diff options
author | jkim <jkim@FreeBSD.org> | 2013-04-26 04:03:56 +0800 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2013-04-26 04:03:56 +0800 |
commit | a3d34cc7fbbbb2ececf9401e3dcf45b47e03c314 (patch) | |
tree | faaadf11511ea057e94e662bbf56a70751cbbbec /java/openjdk6 | |
parent | 0d8f9106fe0f962591517932cf5d3a128548ac26 (diff) | |
download | freebsd-ports-gnome-a3d34cc7fbbbb2ececf9401e3dcf45b47e03c314.tar.gz freebsd-ports-gnome-a3d34cc7fbbbb2ececf9401e3dcf45b47e03c314.tar.zst freebsd-ports-gnome-a3d34cc7fbbbb2ececf9401e3dcf45b47e03c314.zip |
Add multiple security patches from IcedTea6 1.12.5.
http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2013-April/022985.html
Obtained from: IcedTea Project
Diffstat (limited to 'java/openjdk6')
48 files changed, 45693 insertions, 45 deletions
diff --git a/java/openjdk6/Makefile b/java/openjdk6/Makefile index 038475b2ee7b..a6f3e490bc36 100644 --- a/java/openjdk6/Makefile +++ b/java/openjdk6/Makefile @@ -3,7 +3,7 @@ PORTNAME= openjdk6 PORTVERSION= b27 -PORTREVISION?= 2 +PORTREVISION?= 3 CATEGORIES= java devel MASTER_SITES= http://download.java.net/openjdk/jdk6/promoted/${PORTVERSION}/ \ http://download.java.net/jaxp/openjdk/jdk6/:jaxp \ @@ -39,7 +39,9 @@ RUN_DEPENDS= javavm:${PORTSDIR}/java/javavmwrapper \ OPENJDK_BUILDDATE= 26_oct_2012 -EXTRA_PATCHES= ${FILESDIR}/icedtea/security/20120830/7182135-impossible_to_use_some_editors_directly.patch \ +EXTRA_PATCHES= ${FILESDIR}/icedtea/jaxp.patch \ + ${FILESDIR}/icedtea/jaxws.patch \ + ${FILESDIR}/icedtea/security/20120830/7182135-impossible_to_use_some_editors_directly.patch \ ${FILESDIR}/icedtea/security/20130201/7201068.patch \ ${FILESDIR}/icedtea/security/20130201/6563318.patch \ ${FILESDIR}/icedtea/security/20130201/6664509.patch \ @@ -68,12 +70,52 @@ EXTRA_PATCHES= ${FILESDIR}/icedtea/security/20120830/7182135-impossible_to_use_s ${FILESDIR}/icedtea/security/20130201/8001307.patch \ ${FILESDIR}/icedtea/security/20130201/8001972.patch \ ${FILESDIR}/icedtea/security/20130201/8002325.patch \ - ${FILESDIR}/icedtea/security/20130201/8001235.patch \ ${FILESDIR}/icedtea/security/20130219/8006446.patch \ ${FILESDIR}/icedtea/security/20130219/8006777.patch \ ${FILESDIR}/icedtea/security/20130219/8007688.patch \ ${FILESDIR}/icedtea/security/20130304/8007014.patch \ - ${FILESDIR}/icedtea/security/20130304/8007675.patch + ${FILESDIR}/icedtea/security/20130304/8007675.patch \ + ${FILESDIR}/icedtea/openjdk/7036559-concurrenthashmap_improvements.patch \ + ${FILESDIR}/icedtea/security/20130416/8009063.patch \ + ${FILESDIR}/icedtea/openjdk/8004302-soap_test_failure.patch \ + ${FILESDIR}/icedtea/security/20130416/6657673.patch \ + ${FILESDIR}/icedtea/security/20130416/6657673-fixup.patch \ + ${FILESDIR}/icedtea/openjdk/7133220-factory_finder_parser_transform_useBSClassLoader.patch \ + ${FILESDIR}/icedtea/security/20130416/6657673-factory_finder.patch \ + ${FILESDIR}/icedtea/openjdk/6669869-queries_per_appcontext.patch \ + ${FILESDIR}/icedtea/openjdk/5102804-memory_leak.patch \ + ${FILESDIR}/icedtea/openjdk/6963811-deadlock_fix.patch \ + ${FILESDIR}/icedtea/openjdk/7064279-resource_release.patch \ + ${FILESDIR}/icedtea/openjdk/7064279-fixup.patch \ + ${FILESDIR}/icedtea/security/20130416/7200507.patch \ + ${FILESDIR}/icedtea/security/20130416/8000724.patch \ + ${FILESDIR}/icedtea/security/20130416/8004986.patch \ + ${FILESDIR}/icedtea/openjdk/6501644-icu_sync.patch \ + ${FILESDIR}/icedtea/openjdk/6886358-layout_update.patch \ + ${FILESDIR}/icedtea/security/20130416/8001031.patch \ + ${FILESDIR}/icedtea/openjdk/7017324-kerning_crash.patch \ + ${FILESDIR}/icedtea/security/20130416/8001040.patch \ + ${FILESDIR}/icedtea/security/20130416/8001322.patch \ + ${FILESDIR}/icedtea/security/20130416/8001329.patch \ + ${FILESDIR}/icedtea/security/20130416/8003335.patch \ + ${FILESDIR}/icedtea/security/20130416/8003445.patch \ + ${FILESDIR}/icedtea/security/20130416/8003543.patch \ + ${FILESDIR}/icedtea/security/20130416/8004261.patch \ + ${FILESDIR}/icedtea/security/20130416/8004336.patch \ + ${FILESDIR}/icedtea/security/20130416/8005432.patch \ + ${FILESDIR}/icedtea/security/20130416/8005943.patch \ + ${FILESDIR}/icedtea/security/20130416/8006309.patch \ + ${FILESDIR}/icedtea/security/20130416/8006435.patch \ + ${FILESDIR}/icedtea/security/20130416/8006790.patch \ + ${FILESDIR}/icedtea/security/20130416/8006795.patch \ + ${FILESDIR}/icedtea/security/20130416/8007406.patch \ + ${FILESDIR}/icedtea/security/20130416/8007617.patch \ + ${FILESDIR}/icedtea/security/20130416/8007667.patch \ + ${FILESDIR}/icedtea/security/20130416/8007918.patch \ + ${FILESDIR}/icedtea/security/20130416/8009305.patch \ + ${FILESDIR}/icedtea/security/20130416/8009699.patch \ + ${FILESDIR}/icedtea/security/20130416/8009814.patch \ + ${FILESDIR}/icedtea/security/20130416/8009857.patch OPTIONS_DEFINE= ICEDTEA IPV6 POLICY SOUND TZUPDATE OPTIONS_DEFAULT=ICEDTEA IPV6 TZUPDATE @@ -98,7 +140,7 @@ USE_GMAKE= yes USE_MOTIF= yes USE_XORG= x11 xext xi xt xtst -JAXP_BUILD= 144_04 +JAXP_BUILD= 144_05 JAXPFILE= jaxp${JAXP_BUILD}.zip JAXWS_BUILD= 2_1_6-2011_06_13 JAXWSFILE= jdk6-jaxws${JAXWS_BUILD}.zip @@ -148,6 +190,7 @@ BOOTSTRAPJDKDIR?= ${LOCALBASE}/bootstrap-openjdk BUILD_DEPENDS+= ${BOOTSTRAPJDKDIR}/bin/javac:${PORTSDIR}/java/bootstrap-openjdk .endif +FETCH_ARGS= -Fpr MAKE_ENV= LANG=C LC_ALL=C OS= \ ALT_JDK_IMPORT_PATH=${BOOTSTRAPJDKDIR} \ ALT_BOOTDIR=${BOOTSTRAPJDKDIR} \ @@ -198,7 +241,7 @@ MAKE_ENV+= SKIP_FASTDEBUG_BUILD=true .endif .if ${PORT_OPTIONS:MICEDTEA} -EXTRA_PATCHES+= ${FILESDIR}/icedtea/7032388-work_without_cmov_instruction.patch \ +EXTRA_PATCHES+= ${FILESDIR}/icedtea/openjdk/7032388-work_without_cmov_instruction.patch \ ${FILESDIR}/icedtea/applet_hole.patch \ ${FILESDIR}/icedtea/jpegclasses.patch .endif diff --git a/java/openjdk6/distinfo b/java/openjdk6/distinfo index 3a73aea412b0..76dc245659ba 100644 --- a/java/openjdk6/distinfo +++ b/java/openjdk6/distinfo @@ -1,7 +1,7 @@ SHA256 (openjdk-6-src-b27-26_oct_2012.tar.gz) = 044c3877b15940ff04f8aa817337f2878a00cc89674854557f1a02f15b1802a0 SIZE (openjdk-6-src-b27-26_oct_2012.tar.gz) = 45789350 -SHA256 (jaxp144_04.zip) = 490f696218c1fed9cb180680af883fe309b414fec232e9cec19645e12ad0b43c -SIZE (jaxp144_04.zip) = 5976385 +SHA256 (jaxp144_05.zip) = c1a8a5a219fa55ecbf2ad43b66514335a3e96ccad40bd2ec9165a821343b2bff +SIZE (jaxp144_05.zip) = 5976387 SHA256 (jdk6-jaxws2_1_6-2011_06_13.zip) = 229040544e791f44906e8e7b6f6faf503c730a5d854275135f3925490d5c3be3 SIZE (jdk6-jaxws2_1_6-2011_06_13.zip) = 5512710 SHA256 (jdk6-jaf-b20.zip) = 78c7b5c9d6271e88ee46abadd018a61f1e9645f8936cc8df1617e5f4f5074012 diff --git a/java/openjdk6/files/icedtea/jaxp.patch b/java/openjdk6/files/icedtea/jaxp.patch new file mode 100644 index 000000000000..b5d9048a1508 --- /dev/null +++ b/java/openjdk6/files/icedtea/jaxp.patch @@ -0,0 +1,15 @@ +--- jaxp/build.properties.orig 2012-10-26 14:23:11.000000000 -0400 ++++ jaxp/build.properties 2013-04-25 14:25:15.000000000 -0400 +@@ -77,6 +77,12 @@ + # Where patches to drop bundle sources live + patches.dir=patches + ++# Patches to apply ++jaxp_src.patch.list=6657673.patch \ ++ 6657673-fixup.patch \ ++ 7133220-factory_finder_parser_transform_useBSClassLoader.patch \ ++ 6657673-factory_finder.patch ++ + # Sanity information + sanity.info= Sanity Settings:${line.separator}\ + ant.home=${ant.home}${line.separator}\ diff --git a/java/openjdk6/files/icedtea/jaxws.patch b/java/openjdk6/files/icedtea/jaxws.patch new file mode 100644 index 000000000000..b93ba153a0c1 --- /dev/null +++ b/java/openjdk6/files/icedtea/jaxws.patch @@ -0,0 +1,13 @@ +--- jaxws/build.properties.orig 2012-10-26 14:23:24.000000000 -0400 ++++ jaxws/build.properties 2013-04-25 15:06:29.000000000 -0400 +@@ -77,6 +77,10 @@ + # Where patches to drop bundle sources live + patches.dir=patches + ++# Patches to apply ++jaxws_src.patch.list=8003543.patch \ ++ 8005432.patch ++ + # Sanity information + sanity.info= Sanity Settings:${line.separator}\ + ant.home=${ant.home}${line.separator}\ diff --git a/java/openjdk6/files/icedtea/openjdk/5102804-memory_leak.patch b/java/openjdk6/files/icedtea/openjdk/5102804-memory_leak.patch new file mode 100644 index 000000000000..01dd35c1bee2 --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/5102804-memory_leak.patch @@ -0,0 +1,429 @@ +# HG changeset patch +# User andrew +# Date 1365704033 -3600 +# Node ID 06255d9f82761abc74c30f31fda00968ffef4bc3 +# Parent a939f541de9af5ccb78225c27cd46cd7dc6bcf87 +5102804: Memory leak in Introspector.getBeanInfo(Class) for custom BeanInfo: Class param (includes WeakCache from 6397609) +Reviewed-by: peterz + +diff --git a/src/share/classes/com/sun/beans/WeakCache.java b/src/share/classes/com/sun/beans/WeakCache.java +new file mode 100644 +--- /dev/null ++++ jdk/src/share/classes/com/sun/beans/WeakCache.java +@@ -0,0 +1,91 @@ ++/* ++ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute 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.beans; ++ ++import java.lang.ref.Reference; ++import java.lang.ref.WeakReference; ++ ++import java.util.Map; ++import java.util.WeakHashMap; ++ ++/** ++ * A hashtable-based cache with weak keys and weak values. ++ * An entry in the map will be automatically removed ++ * when its key is no longer in the ordinary use. ++ * A value will be automatically removed as well ++ * when it is no longer in the ordinary use. ++ * ++ * @since 1.7 ++ * ++ * @author Sergey A. Malenkov ++ */ ++public final class WeakCache<K, V> { ++ private final Map<K, Reference<V>> map = new WeakHashMap<K, Reference<V>>(); ++ ++ /** ++ * Returns a value to which the specified {@code key} is mapped, ++ * or {@code null} if this map contains no mapping for the {@code key}. ++ * ++ * @param key the key whose associated value is returned ++ * @return a value to which the specified {@code key} is mapped ++ */ ++ public V get(K key) { ++ Reference<V> reference = this.map.get(key); ++ if (reference == null) { ++ return null; ++ } ++ V value = reference.get(); ++ if (value == null) { ++ this.map.remove(key); ++ } ++ return value; ++ } ++ ++ /** ++ * Associates the specified {@code value} with the specified {@code key}. ++ * Removes the mapping for the specified {@code key} from this cache ++ * if it is present and the specified {@code value} is {@code null}. ++ * If the cache previously contained a mapping for the {@code key}, ++ * the old value is replaced by the specified {@code value}. ++ * ++ * @param key the key with which the specified value is associated ++ * @param value the value to be associated with the specified key ++ */ ++ public void put(K key, V value) { ++ if (value != null) { ++ this.map.put(key, new WeakReference<V>(value)); ++ } ++ else { ++ this.map.remove(key); ++ } ++ } ++ ++ /** ++ * Removes all of the mappings from this cache. ++ */ ++ public void clear() { ++ this.map.clear(); ++ } ++} +diff --git a/src/share/classes/java/beans/Introspector.java b/src/share/classes/java/beans/Introspector.java +--- jdk/src/share/classes/java/beans/Introspector.java ++++ jdk/src/share/classes/java/beans/Introspector.java +@@ -25,25 +25,18 @@ + + package java.beans; + ++import com.sun.beans.WeakCache; + import com.sun.beans.finder.ClassFinder; + +-import java.lang.ref.Reference; +-import java.lang.ref.SoftReference; +- + import java.lang.reflect.Method; + import java.lang.reflect.Modifier; + +-import java.security.AccessController; +-import java.security.PrivilegedAction; +- +-import java.util.Collections; + import java.util.Map; + import java.util.ArrayList; + import java.util.HashMap; + import java.util.Iterator; + import java.util.EventListener; + import java.util.List; +-import java.util.WeakHashMap; + import java.util.TreeMap; + import sun.awt.AppContext; + import sun.reflect.misc.ReflectUtil; +@@ -110,8 +103,8 @@ + public final static int IGNORE_ALL_BEANINFO = 3; + + // Static Caches to speed up introspection. +- private static Map declaredMethodCache = +- Collections.synchronizedMap(new WeakHashMap()); ++ private static WeakCache<Class<?>, Method[]> declaredMethodCache = ++ new WeakCache<Class<?>, Method[]>(); + + private static final Object BEANINFO_CACHE = new Object(); + +@@ -177,20 +170,21 @@ + if (!ReflectUtil.isPackageAccessible(beanClass)) { + return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); + } +- Map<Class<?>, BeanInfo> map; + synchronized (BEANINFO_CACHE) { +- map = (Map<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE); +- if (map == null) { +- map = Collections.synchronizedMap(new WeakHashMap<Class<?>, BeanInfo>()); +- AppContext.getAppContext().put(BEANINFO_CACHE, map); ++ WeakCache<Class<?>, BeanInfo> beanInfoCache = ++ (WeakCache<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE); ++ ++ if (beanInfoCache == null) { ++ beanInfoCache = new WeakCache<Class<?>, BeanInfo>(); ++ AppContext.getAppContext().put(BEANINFO_CACHE, beanInfoCache); + } ++ BeanInfo beanInfo = beanInfoCache.get(beanClass); ++ if (beanInfo == null) { ++ beanInfo = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); ++ beanInfoCache.put(beanClass, beanInfo); ++ } ++ return beanInfo; + } +- BeanInfo bi = map.get(beanClass); +- if (bi == null) { +- bi = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); +- map.put(beanClass, bi); +- } +- return bi; + } + + /** +@@ -337,11 +331,13 @@ + */ + + public static void flushCaches() { +- Map map = (Map) AppContext.getAppContext().get(BEANINFO_CACHE); +- if (map != null) { +- map.clear(); ++ synchronized (BEANINFO_CACHE) { ++ WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE); ++ if (beanInfoCache != null) { ++ beanInfoCache.clear(); ++ } ++ declaredMethodCache.clear(); + } +- declaredMethodCache.clear(); + } + + /** +@@ -363,11 +359,13 @@ + if (clz == null) { + throw new NullPointerException(); + } +- Map map = (Map) AppContext.getAppContext().get(BEANINFO_CACHE); +- if (map != null) { +- map.remove(clz); ++ synchronized (BEANINFO_CACHE) { ++ WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE); ++ if (beanInfoCache != null) { ++ beanInfoCache.put(clz, null); ++ } ++ declaredMethodCache.put(clz, null); + } +- declaredMethodCache.remove(clz); + } + + //====================================================================== +@@ -1306,41 +1304,26 @@ + /* + * Internal method to return *public* methods within a class. + */ +- private static synchronized Method[] getPublicDeclaredMethods(Class clz) { ++ private static Method[] getPublicDeclaredMethods(Class clz) { + // Looking up Class.getDeclaredMethods is relatively expensive, + // so we cache the results. +- Method[] result = null; + if (!ReflectUtil.isPackageAccessible(clz)) { + return new Method[0]; + } +- final Class fclz = clz; +- Reference ref = (Reference)declaredMethodCache.get(fclz); +- if (ref != null) { +- result = (Method[])ref.get(); +- if (result != null) { +- return result; ++ synchronized (BEANINFO_CACHE) { ++ Method[] result = declaredMethodCache.get(clz); ++ if (result == null) { ++ result = clz.getMethods(); ++ for (int i = 0; i < result.length; i++) { ++ Method method = result[i]; ++ if (!method.getDeclaringClass().equals(clz)) { ++ result[i] = null; ++ } ++ } ++ declaredMethodCache.put(clz, result); + } ++ return result; + } +- +- // We have to raise privilege for getDeclaredMethods +- result = (Method[]) AccessController.doPrivileged(new PrivilegedAction() { +- public Object run() { +- return fclz.getDeclaredMethods(); +- } +- }); +- +- +- // Null out any non-public methods. +- for (int i = 0; i < result.length; i++) { +- Method method = result[i]; +- int mods = method.getModifiers(); +- if (!Modifier.isPublic(mods)) { +- result[i] = null; +- } +- } +- // Add it to the cache. +- declaredMethodCache.put(fclz, new SoftReference(result)); +- return result; + } + + //====================================================================== +diff --git a/test/java/beans/Introspector/Test5102804.java b/test/java/beans/Introspector/Test5102804.java +new file mode 100644 +--- /dev/null ++++ jdk/test/java/beans/Introspector/Test5102804.java +@@ -0,0 +1,155 @@ ++/* ++ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute 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 5102804 ++ * @summary Tests memory leak ++ * @author Sergey Malenkov ++ */ ++ ++import java.beans.BeanInfo; ++import java.beans.IntrospectionException; ++import java.beans.Introspector; ++import java.beans.PropertyDescriptor; ++import java.beans.SimpleBeanInfo; ++import java.lang.ref.Reference; ++import java.lang.ref.WeakReference; ++import java.net.URL; ++import java.net.URLClassLoader; ++ ++public class Test5102804 { ++ private static final String BEAN_NAME = "Test5102804$Example"; ++ private static final String BEAN_INFO_NAME = BEAN_NAME + "BeanInfo"; ++ ++ public static void main(String[] args) { ++ if (!isCollectible(getReference())) ++ throw new Error("Reference is not collected"); ++ } ++ ++ private static Reference getReference() { ++ try { ++ ClassLoader loader = new Loader(); ++ Class type = Class.forName(BEAN_NAME, true, loader); ++ if (!type.getClassLoader().equals(loader)) { ++ throw new Error("Wrong class loader"); ++ } ++ BeanInfo info = Introspector.getBeanInfo(type); ++ if (0 != info.getDefaultPropertyIndex()) { ++ throw new Error("Wrong bean info found"); ++ } ++ return new WeakReference<Class>(type); ++ } ++ catch (IntrospectionException exception) { ++ throw new Error("Introspection Error", exception); ++ } ++ catch (ClassNotFoundException exception) { ++ throw new Error("Class Not Found", exception); ++ } ++ } ++ ++ private static boolean isCollectible(Reference reference) { ++ int[] array = new int[10]; ++ while (true) { ++ try { ++ array = new int[array.length + array.length / 3]; ++ } ++ catch (OutOfMemoryError error) { ++ return null == reference.get(); ++ } ++ } ++ } ++ ++ /** ++ * Custom class loader to load the Example class by itself. ++ * Could also load it from a different code source, but this is easier to set up. ++ */ ++ private static final class Loader extends URLClassLoader { ++ Loader() { ++ super(new URL[] { ++ Test5102804.class.getProtectionDomain().getCodeSource().getLocation() ++ }); ++ } ++ ++ @Override ++ protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { ++ Class c = findLoadedClass(name); ++ if (c == null) { ++ if (BEAN_NAME.equals(name) || BEAN_INFO_NAME.equals(name)) { ++ c = findClass(name); ++ } ++ else try { ++ c = getParent().loadClass(name); ++ } ++ catch (ClassNotFoundException exception) { ++ c = findClass(name); ++ } ++ } ++ if (resolve) { ++ resolveClass(c); ++ } ++ return c; ++ } ++ } ++ ++ /** ++ * A simple bean to load from the Loader class, not main class loader. ++ */ ++ public static final class Example { ++ private int value; ++ ++ public int getValue() { ++ return value; ++ } ++ ++ public void setValue(int value) { ++ this.value = value; ++ } ++ } ++ ++ /** ++ * The BeanInfo for the Example class. ++ * It is also loaded from the Loader class. ++ */ ++ public static final class ExampleBeanInfo extends SimpleBeanInfo { ++ @Override ++ public int getDefaultPropertyIndex() { ++ return 0; ++ } ++ ++ @Override ++ public PropertyDescriptor[] getPropertyDescriptors() { ++ try { ++ return new PropertyDescriptor[] { ++ new PropertyDescriptor("value", Class.forName(BEAN_NAME)) ++ }; ++ } ++ catch (ClassNotFoundException exception) { ++ return null; ++ } ++ catch (IntrospectionException exception) { ++ return null; ++ } ++ } ++ } ++} diff --git a/java/openjdk6/files/icedtea/openjdk/6501644-icu_sync.patch b/java/openjdk6/files/icedtea/openjdk/6501644-icu_sync.patch new file mode 100644 index 000000000000..299a59691ef8 --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/6501644-icu_sync.patch @@ -0,0 +1,8066 @@ +# HG changeset patch +# User andrew +# Date 1365739093 -3600 +# Node ID e8ed86062291305172267be90dcec2acef7c15a8 +# Parent c7ddbf756d7f35d6e782eb91b86ce2938de44fb8 +6501644: sync LayoutEngine *code* structure to match ICU +Reviewed-by: prr + +diff --git a/make/sun/font/Makefile b/make/sun/font/Makefile +--- jdk/make/sun/font/Makefile ++++ jdk/make/sun/font/Makefile +@@ -209,3 +209,7 @@ + -I$(PLATFORM_SRC)/native/sun/java2d/d3d + endif + ++# Make the Layout Engine build standalone ++CPPFLAGS += -DLE_STANDALONE ++ ++ +diff --git a/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp b/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp +--- jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp +@@ -37,6 +37,8 @@ + #include "GlyphIterator.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_uint32 AlternateSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const + { + // NOTE: For now, we'll just pick the first alternative... +@@ -64,3 +66,5 @@ + + return 0; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/AlternateSubstSubtables.h b/src/share/native/sun/font/layout/AlternateSubstSubtables.h +--- jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.h ++++ jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.h +@@ -32,12 +32,19 @@ + #ifndef __ALTERNATESUBSTITUTIONSUBTABLES_H + #define __ALTERNATESUBSTITUTIONSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEGlyphFilter.h" + #include "OpenTypeTables.h" + #include "GlyphSubstitutionTables.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + struct AlternateSetTable + { + le_uint16 glyphCount; +@@ -52,4 +59,5 @@ + le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/AnchorTables.cpp b/src/share/native/sun/font/layout/AnchorTables.cpp +--- jdk/src/share/native/sun/font/layout/AnchorTables.cpp ++++ jdk/src/share/native/sun/font/layout/AnchorTables.cpp +@@ -35,6 +35,8 @@ + #include "AnchorTables.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + void AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, + LEPoint &anchor) const + { +@@ -124,3 +126,6 @@ + + fontInstance->pixelsToUnits(pixels, anchor); + } ++ ++U_NAMESPACE_END ++ +diff --git a/src/share/native/sun/font/layout/AnchorTables.h b/src/share/native/sun/font/layout/AnchorTables.h +--- jdk/src/share/native/sun/font/layout/AnchorTables.h ++++ jdk/src/share/native/sun/font/layout/AnchorTables.h +@@ -32,10 +32,17 @@ + #ifndef __ANCHORTABLES_H + #define __ANCHORTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + struct AnchorTable + { + le_uint16 anchorFormat; +@@ -66,5 +73,7 @@ + void getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const; + }; + ++U_NAMESPACE_END ++#endif + +-#endif ++ +diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp b/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp +@@ -49,23 +49,25 @@ + #include "ArabicShaping.h" + #include "CanonShaping.h" + ++U_NAMESPACE_BEGIN ++ + le_bool CharSubstitutionFilter::accept(LEGlyphID glyph) const + { + return fFontInstance->canDisplay((LEUnicode) glyph); + } + +-ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine( +- const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ArabicOpenTypeLayoutEngine) ++ ++ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable) + { + fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; + } + +-ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine( +- const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) ++ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags) + { + fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount); +@@ -86,9 +88,8 @@ + // Input: characters + // Output: characters, char indices, tags + // Returns: output character count +-le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], +- le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, +- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; +@@ -124,8 +125,8 @@ + return count; + } + +-void ArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success) ++void ArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return; +@@ -137,24 +138,20 @@ + } + + if (fGPOSTable != NULL) { +- OpenTypeLayoutEngine::adjustGlyphPositions(chars, offset, count, +- reverse, glyphStorage, success); ++ OpenTypeLayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphStorage, success); + } else if (fGDEFTable != NULL) { + GDEFMarkFilter filter(fGDEFTable); + + adjustMarkGlyphs(glyphStorage, &filter, success); + } else { +- GlyphDefinitionTableHeader *gdefTable = +- (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; ++ GlyphDefinitionTableHeader *gdefTable = (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; + GDEFMarkFilter filter(gdefTable); + + adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); + } + } + +-UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine( +- const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) ++UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) + : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG) + { + fGSUBTable = (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; +@@ -168,8 +165,7 @@ + } + + // "glyphs", "indices" -> glyphs, indices +-le_int32 UnicodeArabicOpenTypeLayoutEngine::glyphPostProcessing( +- LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 UnicodeArabicOpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; +@@ -192,17 +188,14 @@ + + glyphStorage.adoptCharIndicesArray(tempGlyphStorage); + +- ArabicOpenTypeLayoutEngine::mapCharsToGlyphs(tempChars, 0, tempGlyphCount, FALSE, +- TRUE, glyphStorage, success); ++ ArabicOpenTypeLayoutEngine::mapCharsToGlyphs(tempChars, 0, tempGlyphCount, FALSE, TRUE, glyphStorage, success); + + LE_DELETE_ARRAY(tempChars); + + return tempGlyphCount; + } + +-void UnicodeArabicOpenTypeLayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], +- le_int32 offset, le_int32 count, le_bool reverse, le_bool /*mirror*/, +- LEGlyphStorage &glyphStorage, LEErrorCode &success) ++void UnicodeArabicOpenTypeLayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool /*mirror*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return; +@@ -227,9 +220,8 @@ + } + } + +-void UnicodeArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], +- le_int32 offset, le_int32 count, le_bool reverse, +- LEGlyphStorage &glyphStorage, LEErrorCode &success) ++void UnicodeArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return; +@@ -244,3 +236,6 @@ + + adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); + } ++ ++U_NAMESPACE_END ++ +diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.h b/src/share/native/sun/font/layout/ArabicLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h +@@ -43,6 +43,8 @@ + #include "GlyphDefinitionTables.h" + #include "GlyphPositioningTables.h" + ++U_NAMESPACE_BEGIN ++ + /** + * This class implements OpenType layout for Arabic fonts. It overrides + * the characerProcessing method to assign the correct OpenType feature +@@ -71,8 +73,8 @@ + * + * @internal + */ +- ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, +- le_int32 languageCode, le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); ++ ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +@@ -87,8 +89,8 @@ + * + * @internal + */ +- ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, +- le_int32 languageCode, le_int32 typoFlags); ++ ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -97,6 +99,20 @@ + */ + virtual ~ArabicOpenTypeLayoutEngine(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + protected: + + /** +@@ -108,8 +124,7 @@ + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context +- * @param rightToLeft - <code>TRUE</code> if the characters are in a +- * right to left directional run ++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run + * + * Output parameters: + * @param outChars - the output character arrayt +@@ -121,9 +136,8 @@ + * + * @internal + */ +- virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, +- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method applies the GPOS table if it is present, otherwise it ensures that all vowel +@@ -142,11 +156,9 @@ + * + * @internal + */ +- virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); + +- // static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, +- // le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ // static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + }; + +@@ -178,8 +190,8 @@ + * + * @internal + */ +- UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags); ++ UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -208,8 +220,7 @@ + * + * @internal + */ +- virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, +- LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method copies the input characters into the output glyph index array, +@@ -227,8 +238,7 @@ + * + * @internal + */ +- virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_bool reverse, le_bool mirror, ++ virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** +@@ -245,8 +255,9 @@ + * + * @internal + */ +- virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/ArabicShaping.cpp b/src/share/native/sun/font/layout/ArabicShaping.cpp +--- jdk/src/share/native/sun/font/layout/ArabicShaping.cpp ++++ jdk/src/share/native/sun/font/layout/ArabicShaping.cpp +@@ -35,6 +35,8 @@ + #include "LEGlyphStorage.h" + #include "ClassDefinitionTables.h" + ++U_NAMESPACE_BEGIN ++ + // This table maps Unicode joining types to + // ShapeTypes. + const ArabicShaping::ShapeType ArabicShaping::shapeTypes[] = +@@ -102,9 +104,7 @@ + #define markFeatureMask 0x00040000UL + #define mkmkFeatureMask 0x00020000UL + +-#define ISOL_FEATURES (isolFeatureMask | ligaFeatureMask | msetFeatureMask | \ +- markFeatureMask | ccmpFeatureMask | rligFeatureMask | caltFeatureMask | \ +- dligFeatureMask | cswhFeatureMask | cursFeatureMask | kernFeatureMask | mkmkFeatureMask) ++#define ISOL_FEATURES (isolFeatureMask | ligaFeatureMask | msetFeatureMask | markFeatureMask | ccmpFeatureMask | rligFeatureMask | caltFeatureMask | dligFeatureMask | cswhFeatureMask | cursFeatureMask | kernFeatureMask | mkmkFeatureMask) + + #define SHAPE_MASK 0xF0000000UL + +@@ -226,3 +226,5 @@ + adjustTags(erout, 2, glyphStorage); + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ArabicShaping.h b/src/share/native/sun/font/layout/ArabicShaping.h +--- jdk/src/share/native/sun/font/layout/ArabicShaping.h ++++ jdk/src/share/native/sun/font/layout/ArabicShaping.h +@@ -32,12 +32,19 @@ + #ifndef __ARABICSHAPING_H + #define __ARABICSHAPING_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + +-class ArabicShaping { ++class ArabicShaping /* not : public UObject because all methods are static */ { + public: + // Joining types + enum JoiningTypes +@@ -74,8 +81,8 @@ + + typedef le_int32 ShapeType; + +- static void shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, +- le_int32 charMax, le_bool rightToLeft, LEGlyphStorage &glyphStorage); ++ static void shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax, ++ le_bool rightToLeft, LEGlyphStorage &glyphStorage); + + static const FeatureMap *getFeatureMap(le_int32 &count); + +@@ -88,8 +95,8 @@ + static const le_uint8 shapingTypeTable[]; + static const ShapeType shapeTypes[]; + +- static void adjustTags(le_int32 outIndex, le_int32 shapeOffset, +- LEGlyphStorage &glyphStorage); ++ static void adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage); + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/AttachmentPosnSubtables.h b/src/share/native/sun/font/layout/AttachmentPosnSubtables.h +--- jdk/src/share/native/sun/font/layout/AttachmentPosnSubtables.h ++++ jdk/src/share/native/sun/font/layout/AttachmentPosnSubtables.h +@@ -32,12 +32,19 @@ + #ifndef __ATTACHMENTPOSITIONINGSUBTABLES_H + #define __ATTACHMENTPOSITIONINGSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + #include "GlyphPositioningTables.h" + #include "ValueRecords.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + struct AttachmentPositioningSubtable : GlyphPositioningSubtable + { + Offset baseCoverageTableOffset; +@@ -55,4 +62,6 @@ + return getGlyphCoverage(baseCoverageTableOffset, baseGlyphID); + } + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/CanonData.cpp b/src/share/native/sun/font/layout/CanonData.cpp +--- jdk/src/share/native/sun/font/layout/CanonData.cpp ++++ jdk/src/share/native/sun/font/layout/CanonData.cpp +@@ -36,6 +36,8 @@ + #include "LETypes.h" + #include "CanonShaping.h" + ++U_NAMESPACE_BEGIN ++ + const le_uint8 CanonShaping::glyphSubstitutionTable[] = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x58, 0x02, 0x86, 0x00, 0x12, 0x61, 0x72, 0x61, 0x62, + 0x00, 0x6E, 0x62, 0x65, 0x6E, 0x67, 0x00, 0x82, 0x63, 0x79, 0x72, 0x6C, 0x00, 0x8E, 0x64, 0x65, +@@ -3773,3 +3775,5 @@ + 0x00, 0xDC, 0xD1, 0x85, 0xD1, 0x89, 0x00, 0xE6, 0xD1, 0x8A, 0xD1, 0x8B, 0x00, 0xDC, 0xD1, 0xAA, + 0xD1, 0xAD, 0x00, 0xE6, 0xD2, 0x42, 0xD2, 0x44, 0x00, 0xE6 + }; ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/CanonShaping.cpp b/src/share/native/sun/font/layout/CanonShaping.cpp +--- jdk/src/share/native/sun/font/layout/CanonShaping.cpp ++++ jdk/src/share/native/sun/font/layout/CanonShaping.cpp +@@ -35,8 +35,9 @@ + #include "GlyphDefinitionTables.h" + #include "ClassDefinitionTables.h" + +-void CanonShaping::sortMarks(le_int32 *indices, +- const le_int32 *combiningClasses, le_int32 index, le_int32 limit) ++U_NAMESPACE_BEGIN ++ ++void CanonShaping::sortMarks(le_int32 *indices, const le_int32 *combiningClasses, le_int32 index, le_int32 limit) + { + for (le_int32 j = index + 1; j < limit; j += 1) { + le_int32 i; +@@ -55,13 +56,11 @@ + } + } + +-void CanonShaping::reorderMarks(const LEUnicode *inChars, le_int32 charCount, +- le_bool rightToLeft, LEUnicode *outChars, LEGlyphStorage &glyphStorage) ++void CanonShaping::reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft, ++ LEUnicode *outChars, LEGlyphStorage &glyphStorage) + { +- const GlyphDefinitionTableHeader *gdefTable = +- (const GlyphDefinitionTableHeader *) glyphDefinitionTable; +- const ClassDefinitionTable *classTable = +- gdefTable->getMarkAttachClassDefinitionTable(); ++ const GlyphDefinitionTableHeader *gdefTable = (const GlyphDefinitionTableHeader *) glyphDefinitionTable; ++ const ClassDefinitionTable *classTable = gdefTable->getMarkAttachClassDefinitionTable(); + le_int32 *combiningClasses = LE_NEW_ARRAY(le_int32, charCount); + le_int32 *indices = LE_NEW_ARRAY(le_int32, charCount); + LEErrorCode status = LE_NO_ERROR; +@@ -103,3 +102,5 @@ + LE_DELETE_ARRAY(indices); + LE_DELETE_ARRAY(combiningClasses); + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/CanonShaping.h b/src/share/native/sun/font/layout/CanonShaping.h +--- jdk/src/share/native/sun/font/layout/CanonShaping.h ++++ jdk/src/share/native/sun/font/layout/CanonShaping.h +@@ -34,20 +34,22 @@ + + #include "LETypes.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + +-class CanonShaping ++class CanonShaping /* not : public UObject because all members are static */ + { + public: + static const le_uint8 glyphSubstitutionTable[]; + static const le_uint8 glyphDefinitionTable[]; + +- static void reorderMarks(const LEUnicode *inChars, le_int32 charCount, +- le_bool rightToLeft, LEUnicode *outChars, LEGlyphStorage &glyphStorage); ++ static void reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft, ++ LEUnicode *outChars, LEGlyphStorage &glyphStorage); + + private: +- static void sortMarks(le_int32 *indices, const le_int32 *combiningClasses, +- le_int32 index, le_int32 limit); ++ static void sortMarks(le_int32 *indices, const le_int32 *combiningClasses, le_int32 index, le_int32 limit); + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/CharSubstitutionFilter.h b/src/share/native/sun/font/layout/CharSubstitutionFilter.h +--- jdk/src/share/native/sun/font/layout/CharSubstitutionFilter.h ++++ jdk/src/share/native/sun/font/layout/CharSubstitutionFilter.h +@@ -35,6 +35,8 @@ + #include "LETypes.h" + #include "LEGlyphFilter.h" + ++U_NAMESPACE_BEGIN ++ + class LEFontInstance; + + /** +@@ -43,7 +45,7 @@ + * + * @internal + */ +-class CharSubstitutionFilter : public LEGlyphFilter ++class CharSubstitutionFilter : public UMemory, public LEGlyphFilter + { + private: + /** +@@ -98,4 +100,7 @@ + le_bool accept(LEGlyphID glyph) const; + }; + ++U_NAMESPACE_END + #endif ++ ++ +diff --git a/src/share/native/sun/font/layout/ClassDefinitionTables.cpp b/src/share/native/sun/font/layout/ClassDefinitionTables.cpp +--- jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp ++++ jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp +@@ -35,6 +35,8 @@ + #include "ClassDefinitionTables.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_int32 ClassDefinitionTable::getGlyphClass(LEGlyphID glyphID) const + { + switch(SWAPW(classFormat)) { +@@ -139,3 +141,5 @@ + + return FALSE; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ClassDefinitionTables.h b/src/share/native/sun/font/layout/ClassDefinitionTables.h +--- jdk/src/share/native/sun/font/layout/ClassDefinitionTables.h ++++ jdk/src/share/native/sun/font/layout/ClassDefinitionTables.h +@@ -32,9 +32,16 @@ + #ifndef __CLASSDEFINITIONTABLES_H + #define __CLASSDEFINITIONTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + struct ClassDefinitionTable + { + le_uint16 classFormat; +@@ -69,4 +76,5 @@ + le_bool hasGlyphClass(le_int32 glyphClass) const; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/ContextualGlyphInsertion.h b/src/share/native/sun/font/layout/ContextualGlyphInsertion.h +--- jdk/src/share/native/sun/font/layout/ContextualGlyphInsertion.h ++++ jdk/src/share/native/sun/font/layout/ContextualGlyphInsertion.h +@@ -32,12 +32,19 @@ + #ifndef __CONTEXTUALGLYPHINSERTION_H + #define __CONTEXTUALGLYPHINSERTION_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LayoutTables.h" + #include "StateTables.h" + #include "MorphTables.h" + #include "MorphStateTables.h" + ++U_NAMESPACE_BEGIN ++ + struct ContextualGlyphInsertionHeader : MorphStateTableHeader + { + }; +@@ -60,4 +67,5 @@ + ByteOffset markedInsertionListOffset; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp b/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp +--- jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp ++++ jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp +@@ -39,6 +39,10 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ContextualGlyphSubstitutionProcessor) ++ + ContextualGlyphSubstitutionProcessor::ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) + : StateTableProcessor(morphSubtableHeader) + { +@@ -57,8 +61,7 @@ + markGlyph = 0; + } + +-ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, +- le_int32 &currGlyph, EntryTableIndex index) ++ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) + { + const ContextualGlyphSubstitutionStateEntry *entry = &entryTable[index]; + ByteOffset newState = SWAPW(entry->newStateOffset); +@@ -97,3 +100,5 @@ + void ContextualGlyphSubstitutionProcessor::endStateTable() + { + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h b/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h +--- jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h ++++ jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h +@@ -32,12 +32,19 @@ + #ifndef __CONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H + #define __CONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "MorphTables.h" + #include "SubtableProcessor.h" + #include "StateTableProcessor.h" + #include "ContextualGlyphSubstitution.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + class ContextualGlyphSubstitutionProcessor : public StateTableProcessor +@@ -52,6 +59,20 @@ + ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader); + virtual ~ContextualGlyphSubstitutionProcessor(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + private: + ContextualGlyphSubstitutionProcessor(); + +@@ -62,6 +83,8 @@ + le_int32 markGlyph; + + const ContextualGlyphSubstitutionHeader *contextualGlyphSubstitutionHeader; ++ + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/ContextualGlyphSubstitution.h b/src/share/native/sun/font/layout/ContextualGlyphSubstitution.h +--- jdk/src/share/native/sun/font/layout/ContextualGlyphSubstitution.h ++++ jdk/src/share/native/sun/font/layout/ContextualGlyphSubstitution.h +@@ -32,11 +32,18 @@ + #ifndef __CONTEXTUALGLYPHSUBSTITUTION_H + #define __CONTEXTUALGLYPHSUBSTITUTION_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LayoutTables.h" + #include "StateTables.h" + #include "MorphTables.h" + ++U_NAMESPACE_BEGIN ++ + struct ContextualGlyphSubstitutionHeader : MorphStateTableHeader + { + ByteOffset substitutionTableOffset; +@@ -55,4 +62,5 @@ + WordOffset currOffset; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp b/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp +--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp +@@ -24,7 +24,6 @@ + */ + + /* +- * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ +@@ -39,6 +38,8 @@ + #include "CoverageTables.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + /* + NOTE: This could be optimized somewhat by keeping track + of the previous sequenceIndex in the loop and doing next() +@@ -350,7 +351,7 @@ + + // NOTE: This could be a #define, but that seems to confuse + // the Visual Studio .NET 2003 compiler on the calls to the +-// GlyphIterator constructor. It somehow can't decide if ++// GlyphIterator constructor. It somehow can't decide if + // emptyFeatureList matches an le_uint32 or an le_uint16... + static const FeatureMask emptyFeatureList = 0x00000000UL; + +@@ -542,3 +543,5 @@ + + return 0; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.h b/src/share/native/sun/font/layout/ContextualSubstSubtables.h +--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h ++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h +@@ -32,6 +32,11 @@ + #ifndef __CONTEXTUALSUBSTITUTIONSUBTABLES_H + #define __CONTEXTUALSUBSTITUTIONSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" +@@ -39,6 +44,8 @@ + #include "GlyphIterator.h" + #include "LookupProcessor.h" + ++U_NAMESPACE_BEGIN ++ + struct SubstitutionLookupRecord + { + le_uint16 sequenceIndex; +@@ -218,4 +225,5 @@ + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/CoverageTables.cpp b/src/share/native/sun/font/layout/CoverageTables.cpp +--- jdk/src/share/native/sun/font/layout/CoverageTables.cpp ++++ jdk/src/share/native/sun/font/layout/CoverageTables.cpp +@@ -35,6 +35,8 @@ + #include "CoverageTables.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_int32 CoverageTable::getGlyphCoverage(LEGlyphID glyphID) const + { + switch(SWAPW(coverageFormat)) +@@ -106,3 +108,5 @@ + + return startCoverageIndex + (ttGlyphID - firstInRange); + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/CoverageTables.h b/src/share/native/sun/font/layout/CoverageTables.h +--- jdk/src/share/native/sun/font/layout/CoverageTables.h ++++ jdk/src/share/native/sun/font/layout/CoverageTables.h +@@ -32,9 +32,16 @@ + #ifndef __COVERAGETABLES_H + #define __COVERAGETABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + struct CoverageTable + { + le_uint16 coverageFormat; +@@ -58,5 +65,5 @@ + le_int32 getGlyphCoverage(LEGlyphID glyphID) const; + }; + +- ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp b/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp +--- jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp +@@ -37,6 +37,8 @@ + #include "OpenTypeUtilities.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_uint32 CursiveAttachmentSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const + { + LEGlyphID glyphID = glyphIterator->getCurrGlyphID(); +@@ -68,3 +70,5 @@ + + return 1; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h b/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h +--- jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h ++++ jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h +@@ -32,10 +32,17 @@ + #ifndef __CURSIVEATTACHMENTSUBTABLES_H + #define __CURSIVEATTACHMENTSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + #include "GlyphPositioningTables.h" + ++U_NAMESPACE_BEGIN ++ + class LEFontInstance; + class GlyphIterator; + +@@ -53,4 +60,7 @@ + le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; + }; + ++U_NAMESPACE_END + #endif ++ ++ +diff --git a/src/share/native/sun/font/layout/DefaultCharMapper.h b/src/share/native/sun/font/layout/DefaultCharMapper.h +--- jdk/src/share/native/sun/font/layout/DefaultCharMapper.h ++++ jdk/src/share/native/sun/font/layout/DefaultCharMapper.h +@@ -24,7 +24,6 @@ + */ + + /* +- * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ +@@ -32,9 +31,16 @@ + #ifndef __DEFAULTCHARMAPPER_H + #define __DEFAULTCHARMAPPER_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + ++U_NAMESPACE_BEGIN ++ + /** + * This class is an instance of LECharMapper which + * implements control character filtering and bidi +@@ -42,7 +48,7 @@ + * + * @see LECharMapper + */ +-class DefaultCharMapper : public LECharMapper ++class DefaultCharMapper : public UMemory, public LECharMapper + { + private: + le_bool fFilterControls; +@@ -77,4 +83,5 @@ + LEUnicode32 mapChar(LEUnicode32 ch) const; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/DeviceTables.cpp b/src/share/native/sun/font/layout/DeviceTables.cpp +--- jdk/src/share/native/sun/font/layout/DeviceTables.cpp ++++ jdk/src/share/native/sun/font/layout/DeviceTables.cpp +@@ -25,6 +25,7 @@ + + /* + * ++ * + * (C) Copyright IBM Corp. 1998 - 2005 - All Rights Reserved + * + */ +@@ -34,6 +35,8 @@ + #include "DeviceTables.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + const le_uint16 DeviceTable::fieldMasks[] = {0x0003, 0x000F, 0x00FF}; + const le_uint16 DeviceTable::fieldSignBits[] = {0x0002, 0x0008, 0x0080}; + const le_uint16 DeviceTable::fieldBits[] = { 2, 4, 8}; +@@ -62,3 +65,5 @@ + + return result; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/DeviceTables.h b/src/share/native/sun/font/layout/DeviceTables.h +--- jdk/src/share/native/sun/font/layout/DeviceTables.h ++++ jdk/src/share/native/sun/font/layout/DeviceTables.h +@@ -25,6 +25,7 @@ + + /* + * ++ * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ +@@ -32,10 +33,15 @@ + #ifndef __DEVICETABLES_H + #define __DEVICETABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" +-#include "GlyphIterator.h" +-#include "GlyphPositionAdjustments.h" ++ ++U_NAMESPACE_BEGIN + + struct DeviceTable + { +@@ -52,5 +58,7 @@ + static const le_uint16 fieldBits[]; + }; + ++U_NAMESPACE_END ++#endif + +-#endif ++ +diff --git a/src/share/native/sun/font/layout/ExtensionSubtables.cpp b/src/share/native/sun/font/layout/ExtensionSubtables.cpp +--- jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp +@@ -25,7 +25,8 @@ + + /* + * +- * (C) Copyright IBM Corp. 2003 - All Rights Reserved ++ * ++ * (C) Copyright IBM Corp. 2002 - All Rights Reserved + * + */ + +@@ -37,6 +38,9 @@ + #include "GlyphIterator.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ ++ + // FIXME: should look at the format too... maybe have a sub-class for it? + le_uint32 ExtensionSubtable::process(const LookupProcessor *lookupProcessor, le_uint16 lookupType, + GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const +@@ -52,3 +56,5 @@ + + return 0; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ExtensionSubtables.h b/src/share/native/sun/font/layout/ExtensionSubtables.h +--- jdk/src/share/native/sun/font/layout/ExtensionSubtables.h ++++ jdk/src/share/native/sun/font/layout/ExtensionSubtables.h +@@ -25,6 +25,7 @@ + + /* + * ++ * + * (C) Copyright IBM Corp. 2002-2003 - All Rights Reserved + * + */ +@@ -32,12 +33,19 @@ + #ifndef __EXTENSIONSUBTABLES_H + #define __EXTENSIONSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + #include "GlyphSubstitutionTables.h" + #include "LookupProcessor.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + struct ExtensionSubtable //: GlyphSubstitutionSubtable + { + le_uint16 substFormat; +@@ -48,4 +56,5 @@ + GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/Features.cpp b/src/share/native/sun/font/layout/Features.cpp +--- jdk/src/share/native/sun/font/layout/Features.cpp ++++ jdk/src/share/native/sun/font/layout/Features.cpp +@@ -25,6 +25,7 @@ + + /* + * ++ * + * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * + */ +@@ -35,6 +36,8 @@ + #include "Features.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + const FeatureTable *FeatureListTable::getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const + { + if (featureIndex >= SWAPW(featureCount)) { +@@ -79,3 +82,5 @@ + return 0; + #endif + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/Features.h b/src/share/native/sun/font/layout/Features.h +--- jdk/src/share/native/sun/font/layout/Features.h ++++ jdk/src/share/native/sun/font/layout/Features.h +@@ -32,9 +32,16 @@ + #ifndef __FEATURES_H + #define __FEATURES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + struct FeatureRecord + { + ATag featureTag; +@@ -53,9 +60,10 @@ + le_uint16 featureCount; + FeatureRecord featureRecordArray[ANY_NUMBER]; + +- const FeatureTable *getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const; ++ const FeatureTable *getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const; + + const FeatureTable *getFeatureTable(LETag featureTag) const; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/GDEFMarkFilter.cpp b/src/share/native/sun/font/layout/GDEFMarkFilter.cpp +--- jdk/src/share/native/sun/font/layout/GDEFMarkFilter.cpp ++++ jdk/src/share/native/sun/font/layout/GDEFMarkFilter.cpp +@@ -34,6 +34,8 @@ + #include "GDEFMarkFilter.h" + #include "GlyphDefinitionTables.h" + ++U_NAMESPACE_BEGIN ++ + GDEFMarkFilter::GDEFMarkFilter(const GlyphDefinitionTableHeader *gdefTable) + { + classDefTable = gdefTable->getGlyphClassDefinitionTable(); +@@ -50,3 +52,5 @@ + + return glyphClass == gcdMarkGlyph; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GDEFMarkFilter.h b/src/share/native/sun/font/layout/GDEFMarkFilter.h +--- jdk/src/share/native/sun/font/layout/GDEFMarkFilter.h ++++ jdk/src/share/native/sun/font/layout/GDEFMarkFilter.h +@@ -32,11 +32,18 @@ + #ifndef __GDEFMARKFILTER__H + #define __GDEFMARKFILTER__H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEGlyphFilter.h" + #include "GlyphDefinitionTables.h" + +-class GDEFMarkFilter : public LEGlyphFilter ++U_NAMESPACE_BEGIN ++ ++class GDEFMarkFilter : public UMemory, public LEGlyphFilter + { + private: + const GlyphClassDefinitionTable *classDefTable; +@@ -51,5 +58,5 @@ + virtual le_bool accept(LEGlyphID glyph) const; + }; + +- ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.cpp b/src/share/native/sun/font/layout/GXLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp +@@ -23,6 +23,7 @@ + * + */ + ++ + /* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved +@@ -36,8 +37,11 @@ + + #include "MorphTables.h" + +-GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, +- le_int32 languageCode, const MorphTableHeader *morphTable) ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GXLayoutEngine) ++ ++GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable) + : LayoutEngine(fontInstance, scriptCode, languageCode, 0), fMorphTable(morphTable) + { + // nothing else to do? +@@ -49,9 +53,7 @@ + } + + // apply 'mort' table +-le_int32 GXLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, +- LEErrorCode &success) ++le_int32 GXLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; +@@ -74,9 +76,8 @@ + } + + // apply positional tables +-void GXLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], +- le_int32 offset, le_int32 count, le_bool /*reverse*/, +- LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success) ++void GXLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/, ++ LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return; +@@ -89,3 +90,5 @@ + + // FIXME: no positional processing yet... + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.h b/src/share/native/sun/font/layout/GXLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.h +@@ -23,6 +23,7 @@ + * + */ + ++ + /* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved +@@ -37,6 +38,8 @@ + + #include "MorphTables.h" + ++U_NAMESPACE_BEGIN ++ + class LEFontInstance; + class LEGlyphStorage; + +@@ -70,8 +73,7 @@ + * + * @internal + */ +- GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, +- le_int32 languageCode, const MorphTableHeader *morphTable); ++ GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -80,6 +82,20 @@ + */ + virtual ~GXLayoutEngine(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + protected: + + /** +@@ -99,10 +115,8 @@ + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context +- * @param rightToLeft - <code>TRUE</code> if the text is in a +- * right to left directional run +- * @param glyphStorage - the glyph storage object. The glyph +- * and char index arrays will be set. ++ * @param rightToLeft - <code>TRUE</code> if the text is in a right to left directional run ++ * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. + * + * Output parameters: + * @param success - set to an error code if the operation fails +@@ -111,8 +125,7 @@ + * + * @internal + */ +- virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, ++ virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** +@@ -120,16 +133,18 @@ + * 'kern', 'trak', 'bsln', 'opbd' and 'just' tables. + * + * Input parameters: +- * @param glyphStorage - the object holding the glyph storage. +- * The positions will be updated as needed. ++ * @param glyphStorage - the object holding the glyph storage. The positions will be updated as needed. + * + * Output parameters: + * @param success - set to an error code if the operation fails + * + * @internal + */ +- virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp b/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp +--- jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp +@@ -34,6 +34,8 @@ + #include "GlyphDefinitionTables.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + const GlyphClassDefinitionTable *GlyphDefinitionTableHeader::getGlyphClassDefinitionTable() const + { + return (const GlyphClassDefinitionTable *) ((char *) this + SWAPW(glyphClassDefOffset)); +@@ -53,3 +55,5 @@ + { + return (const MarkAttachClassDefinitionTable *) ((char *) this + SWAPW(MarkAttachClassDefOffset)); + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphDefinitionTables.h b/src/share/native/sun/font/layout/GlyphDefinitionTables.h +--- jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.h ++++ jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.h +@@ -32,10 +32,17 @@ + #ifndef __GLYPHDEFINITIONTABLES_H + #define __GLYPHDEFINITIONTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + #include "ClassDefinitionTables.h" + ++U_NAMESPACE_BEGIN ++ + typedef ClassDefinitionTable GlyphClassDefinitionTable; + + enum GlyphClassDefinitions +@@ -110,4 +117,5 @@ + const MarkAttachClassDefinitionTable *getMarkAttachClassDefinitionTable() const; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/GlyphIterator.cpp b/src/share/native/sun/font/layout/GlyphIterator.cpp +--- jdk/src/share/native/sun/font/layout/GlyphIterator.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphIterator.cpp +@@ -38,11 +38,10 @@ + #include "Lookups.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN + +-GlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, +- GlyphPositionAdjustments *theGlyphPositionAdjustments, +- le_bool rightToLeft, le_uint16 theLookupFlags, FeatureMask theFeatureMask, +- const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader) ++GlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, ++ FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader) + : direction(1), position(-1), nextLimit(-1), prevLimit(-1), + glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments), + srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), +@@ -262,8 +261,8 @@ + glyphPositionAdjustments->setBaseOffset(position, baseOffset); + } + +-void GlyphIterator::adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, +- float yPlacementAdjust, float xAdvanceAdjust, float yAdvanceAdjust) ++void GlyphIterator::adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, ++ float xAdvanceAdjust, float yAdvanceAdjust) + { + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { +@@ -281,8 +280,8 @@ + glyphPositionAdjustments->adjustYAdvance(position, yAdvanceAdjust); + } + +-void GlyphIterator::setCurrGlyphPositionAdjustment(float xPlacementAdjust, +- float yPlacementAdjust, float xAdvanceAdjust, float yAdvanceAdjust) ++void GlyphIterator::setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, ++ float xAdvanceAdjust, float yAdvanceAdjust) + { + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { +@@ -484,10 +483,11 @@ + + do { + newPosition -= direction; +- } while (newPosition != prevLimit && glyphStorage[newPosition] != 0xFFFE && +- filterGlyph(newPosition)); ++ } while (newPosition != prevLimit && glyphStorage[newPosition] != 0xFFFE && filterGlyph(newPosition)); + + position = newPosition; + + return position != prevLimit; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphIterator.h b/src/share/native/sun/font/layout/GlyphIterator.h +--- jdk/src/share/native/sun/font/layout/GlyphIterator.h ++++ jdk/src/share/native/sun/font/layout/GlyphIterator.h +@@ -32,26 +32,24 @@ + #ifndef __GLYPHITERATOR_H + #define __GLYPHITERATOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + #include "GlyphDefinitionTables.h" + +-struct InsertionRecord +-{ +- InsertionRecord *next; +- le_int32 position; +- le_int32 count; +- LEGlyphID glyphs[ANY_NUMBER]; +-}; ++U_NAMESPACE_BEGIN + + class LEGlyphStorage; + class GlyphPositionAdjustments; + +-class GlyphIterator { ++class GlyphIterator : public UMemory { + public: +- GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, +- le_bool rightToLeft, le_uint16 theLookupFlags, FeatureMask theFeatureMask, +- const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader); ++ GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, ++ FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader); + + GlyphIterator(GlyphIterator &that); + +@@ -122,4 +120,5 @@ + GlyphIterator &operator=(const GlyphIterator &other); // forbid copying of this class + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/GlyphLookupTables.cpp b/src/share/native/sun/font/layout/GlyphLookupTables.cpp +--- jdk/src/share/native/sun/font/layout/GlyphLookupTables.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphLookupTables.cpp +@@ -35,6 +35,8 @@ + #include "GlyphLookupTables.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_bool GlyphLookupTableHeader::coversScript(LETag scriptTag) const + { + const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset)); +@@ -51,3 +53,5 @@ + // Note: don't have to SWAPW langSysTable->featureCount to check for non-zero. + return langSysTable != NULL && langSysTable->featureCount != 0; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphLookupTables.h b/src/share/native/sun/font/layout/GlyphLookupTables.h +--- jdk/src/share/native/sun/font/layout/GlyphLookupTables.h ++++ jdk/src/share/native/sun/font/layout/GlyphLookupTables.h +@@ -32,9 +32,16 @@ + #ifndef __GLYPHLOOKUPTABLES_H + #define __GLYPHLOOKUPTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + struct GlyphLookupTableHeader + { + fixed32 version; +@@ -46,4 +53,7 @@ + le_bool coversScriptAndLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const; + }; + ++U_NAMESPACE_END ++ + #endif ++ +diff --git a/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp b/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp +--- jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp +@@ -34,6 +34,8 @@ + #include "LEGlyphStorage.h" + #include "LEFontInstance.h" + ++U_NAMESPACE_BEGIN ++ + #define CHECK_ALLOCATE_ARRAY(array, type, size) \ + if (array == NULL) { \ + array = (type *) new type[size]; \ +@@ -185,3 +187,5 @@ + + return NULL; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphPositionAdjustments.h b/src/share/native/sun/font/layout/GlyphPositionAdjustments.h +--- jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.h ++++ jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.h +@@ -32,16 +32,23 @@ + #ifndef __GLYPHPOSITIONADJUSTMENTS_H + #define __GLYPHPOSITIONADJUSTMENTS_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + class LEFontInstance; + +-class GlyphPositionAdjustments ++class GlyphPositionAdjustments : public UMemory + { + private: +- class Adjustment { ++ class Adjustment : public UMemory { + public: + + inline Adjustment(); +@@ -78,7 +85,7 @@ + // allow copying of this class because all of its fields are simple types + }; + +- class EntryExitPoint ++ class EntryExitPoint : public UMemory + { + public: + inline EntryExitPoint(); +@@ -144,14 +151,11 @@ + inline void adjustXAdvance(le_int32 index, float xAdjustment); + inline void adjustYAdvance(le_int32 index, float yAdjustment); + +- void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, +- le_bool baselineIsLogicalEnd); +- void setExitPoint(le_int32 index, LEPoint &newExitPoint, +- le_bool baselineIsLogicalEnd); ++ void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd); ++ void setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd); + void setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd); + +- void applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, +- const LEFontInstance *fontInstance); ++ void applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance); + }; + + inline GlyphPositionAdjustments::Adjustment::Adjustment() +@@ -160,10 +164,8 @@ + // nothing else to do! + } + +-inline GlyphPositionAdjustments::Adjustment::Adjustment(float xPlace, float yPlace, +- float xAdv, float yAdv, le_int32 baseOff) +- : xPlacement(xPlace), yPlacement(yPlace), xAdvance(xAdv), yAdvance(yAdv), +- baseOffset(baseOff) ++inline GlyphPositionAdjustments::Adjustment::Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff) ++ : xPlacement(xPlace), yPlacement(yPlace), xAdvance(xAdv), yAdvance(yAdv), baseOffset(baseOff) + { + // nothing else to do! + } +@@ -246,7 +248,7 @@ + inline GlyphPositionAdjustments::EntryExitPoint::EntryExitPoint() + : fFlags(0) + { +- fEntryPoint.fX = fEntryPoint.fY = fExitPoint.fX = fEntryPoint.fY = 0; ++ fEntryPoint.fX = fEntryPoint.fY = fExitPoint.fX = fExitPoint.fY = 0; + } + + inline GlyphPositionAdjustments::EntryExitPoint::~EntryExitPoint() +@@ -264,12 +266,10 @@ + return (fFlags & EEF_BASELINE_IS_LOGICAL_END) != 0; + } + +-inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint( +- LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd) ++inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd) + { + if (baselineIsLogicalEnd) { +- fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH | +- EEF_BASELINE_IS_LOGICAL_END); ++ fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); + } else { + fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH); + } +@@ -277,12 +277,10 @@ + fEntryPoint = newEntryPoint; + } + +-inline void GlyphPositionAdjustments::EntryExitPoint::setExitPoint( +- LEPoint &newExitPoint, le_bool baselineIsLogicalEnd) ++inline void GlyphPositionAdjustments::EntryExitPoint::setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd) + { + if (baselineIsLogicalEnd) { +- fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH | +- EEF_BASELINE_IS_LOGICAL_END); ++ fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); + } else { + fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH); + } +@@ -290,8 +288,7 @@ + fExitPoint = newExitPoint; + } + +-inline void GlyphPositionAdjustments::EntryExitPoint::setCursiveGlyph( +- le_bool baselineIsLogicalEnd) ++inline void GlyphPositionAdjustments::EntryExitPoint::setCursiveGlyph(le_bool baselineIsLogicalEnd) + { + if (baselineIsLogicalEnd) { + fFlags |= (EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); +@@ -386,4 +383,5 @@ + return fEntryExitPoints != NULL; + } + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.cpp b/src/share/native/sun/font/layout/GlyphPositioningTables.cpp +--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp +@@ -24,7 +24,6 @@ + */ + + /* +- * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ +@@ -40,18 +39,18 @@ + #include "LEGlyphStorage.h" + #include "GlyphPositionAdjustments.h" + +-void GlyphPositioningTableHeader::process(LEGlyphStorage &glyphStorage, +- GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft, +- LETag scriptTag, LETag languageTag, +- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, +- const LEFontInstance *fontInstance, +- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const ++U_NAMESPACE_BEGIN ++ ++void GlyphPositioningTableHeader::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft, ++ LETag scriptTag, LETag languageTag, ++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, ++ const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const + { +- GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureMap, +- featureMapCount, featureOrder); ++ GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureMap, featureMapCount, featureOrder); + +- processor.process(glyphStorage, glyphPositionAdjustments, rightToLeft, +- glyphDefinitionTableHeader, fontInstance); ++ processor.process(glyphStorage, glyphPositionAdjustments, rightToLeft, glyphDefinitionTableHeader, fontInstance); + + glyphPositionAdjustments->applyCursiveAdjustments(glyphStorage, rightToLeft, fontInstance); + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.h b/src/share/native/sun/font/layout/GlyphPositioningTables.h +--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h ++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h +@@ -24,7 +24,6 @@ + */ + + /* +- * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ +@@ -32,11 +31,18 @@ + #ifndef __GLYPHPOSITIONINGTABLES_H + #define __GLYPHPOSITIONINGTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + #include "Lookups.h" + #include "GlyphLookupTables.h" + ++U_NAMESPACE_BEGIN ++ + class LEFontInstance; + class LEGlyphStorage; + class LEGlyphFilter; +@@ -45,12 +51,10 @@ + + struct GlyphPositioningTableHeader : public GlyphLookupTableHeader + { +- void process(LEGlyphStorage &glyphStorage, +- GlyphPositionAdjustments *glyphPositionAdjustments, ++ void process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, + le_bool rightToLeft, LETag scriptTag, LETag languageTag, + const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, +- const LEFontInstance *fontInstance, +- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const; ++ const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const; + }; + + enum GlyphPositioningSubtableTypes +@@ -68,4 +72,5 @@ + + typedef LookupSubtable GlyphPositioningSubtable; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp b/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp +--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp +@@ -24,7 +24,6 @@ + */ + + /* +- * + * (C) Copyright IBM Corp. 1998 - 2005 - All Rights Reserved + * + */ +@@ -50,6 +49,8 @@ + #include "GlyphPosnLookupProc.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + // Aside from the names, the contextual positioning subtables are + // the same as the contextual substitution subtables. + typedef ContextualSubstitutionSubtable ContextualPositioningSubtable; +@@ -57,8 +58,7 @@ + + GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor( + const GlyphPositioningTableHeader *glyphPositioningTableHeader, +- LETag scriptTag, LETag languageTag, +- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) ++ LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) + : LookupProcessor( + (char *) glyphPositioningTableHeader, + SWAPW(glyphPositioningTableHeader->scriptListOffset), +@@ -166,3 +166,5 @@ + GlyphPositioningLookupProcessor::~GlyphPositioningLookupProcessor() + { + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.h b/src/share/native/sun/font/layout/GlyphPosnLookupProc.h +--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h ++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h +@@ -24,7 +24,6 @@ + */ + + /* +- * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ +@@ -32,6 +31,11 @@ + #ifndef __GLYPHPOSITIONINGLOOKUPPROCESSOR_H + #define __GLYPHPOSITIONINGLOOKUPPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" +@@ -42,12 +46,13 @@ + #include "GlyphIterator.h" + #include "LookupProcessor.h" + ++U_NAMESPACE_BEGIN ++ + class GlyphPositioningLookupProcessor : public LookupProcessor + { + public: + GlyphPositioningLookupProcessor(const GlyphPositioningTableHeader *glyphPositioningTableHeader, +- LETag scriptTag, LETag languageTag, +- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder); ++ LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder); + + virtual ~GlyphPositioningLookupProcessor(); + +@@ -63,4 +68,5 @@ + GlyphPositioningLookupProcessor &operator=(const GlyphPositioningLookupProcessor &other); // forbid copying of this class + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp b/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp +--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp +@@ -48,17 +48,17 @@ + #include "GlyphSubstLookupProc.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor( + const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader, +- LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter, +- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) ++ LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) + : LookupProcessor( + (char *) glyphSubstitutionTableHeader, + SWAPW(glyphSubstitutionTableHeader->scriptListOffset), + SWAPW(glyphSubstitutionTableHeader->featureListOffset), + SWAPW(glyphSubstitutionTableHeader->lookupListOffset), +- scriptTag, languageTag, featureMap, featureMapCount, featureOrder) +- , fFilter(filter) ++ scriptTag, languageTag, featureMap, featureMapCount, featureOrder), fFilter(filter) + { + // anything? + } +@@ -143,3 +143,5 @@ + GlyphSubstitutionLookupProcessor::~GlyphSubstitutionLookupProcessor() + { + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.h b/src/share/native/sun/font/layout/GlyphSubstLookupProc.h +--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h ++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h +@@ -24,7 +24,6 @@ + */ + + /* +- * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ +@@ -32,6 +31,11 @@ + #ifndef __GLYPHSUBSTITUTIONLOOKUPPROCESSOR_H + #define __GLYPHSUBSTITUTIONLOOKUPPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEGlyphFilter.h" + #include "LEFontInstance.h" +@@ -43,12 +47,13 @@ + #include "GlyphIterator.h" + #include "LookupProcessor.h" + ++U_NAMESPACE_BEGIN ++ + class GlyphSubstitutionLookupProcessor : public LookupProcessor + { + public: + GlyphSubstitutionLookupProcessor(const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader, +- LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter, +- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder); ++ LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder); + + virtual ~GlyphSubstitutionLookupProcessor(); + +@@ -65,4 +70,5 @@ + GlyphSubstitutionLookupProcessor &operator=(const GlyphSubstitutionLookupProcessor &other); // forbid copying of this class + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp b/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp +--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp +@@ -40,14 +40,15 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + +-le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage, +- le_bool rightToLeft, LETag scriptTag, LETag languageTag, +- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, +- const LEGlyphFilter *filter, const FeatureMap *featureMap, +- le_int32 featureMapCount, le_bool featureOrder) const ++U_NAMESPACE_BEGIN ++ ++le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage, le_bool rightToLeft, LETag scriptTag, LETag languageTag, ++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, ++ const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const + { +- GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureMap, +- featureMapCount, featureOrder); ++ GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder); + + return processor.process(glyphStorage, NULL, rightToLeft, glyphDefinitionTableHeader, NULL); + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.h b/src/share/native/sun/font/layout/GlyphSubstitutionTables.h +--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h ++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h +@@ -32,22 +32,27 @@ + #ifndef __GLYPHSUBSTITUTIONTABLES_H + #define __GLYPHSUBSTITUTIONTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + #include "Lookups.h" + #include "GlyphLookupTables.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + class LEGlyphFilter; + struct GlyphDefinitionTableHeader; + + struct GlyphSubstitutionTableHeader : public GlyphLookupTableHeader + { +- le_int32 process(LEGlyphStorage &glyphStorage, +- le_bool rightToLeft, LETag scriptTag, LETag languageTag, +- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, +- const LEGlyphFilter *filter, const FeatureMap *featureMap, +- le_int32 featureMapCount, le_bool featureOrder) const; ++ le_int32 process(LEGlyphStorage &glyphStorage, le_bool rightToLeft, LETag scriptTag, LETag languageTag, ++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEGlyphFilter *filter, ++ const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const; + }; + + enum GlyphSubstitutionSubtableTypes +@@ -64,4 +69,5 @@ + + typedef LookupSubtable GlyphSubstitutionSubtable; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.cpp b/src/share/native/sun/font/layout/HanLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp +@@ -24,7 +24,6 @@ + */ + + /* +- * + * HanLayoutEngine.cpp: OpenType processing for Han fonts. + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved. +@@ -41,6 +40,10 @@ + #include "LEGlyphStorage.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HanOpenTypeLayoutEngine) ++ + #define loclFeatureTag LE_LOCL_FEATURE_TAG + #define smplFeatureTag LE_SMPL_FEATURE_TAG + #define tradFeatureTag LE_TRAD_FEATURE_TAG +@@ -60,9 +63,8 @@ + + #define features (loclFeatureMask) + +-HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, +- const GlyphSubstitutionTableHeader *gsubTable) ++HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable) + { + fFeatureMap = featureMap; +@@ -74,9 +76,8 @@ + // nothing to do + } + +-le_int32 HanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], +- le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, +- LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 HanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, ++ LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; +@@ -104,3 +105,5 @@ + + return count; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.h b/src/share/native/sun/font/layout/HanLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.h +@@ -23,8 +23,8 @@ + * + */ + ++ + /* +- * + * HanLayoutEngine.h: OpenType processing for Han fonts. + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved. +@@ -40,6 +40,8 @@ + + #include "GlyphSubstitutionTables.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + /** +@@ -69,9 +71,8 @@ + * + * @internal + */ +- HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, +- le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); ++ HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); + + + /** +@@ -81,6 +82,20 @@ + */ + virtual ~HanOpenTypeLayoutEngine(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + protected: + + /** +@@ -92,10 +107,8 @@ + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context +- * @param rightToLeft - <code>TRUE</code> if the characters are in a +- * right to left directional run +- * @param glyphStorage - the object holding the glyph storage. The char +- * index and auxillary data arrays will be set. ++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run ++ * @param glyphStorage - the object holding the glyph storage. The char index and auxillary data arrays will be set. + * + * Output parameters: + * @param outChars - the output character arrayt +@@ -107,9 +120,10 @@ + * + * @internal + */ +- virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, +- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/IndicClassTables.cpp b/src/share/native/sun/font/layout/IndicClassTables.cpp +--- jdk/src/share/native/sun/font/layout/IndicClassTables.cpp ++++ jdk/src/share/native/sun/font/layout/IndicClassTables.cpp +@@ -35,6 +35,8 @@ + #include "OpenTypeUtilities.h" + #include "IndicReordering.h" + ++U_NAMESPACE_BEGIN ++ + // Split matra table indices + #define _x1 (1 << CF_INDEX_SHIFT) + #define _x2 (2 << CF_INDEX_SHIFT) +@@ -385,3 +387,5 @@ + + return classTable->getWorstCaseExpansion(); + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.cpp b/src/share/native/sun/font/layout/IndicLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp +@@ -45,20 +45,20 @@ + + #include "IndicReordering.h" + +-IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, +- const GlyphSubstitutionTableHeader *gsubTable) +- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable), +- fMPreFixups(NULL) ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicOpenTypeLayoutEngine) ++ ++IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable), fMPreFixups(NULL) + { + fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; + } + +-IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) +- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), +- fMPreFixups(NULL) ++IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fMPreFixups(NULL) + { + fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; +@@ -71,9 +71,8 @@ + + // Input: characters, tags + // Output: glyphs, char indices +-le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], +- le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, +- LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; +@@ -84,8 +83,7 @@ + return 0; + } + +- le_int32 retCount = OpenTypeLayoutEngine::glyphProcessing(chars, offset, count, max, +- rightToLeft, glyphStorage, success); ++ le_int32 retCount = OpenTypeLayoutEngine::glyphProcessing(chars, offset, count, max, rightToLeft, glyphStorage, success); + + if (LE_FAILURE(success)) { + return 0; +@@ -99,9 +97,8 @@ + // Input: characters + // Output: characters, char indices, tags + // Returns: output character count +-le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], +- le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, +- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; +@@ -131,9 +128,10 @@ + + // NOTE: assumes this allocates featureTags... + // (probably better than doing the worst case stuff here...) +- le_int32 outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, +- outChars, glyphStorage, &fMPreFixups); ++ le_int32 outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups); ++ + glyphStorage.adoptGlyphCount(outCharCount); +- + return outCharCount; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.h b/src/share/native/sun/font/layout/IndicLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h +@@ -43,6 +43,8 @@ + #include "GlyphDefinitionTables.h" + #include "GlyphPositioningTables.h" + ++U_NAMESPACE_BEGIN ++ + class MPreFixups; + class LEGlyphStorage; + +@@ -77,9 +79,8 @@ + * + * @internal + */ +- IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); ++ IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +@@ -94,8 +95,8 @@ + * + * @internal + */ +- IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags); ++ IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -104,6 +105,20 @@ + */ + virtual ~IndicOpenTypeLayoutEngine(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + protected: + + /** +@@ -117,10 +132,9 @@ + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context +- * @param rightToLeft - <code>TRUE</code> if the characters are in a +- * right to left directional run +- * @param glyphStorage - the glyph storage object. The glyph and character +- * index arrays will be set. The auxillary data array will be set to the feature tags. ++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run ++ * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. ++ * the auxillary data array will be set to the feature tags. + * + * Output parameters: + * @param success - set to an error code if the operation fails +@@ -129,9 +143,8 @@ + * + * @internal + */ +- virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, +- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method does character to glyph mapping, applies the GSUB table and applies +@@ -147,11 +160,9 @@ + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context +- * @param rightToLeft - <code>TRUE</code> if the characters are in a +- * right to left directional run ++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run + * @param featureTags - the feature tag array +- * @param glyphStorage - the glyph storage object. The glyph and char +- * index arrays will be set. ++ * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. + * + * Output parameters: + * @param success - set to an error code if the operation fails +@@ -163,12 +174,14 @@ + * + * @internal + */ +- virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, +- LEErrorCode &success); ++ virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success); + + private: ++ + MPreFixups *fMPreFixups; + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/IndicRearrangement.h b/src/share/native/sun/font/layout/IndicRearrangement.h +--- jdk/src/share/native/sun/font/layout/IndicRearrangement.h ++++ jdk/src/share/native/sun/font/layout/IndicRearrangement.h +@@ -32,12 +32,19 @@ + #ifndef __INDICREARRANGEMENT_H + #define __INDICREARRANGEMENT_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LayoutTables.h" + #include "StateTables.h" + #include "MorphTables.h" + #include "MorphStateTables.h" + ++U_NAMESPACE_BEGIN ++ + struct IndicRearrangementSubtableHeader : MorphStateTableHeader + { + }; +@@ -78,4 +85,6 @@ + { + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp b/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp +--- jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp +@@ -39,6 +39,10 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicRearrangementProcessor) ++ + IndicRearrangementProcessor::IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader) + : StateTableProcessor(morphSubtableHeader) + { +@@ -56,8 +60,7 @@ + lastGlyph = 0; + } + +-ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, +- le_int32 &currGlyph, EntryTableIndex index) ++ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) + { + const IndicRearrangementStateEntry *entry = &entryTable[index]; + ByteOffset newState = SWAPW(entry->newStateOffset); +@@ -416,3 +419,5 @@ + break; + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/IndicRearrangementProcessor.h b/src/share/native/sun/font/layout/IndicRearrangementProcessor.h +--- jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.h ++++ jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.h +@@ -32,12 +32,19 @@ + #ifndef __INDICREARRANGEMENTPROCESSOR_H + #define __INDICREARRANGEMENTPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "MorphTables.h" + #include "SubtableProcessor.h" + #include "StateTableProcessor.h" + #include "IndicRearrangement.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + class IndicRearrangementProcessor : public StateTableProcessor +@@ -54,12 +61,28 @@ + IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader); + virtual ~IndicRearrangementProcessor(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + protected: + le_int32 firstGlyph; + le_int32 lastGlyph; + + const IndicRearrangementStateEntry *entryTable; + const IndicRearrangementSubtableHeader *indicRearrangementSubtableHeader; ++ + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/IndicReordering.cpp b/src/share/native/sun/font/layout/IndicReordering.cpp +--- jdk/src/share/native/sun/font/layout/IndicReordering.cpp ++++ jdk/src/share/native/sun/font/layout/IndicReordering.cpp +@@ -36,6 +36,8 @@ + #include "LEGlyphStorage.h" + #include "MPreFixups.h" + ++U_NAMESPACE_BEGIN ++ + #define initFeatureTag LE_INIT_FEATURE_TAG + #define nuktFeatureTag LE_NUKT_FEATURE_TAG + #define akhnFeatureTag LE_AKHN_FEATURE_TAG +@@ -71,7 +73,7 @@ + #define distFeatureMask 0x00020000UL + #define initFeatureMask 0x00010000UL + +-class ReorderingOutput { ++class ReorderingOutput : public UMemory { + private: + le_int32 fOutIndex; + LEUnicode *fOutChars; +@@ -187,8 +189,7 @@ + fOutIndex += 1; + } + +- le_bool noteMatra(const IndicClassTable *classTable, LEUnicode matra, le_uint32 matraIndex, +- FeatureMask matraFeatures, le_bool wordStart) ++ le_bool noteMatra(const IndicClassTable *classTable, LEUnicode matra, le_uint32 matraIndex, FeatureMask matraFeatures, le_bool wordStart) + { + IndicClassTable::CharClass matraClass = classTable->getCharClass(matra); + +@@ -219,13 +220,12 @@ + return FALSE; + } + +- void noteVowelModifier(const IndicClassTable *classTable, LEUnicode vowelModifier, +- le_uint32 vowelModifierIndex, FeatureMask vowelModifierFeatures) ++ void noteVowelModifier(const IndicClassTable *classTable, LEUnicode vowelModifier, le_uint32 vowelModifierIndex, FeatureMask vowelModifierFeatures) + { + IndicClassTable::CharClass vmClass = classTable->getCharClass(vowelModifier); + + fVMIndex = vowelModifierIndex; +- fVMFeatures = vowelModifierFeatures; ++ fVMFeatures = vowelModifierFeatures; + + if (IndicClassTable::isVowelModifier(vmClass)) { + switch (vmClass & CF_POS_MASK) { +@@ -244,13 +244,12 @@ + } + } + +- void noteStressMark(const IndicClassTable *classTable, LEUnicode stressMark, +- le_uint32 stressMarkIndex, FeatureMask stressMarkFeatures) ++ void noteStressMark(const IndicClassTable *classTable, LEUnicode stressMark, le_uint32 stressMarkIndex, FeatureMask stressMarkFeatures) + { + IndicClassTable::CharClass smClass = classTable->getCharClass(stressMark); + + fSMIndex = stressMarkIndex; +- fSMFeatures = stressMarkFeatures; ++ fSMFeatures = stressMarkFeatures; + + if (IndicClassTable::isStressMark(smClass)) { + switch (smClass & CF_POS_MASK) { +@@ -360,9 +359,7 @@ + }; + + // TODO: Find better names for these! +-#define tagArray4 (nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | \ +- blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | \ +- blwmFeatureMask | abvmFeatureMask | distFeatureMask) ++#define tagArray4 (nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask) + #define tagArray3 (pstfFeatureMask | tagArray4) + #define tagArray2 (halfFeatureMask | tagArray3) + #define tagArray1 (blwfFeatureMask | tagArray2) +@@ -415,8 +412,7 @@ + return featureMap; + } + +-le_int32 IndicReordering::findSyllable(const IndicClassTable *classTable, +- const LEUnicode *chars, le_int32 prev, le_int32 charCount) ++le_int32 IndicReordering::findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount) + { + le_int32 cursor = prev; + le_int8 state = 0; +@@ -752,3 +748,5 @@ + delete mpreFixups; + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/IndicReordering.h b/src/share/native/sun/font/layout/IndicReordering.h +--- jdk/src/share/native/sun/font/layout/IndicReordering.h ++++ jdk/src/share/native/sun/font/layout/IndicReordering.h +@@ -32,9 +32,16 @@ + #ifndef __INDICREORDERING_H + #define __INDICREORDERING_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + // Characters that get refered to by name... + #define C_SIGN_ZWNJ 0x200C + #define C_SIGN_ZWJ 0x200D +@@ -140,7 +147,7 @@ + static const IndicClassTable *getScriptClassTable(le_int32 scriptCode); + }; + +-class IndicReordering { ++class IndicReordering /* not : public UObject because all methods are static */ { + public: + static le_int32 getWorstCaseExpansion(le_int32 scriptCode); + +@@ -156,8 +163,7 @@ + // do not instantiate + IndicReordering(); + +- static le_int32 findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, +- le_int32 prev, le_int32 charCount); ++ static le_int32 findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount); + + }; + +@@ -305,4 +311,5 @@ + return hasBelowBaseForm(getCharClass(ch)); + } + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/KernTable.cpp b/src/share/native/sun/font/layout/KernTable.cpp +--- jdk/src/share/native/sun/font/layout/KernTable.cpp ++++ jdk/src/share/native/sun/font/layout/KernTable.cpp +@@ -25,6 +25,7 @@ + + /* + * ++ * + * (C) Copyright IBM Corp. 2004-2005 - All Rights Reserved + * + */ +@@ -39,6 +40,8 @@ + + #define DEBUG 0 + ++U_NAMESPACE_BEGIN ++ + struct PairInfo { + le_uint32 key; // sigh, MSVC compiler gags on union here + le_int16 value; // fword, kern value in funits +@@ -191,6 +194,12 @@ + float adjust = 0; + for (int i = 1, e = storage.getGlyphCount(); i < e; ++i) { + key = key << 16 | (storage[i] & 0xffff); ++ ++ // argh, to do a binary search, we need to have the pair list in sorted order ++ // but it is not in sorted order on win32 platforms because of the endianness difference ++ // so either I have to swap the element each time I examine it, or I have to swap ++ // all the elements ahead of time and store them in the font ++ + const PairInfo* p = pairs; + const PairInfo* tp = (const PairInfo*)(p + rangeShift); + if (key > tp->key) { +@@ -238,3 +247,6 @@ + storage.adjustPosition(storage.getGlyphCount(), adjust, 0, success); + } + } ++ ++U_NAMESPACE_END ++ +diff --git a/src/share/native/sun/font/layout/KernTable.h b/src/share/native/sun/font/layout/KernTable.h +--- jdk/src/share/native/sun/font/layout/KernTable.h ++++ jdk/src/share/native/sun/font/layout/KernTable.h +@@ -25,6 +25,7 @@ + + /* + * ++ * + * (C) Copyright IBM Corp. 2004-2005 - All Rights Reserved + * + */ +@@ -37,9 +38,12 @@ + #endif + + #include "LETypes.h" ++//#include "LEFontInstance.h" ++//#include "LEGlyphStorage.h" + + #include <stdio.h> + ++U_NAMESPACE_BEGIN + struct PairInfo; + class LEFontInstance; + class LEGlyphStorage; +@@ -67,4 +71,6 @@ + void process(LEGlyphStorage& storage); + }; + ++U_NAMESPACE_END ++ + #endif +diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp b/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp +@@ -23,8 +23,8 @@ + * + */ + ++ + /* +- * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + * This file is a modification of the ICU file IndicLayoutEngine.cpp +@@ -38,17 +38,20 @@ + #include "LEGlyphStorage.h" + #include "KhmerReordering.h" + +-KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, +- const GlyphSubstitutionTableHeader *gsubTable) ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(KhmerOpenTypeLayoutEngine) ++ ++KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable) + { + fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; + } + +-KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) ++KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags) + { + fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount); +@@ -63,16 +66,14 @@ + // Input: characters + // Output: characters, char indices, tags + // Returns: output character count +-le_int32 KhmerOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], +- le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, +- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 KhmerOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; + } + +- if (chars == NULL || offset < 0 || count < 0 || max < 0 || +- offset >= max || offset + count > max) { ++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } +@@ -96,9 +97,10 @@ + + // NOTE: assumes this allocates featureTags... + // (probably better than doing the worst case stuff here...) +- le_int32 outCharCount = KhmerReordering::reorder(&chars[offset], count, +- fScriptCode, outChars, glyphStorage); ++ le_int32 outCharCount = KhmerReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage); + + glyphStorage.adoptGlyphCount(outCharCount); + return outCharCount; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.h b/src/share/native/sun/font/layout/KhmerLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h +@@ -23,6 +23,7 @@ + * + */ + ++ + /* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved +@@ -45,19 +46,18 @@ + // #include "GlyphDefinitionTables.h" + // #include "GlyphPositioningTables.h" + ++U_NAMESPACE_BEGIN ++ + // class MPreFixups; + // class LEGlyphStorage; + + /** + * This class implements OpenType layout for Khmer OpenType fonts, as +- * specified by Microsoft in "Creating and Supporting OpenType Fonts +- * for Khmer Scripts" +- * (http://www.microsoft.com/typography/otspec/indicot/default.htm) +- * TODO: change url ++ * specified by Microsoft in "Creating and Supporting OpenType Fonts for ++ * Khmer Scripts" (http://www.microsoft.com/typography/otspec/indicot/default.htm) TODO: change url + * +- * This class overrides the characterProcessing method to do Khmer +- * character processing and reordering (See the MS spec. for more +- * details) ++ * This class overrides the characterProcessing method to do Khmer character processing ++ * and reordering (See the MS spec. for more details) + * + * @internal + */ +@@ -65,11 +65,10 @@ + { + public: + /** +- * This is the main constructor. It constructs an instance of +- * KhmerOpenTypeLayoutEngine for a particular font, script and +- * language. It takes the GSUB table as a parameter since +- * LayoutEngine::layoutEngineFactory has to read the GSUB table to +- * know that it has an Khmer OpenType font. ++ * This is the main constructor. It constructs an instance of KhmerOpenTypeLayoutEngine for ++ * a particular font, script and language. It takes the GSUB table as a parameter since ++ * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an ++ * Khmer OpenType font. + * + * @param fontInstance - the font + * @param scriptCode - the script +@@ -82,14 +81,12 @@ + * + * @internal + */ +- KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, +- const GlyphSubstitutionTableHeader *gsubTable); ++ KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); + + /** +- * This constructor is used when the font requires a "canned" GSUB +- * table which can't be known until after this constructor has +- * been invoked. ++ * This constructor is used when the font requires a "canned" GSUB table which can't be known ++ * until after this constructor has been invoked. + * + * @param fontInstance - the font + * @param scriptCode - the script +@@ -100,8 +97,8 @@ + * + * @internal + */ +- KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags); ++ KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -110,25 +107,35 @@ + */ + virtual ~KhmerOpenTypeLayoutEngine(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + protected: + + /** +- * This method does Khmer OpenType character processing. It +- * assigns the OpenType feature tags to the characters, and may +- * generate output characters which have been reordered. It may +- * also split some vowels, resulting in more output characters +- * than input characters. ++ * This method does Khmer OpenType character processing. It assigns the OpenType feature ++ * tags to the characters, and may generate output characters which have been reordered. ++ * It may also split some vowels, resulting in more output characters than input characters. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context +- * @param rightToLeft - <code>TRUE</code> if the characters are in +- * a right to left directional run +- * @param glyphStorage - the glyph storage object. The glyph and +- * character index arrays will be set. the auxillary data array +- * will be set to the feature tags. ++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run ++ * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. ++ * the auxillary data array will be set to the feature tags. + * + * Output parameters: + * @param success - set to an error code if the operation fails +@@ -137,9 +144,11 @@ + * + * @internal + */ +- virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, +- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/KhmerReordering.cpp b/src/share/native/sun/font/layout/KhmerReordering.cpp +--- jdk/src/share/native/sun/font/layout/KhmerReordering.cpp ++++ jdk/src/share/native/sun/font/layout/KhmerReordering.cpp +@@ -37,6 +37,9 @@ + #include "KhmerReordering.h" + #include "LEGlyphStorage.h" + ++ ++U_NAMESPACE_BEGIN ++ + // Characters that get refered to by name... + enum + { +@@ -53,35 +56,23 @@ + + enum + { +- // simple classes, they are used in the statetable (in this file) +- // to control the length of a syllable they are also used to know +- // where a character should be placed (location in reference to +- // the base character) and also to know if a character, when +- // independtly displayed, should be displayed with a dotted-circle +- // to indicate error in syllable construction +- ++ // simple classes, they are used in the statetable (in this file) to control the length of a syllable ++ // they are also used to know where a character should be placed (location in reference to the base character) ++ // and also to know if a character, when independtly displayed, should be displayed with a dotted-circle to ++ // indicate error in syllable construction + _xx = KhmerClassTable::CC_RESERVED, +- _sa = KhmerClassTable::CC_SIGN_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE +- | KhmerClassTable::CF_POS_ABOVE, +- _sp = KhmerClassTable::CC_SIGN_AFTER | KhmerClassTable::CF_DOTTED_CIRCLE +- | KhmerClassTable::CF_POS_AFTER, ++ _sa = KhmerClassTable::CC_SIGN_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_POS_ABOVE, ++ _sp = KhmerClassTable::CC_SIGN_AFTER | KhmerClassTable::CF_DOTTED_CIRCLE| KhmerClassTable::CF_POS_AFTER, + _c1 = KhmerClassTable::CC_CONSONANT | KhmerClassTable::CF_CONSONANT, + _c2 = KhmerClassTable::CC_CONSONANT2 | KhmerClassTable::CF_CONSONANT, + _c3 = KhmerClassTable::CC_CONSONANT3 | KhmerClassTable::CF_CONSONANT, +- _rb = KhmerClassTable::CC_ROBAT | KhmerClassTable::CF_POS_ABOVE +- | KhmerClassTable::CF_DOTTED_CIRCLE, +- _cs = KhmerClassTable::CC_CONSONANT_SHIFTER | KhmerClassTable::CF_DOTTED_CIRCLE +- | KhmerClassTable::CF_SHIFTER, +- _dl = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BEFORE +- | KhmerClassTable::CF_DOTTED_CIRCLE, +- _db = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BELOW +- | KhmerClassTable::CF_DOTTED_CIRCLE, +- _da = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_ABOVE +- | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_ABOVE_VOWEL, +- _dr = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_AFTER +- | KhmerClassTable::CF_DOTTED_CIRCLE, +- _co = KhmerClassTable::CC_COENG | KhmerClassTable::CF_COENG +- | KhmerClassTable::CF_DOTTED_CIRCLE, ++ _rb = KhmerClassTable::CC_ROBAT | KhmerClassTable::CF_POS_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE, ++ _cs = KhmerClassTable::CC_CONSONANT_SHIFTER | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_SHIFTER, ++ _dl = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BEFORE | KhmerClassTable::CF_DOTTED_CIRCLE, ++ _db = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BELOW | KhmerClassTable::CF_DOTTED_CIRCLE, ++ _da = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_ABOVE_VOWEL, ++ _dr = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_AFTER | KhmerClassTable::CF_DOTTED_CIRCLE, ++ _co = KhmerClassTable::CC_COENG | KhmerClassTable::CF_COENG | KhmerClassTable::CF_DOTTED_CIRCLE, + + // split vowel + _va = _da | KhmerClassTable::CF_SPLIT_VOWEL, +@@ -90,13 +81,10 @@ + + + // Character class tables +- +-// _xx character does not combine into syllable, such as numbers, +-// puntuation marks, non-Khmer signs... ++// _xx character does not combine into syllable, such as numbers, puntuation marks, non-Khmer signs... + // _sa Sign placed above the base + // _sp Sign placed after the base +-// _c1 Consonant of type 1 or independent vowel (independent vowels +-// behave as type 1 consonants) ++// _c1 Consonant of type 1 or independent vowel (independent vowels behave as type 1 consonants) + // _c2 Consonant of type 2 (only RO) + // _c3 Consonant of type 3 + // _rb Khmer sign robat u17CC. combining mark for subscript consonants +@@ -105,13 +93,10 @@ + // _db Dependent vowel placed below the base + // _da Dependent vowel placed above the base + // _dr Dependent vowel placed behind the base (right of the base) +-// _co Khmer combining mark COENG u17D2, combines with the consonant +-// or independent vowel following it to create a subscript consonant +-// or independent vowel +-// _va Khmer split vowel in wich the first part is before the base and +-// the second one above the base +-// _vr Khmer split vowel in wich the first part is before the base and +-// the second one behind (right of) the base ++// _co Khmer combining mark COENG u17D2, combines with the consonant or independent vowel following ++// it to create a subscript consonant or independent vowel ++// _va Khmer split vowel in wich the first part is before the base and the second one above the base ++// _vr Khmer split vowel in wich the first part is before the base and the second one behind (right of) the base + + static const KhmerClassTable::CharClass khmerCharClasses[] = + { +@@ -129,19 +114,19 @@ + // + + // +-// The range of characters defined in the above table is defined +-// here. FOr Khmer 1780 to 17DF Even if the Khmer range is bigger, all +-// other characters are not combinable, and therefore treated as _xx ++// The range of characters defined in the above table is defined here. FOr Khmer 1780 to 17DF ++// Even if the Khmer range is bigger, all other characters are not combinable, and therefore treated ++// as _xx + static const KhmerClassTable khmerClassTable = {0x1780, 0x17df, khmerCharClasses}; + + +-// Below we define how a character in the input string is either in +-// the khmerCharClasses table (in which case we get its type back), a +-// ZWJ or ZWNJ (two characters that may appear within the syllable, +-// but are not in the table) we also get their type back, or an +-// unknown object in which case we get _xx (CC_RESERVED) back ++// Below we define how a character in the input string is either in the khmerCharClasses table ++// (in which case we get its type back), a ZWJ or ZWNJ (two characters that may appear ++// within the syllable, but are not in the table) we also get their type back, or an unknown object ++// in which case we get _xx (CC_RESERVED) back + KhmerClassTable::CharClass KhmerClassTable::getCharClass(LEUnicode ch) const + { ++ + if (ch == C_SIGN_ZWJ) { + return CC_ZERO_WIDTH_J_MARK; + } +@@ -164,13 +149,14 @@ + + + +-class ReorderingOutput { ++class ReorderingOutput : public UMemory { + private: + le_int32 fOutIndex; + LEUnicode *fOutChars; + + LEGlyphStorage &fGlyphStorage; + ++ + public: + ReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage) + : fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage) +@@ -232,18 +218,11 @@ + #define abvmFeatureMask 0x00100000UL + #define mkmkFeatureMask 0x00080000UL + +-#define tagPref (prefFeatureMask | presFeatureMask | \ +- cligFeatureMask | distFeatureMask) +-#define tagAbvf (abvfFeatureMask | abvsFeatureMask | \ +- cligFeatureMask | distFeatureMask | abvmFeatureMask | mkmkFeatureMask) +-#define tagPstf (blwfFeatureMask | blwsFeatureMask | prefFeatureMask | \ +- presFeatureMask | pstfFeatureMask | pstsFeatureMask | cligFeatureMask | \ +- distFeatureMask | blwmFeatureMask) +-#define tagBlwf (blwfFeatureMask | blwsFeatureMask | cligFeatureMask | \ +- distFeatureMask | blwmFeatureMask | mkmkFeatureMask) +-#define tagDefault (prefFeatureMask | blwfFeatureMask | presFeatureMask | \ +- blwsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | \ +- blwmFeatureMask | mkmkFeatureMask) ++#define tagPref (prefFeatureMask | presFeatureMask | cligFeatureMask | distFeatureMask) ++#define tagAbvf (abvfFeatureMask | abvsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | mkmkFeatureMask) ++#define tagPstf (blwfFeatureMask | blwsFeatureMask | prefFeatureMask | presFeatureMask | pstfFeatureMask | pstsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask) ++#define tagBlwf (blwfFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask | mkmkFeatureMask) ++#define tagDefault (prefFeatureMask | blwfFeatureMask | presFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask | mkmkFeatureMask) + + + +@@ -274,35 +253,32 @@ + // The stateTable is used to calculate the end (the length) of a well + // formed Khmer Syllable. + // +-// Each horizontal line is ordered exactly the same way as the values +-// in KhmerClassTable CharClassValues in KhmerReordering.h This +-// coincidence of values allows the follow up of the table. ++// Each horizontal line is ordered exactly the same way as the values in KhmerClassTable ++// CharClassValues in KhmerReordering.h This coincidence of values allows the ++// follow up of the table. + // +-// Each line corresponds to a state, which does not necessarily need +-// to be a type of component... for example, state 2 is a base, with +-// is always a first character in the syllable, but the state could be +-// produced a consonant of any type when it is the first character +-// that is analysed (in ground state). ++// Each line corresponds to a state, which does not necessarily need to be a type ++// of component... for example, state 2 is a base, with is always a first character ++// in the syllable, but the state could be produced a consonant of any type when ++// it is the first character that is analysed (in ground state). + // + // Differentiating 3 types of consonants is necessary in order to + // forbid the use of certain combinations, such as having a second +-// coeng after a coeng RO. +-// The inexistent possibility of having a type 3 after another type 3 +-// is permitted, eliminating it would very much complicate the table, +-// and it does not create typing problems, as the case above. ++// coeng after a coeng RO, ++// The inexistent possibility of having a type 3 after another type 3 is permitted, ++// eliminating it would very much complicate the table, and it does not create typing ++// problems, as the case above. + // +-// The table is quite complex, in order to limit the number of coeng +-// consonants to 2 (by means of the table). ++// The table is quite complex, in order to limit the number of coeng consonants ++// to 2 (by means of the table). + // + // There a peculiarity, as far as Unicode is concerned: + // - The consonant-shifter is considered in two possible different +-// locations, the one considered in Unicode 3.0 and the one considered +-// in Unicode 4.0. (there is a backwards compatibility problem in this +-// standard). ++// locations, the one considered in Unicode 3.0 and the one considered in ++// Unicode 4.0. (there is a backwards compatibility problem in this standard). + + +-// xx independent character, such as a number, punctuation sign or +-// non-khmer char ++// xx independent character, such as a number, punctuation sign or non-khmer char + // + // c1 Khmer consonant of type 1 or an independent vowel + // that is, a letter in which the subscript for is only under the +@@ -320,10 +296,9 @@ + // + // co coeng character (u17D2) + // +-// dv dependent vowel (including split vowels, they are treated in the +-// same way). even if dv is not defined above, the component that is +-// really tested for is KhmerClassTable::CC_DEPENDENT_VOWEL, which is +-// common to all dependent vowels ++// dv dependent vowel (including split vowels, they are treated in the same way). ++// even if dv is not defined above, the component that is really tested for is ++// KhmerClassTable::CC_DEPENDENT_VOWEL, which is common to all dependent vowels + // + // zwj Zero Width joiner + // +@@ -352,8 +327,7 @@ + {-1, -1, -1, -1, 12, 13, -1, -1, 16, 17, 1, 14}, // 8 - First consonant of type 2 after coeng + {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, // 9 - First consonant or type 3 after ceong + {-1, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1}, // 10 - Second Coeng (no register shifter before) +- {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 11 - Second coeng consonant +- // (or ind. vowel) no register shifter before ++ {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 11 - Second coeng consonant (or ind. vowel) no register shifter before + {-1, -1, 1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, // 12 - Second ZWNJ before a register shifter + {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 13 - Second register shifter + {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, // 14 - ZWJ before vowel +@@ -363,6 +337,7 @@ + {-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1}, // 18 - ZWJ after vowel + {-1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1}, // 19 - Third coeng + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, // 20 - dependent vowel after a Robat ++ + }; + + +@@ -377,15 +352,13 @@ + // Given an input string of characters and a location in which to start looking + // calculate, using the state table, which one is the last character of the syllable + // that starts in the starting position. +-le_int32 KhmerReordering::findSyllable(const KhmerClassTable *classTable, +- const LEUnicode *chars, le_int32 prev, le_int32 charCount) ++le_int32 KhmerReordering::findSyllable(const KhmerClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount) + { + le_int32 cursor = prev; + le_int8 state = 0; + + while (cursor < charCount) { +- KhmerClassTable::CharClass charClass = (classTable->getCharClass(chars[cursor]) +- & KhmerClassTable::CF_CLASS_MASK); ++ KhmerClassTable::CharClass charClass = (classTable->getCharClass(chars[cursor]) & KhmerClassTable::CF_CLASS_MASK); + + state = khmerStateTable[state][charClass]; + +@@ -402,8 +375,8 @@ + + // This is the real reordering function as applied to the Khmer language + +-le_int32 KhmerReordering::reorder(const LEUnicode *chars, le_int32 charCount, +- le_int32 /*scriptCode*/, LEUnicode *outChars, LEGlyphStorage &glyphStorage) ++le_int32 KhmerReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32 /*scriptCode*/, ++ LEUnicode *outChars, LEGlyphStorage &glyphStorage) + { + const KhmerClassTable *classTable = KhmerClassTable::getKhmerClassTable(); + +@@ -442,8 +415,7 @@ + // and because CC_CONSONANT2 is enough to identify it, as it is the only consonant + // with this flag + if ( (charClass & KhmerClassTable::CF_COENG) && (i + 1 < syllable) && +- ( (classTable->getCharClass(chars[i + 1]) & +- KhmerClassTable::CF_CLASS_MASK) == KhmerClassTable::CC_CONSONANT2) ) ++ ( (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_CLASS_MASK) == KhmerClassTable::CC_CONSONANT2) ) + { + coengRo = i; + } +@@ -455,16 +427,15 @@ + output.writeChar(C_RO, coengRo + 1, tagPref); + } + +- // shall we add a dotted circle? If in the position in which +- // the base should be (first char in the string) there is a +- // character that has the Dotted circle flag (a character that +- // cannot be a base) then write a dotted circle ++ // shall we add a dotted circle? ++ // If in the position in which the base should be (first char in the string) there is ++ // a character that has the Dotted circle flag (a character that cannot be a base) ++ // then write a dotted circle + if (classTable->getCharClass(chars[prev]) & KhmerClassTable::CF_DOTTED_CIRCLE) { + output.writeChar(C_DOTTED_CIRCLE, prev, tagDefault); + } + +- // copy what is left to the output, skipping before vowels and +- // coeng Ro if they are present ++ // copy what is left to the output, skipping before vowels and coeng Ro if they are present + for (i = prev; i < syllable; i += 1) { + charClass = classTable->getCharClass(chars[i]); + +@@ -515,30 +486,14 @@ + // and there is an extra rule for C_VOWEL_AA + C_SIGN_NIKAHIT also for two + // different positions, right after the shifter or after a vowel (Unicode 4) + if ( (charClass & KhmerClassTable::CF_SHIFTER) && (i + 1 < syllable) ) { +- if (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_ABOVE_VOWEL ) { +- output.writeChar(chars[i], i, tagBlwf); +- break; +- } +- if (i + 2 < syllable && +- ( (classTable->getCharClass(chars[i + 1]) & +- KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA) && +- ( (classTable->getCharClass(chars[i + 2]) & +- KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT) ) +- { +- output.writeChar(chars[i], i, tagBlwf); +- break; +- } +- if (i + 3 < syllable && (classTable->getCharClass(chars[i + 3]) & +- KhmerClassTable::CF_ABOVE_VOWEL) ) +- { +- output.writeChar(chars[i], i, tagBlwf); +- break; +- } +- if (i + 4 < syllable && +- ( (classTable->getCharClass(chars[i + 3]) & +- KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA) && +- ( (classTable->getCharClass(chars[i + 4]) & +- KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT) ) ++ if ((classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_ABOVE_VOWEL) ++ || (i + 2 < syllable ++ && ( (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA) ++ && ( (classTable->getCharClass(chars[i + 2]) & KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT)) ++ || (i + 3 < syllable && (classTable->getCharClass(chars[i + 3]) & KhmerClassTable::CF_ABOVE_VOWEL)) ++ || (i + 4 < syllable ++ && ( (classTable->getCharClass(chars[i + 3]) & KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA) ++ && ( (classTable->getCharClass(chars[i + 4]) & KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT) ) ) + { + output.writeChar(chars[i], i, tagBlwf); + break; +@@ -556,3 +511,6 @@ + + return output.getOutputIndex(); + } ++ ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/KhmerReordering.h b/src/share/native/sun/font/layout/KhmerReordering.h +--- jdk/src/share/native/sun/font/layout/KhmerReordering.h ++++ jdk/src/share/native/sun/font/layout/KhmerReordering.h +@@ -24,7 +24,6 @@ + */ + + /* +- * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + * This file is a modification of the ICU file IndicReordering.h +@@ -35,80 +34,60 @@ + #ifndef __KHMERREORDERING_H + #define __KHMERREORDERING_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + // Vocabulary +- +-// Base -> +-// A consonant or an independent vowel in its full (not +-// subscript) form. It is the center of the syllable, it can be +-// souranded by coeng (subscript) consonants, vowels, split +-// vowels, signs... but there is only one base in a syllable, it +-// has to be coded as the first character of the syllable. +-// split vowel -> +-// vowel that has two parts placed separately (e.g. Before and +-// after the consonant). Khmer language has five of them. Khmer +-// split vowels either have one part before the base and one after +-// the base or they have a part before the base and a part above +-// the base. The first part of all Khmer split vowels is the same +-// character, identical to the glyph of Khmer dependent vowel SRA +-// EI +-// coeng -> +-// modifier used in Khmer to construct coeng (subscript) +-// consonants differently than indian languages, the coeng +-// modifies the consonant that follows it, not the one preceding +-// it Each consonant has two forms, the base form and the +-// subscript form the base form is the normal one (using the +-// consonants code-point), the subscript form is displayed when +-// the combination coeng + consonant is encountered. +-// Consonant of type 1 -> +-// A consonant which has subscript for that only occupies space +-// under a base consonant +-// Consonant of type 2 -> +-// Its subscript form occupies space under and before the base +-// (only one, RO) +-// Consonant of Type 3 -> +-// Its subscript form occupies space under and after the base +-// (KHO, CHHO, THHO, BA, YO, SA) +-// Consonant shifter -> +-// Khmer has to series of consonants. The same dependent vowel has +-// different sounds if it is attached to a consonant of the first +-// series or a consonant of the second series Most consonants have +-// an equivalent in the other series, but some of theme exist only +-// in one series (for example SA). If we want to use the consonant +-// SA with a vowel sound that can only be done with a vowel sound +-// that corresponds to a vowel accompanying a consonant of the +-// other series, then we need to use a consonant shifter: TRIISAP +-// or MUSIKATOAN x17C9 y x17CA. TRIISAP changes a first series +-// consonant to second series sound and MUSIKATOAN a second series +-// consonant to have a first series vowel sound. Consonant +-// shifter are both normally supercript marks, but, when they are +-// followed by a superscript, they change shape and take the form +-// of subscript dependent vowel SRA U. If they are in the same +-// syllable as a coeng consonant, Unicode 3.0 says that they +-// should be typed before the coeng. Unicode 4.0 breaks the +-// standard and says that it should be placed after the coeng +-// consonant. +-// Dependent vowel -> +-// In khmer dependent vowels can be placed above, below, before or +-// after the base Each vowel has its own position. Only one vowel +-// per syllable is allowed. +-// Signs -> +-// Khmer has above signs and post signs. Only one above sign +-// and/or one post sign are Allowed in a syllable. ++// Base -> A consonant or an independent vowel in its full (not subscript) form. It is the ++// center of the syllable, it can be souranded by coeng (subscript) consonants, vowels, ++// split vowels, signs... but there is only one base in a syllable, it has to be coded as ++// the first character of the syllable. ++// split vowel --> vowel that has two parts placed separately (e.g. Before and after the consonant). ++// Khmer language has five of them. Khmer split vowels either have one part before the ++// base and one after the base or they have a part before the base and a part above the base. ++// The first part of all Khmer split vowels is the same character, identical to ++// the glyph of Khmer dependent vowel SRA EI ++// coeng --> modifier used in Khmer to construct coeng (subscript) consonants ++// Differently than indian languages, the coeng modifies the consonant that follows it, ++// not the one preceding it Each consonant has two forms, the base form and the subscript form ++// the base form is the normal one (using the consonants code-point), the subscript form is ++// displayed when the combination coeng + consonant is encountered. ++// Consonant of type 1 -> A consonant which has subscript for that only occupies space under a base consonant ++// Consonant of type 2.-> Its subscript form occupies space under and before the base (only one, RO) ++// Consonant of Type 3 -> Its subscript form occupies space under and after the base (KHO, CHHO, THHO, BA, YO, SA) ++// Consonant shifter -> Khmer has to series of consonants. The same dependent vowel has different sounds ++// if it is attached to a consonant of the first series or a consonant of the second series ++// Most consonants have an equivalent in the other series, but some of theme exist only in ++// one series (for example SA). If we want to use the consonant SA with a vowel sound that ++// can only be done with a vowel sound that corresponds to a vowel accompanying a consonant ++// of the other series, then we need to use a consonant shifter: TRIISAP or MUSIKATOAN ++// x17C9 y x17CA. TRIISAP changes a first series consonant to second series sound and ++// MUSIKATOAN a second series consonant to have a first series vowel sound. ++// Consonant shifter are both normally supercript marks, but, when they are followed by a ++// superscript, they change shape and take the form of subscript dependent vowel SRA U. ++// If they are in the same syllable as a coeng consonant, Unicode 3.0 says that they ++// should be typed before the coeng. Unicode 4.0 breaks the standard and says that it should ++// be placed after the coeng consonant. ++// Dependent vowel -> In khmer dependent vowels can be placed above, below, before or after the base ++// Each vowel has its own position. Only one vowel per syllable is allowed. ++// Signs -> Khmer has above signs and post signs. Only one above sign and/or one post sign are ++// Allowed in a syllable. ++// + // + +-// This list must include all types of components that can be used +-// inside a syllable +-struct KhmerClassTable ++struct KhmerClassTable // This list must include all types of components that can be used inside a syllable + { +- // order is important here! This order must be the same that is +- // found in each horizontal line in the statetable for Khmer (file +- // KhmerReordering.cpp). +- enum CharClassValues ++ enum CharClassValues // order is important here! This order must be the same that is found in each horizontal ++ // line in the statetable for Khmer (file KhmerReordering.cpp). + { + CC_RESERVED = 0, + CC_CONSONANT = 1, // consonant of type 1 or independent vowel +@@ -116,8 +95,7 @@ + CC_CONSONANT3 = 3, // Consonant of type 3 + CC_ZERO_WIDTH_NJ_MARK = 4, // Zero Width non joiner character (0x200C) + CC_CONSONANT_SHIFTER = 5, +- CC_ROBAT = 6, // Khmer special diacritic accent +- // -treated differently in state table ++ CC_ROBAT = 6, // Khmer special diacritic accent -treated differently in state table + CC_COENG = 7, // Subscript consonant combining character + CC_DEPENDENT_VOWEL = 8, + CC_SIGN_ABOVE = 9, +@@ -131,10 +109,8 @@ + CF_CLASS_MASK = 0x0000FFFF, + + CF_CONSONANT = 0x01000000, // flag to speed up comparing +- CF_SPLIT_VOWEL = 0x02000000, // flag for a split vowel -> the first part +- // is added in front of the syllable +- CF_DOTTED_CIRCLE = 0x04000000, // add a dotted circle if a character with +- // this flag is the first in a syllable ++ CF_SPLIT_VOWEL = 0x02000000, // flag for a split vowel -> the first part is added in front of the syllable ++ CF_DOTTED_CIRCLE = 0x04000000, // add a dotted circle if a character with this flag is the first in a syllable + CF_COENG = 0x08000000, // flag to speed up comparing + CF_SHIFTER = 0x10000000, // flag to speed up comparing + CF_ABOVE_VOWEL = 0x20000000, // flag to speed up comparing +@@ -161,10 +137,10 @@ + }; + + +-class KhmerReordering { ++class KhmerReordering /* not : public UObject because all methods are static */ { + public: +- static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, +- le_int32 scriptCode, LEUnicode *outChars, LEGlyphStorage &glyphStorage); ++ static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, ++ LEUnicode *outChars, LEGlyphStorage &glyphStorage); + + static const FeatureMap *getFeatureMap(le_int32 &count); + +@@ -172,8 +148,10 @@ + // do not instantiate + KhmerReordering(); + +- static le_int32 findSyllable(const KhmerClassTable *classTable, +- const LEUnicode *chars, le_int32 prev, le_int32 charCount); ++ static le_int32 findSyllable(const KhmerClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount); ++ + }; + ++ ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/LEFontInstance.cpp b/src/share/native/sun/font/layout/LEFontInstance.cpp +--- jdk/src/share/native/sun/font/layout/LEFontInstance.cpp ++++ jdk/src/share/native/sun/font/layout/LEFontInstance.cpp +@@ -24,7 +24,6 @@ + */ + + /* +- * + ******************************************************************************* + * + * Copyright (C) 1999-2005, International Business Machines +@@ -42,6 +41,10 @@ + #include "LEFontInstance.h" + #include "LEGlyphStorage.h" + ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEFontInstance) ++ + const LEFontInstance *LEFontInstance::getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, + le_int32 script, LEErrorCode &success) const + { +@@ -59,7 +62,7 @@ + } + + void LEFontInstance::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, +- le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const ++ le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const + { + le_int32 i, out = 0, dir = 1; + +@@ -100,3 +103,5 @@ + + return mapCharToGlyph(mappedChar); + } ++U_NAMESPACE_END ++ +diff --git a/src/share/native/sun/font/layout/LEFontInstance.h b/src/share/native/sun/font/layout/LEFontInstance.h +--- jdk/src/share/native/sun/font/layout/LEFontInstance.h ++++ jdk/src/share/native/sun/font/layout/LEFontInstance.h +@@ -34,6 +34,12 @@ + #define __LEFONTINSTANCE_H + + #include "LETypes.h" ++/** ++ * \file ++ * \brief C++ API: Layout Engine Font Instance object ++ */ ++ ++U_NAMESPACE_BEGIN + + /** + * Instances of this class are used by <code>LEFontInstance::mapCharsToGlyphs</code> and +@@ -44,7 +50,7 @@ + * + * @stable ICU 3.2 + */ +-class LECharMapper ++class LECharMapper /* not : public UObject because this is an interface/mixin class */ + { + public: + /** +@@ -97,7 +103,7 @@ + * + * @draft ICU 3.0 + */ +-class LEFontInstance ++class U_LAYOUT_API LEFontInstance : public UObject + { + public: + +@@ -160,8 +166,7 @@ + * + * @stable ICU 3.2 + */ +- virtual const LEFontInstance *getSubFont(const LEUnicode chars[], le_int32 *offset, +- le_int32 limit, le_int32 script, LEErrorCode &success) const; ++ virtual const LEFontInstance *getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, le_int32 script, LEErrorCode &success) const; + + // + // Font file access +@@ -238,8 +243,7 @@ + * + * @draft ICU 3.0 + */ +- virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, +- le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const; ++ virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const; + + /** + * This method maps a single character to a glyph index, using the +@@ -502,6 +506,21 @@ + * @stable ICU 3.2 + */ + virtual le_int32 getLineHeight() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 3.2 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 3.2 ++ */ ++ static UClassID getStaticClassID(); ++ + }; + + inline le_bool LEFontInstance::canDisplay(LEUnicode32 ch) const +@@ -562,4 +581,7 @@ + return getAscent() + getDescent() + getLeading(); + } + ++U_NAMESPACE_END + #endif ++ ++ +diff --git a/src/share/native/sun/font/layout/LEGlyphFilter.h b/src/share/native/sun/font/layout/LEGlyphFilter.h +--- jdk/src/share/native/sun/font/layout/LEGlyphFilter.h ++++ jdk/src/share/native/sun/font/layout/LEGlyphFilter.h +@@ -34,14 +34,15 @@ + + #include "LETypes.h" + ++U_NAMESPACE_BEGIN ++ + /** + * This is a helper class that is used to + * recognize a set of glyph indices. + * + * @internal + */ +-class LEGlyphFilter +-{ ++class LEGlyphFilter /* not : public UObject because this is an interface/mixin class */ { + public: + /** + * Destructor. +@@ -63,4 +64,5 @@ + virtual le_bool accept(LEGlyphID glyph) const = 0; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/LEGlyphStorage.cpp b/src/share/native/sun/font/layout/LEGlyphStorage.cpp +--- jdk/src/share/native/sun/font/layout/LEGlyphStorage.cpp ++++ jdk/src/share/native/sun/font/layout/LEGlyphStorage.cpp +@@ -24,7 +24,6 @@ + */ + + /* +- * + ********************************************************************** + * Copyright (C) 1998-2005, International Business Machines + * Corporation and others. All Rights Reserved. +@@ -35,6 +34,10 @@ + #include "LEInsertionList.h" + #include "LEGlyphStorage.h" + ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEGlyphStorage) ++ + LEGlyphStorage::LEGlyphStorage() + : fGlyphCount(0), fGlyphs(NULL), fCharIndices(NULL), fPositions(NULL), + fAuxData(NULL), fInsertionList(NULL), fSrcIndex(0), fDestIndex(0) +@@ -603,3 +606,6 @@ + + return FALSE; + } ++ ++U_NAMESPACE_END ++ +diff --git a/src/share/native/sun/font/layout/LEGlyphStorage.h b/src/share/native/sun/font/layout/LEGlyphStorage.h +--- jdk/src/share/native/sun/font/layout/LEGlyphStorage.h ++++ jdk/src/share/native/sun/font/layout/LEGlyphStorage.h +@@ -24,7 +24,6 @@ + */ + + /* +- * + ********************************************************************** + * Copyright (C) 1998-2005, International Business Machines + * Corporation and others. All Rights Reserved. +@@ -38,6 +37,13 @@ + #include "LEInsertionList.h" + + /** ++ * \file ++ * \brief C++ API: This class encapsulates the per-glyph storage used by the ICU LayoutEngine. ++ */ ++ ++U_NAMESPACE_BEGIN ++ ++/** + * This class encapsulates the per-glyph storage used by the ICU LayoutEngine. + * For each glyph it holds the glyph ID, the index of the backing store character + * which produced the glyph, the X and Y position of the glyph and an auxillary data +@@ -50,7 +56,7 @@ + * + * @draft ICU 3.6 + */ +-class U_LAYOUT_API LEGlyphStorage : protected LEInsertionCallback ++class U_LAYOUT_API LEGlyphStorage : public UObject, protected LEInsertionCallback + { + private: + /** +@@ -112,35 +118,37 @@ + + protected: + /** +- * This implements <code>LEInsertionCallback</code>. The +- * <code>LEInsertionList</code> will call this method once for +- * each insertion. ++ * This implements <code>LEInsertionCallback</code>. The <code>LEInsertionList</code> ++ * will call this method once for each insertion. + * + * @param atPosition the position of the insertion + * @param count the number of glyphs being inserted + * @param newGlyphs the address of the new glyph IDs + * +- * @return <code>true</code> if <code>LEInsertionList</code> +- * should stop processing the insertion list after this insertion. ++ * @return <code>true</code> if <code>LEInsertionList</code> should stop ++ * processing the insertion list after this insertion. + * + * @see LEInsertionList.h + * + * @draft ICU 3.0 + */ +- virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, +- LEGlyphID newGlyphs[]); ++ virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]); + + public: + + /** +- * Allocates an empty <code>LEGlyphStorage</code> object. You must +- * call <code>allocateGlyphArray, allocatePositions and +- * allocateAuxData</code> to allocate the data. ++ * Allocates an empty <code>LEGlyphStorage</code> object. You must call ++ * <code>allocateGlyphArray, allocatePositions and allocateAuxData</code> ++ * to allocate the data. ++ * ++ * @draft ICU 3.0 + */ + LEGlyphStorage(); + + /** + * The destructor. This will deallocate all of the arrays. ++ * ++ * @draft ICU 3.0 + */ + ~LEGlyphStorage(); + +@@ -154,9 +162,9 @@ + inline le_int32 getGlyphCount() const; + + /** +- * This method copies the glyph array into a caller supplied +- * array. The caller must ensure that the array is large enough +- * to hold all the glyphs. ++ * This method copies the glyph array into a caller supplied array. ++ * The caller must ensure that the array is large enough to hold all ++ * the glyphs. + * + * @param glyphs - the destiniation glyph array + * @param success - set to an error code if the operation fails +@@ -166,10 +174,10 @@ + void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const; + + /** +- * This method copies the glyph array into a caller supplied +- * array, ORing in extra bits. (This functionality is needed by +- * the JDK, which uses 32 bits pre glyph idex, with the high 16 +- * bits encoding the composite font slot number) ++ * This method copies the glyph array into a caller supplied array, ++ * ORing in extra bits. (This functionality is needed by the JDK, ++ * which uses 32 bits pre glyph idex, with the high 16 bits encoding ++ * the composite font slot number) + * + * @param glyphs - the destination (32 bit) glyph array + * @param extraBits - this value will be ORed with each glyph index +@@ -177,13 +185,12 @@ + * + * @draft ICU 3.0 + */ +- void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, +- LEErrorCode &success) const; ++ void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const; + + /** +- * This method copies the character index array into a caller +- * supplied array. The caller must ensure that the array is large +- * enough to hold a character index for each glyph. ++ * This method copies the character index array into a caller supplied array. ++ * The caller must ensure that the array is large enough to hold a ++ * character index for each glyph. + * + * @param charIndices - the destiniation character index array + * @param success - set to an error code if the operation fails +@@ -193,9 +200,9 @@ + void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const; + + /** +- * This method copies the character index array into a caller +- * supplied array. The caller must ensure that the array is large +- * enough to hold a character index for each glyph. ++ * This method copies the character index array into a caller supplied array. ++ * The caller must ensure that the array is large enough to hold a ++ * character index for each glyph. + * + * @param charIndices - the destiniation character index array + * @param indexBase - an offset which will be added to each index +@@ -203,14 +210,13 @@ + * + * @draft ICU 3.0 + */ +- void getCharIndices(le_int32 charIndices[], le_int32 indexBase, +- LEErrorCode &success) const; ++ void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const; + + /** +- * This method copies the position array into a caller supplied +- * array. The caller must ensure that the array is large enough +- * to hold an X and Y position for each glyph, plus an extra X and +- * Y for the advance of the last glyph. ++ * This method copies the position array into a caller supplied array. ++ * The caller must ensure that the array is large enough to hold an ++ * X and Y position for each glyph, plus an extra X and Y for the ++ * advance of the last glyph. + * + * @param positions - the destiniation position array + * @param success - set to an error code if the operation fails +@@ -233,33 +239,27 @@ + * + * @draft ICU 3.0 + */ +- void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, +- LEErrorCode &success) const; ++ void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const; + + /** +- * This method allocates the glyph array, the char indices array +- * and the insertion list. You must call this method before using +- * the object. This method also initializes the char indices ++ * This method allocates the glyph array, the char indices array and the insertion list. You ++ * must call this method before using the object. This method also initializes the char indices + * array. +- * @param initialGlyphCount the initial size of the glyph and char +- * indices arrays. +- * @param rightToLeft <code>true</code> if the original input text +- * is right to left. +- * @param success set to an error code if the storage cannot be +- * allocated of if the initial glyph count is not positive. ++ * ++ * @param initialGlyphCount the initial size of the glyph and char indices arrays. ++ * @param rightToLeft <code>true</code> if the original input text is right to left. ++ * @param success set to an error code if the storage cannot be allocated of if the initial ++ * glyph count is not positive. + * + * @draft ICU 3.0 + */ +- void allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, +- LEErrorCode &success); ++ void allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, LEErrorCode &success); + + /** +- * This method allocates the storage for the glyph positions. It +- * allocates one extra X, Y position pair for the position just +- * after the last glyph. ++ * This method allocates the storage for the glyph positions. It allocates one extra X, Y ++ * position pair for the position just after the last glyph. + * +- * @param success set to an error code if the positions array +- * cannot be allocated. ++ * @param success set to an error code if the positions array cannot be allocated. + * + * @return the number of X, Y position pairs allocated. + * +@@ -270,8 +270,7 @@ + /** + * This method allocates the storage for the auxillary glyph data. + * +- * @param success set to an error code if the aulillary data array +- * cannot be allocated. ++ * @param success set to an error code if the aulillary data array cannot be allocated. + * + * @return the size of the auxillary data array. + * +@@ -282,10 +281,8 @@ + /** + * Copy the entire auxillary data array. + * +- * @param auxData the auxillary data array will be copied to this +- * address +- * @param success set to an error code if the data cannot be +- * copied ++ * @param auxData the auxillary data array will be copied to this address ++ * @param success set to an error code if the data cannot be copied + * + * @draft ICU 3.6 + */ +@@ -295,8 +292,7 @@ + * Get the glyph ID for a particular glyph. + * + * @param glyphIndex the index into the glyph array +- * @param success set to an error code if the glyph ID cannot be +- * retrieved. ++ * @param success set to an error code if the glyph ID cannot be retrieved. + * + * @return the glyph ID + * +@@ -308,8 +304,7 @@ + * Get the char index for a particular glyph. + * + * @param glyphIndex the index into the glyph array +- * @param success set to an error code if the char index cannot be +- * retrieved. ++ * @param success set to an error code if the char index cannot be retrieved. + * + * @return the character index + * +@@ -322,8 +317,7 @@ + * Get the auxillary data for a particular glyph. + * + * @param glyphIndex the index into the glyph array +- * @param success set to an error code if the auxillary data +- * cannot be retrieved. ++ * @param success set to an error code if the auxillary data cannot be retrieved. + * + * @return the auxillary data + * +@@ -345,11 +339,10 @@ + + /** + * Call this method to replace a single glyph in the glyph array +- * with multiple glyphs. This method uses the +- * <code>LEInsertionList</code> to do the insertion. It returns +- * the address of storage where the new glyph IDs can be +- * stored. They will not actually be inserted into the glyph array +- * until <code>applyInsertions</code> is called. ++ * with multiple glyphs. This method uses the <code>LEInsertionList</code> ++ * to do the insertion. It returns the address of storage where the new ++ * glyph IDs can be stored. They will not actually be inserted into the ++ * glyph array until <code>applyInsertions</code> is called. + * + * @param atIndex the index of the glyph to be replaced + * @param insertCount the number of glyphs to replace it with +@@ -381,26 +374,22 @@ + * + * @param glyphIndex the index of the glyph + * @param glyphID the new glyph ID +- * @param success will be set to an error code if the glyph ID +- * cannot be set. ++ * @param success will be set to an error code if the glyph ID cannot be set. + * + * @draft ICU 3.0 + */ +- void setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, +- LEErrorCode &success); ++ void setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, LEErrorCode &success); + + /** + * Set the char index for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param charIndex the new char index +- * @param success will be set to an error code if the char index +- * cannot be set. ++ * @param success will be set to an error code if the char index cannot be set. + * + * @draft ICU 3.0 + */ +- void setCharIndex(le_int32 glyphIndex, le_int32 charIndex, +- LEErrorCode &success); ++ void setCharIndex(le_int32 glyphIndex, le_int32 charIndex, LEErrorCode &success); + + /** + * Set the X, Y position for a particular glyph. +@@ -408,13 +397,11 @@ + * @param glyphIndex the index of the glyph + * @param x the new X position + * @param y the new Y position +- * @param success will be set to an error code if the position +- * cannot be set. ++ * @param success will be set to an error code if the position cannot be set. + * + * @draft ICU 3.0 + */ +- void setPosition(le_int32 glyphIndex, float x, float y, +- LEErrorCode &success); ++ void setPosition(le_int32 glyphIndex, float x, float y, LEErrorCode &success); + + /** + * Adjust the X, Y position for a particular glyph. +@@ -422,21 +409,18 @@ + * @param glyphIndex the index of the glyph + * @param xAdjust the adjustment to the glyph's X position + * @param yAdjust the adjustment to the glyph's Y position +- * @param success will be set to an error code if the glyph's +- * position cannot be adjusted. ++ * @param success will be set to an error code if the glyph's position cannot be adjusted. + * + * @draft ICU 3.0 + */ +- void adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, +- LEErrorCode &success); ++ void adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success); + + /** + * Set the auxillary data for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param auxData the new auxillary data +- * @param success will be set to an error code if the auxillary +- * data cannot be set. ++ * @param success will be set to an error code if the auxillary data cannot be set. + * + * @draft ICU 3.6 + */ +@@ -511,14 +495,28 @@ + void adoptGlyphCount(le_int32 newGlyphCount); + + /** +- * This method frees the glyph, character index, position and +- * auxillary data arrays so that the LayoutEngine can be reused to +- * layout a different characer array. (This method is also called ++ * This method frees the glyph, character index, position and ++ * auxillary data arrays so that the LayoutEngine can be reused ++ * to layout a different characer array. (This method is also called + * by the destructor) + * + * @draft ICU 3.0 + */ + void reset(); ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @draft ICU 3.0 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @draft ICU 3.0 ++ */ ++ static UClassID getStaticClassID(); + }; + + inline le_int32 LEGlyphStorage::getGlyphCount() const +@@ -531,4 +529,7 @@ + return fGlyphs[glyphIndex]; + } + ++ ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/LEInsertionList.cpp b/src/share/native/sun/font/layout/LEInsertionList.cpp +--- jdk/src/share/native/sun/font/layout/LEInsertionList.cpp ++++ jdk/src/share/native/sun/font/layout/LEInsertionList.cpp +@@ -24,7 +24,6 @@ + */ + + /* +- * + ********************************************************************** + * Copyright (C) 1998-2004, International Business Machines + * Corporation and others. All Rights Reserved. +@@ -34,6 +33,8 @@ + #include "LETypes.h" + #include "LEInsertionList.h" + ++U_NAMESPACE_BEGIN ++ + #define ANY_NUMBER 1 + + struct InsertionRecord +@@ -44,6 +45,8 @@ + LEGlyphID glyphs[ANY_NUMBER]; + }; + ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEInsertionList) ++ + LEInsertionList::LEInsertionList(le_bool rightToLeft) + : head(NULL), tail(NULL), growAmount(0), append(rightToLeft) + { +@@ -106,3 +109,5 @@ + + return FALSE; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/LEInsertionList.h b/src/share/native/sun/font/layout/LEInsertionList.h +--- jdk/src/share/native/sun/font/layout/LEInsertionList.h ++++ jdk/src/share/native/sun/font/layout/LEInsertionList.h +@@ -24,7 +24,6 @@ + */ + + /* +- * + ********************************************************************** + * Copyright (C) 1998-2004, International Business Machines + * Corporation and others. All Rights Reserved. +@@ -36,6 +35,8 @@ + + #include "LETypes.h" + ++U_NAMESPACE_BEGIN ++ + struct InsertionRecord; + + /** +@@ -78,7 +79,7 @@ + * + * @internal + */ +-class LEInsertionList ++class LEInsertionList : public UObject + { + public: + /** +@@ -140,6 +141,20 @@ + */ + void reset(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + private: + + /** +@@ -174,4 +189,6 @@ + le_bool append; + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/LELanguages.h b/src/share/native/sun/font/layout/LELanguages.h +--- jdk/src/share/native/sun/font/layout/LELanguages.h ++++ jdk/src/share/native/sun/font/layout/LELanguages.h +@@ -25,10 +25,12 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved. ++ * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. ++ * ++ * Generated on: 07/19/2005 01:01:08 PM PDT + */ + + #ifndef __LELANGUAGES_H +@@ -37,11 +39,18 @@ + #include "LETypes.h" + + /** ++ * \file ++ * \brief C++ API: List of language codes for LayoutEngine ++ */ ++ ++U_NAMESPACE_BEGIN ++ ++/** + * A provisional list of language codes. For now, + * this is just a list of languages which the LayoutEngine + * supports. + * +- * @draft ICU 3.0 ++ * @draft ICU 3.4 + */ + + enum LanguageCodes { +@@ -79,4 +88,5 @@ + languageCodeCount = 30 + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/LEScripts.h b/src/share/native/sun/font/layout/LEScripts.h +--- jdk/src/share/native/sun/font/layout/LEScripts.h ++++ jdk/src/share/native/sun/font/layout/LEScripts.h +@@ -25,17 +25,23 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved. ++ * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. +- * + */ + + #ifndef __LESCRIPTS_H + #define __LESCRIPTS_H + + #include "LETypes.h" ++/** ++ * \file ++ * \brief C++ API: Constants for Unicode script values ++ */ ++ ++ ++U_NAMESPACE_BEGIN + + /** + * Constants for Unicode script values, generated using +@@ -104,4 +110,5 @@ + scriptCodeCount = 55 + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/LEStandalone.h b/src/share/native/sun/font/layout/LEStandalone.h +new file mode 100644 +--- /dev/null ++++ jdk/src/share/native/sun/font/layout/LEStandalone.h +@@ -0,0 +1,132 @@ ++/* ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute 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 __LESTANDALONE ++#define __LESTANDALONE ++ ++/* Definitions to make Layout Engine work away from ICU. */ ++#ifndef U_NAMESPACE_BEGIN ++#define U_NAMESPACE_BEGIN ++#endif ++ ++#ifndef U_NAMESPACE_END ++#define U_NAMESPACE_END ++#endif ++ ++/* RTTI Definition */ ++typedef const char *UClassID; ++#ifndef UOBJECT_DEFINE_RTTI_IMPLEMENTATION ++#define UOBJECT_DEFINE_RTTI_IMPLEMENTATION(x) UClassID x::getStaticClassID(){static char z=0; return (UClassID)&z; } UClassID x::getDynamicClassID() const{return x::getStaticClassID(); } ++#endif ++ ++/* UMemory's functions aren't used by the layout engine. */ ++struct UMemory {}; ++/* UObject's functions aren't used by the layout engine. */ ++struct UObject {}; ++ ++/* String handling */ ++#include <stdlib.h> ++#include <string.h> ++ ++/** ++ * A convenience macro to test for the success of a LayoutEngine call. ++ * ++ * @stable ICU 2.4 ++ */ ++#define LE_SUCCESS(code) ((code)<=LE_NO_ERROR) ++ ++/** ++ * A convenience macro to test for the failure of a LayoutEngine call. ++ * ++ * @stable ICU 2.4 ++ */ ++#define LE_FAILURE(code) ((code)>LE_NO_ERROR) ++ ++ ++#ifndef _LP64 ++typedef long le_int32; ++typedef unsigned long le_uint32; ++#else ++typedef int le_int32; ++typedef unsigned int le_uint32; ++#endif ++ ++#define HAVE_LE_INT32 1 ++#define HAVE_LE_UINT32 1 ++ ++typedef unsigned short UChar; ++typedef le_uint32 UChar32; ++ ++typedef short le_int16; ++#define HAVE_LE_INT16 1 ++ ++typedef unsigned short le_uint16; ++#define HAVE_LE_UINT16 ++ ++typedef signed char le_int8; ++#define HAVE_LE_INT8 ++ ++typedef unsigned char le_uint8; ++#define HAVE_LE_UINT8 ++ ++typedef char UBool; ++ ++/** ++ * Error codes returned by the LayoutEngine. ++ * ++ * @stable ICU 2.4 ++ */ ++enum LEErrorCode { ++ /* informational */ ++ LE_NO_SUBFONT_WARNING = -127, // U_USING_DEFAULT_WARNING, ++ ++ /* success */ ++ LE_NO_ERROR = 0, // U_ZERO_ERROR, ++ ++ /* failures */ ++ LE_ILLEGAL_ARGUMENT_ERROR = 1, // U_ILLEGAL_ARGUMENT_ERROR, ++ LE_MEMORY_ALLOCATION_ERROR = 7, // U_MEMORY_ALLOCATION_ERROR, ++ LE_INDEX_OUT_OF_BOUNDS_ERROR = 8, //U_INDEX_OUTOFBOUNDS_ERROR, ++ LE_NO_LAYOUT_ERROR = 16, // U_UNSUPPORTED_ERROR, ++ LE_INTERNAL_ERROR = 5, // U_INTERNAL_PROGRAM_ERROR, ++ LE_FONT_FILE_NOT_FOUND_ERROR = 4, // U_FILE_ACCESS_ERROR, ++ LE_MISSING_FONT_TABLE_ERROR = 2 // U_MISSING_RESOURCE_ERROR ++}; ++#define HAVE_LEERRORCODE ++ ++#define U_LAYOUT_API ++ ++#define uprv_malloc malloc ++#define uprv_free free ++#define uprv_memcpy memcpy ++#define uprv_realloc realloc ++ ++#if !defined(U_IS_BIG_ENDIAN) ++ #ifdef _LITTLE_ENDIAN ++ #define U_IS_BIG_ENDIAN 0 ++ #endif ++#endif ++ ++#endif +diff --git a/src/share/native/sun/font/layout/LESwaps.h b/src/share/native/sun/font/layout/LESwaps.h +--- jdk/src/share/native/sun/font/layout/LESwaps.h ++++ jdk/src/share/native/sun/font/layout/LESwaps.h +@@ -26,7 +26,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +@@ -35,11 +35,12 @@ + + #include "LETypes.h" + +-#if !defined(U_IS_BIG_ENDIAN) +- #ifdef _LITTLE_ENDIAN +- #define U_IS_BIG_ENDIAN 0 +- #endif +-#endif ++/** ++ * \file ++ * \brief C++ API: Endian independent access to data for LayoutEngine ++ */ ++ ++U_NAMESPACE_BEGIN + + /** + * A convenience macro which invokes the swapWord member function +@@ -47,7 +48,6 @@ + * + * @stable ICU 2.8 + */ +- + #if defined(U_IS_BIG_ENDIAN) + #if U_IS_BIG_ENDIAN + #define SWAPW(value) (value) +@@ -64,7 +64,6 @@ + * + * @stable ICU 2.8 + */ +- + #if defined(U_IS_BIG_ENDIAN) + #if U_IS_BIG_ENDIAN + #define SWAPL(value) (value) +@@ -86,8 +85,7 @@ + * + * @stable ICU 2.8 + */ +-class LESwaps +-{ ++class U_LAYOUT_API LESwaps /* not : public UObject because all methods are static */ { + public: + + #if !defined(U_IS_BIG_ENDIAN) +@@ -144,4 +142,5 @@ + LESwaps() {} // private - forbid instantiation + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/LETypes.h b/src/share/native/sun/font/layout/LETypes.h +--- jdk/src/share/native/sun/font/layout/LETypes.h ++++ jdk/src/share/native/sun/font/layout/LETypes.h +@@ -23,7 +23,6 @@ + * + */ + +- + /* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved +@@ -33,73 +32,97 @@ + #ifndef __LETYPES_H + #define __LETYPES_H + ++/** ++ * If LE_Standalone is defined, it must exist and contain ++ * definitions for some core ICU defines. ++ */ ++#ifdef LE_STANDALONE ++#include "LEStandalone.h" ++#endif ++ ++#ifdef LE_STANDALONE ++/* Stand-alone Layout Engine- without ICU. */ ++#include "LEStandalone.h" + #define LE_USE_CMEMORY ++#else ++#if !defined(LE_USE_CMEMORY) && (defined(U_LAYOUT_IMPLEMENTATION) || defined(U_LAYOUTEX_IMPLEMENTATION) || defined(U_STATIC_IMPLEMENTATION) || defined(U_COMBINED_IMPLEMENTATION)) ++#define LE_USE_CMEMORY ++#endif + ++#include "unicode/utypes.h" ++#include "unicode/uobject.h" + #ifdef LE_USE_CMEMORY + #include "cmemory.h" + #endif ++#endif /* not standalone */ + +-#ifndef _LP64 +-typedef long le_int32; +-typedef unsigned long le_uint32; +-#else +-typedef int le_int32; +-typedef unsigned int le_uint32; +-#endif ++U_NAMESPACE_BEGIN + +-typedef short le_int16; +-typedef unsigned short le_uint16; +-typedef signed char le_int8; +-typedef unsigned char le_uint8; +-typedef char le_bool; ++/*! ++ * \file ++ * \brief Basic definitions for the ICU LayoutEngine ++ */ + +-typedef char UClassID; +- +-#if 0 + /** + * A type used for signed, 32-bit integers. + * + * @stable ICU 2.4 + */ ++#ifndef HAVE_LE_INT32 + typedef int32_t le_int32; ++#endif + + /** + * A type used for unsigned, 32-bit integers. + * + * @stable ICU 2.4 + */ ++#ifndef HAVE_LE_UINT32 + typedef uint32_t le_uint32; ++#endif + + /** + * A type used for signed, 16-bit integers. + * + * @stable ICU 2.4 + */ ++#ifndef HAVE_LE_INT16 + typedef int16_t le_int16; ++#endif + ++#ifndef HAVE_LE_UINT16 + /** + * A type used for unsigned, 16-bit integers. + * + * @stable ICU 2.4 + */ + typedef uint16_t le_uint16; ++#endif + ++#ifndef HAVE_LE_INT8 + /** + * A type used for signed, 8-bit integers. + * + * @stable ICU 2.4 + */ + typedef int8_t le_int8; +- ++#endif ++ ++#ifndef HAVE_LE_UINT8 + /** + * A type used for unsigned, 8-bit integers. + * + * @stable ICU 2.4 + */ + typedef uint8_t le_uint8; ++#endif + +-typedef char le_bool; +-#endif ++/** ++* A type used for boolean values. ++* ++* @stable ICU 2.4 ++*/ ++typedef UBool le_bool; + + #ifndef TRUE + /** +@@ -292,21 +315,21 @@ + * + * @stable ICU 2.4 + */ +-typedef le_uint16 LEUnicode16; ++typedef UChar LEUnicode16; + + /** + * Used to represent 32-bit Unicode code points. + * + * @stable ICU 2.4 + */ +-typedef le_uint32 LEUnicode32; ++typedef UChar32 LEUnicode32; + + /** + * Used to represent 16-bit Unicode code points. + * + * @deprecated since ICU 2.4. Use LEUnicode16 instead + */ +-typedef le_uint16 LEUnicode; ++typedef UChar LEUnicode; + + /** + * Used to hold a pair of (x, y) values which represent a point. +@@ -353,7 +376,7 @@ + * + * @internal + */ +-#define LE_ARRAY_COPY(dst, src, count) memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0]) ++#define LE_ARRAY_COPY(dst, src, count) uprv_memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0]) + + /** + * Allocate an array of basic types. This is used to isolate the rest of +@@ -361,7 +384,7 @@ + * + * @internal + */ +-#define LE_NEW_ARRAY(type, count) (type *) malloc((count) * sizeof(type)) ++#define LE_NEW_ARRAY(type, count) (type *) uprv_malloc((count) * sizeof(type)) + + /** + * Re-allocate an array of basic types. This is used to isolate the rest of +@@ -369,7 +392,7 @@ + * + * @internal + */ +-#define LE_GROW_ARRAY(array, newSize) realloc((void *) (array), (newSize) * sizeof (array)[0]) ++#define LE_GROW_ARRAY(array, newSize) uprv_realloc((void *) (array), (newSize) * sizeof (array)[0]) + + /** + * Free an array of basic types. This is used to isolate the rest of +@@ -377,7 +400,7 @@ + * + * @internal + */ +-#define LE_DELETE_ARRAY(array) free((void *) (array)) ++#define LE_DELETE_ARRAY(array) uprv_free((void *) (array)) + #endif + + /** +@@ -595,22 +618,24 @@ + * + * @stable ICU 2.4 + */ ++#ifndef HAVE_LEERRORCODE + enum LEErrorCode { + /* informational */ +- LE_NO_SUBFONT_WARNING = -127, // U_USING_DEFAULT_WARNING, ++ LE_NO_SUBFONT_WARNING = U_USING_DEFAULT_WARNING, /**< The font does not contain subfonts. */ + + /* success */ +- LE_NO_ERROR = 0, // U_ZERO_ERROR, ++ LE_NO_ERROR = U_ZERO_ERROR, /**< No error, no warning. */ + + /* failures */ +- LE_ILLEGAL_ARGUMENT_ERROR = 1, // U_ILLEGAL_ARGUMENT_ERROR, +- LE_MEMORY_ALLOCATION_ERROR = 7, // U_MEMORY_ALLOCATION_ERROR, +- LE_INDEX_OUT_OF_BOUNDS_ERROR = 8, //U_INDEX_OUTOFBOUNDS_ERROR, +- LE_NO_LAYOUT_ERROR = 16, // U_UNSUPPORTED_ERROR, +- LE_INTERNAL_ERROR = 5, // U_INTERNAL_PROGRAM_ERROR, +- LE_FONT_FILE_NOT_FOUND_ERROR = 4, // U_FILE_ACCESS_ERROR, +- LE_MISSING_FONT_TABLE_ERROR = 2 // U_MISSING_RESOURCE_ERROR ++ LE_ILLEGAL_ARGUMENT_ERROR = U_ILLEGAL_ARGUMENT_ERROR, /**< An illegal argument was detected. */ ++ LE_MEMORY_ALLOCATION_ERROR = U_MEMORY_ALLOCATION_ERROR, /**< Memory allocation error. */ ++ LE_INDEX_OUT_OF_BOUNDS_ERROR = U_INDEX_OUTOFBOUNDS_ERROR, /**< Trying to access an index that is out of bounds. */ ++ LE_NO_LAYOUT_ERROR = U_UNSUPPORTED_ERROR, /**< You must call layoutChars() first. */ ++ LE_INTERNAL_ERROR = U_INTERNAL_PROGRAM_ERROR, /**< An internal error was encountered. */ ++ LE_FONT_FILE_NOT_FOUND_ERROR = U_FILE_ACCESS_ERROR, /**< The requested font file cannot be opened. */ ++ LE_MISSING_FONT_TABLE_ERROR = U_MISSING_RESOURCE_ERROR /**< The requested font table does not exist. */ + }; ++#endif + + #ifndef XP_CPLUSPLUS + /** +@@ -626,7 +651,9 @@ + * + * @stable ICU 2.4 + */ +-#define LE_SUCCESS(code) ((code)<=LE_NO_ERROR) ++#ifndef LE_FAILURE ++#define LE_SUCCESS(code) (U_SUCCESS((UErrorCode)code)) ++#endif + + enum LEFeatureENUMs { + LE_Kerning_FEATURE_ENUM = 0, +@@ -648,7 +675,11 @@ + * + * @stable ICU 2.4 + */ +-#define LE_FAILURE(code) ((code)>LE_NO_ERROR) ++#ifndef LE_FAILURE ++#define LE_FAILURE(code) (U_FAILURE((UErrorCode)code)) ++#endif + +-#define U_LAYOUT_API ++U_NAMESPACE_END + #endif ++ ++ +diff --git a/src/share/native/sun/font/layout/LayoutEngine.cpp b/src/share/native/sun/font/layout/LayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/LayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/LayoutEngine.cpp +@@ -23,6 +23,7 @@ + * + */ + ++ + /* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved +@@ -41,6 +42,7 @@ + #include "IndicLayoutEngine.h" + #include "KhmerLayoutEngine.h" + #include "ThaiLayoutEngine.h" ++//#include "TibetanLayoutEngine.h" + #include "GXLayoutEngine.h" + #include "ScriptAndLanguageTags.h" + #include "CharSubstitutionFilter.h" +@@ -56,6 +58,8 @@ + + #include "KernTable.h" + ++U_NAMESPACE_BEGIN ++ + const LEUnicode32 DefaultCharMapper::controlChars[] = { + 0x0009, 0x000A, 0x000D, + /*0x200C, 0x200D,*/ 0x200E, 0x200F, +@@ -102,9 +106,7 @@ + } + + if (fMirror) { +- le_int32 index = OpenTypeUtilities::search((le_uint32) ch, +- (le_uint32 *)DefaultCharMapper::mirroredChars, +- DefaultCharMapper::mirroredCharsCount); ++ le_int32 index = OpenTypeUtilities::search((le_uint32) ch, (le_uint32 *)DefaultCharMapper::mirroredChars, DefaultCharMapper::mirroredCharsCount); + + if (mirroredChars[index] == ch) { + return DefaultCharMapper::srahCderorrim[index]; +@@ -133,6 +135,9 @@ + // nothing to do + } + ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LayoutEngine) ++ + #define ccmpFeatureTag LE_CCMP_FEATURE_TAG + + #define ccmpFeatureMask 0x80000000UL +@@ -146,10 +151,9 @@ + + static const le_int32 canonFeatureMapCount = LE_ARRAY_SIZE(canonFeatureMap); + +-LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, +- le_int32 languageCode, le_int32 typoFlags) +- : fGlyphStorage(NULL), fFontInstance(fontInstance), fScriptCode(scriptCode), +- fLanguageCode(languageCode), fTypoFlags(typoFlags) ++LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) ++ : fGlyphStorage(NULL), fFontInstance(fontInstance), fScriptCode(scriptCode), fLanguageCode(languageCode), ++ fTypoFlags(typoFlags) + { + fGlyphStorage = new LEGlyphStorage(); + } +@@ -159,8 +163,7 @@ + return fGlyphStorage->getGlyphCount(); + } + +-void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase, +- LEErrorCode &success) const ++void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const + { + fGlyphStorage->getCharIndices(charIndices, indexBase, success); + } +@@ -171,8 +174,7 @@ + } + + // Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits +-void LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, +- LEErrorCode &success) const ++void LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const + { + fGlyphStorage->getGlyphs(glyphs, extraBits, success); + } +@@ -219,15 +221,13 @@ + fGlyphStorage->getGlyphPositions(positions, success); + } + +-void LayoutEngine::getGlyphPosition(le_int32 glyphIndex, float &x, float &y, +- LEErrorCode &success) const ++void LayoutEngine::getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const + { + fGlyphStorage->getGlyphPosition(glyphIndex, x, y, success); + } + +-le_int32 LayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, LEUnicode *&outChars, +- LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 LayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; +@@ -238,12 +238,7 @@ + return 0; + } + +- if ((fTypoFlags & 0x4) == 0) { // no canonical processing +- return count; +- } +- +- const GlyphSubstitutionTableHeader *canonGSUBTable = +- (GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; ++ const GlyphSubstitutionTableHeader *canonGSUBTable = (GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; + LETag scriptTag = OpenTypeLayoutEngine::getScriptTag(fScriptCode); + LETag langSysTag = OpenTypeLayoutEngine::getLangSysTag(fLanguageCode); + le_int32 i, dir = 1, out = 0, outCharCount = count; +@@ -257,16 +252,15 @@ + // We could just do the mark reordering for all scripts, but most + // of them probably don't need it... + if (fScriptCode == hebrScriptCode) { +- reordered = LE_NEW_ARRAY(LEUnicode, count); ++ reordered = LE_NEW_ARRAY(LEUnicode, count); + +- if (reordered == NULL) { +- success = LE_MEMORY_ALLOCATION_ERROR; +- return 0; +- } ++ if (reordered == NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return 0; ++ } + +- CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, +- reordered, glyphStorage); +- inChars = reordered; ++ CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, glyphStorage); ++ inChars = reordered; + } + + glyphStorage.allocateGlyphArray(count, rightToLeft, success); +@@ -290,8 +284,7 @@ + LE_DELETE_ARRAY(reordered); + } + +- outCharCount = canonGSUBTable->process(glyphStorage, rightToLeft, scriptTag, +- langSysTag, NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE); ++ outCharCount = canonGSUBTable->process(glyphStorage, rightToLeft, scriptTag, langSysTag, NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE); + + out = (rightToLeft? outCharCount - 1 : 0); + +@@ -306,35 +299,26 @@ + return outCharCount; + } + +- +-le_int32 LayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, +- LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 LayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; + } + +- if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || +- offset + count > max) { +- ++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + LEUnicode *outChars = NULL; +- le_int32 outCharCount = characterProcessing(chars, offset, count, max, +- rightToLeft, outChars, glyphStorage, success); ++ le_int32 outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, glyphStorage, success); + + if (outChars != NULL) { +- mapCharsToGlyphs(outChars, 0, outCharCount, rightToLeft, rightToLeft, +- glyphStorage, success); +- // FIXME: a subclass may have allocated this, in which case this delete +- // might not work... +- LE_DELETE_ARRAY(outChars); ++ mapCharsToGlyphs(outChars, 0, outCharCount, rightToLeft, rightToLeft, glyphStorage, success); ++ LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work... + } else { +- mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, +- glyphStorage, success); ++ mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphStorage, success); + } + + return glyphStorage.getGlyphCount(); +@@ -342,8 +326,7 @@ + + // Input: glyphs + // Output: positions +-void LayoutEngine::positionGlyphs(LEGlyphStorage &glyphStorage, +- float x, float y, LEErrorCode &success) ++void LayoutEngine::positionGlyphs(LEGlyphStorage &glyphStorage, float x, float y, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return; +@@ -370,9 +353,8 @@ + glyphStorage.setPosition(glyphCount, x, y, success); + } + +-void LayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_bool reverse, +- LEGlyphStorage &glyphStorage, LEErrorCode &success) ++void LayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return; +@@ -399,8 +381,7 @@ + return; + } + +-void LayoutEngine::adjustMarkGlyphs(LEGlyphStorage &glyphStorage, +- LEGlyphFilter *markFilter, LEErrorCode &success) ++void LayoutEngine::adjustMarkGlyphs(LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success) + { + float xAdjust = 0; + le_int32 p, glyphCount = glyphStorage.getGlyphCount(); +@@ -436,9 +417,7 @@ + glyphStorage.adjustPosition(glyphCount, xAdjust, 0, success); + } + +-void LayoutEngine::adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount, +- le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, +- LEErrorCode &success) ++void LayoutEngine::adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount, le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success) + { + float xAdjust = 0; + le_int32 c = 0, direction = 1, p; +@@ -485,9 +464,8 @@ + return fFontInstance->getFontTable(tableTag); + } + +-void LayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_bool reverse, le_bool mirror, +- LEGlyphStorage &glyphStorage, LEErrorCode &success) ++void LayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return; +@@ -497,32 +475,27 @@ + + DefaultCharMapper charMapper(TRUE, mirror); + +- fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse, +- &charMapper, glyphStorage); ++ fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse, &charMapper, glyphStorage); + } + + // Input: characters, font? + // Output: glyphs, positions, char indices + // Returns: number of glyphs +-le_int32 LayoutEngine::layoutChars(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, +- float x, float y, LEErrorCode &success) ++le_int32 LayoutEngine::layoutChars(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ float x, float y, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; + } + +- if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || +- offset + count > max) { +- ++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + le_int32 glyphCount; + +- glyphCount = computeGlyphs(chars, offset, count, max, rightToLeft, +- *fGlyphStorage, success); ++ glyphCount = computeGlyphs(chars, offset, count, max, rightToLeft, *fGlyphStorage, success); + positionGlyphs(*fGlyphStorage, x, y, success); + adjustGlyphPositions(chars, offset, count, rightToLeft, *fGlyphStorage, success); + +@@ -534,17 +507,13 @@ + fGlyphStorage->reset(); + } + +-LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success) ++LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success) + { + // 3 -> kerning and ligatures +- return LayoutEngine::layoutEngineFactory(fontInstance, scriptCode, +- languageCode, LE_DEFAULT_FEATURE_FLAG, success); ++ return LayoutEngine::layoutEngineFactory(fontInstance, scriptCode, languageCode, LE_DEFAULT_FEATURE_FLAG, success); + } + +-LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, +- LEErrorCode &success) ++LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) + { + static const le_uint32 gsubTableTag = LE_GSUB_TABLE_TAG; + static const le_uint32 mortTableTag = LE_MORT_TABLE_TAG; +@@ -553,18 +522,12 @@ + return NULL; + } + +- // code2000 has GPOS kern feature tags for latn script +- +- const GlyphSubstitutionTableHeader *gsubTable = +- (const GlyphSubstitutionTableHeader *) fontInstance->getFontTable(gsubTableTag); ++ const GlyphSubstitutionTableHeader *gsubTable = (const GlyphSubstitutionTableHeader *) fontInstance->getFontTable(gsubTableTag); + LayoutEngine *result = NULL; + LETag scriptTag = 0x00000000; + LETag languageTag = 0x00000000; + +- if (gsubTable != NULL && +- gsubTable->coversScript(scriptTag = +- OpenTypeLayoutEngine::getScriptTag(scriptCode))) { +- ++ if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) { + switch (scriptCode) { + case bengScriptCode: + case devaScriptCode: +@@ -576,13 +539,11 @@ + case tamlScriptCode: + case teluScriptCode: + case sinhScriptCode: +- result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, +- languageCode, typoFlags, gsubTable); ++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); + break; + + case arabScriptCode: +- result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, +- languageCode, typoFlags, gsubTable); ++ result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); + break; + + case haniScriptCode: +@@ -594,33 +555,33 @@ + case zhtLanguageCode: + case zhsLanguageCode: + if (gsubTable->coversScriptAndLanguage(scriptTag, languageTag, TRUE)) { +- result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, +- languageCode, typoFlags, gsubTable); ++ result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); + break; + } + + // note: falling through to default case. + default: +- result = new OpenTypeLayoutEngine(fontInstance, scriptCode, +- languageCode, typoFlags, gsubTable); ++ result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); + break; + } + + break; ++#if 0 ++ case tibtScriptCode: ++ result = new TibetanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); ++ break; ++#endif + + case khmrScriptCode: +- result = new KhmerOpenTypeLayoutEngine(fontInstance, scriptCode, +- languageCode, typoFlags, gsubTable); ++ result = new KhmerOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); + break; + + default: +- result = new OpenTypeLayoutEngine(fontInstance, scriptCode, +- languageCode, typoFlags, gsubTable); ++ result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); + break; + } + } else { +- const MorphTableHeader *morphTable = +- (MorphTableHeader *) fontInstance->getFontTable(mortTableTag); ++ const MorphTableHeader *morphTable = (MorphTableHeader *) fontInstance->getFontTable(mortTableTag); + + if (morphTable != NULL && SWAPL(morphTable->version)==0x00010000) { + result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable); +@@ -637,16 +598,18 @@ + case teluScriptCode: + case sinhScriptCode: + { +- result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, +- languageCode, typoFlags); ++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); + break; + } + + case arabScriptCode: +- result = new UnicodeArabicOpenTypeLayoutEngine(fontInstance, scriptCode, +- languageCode, typoFlags); ++ //case hebrScriptCode: ++ result = new UnicodeArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); + break; + ++ //case hebrScriptCode: ++ // return new HebrewOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); ++ + case thaiScriptCode: + result = new ThaiLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); + break; +@@ -668,3 +631,5 @@ + LayoutEngine::~LayoutEngine() { + delete fGlyphStorage; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/LayoutEngine.h b/src/share/native/sun/font/layout/LayoutEngine.h +--- jdk/src/share/native/sun/font/layout/LayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/LayoutEngine.h +@@ -23,6 +23,7 @@ + * + */ + ++ + /* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved +@@ -34,63 +35,61 @@ + + #include "LETypes.h" + +-#include <string.h> ++/** ++ * \file ++ * \brief C++ API: Virtual base class for complex text layout. ++ */ ++ ++U_NAMESPACE_BEGIN + + class LEFontInstance; + class LEGlyphFilter; + class LEGlyphStorage; + + /** +- * This is a virtual base class used to do complex text layout. The +- * text must all be in a single font, script, and language. An +- * instance of a LayoutEngine can be created by calling the +- * layoutEngineFactory method. Fonts are identified by instances of +- * the LEFontInstance class. Script and language codes are identified ++ * This is a virtual base class used to do complex text layout. The text must all ++ * be in a single font, script, and language. An instance of a LayoutEngine can be ++ * created by calling the layoutEngineFactory method. Fonts are identified by ++ * instances of the LEFontInstance class. Script and language codes are identified + * by integer codes, which are defined in ScriptAndLanuageTags.h. + * +- * Note that this class is not public API. It is declared public so +- * that it can be exported from the library that it is a part of. ++ * Note that this class is not public API. It is declared public so that it can be ++ * exported from the library that it is a part of. + * +- * The input to the layout process is an array of characters in +- * logical order, and a starting X, Y position for the text. The +- * output is an array of glyph indices, an array of character indices +- * for the glyphs, and an array of glyph positions. These arrays are +- * protected members of LayoutEngine which can be retreived by a +- * public method. The reset method can be called to free these arrays +- * so that the LayoutEngine can be reused. ++ * The input to the layout process is an array of characters in logical order, ++ * and a starting X, Y position for the text. The output is an array of glyph indices, ++ * an array of character indices for the glyphs, and an array of glyph positions. ++ * These arrays are protected members of LayoutEngine which can be retreived by a ++ * public method. The reset method can be called to free these arrays so that the ++ * LayoutEngine can be reused. + * +- * The layout process is done in three steps. There is a protected +- * virtual method for each step. These methods have a default +- * implementation which only does character to glyph mapping and +- * default positioning using the glyph's advance widths. Subclasses +- * can override these methods for more advanced layout. There is a +- * public method which invokes the steps in the correct order. ++ * The layout process is done in three steps. There is a protected virtual method ++ * for each step. These methods have a default implementation which only does ++ * character to glyph mapping and default positioning using the glyph's advance ++ * widths. Subclasses can override these methods for more advanced layout. ++ * There is a public method which invokes the steps in the correct order. + * + * The steps are: + * +- * 1) Glyph processing - character to glyph mapping and any other +- * glyph processing such as ligature substitution and contextual +- * forms. ++ * 1) Glyph processing - character to glyph mapping and any other glyph processing ++ * such as ligature substitution and contextual forms. + * +- * 2) Glyph positioning - position the glyphs based on their advance +- * widths. ++ * 2) Glyph positioning - position the glyphs based on their advance widths. + * +- * 3) Glyph position adjustments - adjustment of glyph positions for +- * kerning, accent placement, etc. ++ * 3) Glyph position adjustments - adjustment of glyph positions for kerning, ++ * accent placement, etc. + * +- * NOTE: in all methods below, output parameters are references to +- * pointers so the method can allocate and free the storage as +- * needed. All storage allocated in this way is owned by the object +- * which created it, and will be freed when it is no longer needed, or +- * when the object's destructor is invoked. ++ * NOTE: in all methods below, output parameters are references to pointers so ++ * the method can allocate and free the storage as needed. All storage allocated ++ * in this way is owned by the object which created it, and will be freed when it ++ * is no longer needed, or when the object's destructor is invoked. + * + * @see LEFontInstance + * @see ScriptAndLanguageTags.h + * + * @stable ICU 2.8 + */ +-class U_LAYOUT_API LayoutEngine +-{ ++class U_LAYOUT_API LayoutEngine : public UObject { + protected: + /** + * The object which holds the glyph storage +@@ -134,21 +133,21 @@ + le_int32 fTypoFlags; + + /** +- * This constructs an instance for a given font, script and +- * language. Subclass constructors ++ * This constructs an instance for a given font, script and language. Subclass constructors + * must call this constructor. + * + * @param fontInstance - the font for the text + * @param scriptCode - the script for the text + * @param languageCode - the language for the text ++ * @param typoFlags - the typographic control flags for the text. Set bit 1 if kerning ++ * is desired, set bit 2 if ligature formation is desired. Others are reserved. + * + * @see LEFontInstance + * @see ScriptAndLanguageTags.h + * + * @internal + */ +- LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, +- le_int32 languageCode, le_int32 typoFlags); ++ LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags); + + /** + * This overrides the default no argument constructor to make it +@@ -160,11 +159,10 @@ + LayoutEngine(); + + /** +- * This method does any required pre-processing to the input +- * characters. It may generate output characters that differ from +- * the input charcters due to insertions, deletions, or +- * reorderings. In such cases, it will also generate an output +- * character index array reflecting these changes. ++ * This method does any required pre-processing to the input characters. It ++ * may generate output characters that differ from the input charcters due to ++ * insertions, deletions, or reorderings. In such cases, it will also generate an ++ * output character index array reflecting these changes. + * + * Subclasses must override this method. + * +@@ -173,44 +171,36 @@ + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context +- * @param rightToLeft - TRUE if the characters are in a right to +- * left directional run +- * @param outChars - the output character array, if different from +- * the input +- * @param glyphStorage - the object that holds the per-glyph +- * storage. The character index array may be set. ++ * @param rightToLeft - TRUE if the characters are in a right to left directional run ++ * @param outChars - the output character array, if different from the input ++ * @param glyphStorage - the object that holds the per-glyph storage. The character index array may be set. + * @param success - set to an error code if the operation fails +- * @return the output character count (input character count if no +- * change) ++ * ++ * @return the output character count (input character count if no change) + * + * @internal + */ +- virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, +- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** +- * This method does the glyph processing. It converts an array of +- * characters into an array of glyph indices and character +- * indices. The characters to be processed are passed in a +- * surrounding context. The context is specified as a starting +- * address and a maximum character count. An offset and a count +- * are used to specify the characters to be processed. ++ * This method does the glyph processing. It converts an array of characters ++ * into an array of glyph indices and character indices. The characters to be ++ * processed are passed in a surrounding context. The context is specified as ++ * a starting address and a maximum character count. An offset and a count are ++ * used to specify the characters to be processed. + * +- * The default implementation of this method only does character +- * to glyph mapping. Subclasses needing more elaborate glyph +- * processing must override this method. ++ * The default implementation of this method only does character to glyph mapping. ++ * Subclasses needing more elaborate glyph processing must override this method. + * + * Input parameters: + * @param chars - the character context + * @param offset - the offset of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the context. +- * @param rightToLeft - TRUE if the text is in a right to left +- * directional run +- * @param glyphStorage - the object which holds the per-glyph +- * storage. The glyph and char indices arrays will be +- * set. ++ * @param rightToLeft - TRUE if the text is in a right to left directional run ++ * @param glyphStorage - the object which holds the per-glyph storage. The glyph and char indices arrays ++ * will be set. + * + * Output parameters: + * @param success - set to an error code if the operation fails +@@ -219,60 +209,50 @@ + * + * @internal + */ +- virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, +- LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** +- * This method does basic glyph positioning. The default +- * implementation positions the glyphs based on their advance +- * widths. This is sufficient for most uses. It is not expected +- * that many subclasses will override this method. ++ * This method does basic glyph positioning. The default implementation positions ++ * the glyphs based on their advance widths. This is sufficient for most uses. It ++ * is not expected that many subclasses will override this method. + * + * Input parameters: +- * @param glyphStorage - the object which holds the per-glyph storage. +- * The glyph position array will be set. ++ * @param glyphStorage - the object which holds the per-glyph storage. The glyph position array will be set. + * @param x - the starting X position + * @param y - the starting Y position + * @param success - set to an error code if the operation fails + * + * @internal + */ +- virtual void positionGlyphs(LEGlyphStorage &glyphStorage, +- float x, float y, LEErrorCode &success); ++ virtual void positionGlyphs(LEGlyphStorage &glyphStorage, float x, float y, LEErrorCode &success); + + /** +- * This method does positioning adjustments like accent +- * positioning and kerning. The default implementation does +- * nothing. Subclasses needing position adjustments must override +- * this method. ++ * This method does positioning adjustments like accent positioning and ++ * kerning. The default implementation does nothing. Subclasses needing ++ * position adjustments must override this method. + * +- * Note that this method has both characters and glyphs as input +- * so that it can use the character codes to determine glyph types +- * if that information isn't directly available. (e.g. Some Arabic +- * OpenType fonts don't have a GDEF table) ++ * Note that this method has both characters and glyphs as input so that ++ * it can use the character codes to determine glyph types if that information ++ * isn't directly available. (e.g. Some Arabic OpenType fonts don't have a GDEF ++ * table) + * + * @param chars - the input character context + * @param offset - the offset of the first character to process + * @param count - the number of characters to process +- * @param reverse - <code>TRUE</code> if the glyphs in the glyph +- * array have been reordered +- * @param glyphStorage - the object which holds the per-glyph +- * storage. The glyph positions will be adjusted as needed. +- * @param success - output parameter set to an error code if the +- * operation fails ++ * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered ++ * @param glyphStorage - the object which holds the per-glyph storage. The glyph positions will be ++ * adjusted as needed. ++ * @param success - output parameter set to an error code if the operation fails + * + * @internal + */ +- virtual void adjustGlyphPositions(const LEUnicode chars[], +- le_int32 offset, le_int32 count, le_bool reverse, +- LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** +- * This method gets a table from the font associated with the +- * text. The default implementation gets the table from the font +- * instance. Subclasses which need to get the tables some other +- * way must override this method. ++ * This method gets a table from the font associated with ++ * the text. The default implementation gets the table from ++ * the font instance. Subclasses which need to get the tables ++ * some other way must override this method. + * + * @param tableTag - the four byte table tag. + * +@@ -283,127 +263,106 @@ + virtual const void *getFontTable(LETag tableTag) const; + + /** +- * This method does character to glyph mapping. The default +- * implementation uses the font instance to do the mapping. It +- * will allocate the glyph and character index arrays if they're +- * not already allocated. If it allocates the character index +- * array, it will fill it it. ++ * This method does character to glyph mapping. The default implementation ++ * uses the font instance to do the mapping. It will allocate the glyph and ++ * character index arrays if they're not already allocated. If it allocates the ++ * character index array, it will fill it it. + * +- * This method supports right to left text with the ability to +- * store the glyphs in reverse order, and by supporting character +- * mirroring, which will replace a character which has a left and +- * right form, such as parens, with the opposite form before +- * mapping it to a glyph index. ++ * This method supports right to left ++ * text with the ability to store the glyphs in reverse order, and by supporting ++ * character mirroring, which will replace a character which has a left and right ++ * form, such as parens, with the opposite form before mapping it to a glyph index. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the offset of the first character to be mapped + * @param count - the number of characters to be mapped +- * @param reverse - if <code>TRUE</code>, the output will be in +- * reverse order ++ * @param reverse - if <code>TRUE</code>, the output will be in reverse order + * @param mirror - if <code>TRUE</code>, do character mirroring +- * @param glyphStorage - the object which holds the per-glyph +- * storage. The glyph and char indices arrays will be +- * filled in. ++ * @param glyphStorage - the object which holds the per-glyph storage. The glyph and char ++ * indices arrays will be filled in. + * @param success - set to an error code if the operation fails + * + * @see LEFontInstance + * + * @internal + */ +- virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_bool reverse, le_bool mirror, +- LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** +- * This is a convenience method that forces the advance width of +- * mark glyphs to be zero, which is required for proper selection +- * and highlighting. ++ * This is a convenience method that forces the advance width of mark ++ * glyphs to be zero, which is required for proper selection and highlighting. + * +- * @param glyphStorage - the object containing the per-glyph +- * storage. The positions array will be modified. ++ * @param glyphStorage - the object containing the per-glyph storage. The positions array will be modified. + * @param markFilter - used to identify mark glyphs +- * @param success - output parameter set to an error code if the +- * operation fails ++ * @param success - output parameter set to an error code if the operation fails + * + * @see LEGlyphFilter + * + * @internal + */ +- static void adjustMarkGlyphs(LEGlyphStorage &glyphStorage, +- LEGlyphFilter *markFilter, LEErrorCode &success); ++ static void adjustMarkGlyphs(LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success); + + + /** +- * This is a convenience method that forces the advance width of +- * mark glyphs to be zero, which is required for proper selection +- * and highlighting. This method uses the input characters to +- * identify marks. This is required in cases where the font does +- * not contain enough information to identify them based on the +- * glyph IDs. ++ * This is a convenience method that forces the advance width of mark ++ * glyphs to be zero, which is required for proper selection and highlighting. ++ * This method uses the input characters to identify marks. This is required in ++ * cases where the font does not contain enough information to identify them based ++ * on the glyph IDs. + * + * @param chars - the array of input characters + * @param charCount - the number of input characers +- * @param glyphStorage - the object containing the per-glyph +- * storage. The positions array will be modified. +- * @param reverse - <code>TRUE</code> if the glyph array has been +- * reordered ++ * @param glyphStorage - the object containing the per-glyph storage. The positions array will be modified. ++ * @param reverse - <code>TRUE</code> if the glyph array has been reordered + * @param markFilter - used to identify mark glyphs +- * @param success - output parameter set to an error code if the +- * operation fails ++ * @param success - output parameter set to an error code if the operation fails + * + * @see LEGlyphFilter + * + * @internal + */ +- static void adjustMarkGlyphs(const LEUnicode chars[], +- le_int32 charCount, le_bool reverse, +- LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, +- LEErrorCode &success); ++ static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount, le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success); ++ + + public: + /** + * The destructor. It will free any storage allocated for the + * glyph, character index and position arrays by calling the reset +- * method. It is declared virtual so that it will be invoked by +- * the subclass destructors. ++ * method. It is declared virtual so that it will be invoked by the ++ * subclass destructors. + * + * @stable ICU 2.8 + */ + virtual ~LayoutEngine(); + + /** +- * This method will invoke the layout steps in their correct order +- * by calling the 32 bit versions of the computeGlyphs and +- * positionGlyphs methods.(It doesn't * call the +- * adjustGlyphPositions method because that doesn't apply for +- * default * processing.) It will compute the glyph, character +- * index and position arrays. ++ * This method will invoke the layout steps in their correct order by calling ++ * the computeGlyphs, positionGlyphs and adjustGlyphPosition methods.. It will ++ * compute the glyph, character index and position arrays. + * + * @param chars - the input character context + * @param offset - the offset of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context +- * @param rightToLeft - true if the characers are in a right to +- * left directional run ++ * @param rightToLeft - TRUE if the characers are in a right to left directional run + * @param x - the initial X position + * @param y - the initial Y position +- * @param success - output parameter set to an error code if the +- * operation fails ++ * @param success - output parameter set to an error code if the operation fails ++ * + * @return the number of glyphs in the glyph array + * +- * Note: the glyph, character index and position array can be +- * accessed using the getter method below. ++ * Note; the glyph, character index and position array can be accessed ++ * using the getter method below. ++ * ++ * @stable ICU 2.8 + */ +- le_int32 layoutChars(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, float x, +- float y, LEErrorCode &success); ++ virtual le_int32 layoutChars(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, float x, float y, LEErrorCode &success); + + /** +- * This method returns the number of glyphs in the glyph +- * array. Note that the number of glyphs will be greater than or +- * equal to the number of characters used to create the +- * LayoutEngine. ++ * This method returns the number of glyphs in the glyph array. Note ++ * that the number of glyphs will be greater than or equal to the number ++ * of characters used to create the LayoutEngine. + * + * @return the number of glyphs in the glyph array + * +@@ -412,9 +371,9 @@ + le_int32 getGlyphCount() const; + + /** +- * This method copies the glyph array into a caller supplied +- * array. The caller must ensure that the array is large enough +- * to hold all the glyphs. ++ * This method copies the glyph array into a caller supplied array. ++ * The caller must ensure that the array is large enough to hold all ++ * the glyphs. + * + * @param glyphs - the destiniation glyph array + * @param success - set to an error code if the operation fails +@@ -424,10 +383,10 @@ + void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const; + + /** +- * This method copies the glyph array into a caller supplied +- * array, ORing in extra bits. (This functionality is needed by +- * the JDK, which uses 32 bits pre glyph idex, with the high 16 +- * bits encoding the composite font slot number) ++ * This method copies the glyph array into a caller supplied array, ++ * ORing in extra bits. (This functionality is needed by the JDK, ++ * which uses 32 bits pre glyph idex, with the high 16 bits encoding ++ * the composite font slot number) + * + * @param glyphs - the destination (32 bit) glyph array + * @param extraBits - this value will be ORed with each glyph index +@@ -435,13 +394,12 @@ + * + * @stable ICU 2.8 + */ +- virtual void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, +- LEErrorCode &success) const; ++ virtual void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const; + + /** +- * This method copies the character index array into a caller +- * supplied array. The caller must ensure that the array is large +- * enough to hold a character index for each glyph. ++ * This method copies the character index array into a caller supplied array. ++ * The caller must ensure that the array is large enough to hold a ++ * character index for each glyph. + * + * @param charIndices - the destiniation character index array + * @param success - set to an error code if the operation fails +@@ -451,9 +409,9 @@ + void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const; + + /** +- * This method copies the character index array into a caller +- * supplied array. The caller must ensure that the array is large +- * enough to hold a character index for each glyph. ++ * This method copies the character index array into a caller supplied array. ++ * The caller must ensure that the array is large enough to hold a ++ * character index for each glyph. + * + * @param charIndices - the destiniation character index array + * @param indexBase - an offset which will be added to each index +@@ -461,14 +419,13 @@ + * + * @stable ICU 2.8 + */ +- void getCharIndices(le_int32 charIndices[], le_int32 indexBase, +- LEErrorCode &success) const; ++ void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const; + + /** +- * This method copies the position array into a caller supplied +- * array. The caller must ensure that the array is large enough +- * to hold an X and Y position for each glyph, plus an extra X and +- * Y for the advance of the last glyph. ++ * This method copies the position array into a caller supplied array. ++ * The caller must ensure that the array is large enough to hold an ++ * X and Y position for each glyph, plus an extra X and Y for the ++ * advance of the last glyph. + * + * @param positions - the destiniation position array + * @param success - set to an error code if the operation fails +@@ -491,8 +448,7 @@ + * + * @stable ICU 2.8 + */ +- void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, +- LEErrorCode &success) const; ++ void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const; + + /** + * This method frees the glyph, character index and position arrays +@@ -511,8 +467,7 @@ + * @param fontInstance - the font of the text + * @param scriptCode - the script of the text + * @param languageCode - the language of the text +- * @param success - output parameter set to an error code if the +- * operation fails ++ * @param success - output parameter set to an error code if the operation fails + * + * @return a LayoutEngine which can layout text in the given font. + * +@@ -520,17 +475,30 @@ + * + * @stable ICU 2.8 + */ +- static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success); ++ static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success); + + /** + * Override of existing call that provides flags to control typography. + * @draft ICU 3.4 + */ +- static LayoutEngine *layoutEngineFactory( +- const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, +- le_int32 typo_flags, LEErrorCode &success); ++ static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typo_flags, LEErrorCode &success); ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/LayoutTables.h b/src/share/native/sun/font/layout/LayoutTables.h +--- jdk/src/share/native/sun/font/layout/LayoutTables.h ++++ jdk/src/share/native/sun/font/layout/LayoutTables.h +@@ -32,11 +32,20 @@ + #ifndef __LAYOUTTABLES_H + #define __LAYOUTTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + ++U_NAMESPACE_BEGIN ++ + #define ANY_NUMBER 1 + + typedef le_int16 ByteOffset; + typedef le_int16 WordOffset; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/LigatureSubstProc.cpp b/src/share/native/sun/font/layout/LigatureSubstProc.cpp +--- jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp ++++ jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp +@@ -39,10 +39,14 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + #define ExtendedComplement(m) ((le_int32) (~((le_uint32) (m)))) + #define SignBit(m) ((ExtendedComplement(m) >> 1) & (le_int32)(m)) + #define SignExtend(v,m) (((v) & SignBit(m))? ((v) | ExtendedComplement(m)): (v)) + ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LigatureSubstitutionProcessor) ++ + LigatureSubstitutionProcessor::LigatureSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) + : StateTableProcessor(morphSubtableHeader) + { +@@ -63,8 +67,7 @@ + m = -1; + } + +-ByteOffset LigatureSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, +- le_int32 &currGlyph, EntryTableIndex index) ++ByteOffset LigatureSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) + { + const LigatureSubstitutionStateEntry *entry = &entryTable[index]; + ByteOffset newState = SWAPW(entry->newStateOffset); +@@ -162,3 +165,5 @@ + void LigatureSubstitutionProcessor::endStateTable() + { + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/LigatureSubstProc.h b/src/share/native/sun/font/layout/LigatureSubstProc.h +--- jdk/src/share/native/sun/font/layout/LigatureSubstProc.h ++++ jdk/src/share/native/sun/font/layout/LigatureSubstProc.h +@@ -32,12 +32,19 @@ + #ifndef __LIGATURESUBSTITUTIONPROCESSOR_H + #define __LIGATURESUBSTITUTIONPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "MorphTables.h" + #include "SubtableProcessor.h" + #include "StateTableProcessor.h" + #include "LigatureSubstitution.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + #define nComponents 16 +@@ -54,6 +61,20 @@ + LigatureSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader); + virtual ~LigatureSubstitutionProcessor(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + private: + LigatureSubstitutionProcessor(); + +@@ -68,6 +89,8 @@ + le_int16 m; + + const LigatureSubstitutionHeader *ligatureSubstitutionHeader; ++ + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp b/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp +--- jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp +@@ -25,6 +25,7 @@ + + /* + * ++ * + * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * + */ +@@ -37,6 +38,8 @@ + #include "GlyphIterator.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_uint32 LigatureSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const + { + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +@@ -92,3 +95,5 @@ + + return 0; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/LigatureSubstSubtables.h b/src/share/native/sun/font/layout/LigatureSubstSubtables.h +--- jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.h ++++ jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.h +@@ -32,12 +32,19 @@ + #ifndef __LIGATURESUBSTITUTIONSUBTABLES_H + #define __LIGATURESUBSTITUTIONSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEGlyphFilter.h" + #include "OpenTypeTables.h" + #include "GlyphSubstitutionTables.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + struct LigatureSetTable + { + le_uint16 ligatureCount; +@@ -59,4 +66,5 @@ + le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/LigatureSubstitution.h b/src/share/native/sun/font/layout/LigatureSubstitution.h +--- jdk/src/share/native/sun/font/layout/LigatureSubstitution.h ++++ jdk/src/share/native/sun/font/layout/LigatureSubstitution.h +@@ -32,12 +32,19 @@ + #ifndef __LIGATURESUBSTITUTION_H + #define __LIGATURESUBSTITUTION_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LayoutTables.h" + #include "StateTables.h" + #include "MorphTables.h" + #include "MorphStateTables.h" + ++U_NAMESPACE_BEGIN ++ + struct LigatureSubstitutionHeader : MorphStateTableHeader + { + ByteOffset ligatureActionTableOffset; +@@ -65,4 +72,5 @@ + lafComponentOffsetMask = 0x3FFFFFFF + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/LookupProcessor.cpp b/src/share/native/sun/font/layout/LookupProcessor.cpp +--- jdk/src/share/native/sun/font/layout/LookupProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/LookupProcessor.cpp +@@ -42,6 +42,8 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_uint32 LookupProcessor::applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance) const + { +@@ -65,10 +67,9 @@ + return 1; + } + +-le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage, +- GlyphPositionAdjustments *glyphPositionAdjustments, +- le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, +- const LEFontInstance *fontInstance) const ++le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, ++ le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, ++ const LEFontInstance *fontInstance) const + { + le_int32 glyphCount = glyphStorage.getGlyphCount(); + +@@ -140,8 +141,7 @@ + + LookupProcessor::LookupProcessor(const char *baseAddress, + Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset, +- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, +- le_int32 featureMapCount, le_bool orderFeatures) ++ LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures) + : lookupListTable(NULL), featureListTable(NULL), lookupSelectArray(NULL), lookupSelectCount(0), + lookupOrderArray(NULL), lookupOrderCount(0) + { +@@ -309,3 +309,5 @@ + LE_DELETE_ARRAY(lookupOrderArray); + LE_DELETE_ARRAY(lookupSelectArray); + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/LookupProcessor.h b/src/share/native/sun/font/layout/LookupProcessor.h +--- jdk/src/share/native/sun/font/layout/LookupProcessor.h ++++ jdk/src/share/native/sun/font/layout/LookupProcessor.h +@@ -25,6 +25,7 @@ + + /* + * ++ * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ +@@ -32,9 +33,18 @@ + #ifndef __LOOKUPPROCESSOR_H + #define __LOOKUPPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" ++//#include "Lookups.h" ++//#include "Features.h" ++ ++U_NAMESPACE_BEGIN + + class LEFontInstance; + class LEGlyphStorage; +@@ -46,13 +56,10 @@ + struct LookupSubtable; + struct LookupTable; + +-class LookupProcessor +-{ ++class LookupProcessor : public UMemory { + public: +- le_int32 process(LEGlyphStorage &glyphStorage, +- GlyphPositionAdjustments *glyphPositionAdjustments, +- le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, +- const LEFontInstance *fontInstance) const; ++ le_int32 process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, ++ le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance) const; + + le_uint32 applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; + +@@ -64,19 +71,18 @@ + virtual ~LookupProcessor(); + + protected: +- LookupProcessor(const char *baseAddress, ++ LookupProcessor(const char *baseAddress, + Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset, +- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, +- le_int32 featureMapCount, le_bool orderFeatures); ++ LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures); + +- LookupProcessor(); ++ LookupProcessor(); + + le_int32 selectLookups(const FeatureTable *featureTable, FeatureMask featureMask, le_int32 order); + + const LookupListTable *lookupListTable; + const FeatureListTable *featureListTable; + +- FeatureMask *lookupSelectArray; ++ FeatureMask *lookupSelectArray; + le_uint32 lookupSelectCount; + + le_uint16 *lookupOrderArray; +@@ -88,4 +94,5 @@ + LookupProcessor &operator=(const LookupProcessor &other); // forbid copying of this class + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/LookupTables.cpp b/src/share/native/sun/font/layout/LookupTables.cpp +--- jdk/src/share/native/sun/font/layout/LookupTables.cpp ++++ jdk/src/share/native/sun/font/layout/LookupTables.cpp +@@ -34,6 +34,8 @@ + #include "LookupTables.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + /* + These are the rolled-up versions of the uniform binary search. + Someday, if we need more performance, we can un-roll them. +@@ -104,3 +106,5 @@ + + return NULL; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/LookupTables.h b/src/share/native/sun/font/layout/LookupTables.h +--- jdk/src/share/native/sun/font/layout/LookupTables.h ++++ jdk/src/share/native/sun/font/layout/LookupTables.h +@@ -32,9 +32,16 @@ + #ifndef __LOOKUPTABLES_H + #define __LOOKUPTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LayoutTables.h" + ++U_NAMESPACE_BEGIN ++ + enum LookupTableFormat + { + ltfSimpleArray = 0, +@@ -104,4 +111,5 @@ + LookupValue valueArray[ANY_NUMBER]; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/Lookups.cpp b/src/share/native/sun/font/layout/Lookups.cpp +--- jdk/src/share/native/sun/font/layout/Lookups.cpp ++++ jdk/src/share/native/sun/font/layout/Lookups.cpp +@@ -35,6 +35,8 @@ + #include "CoverageTables.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + const LookupTable *LookupListTable::getLookupTable(le_uint16 lookupTableIndex) const + { + if (lookupTableIndex >= SWAPW(lookupCount)) { +@@ -63,3 +65,5 @@ + + return coverageTable->getGlyphCoverage(glyphID); + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/Lookups.h b/src/share/native/sun/font/layout/Lookups.h +--- jdk/src/share/native/sun/font/layout/Lookups.h ++++ jdk/src/share/native/sun/font/layout/Lookups.h +@@ -32,9 +32,16 @@ + #ifndef __LOOKUPS_H + #define __LOOKUPS_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + enum LookupFlags + { + lfBaselineIsLogicalEnd = 0x0001, // The MS spec. calls this flag "RightToLeft" but this name is more accurate +@@ -79,6 +86,5 @@ + return getGlyphCoverage(coverageTableOffset, glyphID); + } + +- +- ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/MPreFixups.cpp b/src/share/native/sun/font/layout/MPreFixups.cpp +--- jdk/src/share/native/sun/font/layout/MPreFixups.cpp ++++ jdk/src/share/native/sun/font/layout/MPreFixups.cpp +@@ -33,6 +33,8 @@ + #include "LEGlyphStorage.h" + #include "MPreFixups.h" + ++U_NAMESPACE_BEGIN ++ + struct FixupData + { + le_int32 fBaseIndex; +@@ -92,7 +94,7 @@ + + for (i = 0; i < mpreCount; i += 1) { + mpreSave[i] = glyphStorage[mpreIndex + i]; +- indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success); ++ indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success); //charIndices[mpreIndex + i]; + } + + for (i = 0; i < moveCount; i += 1) { +@@ -112,3 +114,5 @@ + LE_DELETE_ARRAY(mpreSave); + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/MPreFixups.h b/src/share/native/sun/font/layout/MPreFixups.h +--- jdk/src/share/native/sun/font/layout/MPreFixups.h ++++ jdk/src/share/native/sun/font/layout/MPreFixups.h +@@ -32,14 +32,22 @@ + #ifndef __MPREFIXUPS_H + #define __MPREFIXUPS_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + // Might want to make this a private member... + struct FixupData; + +-class MPreFixups { ++class MPreFixups : public UMemory ++{ + public: + MPreFixups(le_int32 charCount); + ~MPreFixups(); +@@ -53,4 +61,7 @@ + le_int32 fFixupCount; + }; + ++U_NAMESPACE_END + #endif ++ ++ +diff --git a/src/share/native/sun/font/layout/MarkArrays.cpp b/src/share/native/sun/font/layout/MarkArrays.cpp +--- jdk/src/share/native/sun/font/layout/MarkArrays.cpp ++++ jdk/src/share/native/sun/font/layout/MarkArrays.cpp +@@ -36,6 +36,8 @@ + #include "MarkArrays.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_int32 MarkArray::getMarkClass(LEGlyphID glyphID, le_int32 coverageIndex, const LEFontInstance *fontInstance, + LEPoint &anchor) const + { +@@ -58,3 +60,5 @@ + + return markClass; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/MarkArrays.h b/src/share/native/sun/font/layout/MarkArrays.h +--- jdk/src/share/native/sun/font/layout/MarkArrays.h ++++ jdk/src/share/native/sun/font/layout/MarkArrays.h +@@ -32,10 +32,17 @@ + #ifndef __MARKARRAYS_H + #define __MARKARRAYS_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + struct MarkRecord + { + le_uint16 markClass; +@@ -51,4 +58,7 @@ + LEPoint &anchor) const; + }; + ++U_NAMESPACE_END + #endif ++ ++ +diff --git a/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp +--- jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp +@@ -40,6 +40,8 @@ + #include "GlyphIterator.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + LEGlyphID MarkToBasePositioningSubtable::findBaseGlyph(GlyphIterator *glyphIterator) const + { + if (glyphIterator->prev()) { +@@ -106,7 +108,6 @@ + glyphIterator->setCurrGlyphBaseOffset(baseIterator.getCurrStreamPosition()); + + if (glyphIterator->isRightToLeft()) { +- // dlf flip advance to local coordinate system + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); + } else { + LEPoint baseAdvance; +@@ -114,9 +115,10 @@ + fontInstance->getGlyphAdvance(baseGlyph, pixels); + fontInstance->pixelsToUnits(pixels, baseAdvance); + +- // flip advances to local coordinate system + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - baseAdvance.fX, anchorDiffY - baseAdvance.fY, -markAdvance.fX, -markAdvance.fY); + } + + return 1; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h b/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h +--- jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h ++++ jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h +@@ -32,6 +32,11 @@ + #ifndef __MARKTOBASEPOSITIONINGSUBTABLES_H + #define __MARKTOBASEPOSITIONINGSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" +@@ -39,6 +44,8 @@ + #include "AttachmentPosnSubtables.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + struct MarkToBasePositioningSubtable : AttachmentPositioningSubtable + { + le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; +@@ -56,4 +63,6 @@ + BaseRecord baseRecordArray[ANY_NUMBER]; + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp +--- jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp +@@ -39,6 +39,8 @@ + #include "GlyphIterator.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + LEGlyphID MarkToLigaturePositioningSubtable::findLigatureGlyph(GlyphIterator *glyphIterator) const + { + if (glyphIterator->prev()) { +@@ -117,9 +119,10 @@ + fontInstance->getGlyphAdvance(ligatureGlyph, pixels); + fontInstance->pixelsToUnits(pixels, ligatureAdvance); + +- glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - ligatureAdvance.fX, +- anchorDiffY - ligatureAdvance.fY, -markAdvance.fX, -markAdvance.fY); ++ glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - ligatureAdvance.fX, anchorDiffY - ligatureAdvance.fY, -markAdvance.fX, -markAdvance.fY); + } + + return 1; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h b/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h +--- jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h ++++ jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h +@@ -32,6 +32,11 @@ + #ifndef __MARKTOLIGATUREPOSITIONINGSUBTABLES_H + #define __MARKTOLIGATUREPOSITIONINGSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" +@@ -39,6 +44,8 @@ + #include "AttachmentPosnSubtables.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + struct MarkToLigaturePositioningSubtable : AttachmentPositioningSubtable + { + le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; +@@ -62,4 +69,6 @@ + Offset ligatureAttachTableOffsetArray[ANY_NUMBER]; + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp +--- jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp +@@ -40,6 +40,8 @@ + #include "GlyphIterator.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + LEGlyphID MarkToMarkPositioningSubtable::findMark2Glyph(GlyphIterator *glyphIterator) const + { + if (glyphIterator->findMark2Glyph()) { +@@ -88,7 +90,7 @@ + const AnchorTable *anchorTable = (const AnchorTable *) ((char *) mark2Array + anchorTableOffset); + LEPoint mark2Anchor, markAdvance, pixels; + +- if (anchorTableOffset == 0) { // jb4729 ++ if (anchorTableOffset == 0) { + // this seems to mean that the marks don't attach... + return 0; + } +@@ -111,9 +113,10 @@ + fontInstance->getGlyphAdvance(mark2Glyph, pixels); + fontInstance->pixelsToUnits(pixels, mark2Advance); + +- glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - mark2Advance.fX, +- anchorDiffY - mark2Advance.fY, -markAdvance.fX, -markAdvance.fY); ++ glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - mark2Advance.fX, anchorDiffY - mark2Advance.fY, -markAdvance.fX, -markAdvance.fY); + } + + return 1; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h b/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h +--- jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h ++++ jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h +@@ -32,6 +32,11 @@ + #ifndef __MARKTOMARKPOSITIONINGSUBTABLES_H + #define __MARKTOMARKPOSITIONINGSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" +@@ -39,6 +44,8 @@ + #include "AttachmentPosnSubtables.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + struct MarkToMarkPositioningSubtable : AttachmentPositioningSubtable + { + le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; +@@ -56,4 +63,6 @@ + Mark2Record mark2RecordArray[ANY_NUMBER]; + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/MirroredCharData.cpp b/src/share/native/sun/font/layout/MirroredCharData.cpp +--- jdk/src/share/native/sun/font/layout/MirroredCharData.cpp ++++ jdk/src/share/native/sun/font/layout/MirroredCharData.cpp +@@ -36,6 +36,8 @@ + #include "LETypes.h" + #include "DefaultCharMapper.h" + ++U_NAMESPACE_BEGIN ++ + const LEUnicode32 DefaultCharMapper::mirroredChars[] = { + 0x0028, 0x0029, 0x003C, 0x003E, 0x005B, 0x005D, 0x007B, 0x007D, + 0x00AB, 0x00BB, 0x2039, 0x203A, 0x2045, 0x2046, 0x207D, 0x207E, +@@ -127,3 +129,5 @@ + }; + + const le_int32 DefaultCharMapper::mirroredCharsCount = 332; ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/MorphStateTables.h b/src/share/native/sun/font/layout/MorphStateTables.h +--- jdk/src/share/native/sun/font/layout/MorphStateTables.h ++++ jdk/src/share/native/sun/font/layout/MorphStateTables.h +@@ -32,14 +32,22 @@ + #ifndef __MORPHSTATETABLES_H + #define __MORPHSTATETABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LayoutTables.h" + #include "MorphTables.h" + #include "StateTables.h" + ++U_NAMESPACE_BEGIN ++ + struct MorphStateTableHeader : MorphSubtableHeader + { + StateTableHeader stHeader; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/MorphTables.cpp b/src/share/native/sun/font/layout/MorphTables.cpp +--- jdk/src/share/native/sun/font/layout/MorphTables.cpp ++++ jdk/src/share/native/sun/font/layout/MorphTables.cpp +@@ -42,6 +42,8 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + void MorphTableHeader::process(LEGlyphStorage &glyphStorage) const + { + const ChainHeader *chainHeader = chains; +@@ -114,3 +116,5 @@ + delete processor; + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/MorphTables.h b/src/share/native/sun/font/layout/MorphTables.h +--- jdk/src/share/native/sun/font/layout/MorphTables.h ++++ jdk/src/share/native/sun/font/layout/MorphTables.h +@@ -32,9 +32,16 @@ + #ifndef __MORPHTABLES_H + #define __MORPHTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LayoutTables.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + typedef le_uint32 FeatureFlags; +@@ -98,4 +105,6 @@ + void process(LEGlyphStorage &glyphStorage) const; + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp b/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp +--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp +@@ -37,6 +37,8 @@ + #include "GlyphIterator.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const + { + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +@@ -106,3 +108,5 @@ + + return 0; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.h b/src/share/native/sun/font/layout/MultipleSubstSubtables.h +--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h ++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h +@@ -32,12 +32,19 @@ + #ifndef __MULTIPLESUBSTITUTIONSUBTABLES_H + #define __MULTIPLESUBSTITUTIONSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEGlyphFilter.h" + #include "OpenTypeTables.h" + #include "GlyphSubstitutionTables.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + struct SequenceTable + { + le_uint16 glyphCount; +@@ -52,4 +59,5 @@ + le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/NonContextualGlyphSubst.h b/src/share/native/sun/font/layout/NonContextualGlyphSubst.h +--- jdk/src/share/native/sun/font/layout/NonContextualGlyphSubst.h ++++ jdk/src/share/native/sun/font/layout/NonContextualGlyphSubst.h +@@ -25,6 +25,7 @@ + + /* + * ++ * + * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * + */ +@@ -32,14 +33,23 @@ + #ifndef __NONCONTEXTUALGLYPHSUBSTITUTION_H + #define __NONCONTEXTUALGLYPHSUBSTITUTION_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LayoutTables.h" + #include "LookupTables.h" + #include "MorphTables.h" + ++U_NAMESPACE_BEGIN ++ + struct NonContextualGlyphSubstitutionHeader : MorphSubtableHeader + { + LookupTable table; + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp b/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp +--- jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp ++++ jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp +@@ -41,6 +41,8 @@ + #include "TrimmedArrayProcessor.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor() + { + } +@@ -79,3 +81,5 @@ + return NULL; + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h b/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h +--- jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h ++++ jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h +@@ -32,11 +32,18 @@ + #ifndef __NONCONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H + #define __NONCONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "MorphTables.h" + #include "SubtableProcessor.h" + #include "NonContextualGlyphSubst.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + class NonContextualGlyphSubstitutionProcessor : public SubtableProcessor +@@ -57,4 +64,5 @@ + NonContextualGlyphSubstitutionProcessor &operator=(const NonContextualGlyphSubstitutionProcessor &other); // forbid copying of this class + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp +@@ -47,6 +47,10 @@ + + #include "GDEFMarkFilter.h" + ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(OpenTypeLayoutEngine) ++ + #define ccmpFeatureTag LE_CCMP_FEATURE_TAG + #define ligaFeatureTag LE_LIGA_FEATURE_TAG + #define cligFeatureTag LE_CLIG_FEATURE_TAG +@@ -78,7 +82,7 @@ + {ccmpFeatureTag, ccmpFeatureMask}, + {ligaFeatureTag, ligaFeatureMask}, + {cligFeatureTag, cligFeatureMask}, +- {kernFeatureTag, kernFeatureMask}, ++ {kernFeatureTag, kernFeatureMask}, + {paltFeatureTag, paltFeatureMask}, + {markFeatureTag, markFeatureMask}, + {mkmkFeatureTag, mkmkFeatureMask} +@@ -86,19 +90,15 @@ + + static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); + +-OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, +- const GlyphSubstitutionTableHeader *gsubTable) +- : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), +- fFeatureMask(minimalFeatures), fFeatureMap(featureMap), +- fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE), +- fGSUBTable(gsubTable), fGDEFTable(NULL), fGPOSTable(NULL), +- fSubstitutionFilter(NULL) ++OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) ++ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fFeatureMask(minimalFeatures), ++ fFeatureMap(featureMap), fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE), ++ fGSUBTable(gsubTable), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL) + { + static const le_uint32 gdefTableTag = LE_GDEF_TABLE_TAG; + static const le_uint32 gposTableTag = LE_GPOS_TABLE_TAG; +- const GlyphPositioningTableHeader *gposTable = +- (const GlyphPositioningTableHeader *) getFontTable(gposTableTag); ++ const GlyphPositioningTableHeader *gposTable = (const GlyphPositioningTableHeader *) getFontTable(gposTableTag); + + applyTypoFlags(); + +@@ -128,11 +128,10 @@ + LayoutEngine::reset(); + } + +-OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) +- : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), +- fFeatureOrder(FALSE), fGSUBTable(NULL), fGDEFTable(NULL), +- fGPOSTable(NULL), fSubstitutionFilter(NULL) ++OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags) ++ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fFeatureOrder(FALSE), ++ fGSUBTable(NULL), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL) + { + applyTypoFlags(); + setScriptAndLanguageTags(); +@@ -171,9 +170,8 @@ + fLangSysTag = getLangSysTag(fLanguageCode); + } + +-le_int32 OpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], +- le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, +- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 OpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; +@@ -184,8 +182,7 @@ + return 0; + } + +- le_int32 outCharCount = LayoutEngine::characterProcessing(chars, offset, count, +- max, rightToLeft, outChars, glyphStorage, success); ++ le_int32 outCharCount = LayoutEngine::characterProcessing(chars, offset, count, max, rightToLeft, outChars, glyphStorage, success); + + if (LE_FAILURE(success)) { + return 0; +@@ -203,16 +200,14 @@ + + // Input: characters, tags + // Output: glyphs, char indices +-le_int32 OpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, +- LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 OpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; + } + +- if (chars == NULL || offset < 0 || count < 0 || max < 0 || +- offset >= max || offset + count > max) { ++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } +@@ -224,16 +219,14 @@ + } + + if (fGSUBTable != NULL) { +- count = fGSUBTable->process(glyphStorage, rightToLeft, +- fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, +- fFeatureMap, fFeatureMapCount, fFeatureOrder); ++ count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, ++ fFeatureMap, fFeatureMapCount, fFeatureOrder); + } + + return count; + } + +-le_int32 OpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, +- LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 OpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; +@@ -247,9 +240,7 @@ + return glyphStorage.getGlyphCount(); + } + +-le_int32 OpenTypeLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, +- LEErrorCode &success) ++le_int32 OpenTypeLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + LEUnicode *outChars = NULL; + LEGlyphStorage fakeGlyphStorage; +@@ -259,25 +250,19 @@ + return 0; + } + +- if (chars == NULL || offset < 0 || count < 0 || max < 0 || +- offset >= max || offset + count > max) { ++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + +- outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, +- outChars, fakeGlyphStorage, success); ++ outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, fakeGlyphStorage, success); + + if (outChars != NULL) { +- fakeGlyphCount = glyphProcessing(outChars, 0, outCharCount, outCharCount, +- rightToLeft, fakeGlyphStorage, success); +- // FIXME: a subclass may have allocated this, in which case +- // this delete might not work... +- LE_DELETE_ARRAY(outChars); ++ fakeGlyphCount = glyphProcessing(outChars, 0, outCharCount, outCharCount, rightToLeft, fakeGlyphStorage, success); ++ LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work... + //adjustGlyphs(outChars, 0, outCharCount, rightToLeft, fakeGlyphs, fakeGlyphCount); + } else { +- fakeGlyphCount = glyphProcessing(chars, offset, count, max, rightToLeft, +- fakeGlyphStorage, success); ++ fakeGlyphCount = glyphProcessing(chars, offset, count, max, rightToLeft, fakeGlyphStorage, success); + //adjustGlyphs(chars, offset, count, rightToLeft, fakeGlyphs, fakeGlyphCount); + } + +@@ -287,8 +272,8 @@ + } + + // apply GPOS table, if any +-void OpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success) ++void OpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return; +@@ -324,8 +309,8 @@ + } + #endif + +- fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, +- fGDEFTable, fFontInstance, fFeatureMap, fFeatureMapCount, fFeatureOrder); ++ fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, fGDEFTable, fFontInstance, ++ fFeatureMap, fFeatureMapCount, fFeatureOrder); + + float xAdjust = 0, yAdjust = 0; + +@@ -360,4 +345,12 @@ + + delete adjustments; + } ++ ++#if 0 ++ // Don't know why this is here... ++ LE_DELETE_ARRAY(fFeatureTags); ++ fFeatureTags = NULL; ++#endif + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h +@@ -23,9 +23,7 @@ + * + */ + +- + /* +- * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ +@@ -42,6 +40,8 @@ + #include "GlyphDefinitionTables.h" + #include "GlyphPositioningTables.h" + ++U_NAMESPACE_BEGIN ++ + /** + * OpenTypeLayoutEngine implements complex text layout for OpenType fonts - that is + * fonts which have GSUB and GPOS tables associated with them. In order to do this, +@@ -87,7 +87,7 @@ + * @internal + */ + OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +@@ -95,11 +95,12 @@ + * + * @param fontInstance - the font + * @param scriptCode - the script +- * @param languageCode - the language ++ * @param langaugeCode - the language + * + * @internal + */ +- OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags); ++ OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -132,6 +133,20 @@ + */ + static LETag getLangSysTag(le_int32 languageCode); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + private: + + /** +@@ -259,9 +274,8 @@ + * + * @internal + */ +- virtual le_int32 characterProcessing(const LEUnicode /*chars*/[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool /*rightToLeft*/, +- LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual le_int32 characterProcessing(const LEUnicode /*chars*/[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, ++ LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method does character to glyph mapping, and applies the GSUB table. The +@@ -292,9 +306,8 @@ + * + * @internal + */ +- virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, +- LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method does any processing necessary to convert "fake" +@@ -321,8 +334,7 @@ + * + * @internal + */ +- virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, +- LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method applies the characterProcessing, glyphProcessing and glyphPostProcessing +@@ -346,8 +358,7 @@ + * + * @internal + */ +- virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, +- le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method uses the GPOS table, if there is one, to adjust the glyph positions. +@@ -364,8 +375,7 @@ + * + * @internal + */ +- virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, +- le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method frees the feature tag array so that the +@@ -377,4 +387,6 @@ + virtual void reset(); + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/OpenTypeTables.h b/src/share/native/sun/font/layout/OpenTypeTables.h +--- jdk/src/share/native/sun/font/layout/OpenTypeTables.h ++++ jdk/src/share/native/sun/font/layout/OpenTypeTables.h +@@ -32,8 +32,15 @@ + #ifndef __OPENTYPETABLES_H + #define __OPENTYPETABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + ++U_NAMESPACE_BEGIN ++ + #define ANY_NUMBER 1 + + typedef le_uint16 Offset; +@@ -62,4 +69,5 @@ + FeatureMask mask; + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/OpenTypeUtilities.cpp b/src/share/native/sun/font/layout/OpenTypeUtilities.cpp +--- jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp ++++ jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp +@@ -34,6 +34,8 @@ + #include "OpenTypeUtilities.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + // + // Finds the high bit by binary searching + // through the bits in n. +@@ -192,3 +194,7 @@ + array[i + 1] = v; + } + } ++ ++ ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/OpenTypeUtilities.h b/src/share/native/sun/font/layout/OpenTypeUtilities.h +--- jdk/src/share/native/sun/font/layout/OpenTypeUtilities.h ++++ jdk/src/share/native/sun/font/layout/OpenTypeUtilities.h +@@ -32,10 +32,17 @@ + #ifndef __OPENTYPEUTILITIES_H + #define __OPENTYPEUTILITIES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + +-class OpenTypeUtilities { ++U_NAMESPACE_BEGIN ++ ++class OpenTypeUtilities /* not : public UObject because all methods are static */ { + public: + static le_int8 highBit(le_int32 value); + static Offset getTagOffset(LETag tag, const TagAndOffsetRecord *records, le_int32 recordCount); +@@ -48,4 +55,5 @@ + OpenTypeUtilities() {} // private - forbid instantiation + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/PairPositioningSubtables.cpp b/src/share/native/sun/font/layout/PairPositioningSubtables.cpp +--- jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp +@@ -39,6 +39,8 @@ + #include "OpenTypeUtilities.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_uint32 PairPositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const + { + switch(SWAPW(subtableFormat)) +@@ -82,8 +84,7 @@ + const PairValueRecord *pairValueRecord = NULL; + + if (pairValueCount != 0) { +- pairValueRecord = findPairValueRecord((TTGlyphID) LE_GET_GLYPH(secondGlyph), +- pairSetTable->pairValueRecordArray, pairValueCount, recordSize); ++ pairValueRecord = findPairValueRecord((TTGlyphID) LE_GET_GLYPH(secondGlyph), pairSetTable->pairValueRecordArray, pairValueCount, recordSize); + } + + if (pairValueRecord == NULL) { +@@ -91,8 +92,7 @@ + } + + if (valueFormat1 != 0) { +- pairValueRecord->valueRecord1.adjustPosition(SWAPW(valueFormat1), (char *) this, +- tempIterator, fontInstance); ++ pairValueRecord->valueRecord1.adjustPosition(SWAPW(valueFormat1), (char *) this, tempIterator, fontInstance); + } + + if (valueFormat2 != 0) { +@@ -171,3 +171,5 @@ + + return NULL; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/PairPositioningSubtables.h b/src/share/native/sun/font/layout/PairPositioningSubtables.h +--- jdk/src/share/native/sun/font/layout/PairPositioningSubtables.h ++++ jdk/src/share/native/sun/font/layout/PairPositioningSubtables.h +@@ -32,6 +32,11 @@ + #ifndef __PAIRPOSITIONINGSUBTABLES_H + #define __PAIRPOSITIONINGSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" +@@ -39,6 +44,8 @@ + #include "ValueRecords.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + // NOTE: ValueRecord has a variable size + struct PairValueRecord + { +@@ -96,4 +103,7 @@ + le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; + }; + ++U_NAMESPACE_END + #endif ++ ++ +diff --git a/src/share/native/sun/font/layout/ScriptAndLanguage.cpp b/src/share/native/sun/font/layout/ScriptAndLanguage.cpp +--- jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp ++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp +@@ -25,6 +25,7 @@ + + /* + * ++ * + * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * + */ +@@ -35,6 +36,8 @@ + #include "ScriptAndLanguage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + const LangSysTable *ScriptTable::findLanguage(LETag languageTag, le_bool exactMatch) const + { + le_uint16 count = SWAPW(langSysCount); +@@ -79,3 +82,5 @@ + + return scriptTable->findLanguage(languageTag, exactMatch); + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ScriptAndLanguage.h b/src/share/native/sun/font/layout/ScriptAndLanguage.h +--- jdk/src/share/native/sun/font/layout/ScriptAndLanguage.h ++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguage.h +@@ -32,9 +32,16 @@ + #ifndef __SCRIPTANDLANGUAGE_H + #define __SCRIPTANDLANGUAGE_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + typedef TagAndOffsetRecord LangSysRecord; + + struct LangSysTable +@@ -65,4 +72,6 @@ + const LangSysTable *findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const; + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp b/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp +--- jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp ++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp +@@ -35,6 +35,8 @@ + #include "ScriptAndLanguageTags.h" + #include "OpenTypeLayoutEngine.h" + ++U_NAMESPACE_BEGIN ++ + const LETag OpenTypeLayoutEngine::scriptTags[] = { + zyyyScriptTag, /* 'zyyy' (COMMON) */ + qaaiScriptTag, /* 'qaai' (INHERITED) */ +@@ -125,3 +127,5 @@ + zhsLanguageTag, /* 'ZHS' (Chinese (Simplified)) */ + zhtLanguageTag /* 'ZHT' (Chinese (Traditional)) */ + }; ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ScriptAndLanguageTags.h b/src/share/native/sun/font/layout/ScriptAndLanguageTags.h +--- jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.h ++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.h +@@ -36,6 +36,13 @@ + + #include "LETypes.h" + ++U_NAMESPACE_BEGIN ++ ++/** ++ * \file ++ * \internal ++ */ ++ + const LETag zyyyScriptTag = 0x7A797979; /* 'zyyy' (COMMON) */ + const LETag qaaiScriptTag = 0x71616169; /* 'qaai' (INHERITED) */ + const LETag arabScriptTag = 0x61726162; /* 'arab' (ARABIC) */ +@@ -126,4 +133,6 @@ + const LETag zhsLanguageTag = 0x5A485320; /* 'ZHS' (Chinese (Simplified)) */ + const LETag zhtLanguageTag = 0x5A485420; /* 'ZHT' (Chinese (Traditional)) */ + ++ ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp b/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp +--- jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp +@@ -38,6 +38,10 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentArrayProcessor) ++ + SegmentArrayProcessor::SegmentArrayProcessor() + { + } +@@ -77,3 +81,5 @@ + } + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SegmentArrayProcessor.h b/src/share/native/sun/font/layout/SegmentArrayProcessor.h +--- jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.h ++++ jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.h +@@ -32,12 +32,19 @@ + #ifndef __SEGMENTARRAYPROCESSOR_H + #define __SEGMENTARRAYPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "MorphTables.h" + #include "SubtableProcessor.h" + #include "NonContextualGlyphSubst.h" + #include "NonContextualGlyphSubstProc.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + class SegmentArrayProcessor : public NonContextualGlyphSubstitutionProcessor +@@ -49,11 +56,28 @@ + + virtual ~SegmentArrayProcessor(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + private: + SegmentArrayProcessor(); + + protected: + const SegmentArrayLookupTable *segmentArrayLookupTable; ++ + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp b/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp +--- jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp +@@ -38,6 +38,10 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentSingleProcessor) ++ + SegmentSingleProcessor::SegmentSingleProcessor() + { + } +@@ -71,3 +75,5 @@ + } + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SegmentSingleProcessor.h b/src/share/native/sun/font/layout/SegmentSingleProcessor.h +--- jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.h ++++ jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.h +@@ -32,12 +32,19 @@ + #ifndef __SEGMENTSINGLEPROCESSOR_H + #define __SEGMENTSINGLEPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "MorphTables.h" + #include "SubtableProcessor.h" + #include "NonContextualGlyphSubst.h" + #include "NonContextualGlyphSubstProc.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + class SegmentSingleProcessor : public NonContextualGlyphSubstitutionProcessor +@@ -49,11 +56,28 @@ + + virtual ~SegmentSingleProcessor(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + private: + SegmentSingleProcessor(); + + protected: + const SegmentSingleLookupTable *segmentSingleLookupTable; ++ + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/ShapingTypeData.cpp b/src/share/native/sun/font/layout/ShapingTypeData.cpp +--- jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp ++++ jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp +@@ -36,6 +36,8 @@ + #include "LETypes.h" + #include "ArabicShaping.h" + ++U_NAMESPACE_BEGIN ++ + const le_uint8 ArabicShaping::shapingTypeTable[] = { + 0x00, 0x02, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0x05, 0x03, 0x00, 0x03, 0x6F, 0x00, 0x05, + 0x04, 0x83, 0x04, 0x86, 0x00, 0x05, 0x04, 0x88, 0x04, 0x89, 0x00, 0x05, 0x05, 0x91, 0x05, 0xB9, +@@ -104,3 +106,5 @@ + 0xFE, 0x20, 0xFE, 0x23, 0x00, 0x05, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x05, 0xFF, 0xF9, 0xFF, 0xFB, + 0x00, 0x05 + }; ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp b/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp +--- jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp +@@ -38,6 +38,10 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleArrayProcessor) ++ + SimpleArrayProcessor::SimpleArrayProcessor() + { + } +@@ -68,3 +72,5 @@ + } + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SimpleArrayProcessor.h b/src/share/native/sun/font/layout/SimpleArrayProcessor.h +--- jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.h ++++ jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.h +@@ -32,12 +32,19 @@ + #ifndef __SIMPLEARRAYPROCESSOR_H + #define __SIMPLEARRAYPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "MorphTables.h" + #include "SubtableProcessor.h" + #include "NonContextualGlyphSubst.h" + #include "NonContextualGlyphSubstProc.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + class SimpleArrayProcessor : public NonContextualGlyphSubstitutionProcessor +@@ -49,11 +56,28 @@ + + virtual ~SimpleArrayProcessor(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + private: + SimpleArrayProcessor(); + + protected: + const SimpleArrayLookupTable *simpleArrayLookupTable; ++ + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp b/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp +--- jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp +@@ -38,6 +38,8 @@ + #include "GlyphIterator.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_uint32 SinglePositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const + { + switch(SWAPW(subtableFormat)) +@@ -84,11 +86,12 @@ + le_int16 coverageIndex = (le_int16) getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { +- valueRecordArray[0].adjustPosition(coverageIndex, SWAPW(valueFormat), (const char *) this, +- *glyphIterator, fontInstance); ++ valueRecordArray[0].adjustPosition(coverageIndex, SWAPW(valueFormat), (const char *) this, *glyphIterator, fontInstance); + + return 1; + } + + return 0; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SinglePositioningSubtables.h b/src/share/native/sun/font/layout/SinglePositioningSubtables.h +--- jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.h ++++ jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.h +@@ -32,6 +32,11 @@ + #ifndef __SINGLEPOSITIONINGSUBTABLES_H + #define __SINGLEPOSITIONINGSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" +@@ -39,6 +44,8 @@ + #include "ValueRecords.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + struct SinglePositioningSubtable : GlyphPositioningSubtable + { + le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; +@@ -61,4 +68,7 @@ + le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; + }; + ++U_NAMESPACE_END + #endif ++ ++ +diff --git a/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp b/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp +--- jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp +@@ -37,6 +37,8 @@ + #include "GlyphIterator.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + le_uint32 SingleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const + { + switch(SWAPW(subtableFormat)) +@@ -98,3 +100,5 @@ + + return 0; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h b/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h +--- jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h ++++ jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h +@@ -32,12 +32,19 @@ + #ifndef __SINGLESUBSTITUTIONSUBTABLES_H + #define __SINGLESUBSTITUTIONSUBTABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEGlyphFilter.h" + #include "OpenTypeTables.h" + #include "GlyphSubstitutionTables.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + struct SingleSubstitutionSubtable : GlyphSubstitutionSubtable + { + le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; +@@ -58,4 +65,7 @@ + le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; + }; + ++U_NAMESPACE_END + #endif ++ ++ +diff --git a/src/share/native/sun/font/layout/SingleTableProcessor.cpp b/src/share/native/sun/font/layout/SingleTableProcessor.cpp +--- jdk/src/share/native/sun/font/layout/SingleTableProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/SingleTableProcessor.cpp +@@ -38,6 +38,10 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SingleTableProcessor) ++ + SingleTableProcessor::SingleTableProcessor() + { + } +@@ -68,3 +72,5 @@ + } + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SingleTableProcessor.h b/src/share/native/sun/font/layout/SingleTableProcessor.h +--- jdk/src/share/native/sun/font/layout/SingleTableProcessor.h ++++ jdk/src/share/native/sun/font/layout/SingleTableProcessor.h +@@ -32,12 +32,19 @@ + #ifndef __SINGLETABLEPROCESSOR_H + #define __SINGLETABLEPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "MorphTables.h" + #include "SubtableProcessor.h" + #include "NonContextualGlyphSubst.h" + #include "NonContextualGlyphSubstProc.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + class SingleTableProcessor : public NonContextualGlyphSubstitutionProcessor +@@ -49,11 +56,27 @@ + + virtual ~SingleTableProcessor(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + private: + SingleTableProcessor(); + + protected: + const SingleTableLookupTable *singleTableLookupTable; ++ + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/StateTableProcessor.cpp b/src/share/native/sun/font/layout/StateTableProcessor.cpp +--- jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp +@@ -38,6 +38,8 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + StateTableProcessor::StateTableProcessor() + { + } +@@ -101,3 +103,5 @@ + + endStateTable(); + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/StateTableProcessor.h b/src/share/native/sun/font/layout/StateTableProcessor.h +--- jdk/src/share/native/sun/font/layout/StateTableProcessor.h ++++ jdk/src/share/native/sun/font/layout/StateTableProcessor.h +@@ -32,11 +32,18 @@ + #ifndef __STATETABLEPROCESSOR_H + #define __STATETABLEPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "MorphTables.h" + #include "MorphStateTables.h" + #include "SubtableProcessor.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + class StateTableProcessor : public SubtableProcessor +@@ -72,4 +79,5 @@ + StateTableProcessor &operator=(const StateTableProcessor &other); // forbid copying of this class + }; + ++U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/StateTables.h b/src/share/native/sun/font/layout/StateTables.h +--- jdk/src/share/native/sun/font/layout/StateTables.h ++++ jdk/src/share/native/sun/font/layout/StateTables.h +@@ -32,6 +32,11 @@ + #ifndef __STATETABLES_H + #define __STATETABLES_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LayoutTables.h" + +@@ -70,6 +75,8 @@ + #define LE_STATE_PATIENCE_INCR(x) if((x)!=le_patience_curr) ++le_patience_count; + + ++U_NAMESPACE_BEGIN ++ + struct StateTableHeader + { + le_int16 stateSize; +@@ -113,4 +120,6 @@ + le_int16 flags; + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/SubstitutionLookups.cpp b/src/share/native/sun/font/layout/SubstitutionLookups.cpp +--- jdk/src/share/native/sun/font/layout/SubstitutionLookups.cpp ++++ jdk/src/share/native/sun/font/layout/SubstitutionLookups.cpp +@@ -39,6 +39,8 @@ + #include "CoverageTables.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + /* + NOTE: This could be optimized somewhat by keeping track + of the previous sequenceIndex in the loop and doing next() +@@ -65,3 +67,5 @@ + lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance); + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SubstitutionLookups.h b/src/share/native/sun/font/layout/SubstitutionLookups.h +--- jdk/src/share/native/sun/font/layout/SubstitutionLookups.h ++++ jdk/src/share/native/sun/font/layout/SubstitutionLookups.h +@@ -32,6 +32,11 @@ + #ifndef __SUBSTITUTIONLOOKUPS_H + #define __SUBSTITUTIONLOOKUPS_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" +@@ -39,6 +44,8 @@ + #include "GlyphIterator.h" + #include "LookupProcessor.h" + ++U_NAMESPACE_BEGIN ++ + struct SubstitutionLookupRecord + { + le_uint16 sequenceIndex; +@@ -56,4 +63,6 @@ + le_int32 position); + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/SubtableProcessor.cpp b/src/share/native/sun/font/layout/SubtableProcessor.cpp +--- jdk/src/share/native/sun/font/layout/SubtableProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/SubtableProcessor.cpp +@@ -34,6 +34,8 @@ + #include "SubtableProcessor.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + SubtableProcessor::SubtableProcessor() + { + } +@@ -50,3 +52,5 @@ + SubtableProcessor::~SubtableProcessor() + { + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SubtableProcessor.h b/src/share/native/sun/font/layout/SubtableProcessor.h +--- jdk/src/share/native/sun/font/layout/SubtableProcessor.h ++++ jdk/src/share/native/sun/font/layout/SubtableProcessor.h +@@ -32,13 +32,19 @@ + #ifndef __SUBTABLEPROCESSOR_H + #define __SUBTABLEPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "MorphTables.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + +-class SubtableProcessor +-{ ++class SubtableProcessor : public UMemory { + public: + virtual void process(LEGlyphStorage &glyphStorage) = 0; + virtual ~SubtableProcessor(); +@@ -60,4 +66,6 @@ + SubtableProcessor &operator=(const SubtableProcessor &other); // forbid copying of this class + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp b/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp +@@ -38,8 +38,11 @@ + + #include "ThaiShaping.h" + +-ThaiLayoutEngine::ThaiLayoutEngine(const LEFontInstance *fontInstance, +- le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ThaiLayoutEngine) ++ ++ThaiLayoutEngine::ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) + : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags) + { + fErrorChar = 0x25CC; +@@ -73,16 +76,13 @@ + // Output: glyphs, char indices + // Returns: the glyph count + // NOTE: this assumes that ThaiShaping::compose will allocate the outChars array... +-le_int32 ThaiLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool /*rightToLeft*/, +- LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 ThaiLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; + } + +- if (chars == NULL || offset < 0 || count < 0 || max < 0 || +- offset >= max || offset + count > max) { ++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } +@@ -107,8 +107,7 @@ + return 0; + } + +- glyphCount = ThaiShaping::compose(chars, offset, count, fGlyphSet, fErrorChar, +- outChars, glyphStorage); ++ glyphCount = ThaiShaping::compose(chars, offset, count, fGlyphSet, fErrorChar, outChars, glyphStorage); + mapCharsToGlyphs(outChars, 0, glyphCount, FALSE, FALSE, glyphStorage, success); + + LE_DELETE_ARRAY(outChars); +@@ -116,3 +115,5 @@ + glyphStorage.adoptGlyphCount(glyphCount); + return glyphCount; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ThaiLayoutEngine.h b/src/share/native/sun/font/layout/ThaiLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.h +@@ -39,6 +39,8 @@ + + #include "ThaiShaping.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + /** +@@ -66,8 +68,7 @@ + * + * @internal + */ +- ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, +- le_int32 languageCode, le_int32 typoFlags); ++ ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -76,6 +77,20 @@ + */ + virtual ~ThaiLayoutEngine(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + protected: + /** + * A small integer indicating which Thai encoding +@@ -109,10 +124,8 @@ + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context +- * @param rightToLeft - <code>TRUE</code> if the text is in a +- * right to left directional run +- * @param glyphStorage - the glyph storage object. The glyph and +- * char index arrays will be set. ++ * @param rightToLeft - <code>TRUE</code> if the text is in a right to left directional run ++ * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. + * + * Output parameters: + * @param success - set to an error code if the operation fails +@@ -123,10 +136,11 @@ + * + * @internal + */ +- virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, +- le_int32 count, le_int32 max, le_bool rightToLeft, ++ virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/ThaiShaping.cpp b/src/share/native/sun/font/layout/ThaiShaping.cpp +--- jdk/src/share/native/sun/font/layout/ThaiShaping.cpp ++++ jdk/src/share/native/sun/font/layout/ThaiShaping.cpp +@@ -35,6 +35,8 @@ + #include "LEGlyphStorage.h" + #include "ThaiShaping.h" + ++U_NAMESPACE_BEGIN ++ + enum { + CH_SPACE = 0x0020, + CH_YAMAKKAN = 0x0E4E, +@@ -248,9 +250,8 @@ + return transition.nextState; + } + +-le_uint8 ThaiShaping::getNextState(LEUnicode ch, le_uint8 prevState, le_int32 inputIndex, +- le_uint8 glyphSet, LEUnicode errorChar, +- le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex) ++le_uint8 ThaiShaping::getNextState(LEUnicode ch, le_uint8 prevState, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar, ++ le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex) + { + StateTransition transition; + +@@ -327,3 +328,5 @@ + + return outputIndex; + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ThaiShaping.h b/src/share/native/sun/font/layout/ThaiShaping.h +--- jdk/src/share/native/sun/font/layout/ThaiShaping.h ++++ jdk/src/share/native/sun/font/layout/ThaiShaping.h +@@ -32,13 +32,20 @@ + #ifndef __THAISHAPING_H + #define __THAISHAPING_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEGlyphFilter.h" + #include "OpenTypeTables.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + +-class ThaiShaping { ++class ThaiShaping /* not : public UObject because all methods are static */ { + public: + + enum { +@@ -120,4 +127,7 @@ + return thaiStateTable[state][currClass]; + } + ++U_NAMESPACE_END + #endif ++ ++ +diff --git a/src/share/native/sun/font/layout/ThaiStateTables.cpp b/src/share/native/sun/font/layout/ThaiStateTables.cpp +--- jdk/src/share/native/sun/font/layout/ThaiStateTables.cpp ++++ jdk/src/share/native/sun/font/layout/ThaiStateTables.cpp +@@ -25,6 +25,7 @@ + + /* + * ++ * + * (C) Copyright IBM Corp. 1999-2003 - All Rights Reserved + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS +@@ -35,6 +36,8 @@ + #include "LETypes.h" + #include "ThaiShaping.h" + ++U_NAMESPACE_BEGIN ++ + const le_uint8 ThaiShaping::classTable[] = { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + // ------------------------------------------------------------------------------- +@@ -105,3 +108,5 @@ + /*50*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {51, tC}, { 0, tR}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*51*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}} + }; ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp b/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp +--- jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp +@@ -38,6 +38,10 @@ + #include "LEGlyphStorage.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TrimmedArrayProcessor) ++ + TrimmedArrayProcessor::TrimmedArrayProcessor() + { + } +@@ -72,3 +76,5 @@ + } + } + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/TrimmedArrayProcessor.h b/src/share/native/sun/font/layout/TrimmedArrayProcessor.h +--- jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.h ++++ jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.h +@@ -32,12 +32,19 @@ + #ifndef __TRIMMEDARRAYPROCESSOR_H + #define __TRIMMEDARRAYPROCESSOR_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "MorphTables.h" + #include "SubtableProcessor.h" + #include "NonContextualGlyphSubst.h" + #include "NonContextualGlyphSubstProc.h" + ++U_NAMESPACE_BEGIN ++ + class LEGlyphStorage; + + class TrimmedArrayProcessor : public NonContextualGlyphSubstitutionProcessor +@@ -49,6 +56,20 @@ + + virtual ~TrimmedArrayProcessor(); + ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ + private: + TrimmedArrayProcessor(); + +@@ -56,6 +77,9 @@ + TTGlyphID firstGlyph; + TTGlyphID lastGlyph; + const TrimmedArrayLookupTable *trimmedArrayLookupTable; ++ + }; + ++U_NAMESPACE_END + #endif ++ +diff --git a/src/share/native/sun/font/layout/ValueRecords.cpp b/src/share/native/sun/font/layout/ValueRecords.cpp +--- jdk/src/share/native/sun/font/layout/ValueRecords.cpp ++++ jdk/src/share/native/sun/font/layout/ValueRecords.cpp +@@ -37,6 +37,8 @@ + #include "GlyphIterator.h" + #include "LESwaps.h" + ++U_NAMESPACE_BEGIN ++ + #define Nibble(value, nibble) ((value >> (nibble * 4)) & 0xF) + #define NibbleBits(value, nibble) (bitsInNibble[Nibble(value, nibble)]) + +@@ -161,8 +163,8 @@ + xPlacementAdjustment, yPlacementAdjustment, xAdvanceAdjustment, yAdvanceAdjustment); + } + +-void ValueRecord::adjustPosition(le_int16 index, ValueFormat valueFormat, const char *base, +- GlyphIterator &glyphIterator, const LEFontInstance *fontInstance) const ++void ValueRecord::adjustPosition(le_int16 index, ValueFormat valueFormat, const char *base, GlyphIterator &glyphIterator, ++ const LEFontInstance *fontInstance) const + { + float xPlacementAdjustment = 0; + float yPlacementAdjustment = 0; +@@ -323,3 +325,5 @@ + + return getFieldCount(valueFormat & beforeMasks[field]); + } ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ValueRecords.h b/src/share/native/sun/font/layout/ValueRecords.h +--- jdk/src/share/native/sun/font/layout/ValueRecords.h ++++ jdk/src/share/native/sun/font/layout/ValueRecords.h +@@ -32,11 +32,18 @@ + #ifndef __VALUERECORDS_H + #define __VALUERECORDS_H + ++/** ++ * \file ++ * \internal ++ */ ++ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" + #include "GlyphIterator.h" + ++U_NAMESPACE_BEGIN ++ + typedef le_uint16 ValueFormat; + typedef le_int16 ValueRecordField; + +@@ -84,5 +91,7 @@ + vfbAnyDevice = vfbXPlaDevice + vfbYPlaDevice + vfbXAdvDevice + vfbYAdvDevice + }; + ++U_NAMESPACE_END ++#endif + +-#endif ++ diff --git a/java/openjdk6/files/icedtea/openjdk/6669869-queries_per_appcontext.patch b/java/openjdk6/files/icedtea/openjdk/6669869-queries_per_appcontext.patch new file mode 100644 index 000000000000..5e0f001e7b35 --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/6669869-queries_per_appcontext.patch @@ -0,0 +1,355 @@ +# HG changeset patch +# User andrew +# Date 1365686276 -3600 +# Node ID a939f541de9af5ccb78225c27cd46cd7dc6bcf87 +# Parent 9745a1f43592582cce60d8632d614fafc7dfdc3c +6669869: Beans.isDesignTime() and other queries should be per-AppContext +Reviewed-by: peterz, rupashka + +diff --git a/src/share/classes/java/beans/Beans.java b/src/share/classes/java/beans/Beans.java +--- jdk/src/share/classes/java/beans/Beans.java ++++ jdk/src/share/classes/java/beans/Beans.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. + * 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,26 +27,41 @@ + + import com.sun.beans.finder.ClassFinder; + +-import java.applet.*; ++import java.applet.Applet; ++import java.applet.AppletContext; ++import java.applet.AppletStub; ++import java.applet.AudioClip; + +-import java.awt.*; +- +-import java.beans.AppletInitializer; ++import java.awt.GraphicsEnvironment; ++import java.awt.Image; + + import java.beans.beancontext.BeanContext; + +-import java.io.*; +- +-import java.lang.reflect.Constructor; ++import java.io.IOException; ++import java.io.InputStream; ++import java.io.ObjectInputStream; ++import java.io.ObjectStreamClass; ++import java.io.StreamCorruptedException; + + import java.net.URL; +-import java.lang.reflect.Array; ++ ++import java.security.AccessController; ++import java.security.PrivilegedAction; ++ ++import java.util.Enumeration; ++import java.util.Hashtable; ++import java.util.Iterator; ++import java.util.Vector; ++ ++import sun.awt.AppContext; + + /** + * This class provides some general purpose beans control methods. + */ + + public class Beans { ++ private static final Object DESIGN_TIME = new Object(); ++ private static final Object GUI_AVAILABLE = new Object(); + + /** + * <p> +@@ -59,12 +74,12 @@ + * @param beanName the name of the bean within the class-loader. + * For example "sun.beanbox.foobah" + * +- * @exception java.lang.ClassNotFoundException if the class of a serialized ++ * @exception ClassNotFoundException if the class of a serialized + * object could not be found. +- * @exception java.io.IOException if an I/O error occurs. ++ * @exception IOException if an I/O error occurs. + */ + +- public static Object instantiate(ClassLoader cls, String beanName) throws java.io.IOException, ClassNotFoundException { ++ public static Object instantiate(ClassLoader cls, String beanName) throws IOException, ClassNotFoundException { + return Beans.instantiate(cls, beanName, null, null); + } + +@@ -80,12 +95,12 @@ + * For example "sun.beanbox.foobah" + * @param beanContext The BeanContext in which to nest the new bean + * +- * @exception java.lang.ClassNotFoundException if the class of a serialized ++ * @exception ClassNotFoundException if the class of a serialized + * object could not be found. +- * @exception java.io.IOException if an I/O error occurs. ++ * @exception IOException if an I/O error occurs. + */ + +- public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws java.io.IOException, ClassNotFoundException { ++ public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws IOException, ClassNotFoundException { + return Beans.instantiate(cls, beanName, beanContext, null); + } + +@@ -135,19 +150,19 @@ + * @param beanContext The BeanContext in which to nest the new bean + * @param initializer The AppletInitializer for the new bean + * +- * @exception java.lang.ClassNotFoundException if the class of a serialized ++ * @exception ClassNotFoundException if the class of a serialized + * object could not be found. +- * @exception java.io.IOException if an I/O error occurs. ++ * @exception IOException if an I/O error occurs. + */ + + public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext, AppletInitializer initializer) +- throws java.io.IOException, ClassNotFoundException { ++ throws IOException, ClassNotFoundException { + +- java.io.InputStream ins; +- java.io.ObjectInputStream oins = null; ++ InputStream ins; ++ ObjectInputStream oins = null; + Object result = null; + boolean serialized = false; +- java.io.IOException serex = null; ++ IOException serex = null; + + // If the given classloader is null, we check if an + // system classloader is available and (if so) +@@ -166,8 +181,8 @@ + // Try to find a serialized object with this name + final String serName = beanName.replace('.','/').concat(".ser"); + final ClassLoader loader = cls; +- ins = (InputStream)java.security.AccessController.doPrivileged +- (new java.security.PrivilegedAction() { ++ ins = (InputStream)AccessController.doPrivileged ++ (new PrivilegedAction() { + public Object run() { + if (loader == null) + return ClassLoader.getSystemResourceAsStream(serName); +@@ -185,7 +200,7 @@ + result = oins.readObject(); + serialized = true; + oins.close(); +- } catch (java.io.IOException ex) { ++ } catch (IOException ex) { + ins.close(); + // Drop through and try opening the class. But remember + // the exception in case we can't find the class either. +@@ -264,8 +279,8 @@ + + final ClassLoader cloader = cls; + objectUrl = (URL) +- java.security.AccessController.doPrivileged +- (new java.security.PrivilegedAction() { ++ AccessController.doPrivileged ++ (new PrivilegedAction() { + public Object run() { + if (cloader == null) + return ClassLoader.getSystemResource +@@ -377,10 +392,11 @@ + * @return True if we are running in an application construction + * environment. + * +- * @see java.beans.DesignMode ++ * @see DesignMode + */ + public static boolean isDesignTime() { +- return designTime; ++ Object value = AppContext.getAppContext().get(DESIGN_TIME); ++ return (value instanceof Boolean) && (Boolean) value; + } + + /** +@@ -393,11 +409,12 @@ + * false in a server environment or if an application is + * running as part of a batch job. + * +- * @see java.beans.Visibility ++ * @see Visibility + * + */ + public static boolean isGuiAvailable() { +- return guiAvailable; ++ Object value = AppContext.getAppContext().get(GUI_AVAILABLE); ++ return (value instanceof Boolean) ? (Boolean) value : !GraphicsEnvironment.isHeadless(); + } + + /** +@@ -423,7 +440,7 @@ + if (sm != null) { + sm.checkPropertiesAccess(); + } +- designTime = isDesignTime; ++ AppContext.getAppContext().put(DESIGN_TIME, Boolean.valueOf(isDesignTime)); + } + + /** +@@ -449,14 +466,7 @@ + if (sm != null) { + sm.checkPropertiesAccess(); + } +- guiAvailable = isGuiAvailable; +- } +- +- +- private static boolean designTime; +- private static boolean guiAvailable; +- static { +- guiAvailable = !GraphicsEnvironment.isHeadless(); ++ AppContext.getAppContext().put(GUI_AVAILABLE, Boolean.valueOf(isGuiAvailable)); + } + } + +@@ -501,7 +511,7 @@ + + class BeansAppletContext implements AppletContext { + Applet target; +- java.util.Hashtable imageCache = new java.util.Hashtable(); ++ Hashtable imageCache = new Hashtable(); + + BeansAppletContext(Applet target) { + this.target = target; +@@ -546,8 +556,8 @@ + return null; + } + +- public java.util.Enumeration getApplets() { +- java.util.Vector applets = new java.util.Vector(); ++ public Enumeration getApplets() { ++ Vector applets = new Vector(); + applets.addElement(target); + return applets.elements(); + } +@@ -573,7 +583,7 @@ + return null; + } + +- public java.util.Iterator getStreamKeys(){ ++ public Iterator getStreamKeys(){ + // We do nothing. + return null; + } +diff --git a/test/java/beans/Beans/6669869/TestDesignTime.java b/test/java/beans/Beans/6669869/TestDesignTime.java +new file mode 100644 +--- /dev/null ++++ jdk/test/java/beans/Beans/6669869/TestDesignTime.java +@@ -0,0 +1,52 @@ ++/* ++ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute 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 6669869 ++ * @summary Tests DesignTime property in different application contexts ++ * @author Sergey Malenkov ++ */ ++ ++import java.beans.Beans; ++import sun.awt.SunToolkit; ++ ++public class TestDesignTime implements Runnable { ++ public static void main(String[] args) throws InterruptedException { ++ if (Beans.isDesignTime()) { ++ throw new Error("unexpected DesignTime property"); ++ } ++ Beans.setDesignTime(!Beans.isDesignTime()); ++ ThreadGroup group = new ThreadGroup("$$$"); ++ Thread thread = new Thread(group, new TestDesignTime()); ++ thread.start(); ++ thread.join(); ++ } ++ ++ public void run() { ++ SunToolkit.createNewAppContext(); ++ if (Beans.isDesignTime()) { ++ throw new Error("shared DesignTime property"); ++ } ++ } ++} +diff --git a/test/java/beans/Beans/6669869/TestGuiAvailable.java b/test/java/beans/Beans/6669869/TestGuiAvailable.java +new file mode 100644 +--- /dev/null ++++ jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java +@@ -0,0 +1,53 @@ ++/* ++ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute 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 6669869 ++ * @summary Tests GuiAvailable property in different application contexts ++ * @author Sergey Malenkov ++ */ ++ ++import java.awt.GraphicsEnvironment; ++import java.beans.Beans; ++import sun.awt.SunToolkit; ++ ++public class TestGuiAvailable implements Runnable { ++ public static void main(String[] args) throws InterruptedException { ++ if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) { ++ throw new Error("unexpected GuiAvailable property"); ++ } ++ Beans.setGuiAvailable(!Beans.isGuiAvailable()); ++ ThreadGroup group = new ThreadGroup("$$$"); ++ Thread thread = new Thread(group, new TestGuiAvailable()); ++ thread.start(); ++ thread.join(); ++ } ++ ++ public void run() { ++ SunToolkit.createNewAppContext(); ++ if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) { ++ throw new Error("shared GuiAvailable property"); ++ } ++ } ++} diff --git a/java/openjdk6/files/icedtea/openjdk/6886358-layout_update.patch b/java/openjdk6/files/icedtea/openjdk/6886358-layout_update.patch new file mode 100644 index 000000000000..ac485c96d1ba --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/6886358-layout_update.patch @@ -0,0 +1,13847 @@ +# HG changeset patch +# User andrew +# Date 1365742546 -3600 +# Node ID ec8a935f0737e033e4ffd401c4d554cd73739c39 +# Parent e8ed86062291305172267be90dcec2acef7c15a8 +6886358: layout code update +Reviewed-by: igor, prr + +diff --git a/make/sun/font/FILES_c.gmk b/make/sun/font/FILES_c.gmk +--- jdk/make/sun/font/FILES_c.gmk ++++ jdk/make/sun/font/FILES_c.gmk +@@ -72,8 +72,7 @@ + GlyphPositioningTables.cpp \ + GlyphSubstLookupProc.cpp \ + GlyphSubstitutionTables.cpp \ +- HebrewLigatureData.cpp \ +- HebrewShaping.cpp \ ++ HangulLayoutEngine.cpp \ + IndicClassTables.cpp \ + IndicReordering.cpp \ + KernTable.cpp \ +@@ -99,6 +98,8 @@ + SubstitutionLookups.cpp \ + ThaiShaping.cpp \ + ThaiStateTables.cpp \ ++ TibetanLayoutEngine.cpp \ ++ TibetanReordering.cpp \ + ValueRecords.cpp \ + ArabicLayoutEngine.cpp \ + ArabicShaping.cpp \ +diff --git a/src/share/classes/sun/font/FontManager.java b/src/share/classes/sun/font/FontManager.java +--- jdk/src/share/classes/sun/font/FontManager.java ++++ jdk/src/share/classes/sun/font/FontManager.java +@@ -3598,6 +3598,18 @@ + // 0E00 - 0E7F if Thai, assume shaping for vowel, tone marks + return true; + } ++ else if (code < 0x0f00) { ++ return false; ++ } ++ else if (code <= 0x0fff) { // U+0F00 - U+0FFF Tibetan ++ return true; ++ } ++ else if (code < 0x1100) { ++ return false; ++ } ++ else if (code < 0x11ff) { // U+1100 - U+11FF Old Hangul ++ return true; ++ } + else if (code < 0x1780) { + return false; + } +diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp b/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp +@@ -59,16 +59,16 @@ + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ArabicOpenTypeLayoutEngine) + + ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) +- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable) ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) + { + fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; + } + + ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags) +- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags) ++ le_int32 typoFlags, LEErrorCode &success) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) + { + fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount); + +@@ -151,8 +151,8 @@ + } + } + +-UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) +- : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG) ++UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) ++ : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG, success) + { + fGSUBTable = (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; + fGDEFTable = (const GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; +diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.h b/src/share/native/sun/font/layout/ArabicLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h +@@ -66,6 +66,7 @@ + * @param scriptCode - the script + * @param langaugeCode - the language + * @param gsubTable - the GSUB table ++ * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see OpenTypeLayoutEngine +@@ -74,7 +75,7 @@ + * @internal + */ + ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +@@ -83,6 +84,7 @@ + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language ++ * @param success - set to an error code if the operation fails + * + * @see OpenTypeLayoutEngine + * @see ScriptAndLanguageTags.h for script and language codes +@@ -90,7 +92,7 @@ + * @internal + */ + ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags); ++ le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -184,6 +186,7 @@ + * @param fontInstance - the font + * @param scriptCode - the script + * @param languageCode - the language ++ * @param success - set to an error code if the operation fails + * + * @see LEFontInstance + * @see ScriptAndLanguageTags.h for script and language codes +@@ -191,7 +194,7 @@ + * @internal + */ + UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags); ++ le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. +diff --git a/src/share/native/sun/font/layout/ArabicShaping.cpp b/src/share/native/sun/font/layout/ArabicShaping.cpp +--- jdk/src/share/native/sun/font/layout/ArabicShaping.cpp ++++ jdk/src/share/native/sun/font/layout/ArabicShaping.cpp +@@ -104,6 +104,7 @@ + #define markFeatureMask 0x00040000UL + #define mkmkFeatureMask 0x00020000UL + ++#define NO_FEATURES 0 + #define ISOL_FEATURES (isolFeatureMask | ligaFeatureMask | msetFeatureMask | markFeatureMask | ccmpFeatureMask | rligFeatureMask | caltFeatureMask | dligFeatureMask | cswhFeatureMask | cursFeatureMask | kernFeatureMask | mkmkFeatureMask) + + #define SHAPE_MASK 0xF0000000UL +@@ -198,7 +199,11 @@ + LEUnicode c = chars[in]; + ShapeType t = getShapeType(c); + ++ if (t == ST_NOSHAPE_NONE) { ++ glyphStorage.setAuxData(out, NO_FEATURES, success); ++ } else { + glyphStorage.setAuxData(out, ISOL_FEATURES, success); ++ } + + if ((t & MASK_TRANSPARENT) != 0) { + continue; +diff --git a/src/share/native/sun/font/layout/CanonData.cpp b/src/share/native/sun/font/layout/CanonData.cpp +--- jdk/src/share/native/sun/font/layout/CanonData.cpp ++++ jdk/src/share/native/sun/font/layout/CanonData.cpp +@@ -30,7 +30,7 @@ + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. + * +- * Generated on: 03/31/2005 08:15:27 AM HST ++ * Generated on: 03/12/2008 03:14:34 PM HST + */ + + #include "LETypes.h" +@@ -39,36 +39,33 @@ + U_NAMESPACE_BEGIN + + const le_uint8 CanonShaping::glyphSubstitutionTable[] = { +- 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x58, 0x02, 0x86, 0x00, 0x12, 0x61, 0x72, 0x61, 0x62, +- 0x00, 0x6E, 0x62, 0x65, 0x6E, 0x67, 0x00, 0x82, 0x63, 0x79, 0x72, 0x6C, 0x00, 0x8E, 0x64, 0x65, +- 0x76, 0x61, 0x00, 0x9A, 0x67, 0x72, 0x65, 0x6B, 0x00, 0xA6, 0x67, 0x75, 0x72, 0x75, 0x00, 0xB2, +- 0x68, 0x65, 0x62, 0x72, 0x00, 0xBE, 0x68, 0x69, 0x72, 0x61, 0x00, 0xCA, 0x6B, 0x61, 0x6E, 0x61, +- 0x00, 0xD6, 0x6B, 0x6E, 0x64, 0x61, 0x00, 0xE2, 0x6C, 0x61, 0x74, 0x6E, 0x00, 0xEE, 0x6D, 0x6C, +- 0x79, 0x6D, 0x00, 0xFA, 0x6D, 0x79, 0x6D, 0x72, 0x01, 0x06, 0x6F, 0x72, 0x79, 0x61, 0x01, 0x12, +- 0x73, 0x69, 0x6E, 0x68, 0x01, 0x1E, 0x74, 0x61, 0x6D, 0x6C, 0x01, 0x2A, 0x74, 0x65, 0x6C, 0x75, +- 0x01, 0x36, 0x74, 0x69, 0x62, 0x74, 0x01, 0x42, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +- 0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x00, 0x15, 0x00, 0x12, 0x00, 0x14, 0x00, 0x04, 0x00, 0x00, ++ 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x34, 0x02, 0x46, 0x00, 0x10, 0x61, 0x72, 0x61, 0x62, ++ 0x00, 0x62, 0x62, 0x61, 0x6C, 0x69, 0x00, 0x76, 0x62, 0x65, 0x6E, 0x67, 0x00, 0x82, 0x63, 0x79, ++ 0x72, 0x6C, 0x00, 0x8E, 0x64, 0x65, 0x76, 0x61, 0x00, 0x9A, 0x67, 0x72, 0x65, 0x6B, 0x00, 0xA6, ++ 0x68, 0x69, 0x72, 0x61, 0x00, 0xB2, 0x6B, 0x61, 0x6E, 0x61, 0x00, 0xBE, 0x6B, 0x6E, 0x64, 0x61, ++ 0x00, 0xCA, 0x6C, 0x61, 0x74, 0x6E, 0x00, 0xD6, 0x6D, 0x6C, 0x79, 0x6D, 0x00, 0xE2, 0x6D, 0x79, ++ 0x6D, 0x72, 0x00, 0xEE, 0x6F, 0x72, 0x79, 0x61, 0x00, 0xFA, 0x73, 0x69, 0x6E, 0x68, 0x01, 0x06, ++ 0x74, 0x61, 0x6D, 0x6C, 0x01, 0x12, 0x74, 0x65, 0x6C, 0x75, 0x01, 0x1E, 0x00, 0x04, 0x00, 0x00, ++ 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x05, 0x00, 0x00, 0x00, 0x11, 0x00, 0x13, 0x00, 0x10, 0x00, 0x12, ++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x03, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +- 0x00, 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x07, +- 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, +- 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, ++ 0x00, 0x01, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x06, ++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, ++ 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x01, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0B, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +- 0x00, 0x01, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0F, +- 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, +- 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x11, 0x00, 0x16, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x86, +- 0x63, 0x63, 0x6D, 0x70, 0x00, 0x8E, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x96, 0x63, 0x63, 0x6D, 0x70, +- 0x00, 0x9E, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xA6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xAE, 0x63, 0x63, +- 0x6D, 0x70, 0x00, 0xB6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xBE, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xC6, +- 0x63, 0x63, 0x6D, 0x70, 0x00, 0xCE, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xD6, 0x63, 0x63, 0x6D, 0x70, +- 0x00, 0xDE, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xE6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xEE, 0x63, 0x63, +- 0x6D, 0x70, 0x00, 0xF6, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xFE, 0x63, 0x63, 0x6D, 0x70, 0x01, 0x06, +- 0x63, 0x63, 0x6D, 0x70, 0x01, 0x0E, 0x66, 0x69, 0x6E, 0x61, 0x01, 0x16, 0x69, 0x6E, 0x69, 0x74, +- 0x01, 0x1C, 0x6C, 0x69, 0x67, 0x61, 0x01, 0x22, 0x6D, 0x65, 0x64, 0x69, 0x01, 0x28, 0x00, 0x00, ++ 0x00, 0x01, 0x00, 0x0E, 0x00, 0x14, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x7A, 0x63, 0x63, 0x6D, 0x70, ++ 0x00, 0x82, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x8A, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x92, 0x63, 0x63, ++ 0x6D, 0x70, 0x00, 0x9A, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xA2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xAA, ++ 0x63, 0x63, 0x6D, 0x70, 0x00, 0xB2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xBA, 0x63, 0x63, 0x6D, 0x70, ++ 0x00, 0xC2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xCA, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xD2, 0x63, 0x63, ++ 0x6D, 0x70, 0x00, 0xDA, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xE2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xEA, ++ 0x63, 0x63, 0x6D, 0x70, 0x00, 0xF2, 0x66, 0x69, 0x6E, 0x61, 0x00, 0xFA, 0x69, 0x6E, 0x69, 0x74, ++ 0x01, 0x00, 0x6C, 0x69, 0x67, 0x61, 0x01, 0x06, 0x6D, 0x65, 0x64, 0x69, 0x01, 0x0C, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x08, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x00, +@@ -77,355 +74,349 @@ + 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x1B, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x20, 0x00, 0x21, 0x00, 0x00, 0x00, 0x02, 0x00, 0x22, 0x00, 0x23, 0x00, 0x00, +- 0x00, 0x02, 0x00, 0x24, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, 0x26, 0x00, 0x27, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, +- 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x28, 0x00, 0x52, 0x00, 0xC8, 0x01, 0x2A, 0x01, 0xF4, +- 0x02, 0xBE, 0x03, 0xF8, 0x15, 0x06, 0x15, 0x58, 0x15, 0x9C, 0x18, 0x4E, 0x1A, 0xC4, 0x1B, 0x70, +- 0x1B, 0xF0, 0x4F, 0xEA, 0x8E, 0xAE, 0x8F, 0x14, 0x8F, 0x62, 0x91, 0x58, 0x93, 0x26, 0x94, 0x94, +- 0x95, 0xB4, 0x96, 0x0A, 0x96, 0x66, 0x98, 0x0C, 0x99, 0x54, 0xB9, 0x0C, 0xDC, 0x92, 0xDC, 0xC8, +- 0xDC, 0xF8, 0xDD, 0x18, 0xDD, 0x34, 0xDD, 0x80, 0xDD, 0xC4, 0xDE, 0x0C, 0xDE, 0x5E, 0xDE, 0xA2, +- 0xDE, 0xDC, 0xDE, 0xFC, 0xDF, 0x18, 0xE0, 0x36, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, +- 0x00, 0x01, 0x00, 0x5E, 0x00, 0x06, 0x00, 0x12, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, +- 0x00, 0x54, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x06, 0x22, 0x00, 0x02, 0x06, 0x53, +- 0x06, 0x23, 0x00, 0x02, 0x06, 0x54, 0x06, 0x25, 0x00, 0x02, 0x06, 0x55, 0x00, 0x01, 0x00, 0x04, +- 0x06, 0x24, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0x26, 0x00, 0x02, 0x06, 0x54, +- 0x00, 0x01, 0x00, 0x04, 0x06, 0xC2, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xD3, +- 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xC0, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, +- 0x00, 0x06, 0x06, 0x27, 0x06, 0x48, 0x06, 0x4A, 0x06, 0xC1, 0x06, 0xD2, 0x06, 0xD5, 0x00, 0x02, +- 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x46, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1C, +- 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x02, 0x06, 0x27, +- 0x06, 0x53, 0x00, 0x02, 0x06, 0x27, 0x06, 0x54, 0x00, 0x02, 0x06, 0x48, 0x06, 0x54, 0x00, 0x02, +- 0x06, 0x27, 0x06, 0x55, 0x00, 0x02, 0x06, 0x4A, 0x06, 0x54, 0x00, 0x02, 0x06, 0xD5, 0x06, 0x54, +- 0x00, 0x02, 0x06, 0xC1, 0x06, 0x54, 0x00, 0x02, 0x06, 0xD2, 0x06, 0x54, 0x00, 0x01, 0x00, 0x08, +- 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, 0x06, 0x26, 0x06, 0xC0, 0x06, 0xC2, 0x06, 0xD3, +- 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8B, +- 0xFE, 0x91, 0xFE, 0x97, 0xFE, 0x9B, 0xFE, 0x9F, 0xFE, 0xA3, 0xFE, 0xA7, 0xFE, 0xB3, 0xFE, 0xB7, +- 0xFE, 0xBB, 0xFE, 0xBF, 0xFE, 0xC3, 0xFE, 0xC7, 0xFE, 0xCB, 0xFE, 0xCF, 0xFE, 0xD3, 0xFE, 0xD7, +- 0xFE, 0xDB, 0xFE, 0xDF, 0xFE, 0xE3, 0xFE, 0xE7, 0xFE, 0xEB, 0xFB, 0xE8, 0xFE, 0xF3, 0xFB, 0x68, +- 0xFB, 0x60, 0xFB, 0x54, 0xFB, 0x58, 0xFB, 0x64, 0xFB, 0x5C, 0xFB, 0x78, 0xFB, 0x74, 0xFB, 0x7C, +- 0xFB, 0x80, 0xFB, 0x6C, 0xFB, 0x70, 0xFB, 0x90, 0xFB, 0xD5, 0xFB, 0x94, 0xFB, 0x9C, 0xFB, 0x98, +- 0xFB, 0xA2, 0xFB, 0xAC, 0xFB, 0xA8, 0xFB, 0xFE, 0xFB, 0xE6, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26, +- 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34, +- 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, +- 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79, +- 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, +- 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, +- 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, +- 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8C, 0xFE, 0x92, 0xFE, 0x98, 0xFE, 0x9C, +- 0xFE, 0xA0, 0xFE, 0xA4, 0xFE, 0xA8, 0xFE, 0xB4, 0xFE, 0xB8, 0xFE, 0xBC, 0xFE, 0xC0, 0xFE, 0xC4, +- 0xFE, 0xC8, 0xFE, 0xCC, 0xFE, 0xD0, 0xFE, 0xD4, 0xFE, 0xD8, 0xFE, 0xDC, 0xFE, 0xE0, 0xFE, 0xE4, +- 0xFE, 0xE8, 0xFE, 0xEC, 0xFB, 0xE9, 0xFE, 0xF4, 0xFB, 0x69, 0xFB, 0x61, 0xFB, 0x55, 0xFB, 0x59, +- 0xFB, 0x65, 0xFB, 0x5D, 0xFB, 0x79, 0xFB, 0x75, 0xFB, 0x7D, 0xFB, 0x81, 0xFB, 0x6D, 0xFB, 0x71, +- 0xFB, 0x91, 0xFB, 0xD6, 0xFB, 0x95, 0xFB, 0x9D, 0xFB, 0x99, 0xFB, 0xA3, 0xFB, 0xAD, 0xFB, 0xA9, +- 0xFB, 0xFF, 0xFB, 0xE7, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, +- 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, +- 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, +- 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, +- 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, +- 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, +- 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x9A, +- 0x00, 0x4A, 0xFE, 0x82, 0xFE, 0x84, 0xFE, 0x86, 0xFE, 0x88, 0xFE, 0x8A, 0xFE, 0x8E, 0xFE, 0x90, +- 0xFE, 0x94, 0xFE, 0x96, 0xFE, 0x9A, 0xFE, 0x9E, 0xFE, 0xA2, 0xFE, 0xA6, 0xFE, 0xAA, 0xFE, 0xAC, +- 0xFE, 0xAE, 0xFE, 0xB0, 0xFE, 0xB2, 0xFE, 0xB6, 0xFE, 0xBA, 0xFE, 0xBE, 0xFE, 0xC2, 0xFE, 0xC6, +- 0xFE, 0xCA, 0xFE, 0xCE, 0xFE, 0xD2, 0xFE, 0xD6, 0xFE, 0xDA, 0xFE, 0xDE, 0xFE, 0xE2, 0xFE, 0xE6, +- 0xFE, 0xEA, 0xFE, 0xEE, 0xFE, 0xF0, 0xFE, 0xF2, 0xFB, 0x51, 0xFB, 0x67, 0xFB, 0x5F, 0xFB, 0x53, +- 0xFB, 0x57, 0xFB, 0x63, 0xFB, 0x5B, 0xFB, 0x77, 0xFB, 0x73, 0xFB, 0x7B, 0xFB, 0x7F, 0xFB, 0x89, +- 0xFB, 0x85, 0xFB, 0x83, 0xFB, 0x87, 0xFB, 0x8D, 0xFB, 0x8B, 0xFB, 0x6B, 0xFB, 0x6F, 0xFB, 0x8F, +- 0xFB, 0xD4, 0xFB, 0x93, 0xFB, 0x9B, 0xFB, 0x97, 0xFB, 0x9F, 0xFB, 0xA1, 0xFB, 0xAB, 0xFB, 0xA5, +- 0xFB, 0xA7, 0xFB, 0xE1, 0xFB, 0xDA, 0xFB, 0xD8, 0xFB, 0xDC, 0xFB, 0xE3, 0xFB, 0xDF, 0xFB, 0xFD, +- 0xFB, 0xE5, 0xFB, 0xAF, 0xFB, 0xB1, 0x00, 0x01, 0x00, 0x4A, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, +- 0x06, 0x25, 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, 0x06, 0x29, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, +- 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x2F, 0x06, 0x30, 0x06, 0x31, 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, +- 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, +- 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, 0x06, 0x4A, +- 0x06, 0x71, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, +- 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0x88, 0x06, 0x8C, 0x06, 0x8D, 0x06, 0x8E, 0x06, 0x91, +- 0x06, 0x98, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, +- 0x06, 0xBA, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC0, 0x06, 0xC1, 0x06, 0xC5, 0x06, 0xC6, 0x06, 0xC7, +- 0x06, 0xC8, 0x06, 0xC9, 0x06, 0xCB, 0x06, 0xCC, 0x06, 0xD0, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04, +- 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x10, 0x98, 0x00, 0x35, 0x00, 0x70, 0x00, 0x7A, +- 0x01, 0x0C, 0x01, 0x86, 0x01, 0xA8, 0x01, 0xB2, 0x02, 0x0C, 0x02, 0x62, 0x03, 0x02, 0x03, 0x8A, +- 0x03, 0xB4, 0x03, 0xF6, 0x04, 0x46, 0x04, 0x8A, 0x04, 0xBC, 0x04, 0xEC, 0x05, 0x26, 0x05, 0x38, +- 0x05, 0x42, 0x05, 0x64, 0x05, 0xF8, 0x06, 0x6C, 0x06, 0xEC, 0x07, 0x80, 0x08, 0x1E, 0x08, 0x56, +- 0x08, 0xBA, 0x08, 0xF2, 0x09, 0x38, 0x09, 0x66, 0x09, 0x78, 0x09, 0x82, 0x09, 0xD4, 0x0A, 0x0E, +- 0x0A, 0x40, 0x0A, 0x70, 0x0A, 0xCC, 0x0A, 0xF2, 0x0B, 0x38, 0x0B, 0x68, 0x0B, 0xDC, 0x0C, 0x2A, +- 0x0C, 0xD6, 0x0D, 0x72, 0x0E, 0x16, 0x0E, 0x50, 0x0E, 0xC8, 0x0F, 0x5A, 0x0F, 0xA8, 0x0F, 0xB6, +- 0x0F, 0xC0, 0x0F, 0xCA, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x04, 0xFB, 0xDD, 0x00, 0x02, 0x06, 0x74, +- 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, +- 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, +- 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0xFB, 0xEC, 0x00, 0x02, 0x00, 0x01, 0xFB, 0xF0, 0x00, 0x02, +- 0xFB, 0xD8, 0xFB, 0xF2, 0x00, 0x02, 0xFB, 0xDA, 0xFB, 0xF4, 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF6, +- 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xF8, 0x00, 0x02, 0xFB, 0xE7, 0xFB, 0xEA, 0x00, 0x02, 0xFE, 0x8E, +- 0xFC, 0x00, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x97, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x01, 0x00, 0x02, +- 0xFE, 0xA2, 0xFC, 0x98, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x99, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x02, +- 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9A, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x9B, 0x00, 0x02, 0xFE, 0xEC, +- 0xFB, 0xEE, 0x00, 0x02, 0xFE, 0xEE, 0xFB, 0xF9, 0x00, 0x02, 0xFE, 0xF0, 0xFB, 0xFB, 0x00, 0x02, +- 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, +- 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, +- 0x00, 0x74, 0xFB, 0xED, 0x00, 0x02, 0x00, 0x01, 0xFB, 0xF1, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF3, +- 0x00, 0x02, 0xFB, 0xDA, 0xFB, 0xF5, 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF7, 0x00, 0x02, 0xFB, 0xE5, +- 0xFB, 0xEB, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x64, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x65, 0x00, 0x02, +- 0xFE, 0xB0, 0xFC, 0x66, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xDF, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x67, +- 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE0, 0x00, 0x02, 0xFE, 0xEC, 0xFB, 0xEF, 0x00, 0x02, 0xFE, 0xEE, +- 0xFB, 0xFA, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x69, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x03, 0x00, 0x08, +- 0x00, 0x0E, 0x00, 0x18, 0xFD, 0x3D, 0x00, 0x02, 0x06, 0x4B, 0xFD, 0xF3, 0x00, 0x04, 0xFE, 0xDB, +- 0xFE, 0x92, 0xFE, 0xAE, 0xFD, 0xF2, 0x00, 0x04, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x01, +- 0x00, 0x04, 0xFD, 0x3C, 0x00, 0x02, 0x06, 0x4B, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, +- 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, +- 0xFC, 0x05, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x9C, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x06, 0x00, 0x02, +- 0xFE, 0xA2, 0xFC, 0x9D, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x07, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0x9E, +- 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x08, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9F, 0x00, 0x02, 0xFE, 0xE4, +- 0xFC, 0xA0, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x09, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x0A, 0x00, 0x02, +- 0xFE, 0xF2, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, +- 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0xFD, 0xC2, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, +- 0xFD, 0x9E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x6A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x6B, +- 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x6C, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE1, 0x00, 0x02, 0xFE, 0xE4, +- 0xFC, 0x6D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE2, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x6E, 0x00, 0x02, +- 0xFE, 0xF0, 0xFC, 0x6F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, +- 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, +- 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9A, 0xFC, 0x0B, +- 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x50, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xA1, 0x00, 0x02, +- 0xFE, 0xA0, 0xFC, 0x0C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x52, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, +- 0xFD, 0x53, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xA2, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x0D, +- 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x54, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xA3, 0x00, 0x02, +- 0xFE, 0xA8, 0xFC, 0x0E, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x55, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, +- 0xFD, 0x56, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x57, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8, +- 0xFC, 0xA4, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA5, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x0F, 0x00, 0x02, +- 0xFE, 0xF0, 0xFC, 0x10, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, +- 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, +- 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0xFD, 0xA0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, +- 0xFD, 0x9F, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x51, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0x9E, +- 0xFD, 0xA2, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xA1, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, +- 0xFC, 0x70, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x71, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x72, 0x00, 0x02, +- 0xFE, 0xE2, 0xFD, 0xA4, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA3, 0x00, 0x03, 0xFE, 0xE4, +- 0xFE, 0xF2, 0xFC, 0xE3, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x73, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE4, +- 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x74, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x75, 0x00, 0x02, 0xFE, 0xF2, +- 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0xFC, 0x11, 0x00, 0x02, +- 0xFE, 0x9E, 0xFC, 0x12, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xA6, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x13, +- 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x14, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, +- 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0xFC, 0x76, 0x00, 0x02, +- 0xFE, 0xAE, 0xFC, 0x77, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x78, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE5, +- 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x79, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE6, 0x00, 0x02, 0xFE, 0xEC, +- 0xFC, 0x7A, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7B, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, +- 0x00, 0x18, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0xFC, 0x15, +- 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xA7, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xFB, 0x00, 0x08, 0xFE, 0xDE, +- 0x00, 0x20, 0xFE, 0x9F, 0xFE, 0xE0, 0xFE, 0x8E, 0xFE, 0xDF, 0xFE, 0xEA, 0xFC, 0x16, 0x00, 0x02, +- 0xFE, 0xE2, 0xFD, 0x59, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xA8, 0x00, 0x02, 0xFE, 0xE4, +- 0xFD, 0x01, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x02, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, +- 0x00, 0x18, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0xFD, 0xA6, 0x00, 0x03, +- 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xBE, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x58, 0x00, 0x03, +- 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xA7, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA5, 0x00, 0x03, +- 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1D, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1E, 0x00, 0x02, 0xFE, 0xF2, +- 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x17, +- 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xA9, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x18, 0x00, 0x02, 0xFE, 0xE2, +- 0xFC, 0xAA, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xFF, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x00, 0x00, 0x02, +- 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0xBF, +- 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x5B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x5A, +- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1B, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1C, 0x00, 0x02, +- 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, +- 0x00, 0x34, 0xFC, 0x19, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xAB, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1A, +- 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x1B, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xAC, 0x00, 0x02, 0xFE, 0xE4, +- 0xFD, 0x03, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x04, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, +- 0x00, 0x0C, 0xFD, 0x1F, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x20, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, +- 0x00, 0x04, 0xFC, 0x5B, 0x00, 0x02, 0x06, 0x70, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x18, +- 0xFC, 0x5C, 0x00, 0x02, 0x06, 0x70, 0xFD, 0xFC, 0x00, 0x04, 0xFB, 0xFE, 0xFE, 0x8E, 0xFE, 0xDD, +- 0xFD, 0xF6, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xEE, 0xFE, 0xDD, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, +- 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, +- 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFC, 0x1C, +- 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x5D, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFC, 0xAD, 0x00, 0x02, +- 0xFE, 0xA0, 0xFC, 0x1D, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x5C, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, +- 0xFC, 0xAE, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x1E, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xAF, 0x00, 0x02, +- 0xFE, 0xA8, 0xFD, 0x0E, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x1F, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x61, +- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x60, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x63, +- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB0, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x31, 0x00, 0x02, +- 0xFE, 0xEC, 0xFC, 0xFB, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFC, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0D, +- 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, +- 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0xFD, 0x5E, 0x00, 0x03, 0xFE, 0xA0, +- 0xFE, 0xF0, 0xFD, 0x34, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x35, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xA8, +- 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xC6, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFD, 0x36, +- 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x2A, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x5F, 0x00, 0x03, 0xFE, 0xE4, +- 0xFE, 0xA2, 0xFD, 0x62, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFC, 0xE7, 0x00, 0x02, 0xFE, 0xE4, +- 0xFC, 0xE8, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x17, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x18, 0x00, 0x02, +- 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x40, +- 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, +- 0x00, 0x7A, 0xFD, 0x09, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x2D, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x0A, +- 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x68, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFD, 0x2E, 0x00, 0x02, +- 0xFE, 0xA4, 0xFD, 0x0B, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x2F, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0D, +- 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x0C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x6B, 0x00, 0x03, 0xFE, 0xE4, +- 0xFE, 0xA8, 0xFD, 0x6D, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x30, 0x00, 0x02, 0xFE, 0xE4, +- 0xFD, 0x32, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFD, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFE, 0x00, 0x02, +- 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, +- 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, +- 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFD, 0x25, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x69, 0x00, 0x03, +- 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x37, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x26, 0x00, 0x02, 0xFE, 0xA2, +- 0xFD, 0x67, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, 0xFD, 0xAA, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, +- 0xFD, 0x38, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x27, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x39, 0x00, 0x02, +- 0xFE, 0xA8, 0xFD, 0x29, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x28, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x6A, +- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA6, 0xFD, 0x6C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFC, 0xE9, +- 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xEA, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x19, 0x00, 0x02, 0xFE, 0xF0, +- 0xFD, 0x1A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, +- 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x50, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x84, 0x00, 0x8C, +- 0x00, 0x92, 0x00, 0x98, 0xFC, 0x20, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x65, 0x00, 0x03, 0xFE, 0xA4, +- 0xFE, 0xA4, 0xFC, 0xB1, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0xB2, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0F, +- 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0xF0, 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, 0xFD, 0xF5, 0x00, 0x04, +- 0xFE, 0xE0, 0xFE, 0xCC, 0xFE, 0xE2, 0xFD, 0xFA, 0x00, 0x12, 0xFE, 0xE0, 0xFE, 0xF0, 0x00, 0x20, +- 0xFE, 0x8D, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xCB, 0xFE, 0xE0, 0xFE, 0xF4, +- 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xED, 0xFE, 0xB3, 0xFE, 0xE0, 0xFE, 0xE2, 0xFD, 0xF9, 0x00, 0x03, +- 0xFE, 0xE0, 0xFE, 0xF0, 0xFC, 0x21, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xC5, 0x00, 0x03, 0xFE, 0xE4, +- 0xFE, 0xE4, 0xFC, 0xB3, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x05, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x06, +- 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, +- 0x00, 0x32, 0xFD, 0x64, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA2, 0xFD, 0xA9, 0x00, 0x03, 0xFE, 0xA4, +- 0xFE, 0xF2, 0xFD, 0x2B, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x66, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, +- 0xFD, 0x21, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x22, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, +- 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, +- 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x22, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xB4, 0x00, 0x02, +- 0xFE, 0xA0, 0xFC, 0x23, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xB5, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x24, +- 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x70, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xB6, 0x00, 0x02, +- 0xFE, 0xA8, 0xFD, 0x10, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x25, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xB7, +- 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x07, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x08, 0x00, 0x02, 0xFE, 0xF2, +- 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x6E, +- 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xAB, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x6F, +- 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0x2C, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x23, 0x00, 0x02, +- 0xFE, 0xF0, 0xFD, 0x24, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, +- 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0xFC, 0x26, 0x00, 0x02, 0xFE, 0xA2, +- 0xFC, 0xB8, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x27, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x72, 0x00, 0x03, +- 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x73, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x33, 0x00, 0x02, +- 0xFE, 0xE4, 0xFC, 0xF5, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF6, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, +- 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0xFD, 0x71, 0x00, 0x03, 0xFE, 0xE4, +- 0xFE, 0xA2, 0xFD, 0x74, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x3A, 0x00, 0x02, 0xFE, 0xE4, +- 0xFD, 0x11, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x12, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, +- 0x00, 0x0C, 0xFC, 0x28, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xB9, 0x00, 0x02, 0xFE, 0xE4, 0x00, 0x01, +- 0x00, 0x04, 0xFD, 0x3B, 0x00, 0x02, 0xFE, 0xE4, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, +- 0x00, 0x28, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0xFC, 0x29, 0x00, 0x02, +- 0xFE, 0x9E, 0xFD, 0xC4, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xBA, 0x00, 0x02, 0xFE, 0xA0, +- 0xFD, 0xF7, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xF4, 0xFE, 0xEA, 0xFC, 0x2A, 0x00, 0x02, 0xFE, 0xE2, +- 0xFD, 0x77, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xBB, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF7, +- 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF8, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, +- 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x34, 0xFD, 0x75, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, +- 0xFD, 0x76, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x78, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, +- 0xFD, 0xB6, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x13, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x14, +- 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, +- 0x00, 0x2C, 0xFC, 0x2B, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBC, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x2C, +- 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xBD, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF9, 0x00, 0x02, 0xFE, 0xF0, +- 0xFC, 0xFA, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, +- 0x00, 0x2A, 0xFD, 0x79, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x7B, 0x00, 0x03, 0xFE, 0xE4, +- 0xFE, 0xF0, 0xFD, 0x7A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x15, 0x00, 0x02, 0xFE, 0xF0, +- 0xFD, 0x16, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, +- 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0xFC, 0x2D, +- 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBE, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x2E, 0x00, 0x02, 0xFE, 0xA2, +- 0xFC, 0xBF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x2F, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x7D, 0x00, 0x03, +- 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xC0, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x30, 0x00, 0x02, 0xFE, 0xE2, +- 0xFC, 0xC1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x31, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x32, 0x00, 0x02, +- 0xFE, 0xF2, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x1A, 0x00, 0x20, 0xFD, 0x7C, 0x00, 0x03, +- 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0xC1, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7C, 0x00, 0x02, +- 0xFE, 0xF0, 0xFC, 0x7D, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, +- 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0xFC, 0x33, 0x00, 0x02, 0xFE, 0xA2, +- 0xFC, 0xC2, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xF1, 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, 0xFC, 0x34, +- 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB4, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xC3, 0x00, 0x02, +- 0xFE, 0xE4, 0xFC, 0x35, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x36, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, +- 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0x7E, 0x00, 0x03, 0xFE, 0xE4, +- 0xFE, 0xA2, 0xFD, 0x7F, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB2, 0x00, 0x03, 0xFE, 0xE4, +- 0xFE, 0xF2, 0xFC, 0x7E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, +- 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, +- 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0xFC, 0x37, 0x00, 0x02, +- 0xFE, 0x8E, 0xFC, 0x38, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xC4, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x39, +- 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC5, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x3A, 0x00, 0x02, 0xFE, 0xA6, +- 0xFC, 0xC6, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x3B, 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xC7, 0x00, 0x02, +- 0xFE, 0xE0, 0xFC, 0x3C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xC3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, +- 0xFC, 0xC8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x3D, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x3E, 0x00, 0x02, +- 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, +- 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0x80, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x81, 0x00, 0x02, +- 0xFE, 0xDE, 0xFC, 0xEB, 0x00, 0x02, 0xFE, 0xE0, 0xFC, 0x82, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xBB, +- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB7, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEC, +- 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x83, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x84, 0x00, 0x02, 0xFE, 0xF2, +- 0x00, 0x14, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x50, +- 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, +- 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xA6, 0xFE, 0xF5, 0x00, 0x02, 0xFE, 0x82, +- 0xFE, 0xF7, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xF9, 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFB, 0x00, 0x02, +- 0xFE, 0x8E, 0xFC, 0x3F, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x83, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA0, +- 0xFD, 0xBA, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xC9, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x40, +- 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0xB5, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCA, 0x00, 0x02, +- 0xFE, 0xA4, 0xFC, 0x41, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x86, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, +- 0xFC, 0xCB, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x42, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x88, 0x00, 0x03, +- 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xCC, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xCD, 0x00, 0x02, 0xFE, 0xEC, +- 0xFC, 0x43, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x44, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, +- 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, +- 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, +- 0xFE, 0xF6, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF8, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xFA, 0x00, 0x02, +- 0xFE, 0x88, 0xFE, 0xFC, 0x00, 0x02, 0xFE, 0x8E, 0xFD, 0x84, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0x9E, +- 0xFD, 0xBC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0xAC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, +- 0xFD, 0x80, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, 0xFD, 0x82, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, +- 0xFD, 0x81, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x85, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, +- 0xFC, 0x85, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x87, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xAD, +- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xED, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x86, 0x00, 0x02, +- 0xFE, 0xF0, 0xFC, 0x87, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, +- 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70, +- 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0xFC, 0x45, +- 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x8C, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x92, 0x00, 0x03, +- 0xFE, 0xA0, 0xFE, 0xA8, 0xFD, 0x8D, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xCE, 0x00, 0x02, +- 0xFE, 0xA0, 0xFC, 0x46, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x89, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, +- 0xFD, 0xF4, 0x00, 0x04, 0xFE, 0xA4, 0xFE, 0xE4, 0xFE, 0xAA, 0xFD, 0x8A, 0x00, 0x03, 0xFE, 0xA4, +- 0xFE, 0xE4, 0xFC, 0xCF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x47, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x8E, +- 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xA0, 0xFD, 0x8F, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xD0, +- 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x48, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD1, 0x00, 0x02, 0xFE, 0xE4, +- 0xFC, 0x49, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x4A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, +- 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0xFC, 0x88, 0x00, 0x02, 0xFE, 0x8E, +- 0xFD, 0xC0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x8B, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, +- 0xFD, 0xB9, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x89, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB1, +- 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, +- 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, +- 0x00, 0x6C, 0x00, 0x72, 0xFC, 0x4B, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0xB8, 0x00, 0x03, 0xFE, 0xA0, +- 0xFE, 0xA4, 0xFD, 0x98, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xD2, 0x00, 0x02, 0xFE, 0xA0, +- 0xFC, 0x4C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x95, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xD3, +- 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x4D, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xD4, 0x00, 0x02, 0xFE, 0xA8, +- 0xFC, 0x4E, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD5, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xD6, 0x00, 0x02, +- 0xFE, 0xEC, 0xFC, 0x4F, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x50, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x10, +- 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x58, +- 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, +- 0xFD, 0xBD, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA2, 0xFD, 0x97, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, +- 0xFD, 0x99, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0xC7, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, +- 0xFD, 0x96, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xB3, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, +- 0xFC, 0x8A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x8B, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x8C, 0x00, 0x02, +- 0xFE, 0xE2, 0xFD, 0x9B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x9A, 0x00, 0x03, 0xFE, 0xE4, +- 0xFE, 0xF2, 0xFC, 0xEE, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x8D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xEF, +- 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x8E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x8F, 0x00, 0x02, 0xFE, 0xF2, +- 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, +- 0x00, 0x42, 0x00, 0x48, 0xFC, 0xD9, 0x00, 0x02, 0x06, 0x70, 0xFC, 0x51, 0x00, 0x02, 0xFE, 0x9E, +- 0xFC, 0xD7, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x52, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x93, 0x00, 0x03, +- 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x94, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xD8, 0x00, 0x02, +- 0xFE, 0xE4, 0xFC, 0x53, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x54, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, +- 0x00, 0x04, 0xFD, 0xF8, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xE0, 0xFE, 0xE2, 0x00, 0x01, 0x00, 0x04, +- 0xFC, 0x5D, 0x00, 0x02, 0x06, 0x70, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x90, 0x00, 0x02, 0x06, 0x70, +- 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, +- 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x55, 0x00, 0x02, 0xFE, 0x9E, +- 0xFC, 0xDA, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x56, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xDB, 0x00, 0x02, +- 0xFE, 0xA4, 0xFC, 0x57, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xDC, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x58, +- 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9D, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xDD, 0x00, 0x02, +- 0xFE, 0xE4, 0xFC, 0xDE, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x59, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x5A, +- 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, +- 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0xFD, 0xAF, +- 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0xAE, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFC, 0x91, +- 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x92, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x93, 0x00, 0x02, 0xFE, 0xE2, +- 0xFD, 0x9C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB0, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, +- 0xFC, 0xF0, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x94, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xF1, 0x00, 0x02, +- 0xFE, 0xEC, 0xFC, 0x95, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x96, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, +- 0x00, 0x35, 0xFB, 0xD7, 0xFE, 0x8B, 0xFE, 0x8C, 0xFE, 0x8D, 0xFE, 0x8E, 0xFE, 0x91, 0xFE, 0x92, +- 0xFE, 0x97, 0xFE, 0x98, 0xFE, 0x9B, 0xFE, 0x9C, 0xFE, 0x9F, 0xFE, 0xA0, 0xFE, 0xA3, 0xFE, 0xA4, +- 0xFE, 0xA7, 0xFE, 0xA8, 0xFE, 0xAB, 0xFE, 0xAD, 0xFE, 0xB3, 0xFE, 0xB4, 0xFE, 0xB7, 0xFE, 0xB8, +- 0xFE, 0xBB, 0xFE, 0xBC, 0xFE, 0xBF, 0xFE, 0xC0, 0xFE, 0xC3, 0xFE, 0xC4, 0xFE, 0xC7, 0xFE, 0xC8, +- 0xFE, 0xCB, 0xFE, 0xCC, 0xFE, 0xCF, 0xFE, 0xD0, 0xFE, 0xD3, 0xFE, 0xD4, 0xFE, 0xD7, 0xFE, 0xD8, +- 0xFE, 0xDB, 0xFE, 0xDC, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xE3, 0xFE, 0xE4, 0xFE, 0xE7, 0xFE, 0xE8, +- 0xFE, 0xEB, 0xFE, 0xED, 0xFE, 0xEF, 0xFE, 0xF0, 0xFE, 0xF3, 0xFE, 0xF4, 0x00, 0x04, 0x00, 0x00, +- 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x22, +- 0x00, 0x2C, 0x00, 0x01, 0x00, 0x04, 0x09, 0xDC, 0x00, 0x02, 0x09, 0xBC, 0x00, 0x01, 0x00, 0x04, +- 0x09, 0xDD, 0x00, 0x02, 0x09, 0xBC, 0x00, 0x01, 0x00, 0x04, 0x09, 0xDF, 0x00, 0x02, 0x09, 0xBC, +- 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x09, 0xCB, 0x00, 0x02, 0x09, 0xBE, 0x09, 0xCC, 0x00, 0x02, +- 0x09, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x09, 0xA1, 0x09, 0xA2, 0x09, 0xAF, 0x09, 0xC7, 0x00, 0x02, +- 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x2E, 0x00, 0x05, 0x00, 0x10, 0x00, 0x16, +- 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x02, 0x09, 0xC7, 0x09, 0xBE, 0x00, 0x02, 0x09, 0xC7, +- 0x09, 0xD7, 0x00, 0x02, 0x09, 0xA1, 0x09, 0xBC, 0x00, 0x02, 0x09, 0xA2, 0x09, 0xBC, 0x00, 0x02, +- 0x09, 0xAF, 0x09, 0xBC, 0x00, 0x01, 0x00, 0x05, 0x09, 0xCB, 0x09, 0xCC, 0x09, 0xDC, 0x09, 0xDD, +- 0x09, 0xDF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x02, 0x66, 0x00, 0x20, ++ 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x24, 0x00, 0x4A, 0x00, 0xC0, 0x01, 0x22, 0x01, 0xEC, ++ 0x02, 0xB6, 0x03, 0xF0, 0x14, 0xFE, 0x15, 0x26, 0x15, 0x4C, 0x17, 0xFE, 0x1A, 0x74, 0x1A, 0xB0, ++ 0x1A, 0xE0, 0x4E, 0xDA, 0x8B, 0xBC, 0x8D, 0x2A, 0x8E, 0x4A, 0x8E, 0xA0, 0x8E, 0xFC, 0x90, 0xA2, ++ 0x91, 0xEA, 0xB1, 0xA2, 0xD5, 0x1E, 0xD5, 0x54, 0xD5, 0x84, 0xD5, 0xA4, 0xD5, 0xC0, 0xD5, 0xF0, ++ 0xD6, 0x20, 0xD6, 0x68, 0xD6, 0xBA, 0xD6, 0xFE, 0xD7, 0x38, 0xD7, 0x58, 0xD7, 0x74, 0xD8, 0x20, ++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x5E, 0x00, 0x06, 0x00, 0x12, ++ 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, ++ 0x00, 0x14, 0x06, 0x22, 0x00, 0x02, 0x06, 0x53, 0x06, 0x23, 0x00, 0x02, 0x06, 0x54, 0x06, 0x25, ++ 0x00, 0x02, 0x06, 0x55, 0x00, 0x01, 0x00, 0x04, 0x06, 0x24, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, ++ 0x00, 0x04, 0x06, 0x26, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xC2, 0x00, 0x02, ++ 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xD3, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, ++ 0x06, 0xC0, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x06, 0x06, 0x27, 0x06, 0x48, 0x06, 0x4A, ++ 0x06, 0xC1, 0x06, 0xD2, 0x06, 0xD5, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, ++ 0x00, 0x46, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, ++ 0x00, 0x3A, 0x00, 0x40, 0x00, 0x02, 0x06, 0x27, 0x06, 0x53, 0x00, 0x02, 0x06, 0x27, 0x06, 0x54, ++ 0x00, 0x02, 0x06, 0x48, 0x06, 0x54, 0x00, 0x02, 0x06, 0x27, 0x06, 0x55, 0x00, 0x02, 0x06, 0x4A, ++ 0x06, 0x54, 0x00, 0x02, 0x06, 0xD5, 0x06, 0x54, 0x00, 0x02, 0x06, 0xC1, 0x06, 0x54, 0x00, 0x02, ++ 0x06, 0xD2, 0x06, 0x54, 0x00, 0x01, 0x00, 0x08, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, ++ 0x06, 0x26, 0x06, 0xC0, 0x06, 0xC2, 0x06, 0xD3, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, ++ 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8B, 0xFE, 0x91, 0xFE, 0x97, 0xFE, 0x9B, 0xFE, 0x9F, ++ 0xFE, 0xA3, 0xFE, 0xA7, 0xFE, 0xB3, 0xFE, 0xB7, 0xFE, 0xBB, 0xFE, 0xBF, 0xFE, 0xC3, 0xFE, 0xC7, ++ 0xFE, 0xCB, 0xFE, 0xCF, 0xFE, 0xD3, 0xFE, 0xD7, 0xFE, 0xDB, 0xFE, 0xDF, 0xFE, 0xE3, 0xFE, 0xE7, ++ 0xFE, 0xEB, 0xFB, 0xE8, 0xFE, 0xF3, 0xFB, 0x68, 0xFB, 0x60, 0xFB, 0x54, 0xFB, 0x58, 0xFB, 0x64, ++ 0xFB, 0x5C, 0xFB, 0x78, 0xFB, 0x74, 0xFB, 0x7C, 0xFB, 0x80, 0xFB, 0x6C, 0xFB, 0x70, 0xFB, 0x90, ++ 0xFB, 0xD5, 0xFB, 0x94, 0xFB, 0x9C, 0xFB, 0x98, 0xFB, 0xA2, 0xFB, 0xAC, 0xFB, 0xA8, 0xFB, 0xFE, ++ 0xFB, 0xE6, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, ++ 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, ++ 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, ++ 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, ++ 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, ++ 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC, ++ 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, ++ 0xFE, 0x8C, 0xFE, 0x92, 0xFE, 0x98, 0xFE, 0x9C, 0xFE, 0xA0, 0xFE, 0xA4, 0xFE, 0xA8, 0xFE, 0xB4, ++ 0xFE, 0xB8, 0xFE, 0xBC, 0xFE, 0xC0, 0xFE, 0xC4, 0xFE, 0xC8, 0xFE, 0xCC, 0xFE, 0xD0, 0xFE, 0xD4, ++ 0xFE, 0xD8, 0xFE, 0xDC, 0xFE, 0xE0, 0xFE, 0xE4, 0xFE, 0xE8, 0xFE, 0xEC, 0xFB, 0xE9, 0xFE, 0xF4, ++ 0xFB, 0x69, 0xFB, 0x61, 0xFB, 0x55, 0xFB, 0x59, 0xFB, 0x65, 0xFB, 0x5D, 0xFB, 0x79, 0xFB, 0x75, ++ 0xFB, 0x7D, 0xFB, 0x81, 0xFB, 0x6D, 0xFB, 0x71, 0xFB, 0x91, 0xFB, 0xD6, 0xFB, 0x95, 0xFB, 0x9D, ++ 0xFB, 0x99, 0xFB, 0xA3, 0xFB, 0xAD, 0xFB, 0xA9, 0xFB, 0xFF, 0xFB, 0xE7, 0x00, 0x01, 0x00, 0x2E, ++ 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, ++ 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, ++ 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, ++ 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, ++ 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, ++ 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, ++ 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x9A, 0x00, 0x4A, 0xFE, 0x82, 0xFE, 0x84, 0xFE, 0x86, ++ 0xFE, 0x88, 0xFE, 0x8A, 0xFE, 0x8E, 0xFE, 0x90, 0xFE, 0x94, 0xFE, 0x96, 0xFE, 0x9A, 0xFE, 0x9E, ++ 0xFE, 0xA2, 0xFE, 0xA6, 0xFE, 0xAA, 0xFE, 0xAC, 0xFE, 0xAE, 0xFE, 0xB0, 0xFE, 0xB2, 0xFE, 0xB6, ++ 0xFE, 0xBA, 0xFE, 0xBE, 0xFE, 0xC2, 0xFE, 0xC6, 0xFE, 0xCA, 0xFE, 0xCE, 0xFE, 0xD2, 0xFE, 0xD6, ++ 0xFE, 0xDA, 0xFE, 0xDE, 0xFE, 0xE2, 0xFE, 0xE6, 0xFE, 0xEA, 0xFE, 0xEE, 0xFE, 0xF0, 0xFE, 0xF2, ++ 0xFB, 0x51, 0xFB, 0x67, 0xFB, 0x5F, 0xFB, 0x53, 0xFB, 0x57, 0xFB, 0x63, 0xFB, 0x5B, 0xFB, 0x77, ++ 0xFB, 0x73, 0xFB, 0x7B, 0xFB, 0x7F, 0xFB, 0x89, 0xFB, 0x85, 0xFB, 0x83, 0xFB, 0x87, 0xFB, 0x8D, ++ 0xFB, 0x8B, 0xFB, 0x6B, 0xFB, 0x6F, 0xFB, 0x8F, 0xFB, 0xD4, 0xFB, 0x93, 0xFB, 0x9B, 0xFB, 0x97, ++ 0xFB, 0x9F, 0xFB, 0xA1, 0xFB, 0xAB, 0xFB, 0xA5, 0xFB, 0xA7, 0xFB, 0xE1, 0xFB, 0xDA, 0xFB, 0xD8, ++ 0xFB, 0xDC, 0xFB, 0xE3, 0xFB, 0xDF, 0xFB, 0xFD, 0xFB, 0xE5, 0xFB, 0xAF, 0xFB, 0xB1, 0x00, 0x01, ++ 0x00, 0x4A, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, ++ 0x06, 0x29, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x2F, 0x06, 0x30, ++ 0x06, 0x31, 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, ++ 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, ++ 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x71, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, ++ 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0x88, ++ 0x06, 0x8C, 0x06, 0x8D, 0x06, 0x8E, 0x06, 0x91, 0x06, 0x98, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, ++ 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBA, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC0, ++ 0x06, 0xC1, 0x06, 0xC5, 0x06, 0xC6, 0x06, 0xC7, 0x06, 0xC8, 0x06, 0xC9, 0x06, 0xCB, 0x06, 0xCC, ++ 0x06, 0xD0, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, ++ 0x10, 0x98, 0x00, 0x35, 0x00, 0x70, 0x00, 0x7A, 0x01, 0x0C, 0x01, 0x86, 0x01, 0xA8, 0x01, 0xB2, ++ 0x02, 0x0C, 0x02, 0x62, 0x03, 0x02, 0x03, 0x8A, 0x03, 0xB4, 0x03, 0xF6, 0x04, 0x46, 0x04, 0x8A, ++ 0x04, 0xBC, 0x04, 0xEC, 0x05, 0x26, 0x05, 0x38, 0x05, 0x42, 0x05, 0x64, 0x05, 0xF8, 0x06, 0x6C, ++ 0x06, 0xEC, 0x07, 0x80, 0x08, 0x1E, 0x08, 0x56, 0x08, 0xBA, 0x08, 0xF2, 0x09, 0x38, 0x09, 0x66, ++ 0x09, 0x78, 0x09, 0x82, 0x09, 0xD4, 0x0A, 0x0E, 0x0A, 0x40, 0x0A, 0x70, 0x0A, 0xCC, 0x0A, 0xF2, ++ 0x0B, 0x38, 0x0B, 0x68, 0x0B, 0xDC, 0x0C, 0x2A, 0x0C, 0xD6, 0x0D, 0x72, 0x0E, 0x16, 0x0E, 0x50, ++ 0x0E, 0xC8, 0x0F, 0x5A, 0x0F, 0xA8, 0x0F, 0xB6, 0x0F, 0xC0, 0x0F, 0xCA, 0x10, 0x2E, 0x00, 0x01, ++ 0x00, 0x04, 0xFB, 0xDD, 0x00, 0x02, 0x06, 0x74, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, ++ 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, ++ 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0xFB, 0xEC, ++ 0x00, 0x02, 0x00, 0x01, 0xFB, 0xF0, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF2, 0x00, 0x02, 0xFB, 0xDA, ++ 0xFB, 0xF4, 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF6, 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xF8, 0x00, 0x02, ++ 0xFB, 0xE7, 0xFB, 0xEA, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x00, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x97, ++ 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x01, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x98, 0x00, 0x02, 0xFE, 0xA4, ++ 0xFC, 0x99, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x02, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9A, 0x00, 0x02, ++ 0xFE, 0xE4, 0xFC, 0x9B, 0x00, 0x02, 0xFE, 0xEC, 0xFB, 0xEE, 0x00, 0x02, 0xFE, 0xEE, 0xFB, 0xF9, ++ 0x00, 0x02, 0xFE, 0xF0, 0xFB, 0xFB, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, ++ 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, ++ 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0xFB, 0xED, 0x00, 0x02, 0x00, 0x01, ++ 0xFB, 0xF1, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF3, 0x00, 0x02, 0xFB, 0xDA, 0xFB, 0xF5, 0x00, 0x02, ++ 0xFB, 0xDC, 0xFB, 0xF7, 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xEB, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x64, ++ 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x65, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x66, 0x00, 0x02, 0xFE, 0xE2, ++ 0xFC, 0xDF, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x67, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE0, 0x00, 0x02, ++ 0xFE, 0xEC, 0xFB, 0xEF, 0x00, 0x02, 0xFE, 0xEE, 0xFB, 0xFA, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x69, ++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x18, 0xFD, 0x3D, 0x00, 0x02, ++ 0x06, 0x4B, 0xFD, 0xF3, 0x00, 0x04, 0xFE, 0xDB, 0xFE, 0x92, 0xFE, 0xAE, 0xFD, 0xF2, 0x00, 0x04, ++ 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x01, 0x00, 0x04, 0xFD, 0x3C, 0x00, 0x02, 0x06, 0x4B, ++ 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, ++ 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0xFC, 0x05, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x9C, ++ 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x06, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x9D, 0x00, 0x02, 0xFE, 0xA4, ++ 0xFC, 0x07, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0x9E, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x08, 0x00, 0x02, ++ 0xFE, 0xE2, 0xFC, 0x9F, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA0, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x09, ++ 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x0A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, ++ 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, ++ 0xFD, 0xC2, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x9E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, ++ 0xFC, 0x6A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x6B, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x6C, 0x00, 0x02, ++ 0xFE, 0xE2, 0xFC, 0xE1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x6D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE2, ++ 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x6E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x6F, 0x00, 0x02, 0xFE, 0xF2, ++ 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, ++ 0x00, 0x56, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, ++ 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9A, 0xFC, 0x0B, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x50, 0x00, 0x03, ++ 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xA1, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x0C, 0x00, 0x02, 0xFE, 0xA2, ++ 0xFD, 0x52, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFD, 0x53, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, ++ 0xFC, 0xA2, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x0D, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x54, 0x00, 0x03, ++ 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xA3, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x0E, 0x00, 0x02, 0xFE, 0xE2, ++ 0xFD, 0x55, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x56, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, ++ 0xFD, 0x57, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8, 0xFC, 0xA4, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA5, ++ 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x0F, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x10, 0x00, 0x02, 0xFE, 0xF2, ++ 0x00, 0x0F, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, ++ 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, ++ 0xFD, 0xA0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0x9F, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, ++ 0xFD, 0x51, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0x9E, 0xFD, 0xA2, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, ++ 0xFD, 0xA1, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x70, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x71, ++ 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x72, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xA4, 0x00, 0x03, 0xFE, 0xE4, ++ 0xFE, 0xF0, 0xFD, 0xA3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xE3, 0x00, 0x02, 0xFE, 0xE4, ++ 0xFC, 0x73, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE4, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x74, 0x00, 0x02, ++ 0xFE, 0xF0, 0xFC, 0x75, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, ++ 0x00, 0x1E, 0x00, 0x24, 0xFC, 0x11, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x12, 0x00, 0x02, 0xFE, 0xE2, ++ 0xFC, 0xA6, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x13, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x14, 0x00, 0x02, ++ 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, ++ 0x00, 0x36, 0x00, 0x3C, 0xFC, 0x76, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x77, 0x00, 0x02, 0xFE, 0xB0, ++ 0xFC, 0x78, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE5, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x79, 0x00, 0x02, ++ 0xFE, 0xE6, 0xFC, 0xE6, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x7A, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7B, ++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x36, ++ 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0xFC, 0x15, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xA7, 0x00, 0x02, ++ 0xFE, 0xA4, 0xFD, 0xFB, 0x00, 0x08, 0xFE, 0xDE, 0x00, 0x20, 0xFE, 0x9F, 0xFE, 0xE0, 0xFE, 0x8E, ++ 0xFE, 0xDF, 0xFE, 0xEA, 0xFC, 0x16, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x59, 0x00, 0x03, 0xFE, 0xE4, ++ 0xFE, 0xA4, 0xFC, 0xA8, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x01, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x02, ++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x18, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, ++ 0x00, 0x38, 0x00, 0x3E, 0xFD, 0xA6, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xBE, 0x00, 0x03, ++ 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x58, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xA7, 0x00, 0x03, ++ 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA5, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1D, 0x00, 0x02, ++ 0xFE, 0xF0, 0xFD, 0x1E, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, ++ 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x17, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xA9, 0x00, 0x02, ++ 0xFE, 0xA0, 0xFC, 0x18, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xAA, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xFF, ++ 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x00, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, ++ 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0xBF, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x5B, ++ 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x5A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1B, ++ 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1C, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, ++ 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0xFC, 0x19, 0x00, 0x02, 0xFE, 0x9E, ++ 0xFC, 0xAB, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1A, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x1B, 0x00, 0x02, ++ 0xFE, 0xE2, 0xFC, 0xAC, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x03, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x04, ++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFD, 0x1F, 0x00, 0x02, 0xFE, 0xF0, ++ 0xFD, 0x20, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x5B, 0x00, 0x02, 0x06, 0x70, ++ 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x18, 0xFC, 0x5C, 0x00, 0x02, 0x06, 0x70, 0xFD, 0xFC, ++ 0x00, 0x04, 0xFB, 0xFE, 0xFE, 0x8E, 0xFE, 0xDD, 0xFD, 0xF6, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xEE, ++ 0xFE, 0xDD, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, ++ 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, ++ 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFC, 0x1C, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x5D, 0x00, 0x03, ++ 0xFE, 0xA0, 0xFE, 0xA4, 0xFC, 0xAD, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1D, 0x00, 0x02, 0xFE, 0xA2, ++ 0xFD, 0x5C, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFC, 0xAE, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x1E, ++ 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xAF, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0E, 0x00, 0x02, 0xFE, 0xAE, ++ 0xFC, 0x1F, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x61, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x60, ++ 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x63, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB0, ++ 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x31, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFB, 0x00, 0x02, 0xFE, 0xF0, ++ 0xFC, 0xFC, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, ++ 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, ++ 0x00, 0x6E, 0xFD, 0x5E, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0x34, 0x00, 0x02, 0xFE, 0xA0, ++ 0xFD, 0x35, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xA8, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xC6, ++ 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFD, 0x36, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x2A, 0x00, 0x02, ++ 0xFE, 0xAE, 0xFD, 0x5F, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x62, 0x00, 0x03, 0xFE, 0xE4, ++ 0xFE, 0xE2, 0xFC, 0xE7, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xE8, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x17, ++ 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x18, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, ++ 0x00, 0x2C, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, ++ 0x00, 0x60, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0xFD, 0x09, 0x00, 0x02, 0xFE, 0x9E, ++ 0xFD, 0x2D, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x0A, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x68, 0x00, 0x03, ++ 0xFE, 0xA4, 0xFE, 0xE4, 0xFD, 0x2E, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x0B, 0x00, 0x02, 0xFE, 0xA6, ++ 0xFD, 0x2F, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0D, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x0C, 0x00, 0x02, ++ 0xFE, 0xE2, 0xFD, 0x6B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8, 0xFD, 0x6D, 0x00, 0x03, 0xFE, 0xE4, ++ 0xFE, 0xE4, 0xFD, 0x30, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x32, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFD, ++ 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFE, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, ++ 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, ++ 0x00, 0x66, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFD, 0x25, ++ 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x69, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x37, 0x00, 0x02, ++ 0xFE, 0xA0, 0xFD, 0x26, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x67, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, ++ 0xFD, 0xAA, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x38, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x27, ++ 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x39, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x29, 0x00, 0x02, 0xFE, 0xAE, ++ 0xFD, 0x28, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x6A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA6, 0xFD, 0x6C, ++ 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFC, 0xE9, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xEA, 0x00, 0x02, ++ 0xFE, 0xEC, 0xFD, 0x19, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, ++ 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x50, ++ 0x00, 0x76, 0x00, 0x7E, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0xFC, 0x20, 0x00, 0x02, ++ 0xFE, 0xA2, 0xFD, 0x65, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA4, 0xFC, 0xB1, 0x00, 0x02, 0xFE, 0xA4, ++ 0xFC, 0xB2, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0F, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0xF0, 0x00, 0x03, ++ 0xFE, 0xE0, 0xFB, 0xAF, 0xFD, 0xF5, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xCC, 0xFE, 0xE2, 0xFD, 0xFA, ++ 0x00, 0x12, 0xFE, 0xE0, 0xFE, 0xF0, 0x00, 0x20, 0xFE, 0x8D, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, ++ 0x00, 0x20, 0xFE, 0xCB, 0xFE, 0xE0, 0xFE, 0xF4, 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xED, 0xFE, 0xB3, ++ 0xFE, 0xE0, 0xFE, 0xE2, 0xFD, 0xF9, 0x00, 0x03, 0xFE, 0xE0, 0xFE, 0xF0, 0xFC, 0x21, 0x00, 0x02, ++ 0xFE, 0xE2, 0xFD, 0xC5, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB3, 0x00, 0x02, 0xFE, 0xE4, ++ 0xFD, 0x05, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x06, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, ++ 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x64, 0x00, 0x03, 0xFE, 0xA4, ++ 0xFE, 0xA2, 0xFD, 0xA9, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x2B, 0x00, 0x02, 0xFE, 0xAE, ++ 0xFD, 0x66, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x21, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x22, ++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, ++ 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x22, ++ 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xB4, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x23, 0x00, 0x02, 0xFE, 0xA2, ++ 0xFC, 0xB5, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x24, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x70, 0x00, 0x03, ++ 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xB6, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x10, 0x00, 0x02, 0xFE, 0xAE, ++ 0xFC, 0x25, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xB7, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x07, 0x00, 0x02, ++ 0xFE, 0xF0, 0xFD, 0x08, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, ++ 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x6E, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xAB, ++ 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x6F, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0x2C, ++ 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x23, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x24, 0x00, 0x02, 0xFE, 0xF2, ++ 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, ++ 0x00, 0x40, 0xFC, 0x26, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xB8, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x27, ++ 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x72, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x73, 0x00, 0x03, ++ 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x33, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF5, 0x00, 0x02, 0xFE, 0xF0, ++ 0xFC, 0xF6, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22, ++ 0x00, 0x28, 0xFD, 0x71, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x74, 0x00, 0x03, 0xFE, 0xE4, ++ 0xFE, 0xF2, 0xFD, 0x3A, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x11, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x12, ++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFC, 0x28, 0x00, 0x02, 0xFE, 0xE2, ++ 0xFC, 0xB9, 0x00, 0x02, 0xFE, 0xE4, 0x00, 0x01, 0x00, 0x04, 0xFD, 0x3B, 0x00, 0x02, 0xFE, 0xE4, ++ 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40, ++ 0x00, 0x46, 0x00, 0x4C, 0xFC, 0x29, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0xC4, 0x00, 0x03, 0xFE, 0xA0, ++ 0xFE, 0xE4, 0xFC, 0xBA, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0xF7, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xF4, ++ 0xFE, 0xEA, 0xFC, 0x2A, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x77, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, ++ 0xFC, 0xBB, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF7, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF8, 0x00, 0x02, ++ 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x34, ++ 0xFD, 0x75, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0x76, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, ++ 0xFD, 0x78, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xB6, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, ++ 0xFD, 0x13, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x14, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, ++ 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x2B, 0x00, 0x02, 0xFE, 0x9E, ++ 0xFC, 0xBC, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x2C, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xBD, 0x00, 0x02, ++ 0xFE, 0xE4, 0xFC, 0xF9, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFA, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, ++ 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0x79, 0x00, 0x03, 0xFE, 0xE4, ++ 0xFE, 0xE2, 0xFD, 0x7B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x7A, 0x00, 0x03, 0xFE, 0xE4, ++ 0xFE, 0xF2, 0xFD, 0x15, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x16, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0B, ++ 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44, ++ 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0xFC, 0x2D, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBE, 0x00, 0x02, ++ 0xFE, 0xA0, 0xFC, 0x2E, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xBF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x2F, ++ 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x7D, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xC0, 0x00, 0x02, ++ 0xFE, 0xA8, 0xFC, 0x30, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xC1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x31, ++ 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x32, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, ++ 0x00, 0x1A, 0x00, 0x20, 0xFD, 0x7C, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0xC1, 0x00, 0x03, ++ 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7C, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7D, 0x00, 0x02, 0xFE, 0xF2, ++ 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, ++ 0x00, 0x40, 0xFC, 0x33, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC2, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xF1, ++ 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, 0xFC, 0x34, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB4, 0x00, 0x03, ++ 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xC3, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x35, 0x00, 0x02, 0xFE, 0xF0, ++ 0xFC, 0x36, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, ++ 0x00, 0x2A, 0xFD, 0x7E, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x7F, 0x00, 0x03, 0xFE, 0xE4, ++ 0xFE, 0xE2, 0xFD, 0xB2, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7E, 0x00, 0x02, 0xFE, 0xF0, ++ 0xFC, 0x7F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, ++ 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, ++ 0x00, 0x68, 0x00, 0x6E, 0xFC, 0x37, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x38, 0x00, 0x02, 0xFE, 0x9E, ++ 0xFC, 0xC4, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x39, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC5, 0x00, 0x02, ++ 0xFE, 0xA4, 0xFC, 0x3A, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xC6, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x3B, ++ 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xC7, 0x00, 0x02, 0xFE, 0xE0, 0xFC, 0x3C, 0x00, 0x02, 0xFE, 0xE2, ++ 0xFD, 0xC3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xC8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x3D, ++ 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x3E, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, ++ 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0x80, ++ 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x81, 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xEB, 0x00, 0x02, 0xFE, 0xE0, ++ 0xFC, 0x82, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xBB, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB7, ++ 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEC, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x83, 0x00, 0x02, ++ 0xFE, 0xF0, 0xFC, 0x84, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, ++ 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, ++ 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, ++ 0x00, 0xA6, 0xFE, 0xF5, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF7, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xF9, ++ 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFB, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x3F, 0x00, 0x02, 0xFE, 0x9E, ++ 0xFD, 0x83, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA0, 0xFD, 0xBA, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, ++ 0xFC, 0xC9, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x40, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0xB5, 0x00, 0x03, ++ 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCA, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x41, 0x00, 0x02, 0xFE, 0xA6, ++ 0xFD, 0x86, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xCB, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x42, ++ 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x88, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xCC, 0x00, 0x02, ++ 0xFE, 0xE4, 0xFC, 0xCD, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x43, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x44, ++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, ++ 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A, ++ 0x00, 0x82, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, 0xFE, 0xF6, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF8, ++ 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xFA, 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFC, 0x00, 0x02, 0xFE, 0x8E, ++ 0xFD, 0x84, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0x9E, 0xFD, 0xBC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, ++ 0xFD, 0xAC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x80, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, ++ 0xFD, 0x82, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0x81, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, ++ 0xFD, 0x85, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFC, 0x85, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x87, ++ 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xAD, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xED, ++ 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x86, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x87, 0x00, 0x02, 0xFE, 0xF2, ++ 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, ++ 0x00, 0x58, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8C, ++ 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0xFC, 0x45, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x8C, 0x00, 0x03, ++ 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x92, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA8, 0xFD, 0x8D, 0x00, 0x03, ++ 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xCE, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x46, 0x00, 0x02, 0xFE, 0xA2, ++ 0xFD, 0x89, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFD, 0xF4, 0x00, 0x04, 0xFE, 0xA4, 0xFE, 0xE4, ++ 0xFE, 0xAA, 0xFD, 0x8A, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCF, 0x00, 0x02, 0xFE, 0xA4, ++ 0xFC, 0x47, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x8E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xA0, 0xFD, 0x8F, ++ 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xD0, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x48, 0x00, 0x02, ++ 0xFE, 0xE2, 0xFC, 0xD1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x49, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x4A, ++ 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C, ++ 0x00, 0x32, 0xFC, 0x88, 0x00, 0x02, 0xFE, 0x8E, 0xFD, 0xC0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, ++ 0xFD, 0x8B, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0xB9, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, ++ 0xFC, 0x89, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB1, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0x00, 0x0E, ++ 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, ++ 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x72, 0xFC, 0x4B, 0x00, 0x02, ++ 0xFE, 0x9E, 0xFD, 0xB8, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x98, 0x00, 0x03, 0xFE, 0xA0, ++ 0xFE, 0xE4, 0xFC, 0xD2, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x4C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x95, ++ 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xD3, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x4D, 0x00, 0x02, ++ 0xFE, 0xA6, 0xFC, 0xD4, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x4E, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD5, ++ 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xD6, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x4F, 0x00, 0x02, 0xFE, 0xF0, ++ 0xFC, 0x50, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x3A, ++ 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, ++ 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0xFD, 0xBD, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA2, ++ 0xFD, 0x97, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0x99, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, ++ 0xFD, 0xC7, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x96, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, ++ 0xFD, 0xB3, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFC, 0x8A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x8B, ++ 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x8C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9B, 0x00, 0x03, 0xFE, 0xE4, ++ 0xFE, 0xF0, 0xFD, 0x9A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEE, 0x00, 0x02, 0xFE, 0xE4, ++ 0xFC, 0x8D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xEF, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x8E, 0x00, 0x02, ++ 0xFE, 0xF0, 0xFC, 0x8F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, ++ 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0xD9, 0x00, 0x02, ++ 0x06, 0x70, 0xFC, 0x51, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xD7, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x52, ++ 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x93, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x94, 0x00, 0x03, ++ 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xD8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x53, 0x00, 0x02, 0xFE, 0xF0, ++ 0xFC, 0x54, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x04, 0xFD, 0xF8, 0x00, 0x04, 0xFE, 0xB3, ++ 0xFE, 0xE0, 0xFE, 0xE2, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x5D, 0x00, 0x02, 0x06, 0x70, 0x00, 0x01, ++ 0x00, 0x04, 0xFC, 0x90, 0x00, 0x02, 0x06, 0x70, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, ++ 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, ++ 0x00, 0x5E, 0xFC, 0x55, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xDA, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x56, ++ 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xDB, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x57, 0x00, 0x02, 0xFE, 0xA6, ++ 0xFC, 0xDC, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x58, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9D, 0x00, 0x03, ++ 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xDD, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xDE, 0x00, 0x02, 0xFE, 0xEC, ++ 0xFC, 0x59, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x5A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, ++ 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, ++ 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0xFD, 0xAF, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0xAE, ++ 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFC, 0x91, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x92, 0x00, 0x02, ++ 0xFE, 0xB0, 0xFC, 0x93, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, ++ 0xFD, 0xB0, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xF0, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x94, ++ 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xF1, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x95, 0x00, 0x02, 0xFE, 0xF0, ++ 0xFC, 0x96, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x35, 0xFB, 0xD7, 0xFE, 0x8B, 0xFE, 0x8C, ++ 0xFE, 0x8D, 0xFE, 0x8E, 0xFE, 0x91, 0xFE, 0x92, 0xFE, 0x97, 0xFE, 0x98, 0xFE, 0x9B, 0xFE, 0x9C, ++ 0xFE, 0x9F, 0xFE, 0xA0, 0xFE, 0xA3, 0xFE, 0xA4, 0xFE, 0xA7, 0xFE, 0xA8, 0xFE, 0xAB, 0xFE, 0xAD, ++ 0xFE, 0xB3, 0xFE, 0xB4, 0xFE, 0xB7, 0xFE, 0xB8, 0xFE, 0xBB, 0xFE, 0xBC, 0xFE, 0xBF, 0xFE, 0xC0, ++ 0xFE, 0xC3, 0xFE, 0xC4, 0xFE, 0xC7, 0xFE, 0xC8, 0xFE, 0xCB, 0xFE, 0xCC, 0xFE, 0xCF, 0xFE, 0xD0, ++ 0xFE, 0xD3, 0xFE, 0xD4, 0xFE, 0xD7, 0xFE, 0xD8, 0xFE, 0xDB, 0xFE, 0xDC, 0xFE, 0xDF, 0xFE, 0xE0, ++ 0xFE, 0xE3, 0xFE, 0xE4, 0xFE, 0xE7, 0xFE, 0xE8, 0xFE, 0xEB, 0xFE, 0xED, 0xFE, 0xEF, 0xFE, 0xF0, ++ 0xFE, 0xF3, 0xFE, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1A, ++ 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x09, 0xCB, 0x00, 0x02, 0x09, 0xBE, ++ 0x09, 0xCC, 0x00, 0x02, 0x09, 0xD7, 0x00, 0x01, 0x00, 0x01, 0x09, 0xC7, 0x00, 0x02, 0x00, 0x00, ++ 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x16, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x02, ++ 0x09, 0xC7, 0x09, 0xBE, 0x00, 0x02, 0x09, 0xC7, 0x09, 0xD7, 0x00, 0x01, 0x00, 0x02, 0x09, 0xCB, ++ 0x09, 0xCC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x02, 0x66, 0x00, 0x20, + 0x00, 0x46, 0x00, 0x50, 0x00, 0x62, 0x00, 0x74, 0x00, 0x96, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xDC, + 0x00, 0xEE, 0x00, 0xF8, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, 0x01, 0x38, 0x01, 0x4A, 0x01, 0x5C, + 0x01, 0x7E, 0x01, 0x90, 0x01, 0x9A, 0x01, 0xC4, 0x01, 0xD6, 0x01, 0xE0, 0x02, 0x02, 0x02, 0x0C, +@@ -508,25 +499,13 @@ + 0x04, 0x35, 0x03, 0x40, 0x00, 0x02, 0x04, 0x33, 0x03, 0x41, 0x00, 0x02, 0x04, 0x3A, 0x03, 0x41, + 0x00, 0x02, 0x04, 0x38, 0x03, 0x40, 0x00, 0x01, 0x00, 0x08, 0x04, 0x00, 0x04, 0x03, 0x04, 0x0C, + 0x04, 0x0D, 0x04, 0x50, 0x04, 0x53, 0x04, 0x5C, 0x04, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, +- 0x00, 0x08, 0x00, 0x01, 0x00, 0x8A, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3A, +- 0x00, 0x44, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, 0x00, 0x01, +- 0x00, 0x04, 0x09, 0x58, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x59, 0x00, 0x02, +- 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x5A, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, +- 0x09, 0x5B, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x5C, 0x00, 0x02, 0x09, 0x3C, +- 0x00, 0x01, 0x00, 0x04, 0x09, 0x5D, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x29, +- 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x5E, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, +- 0x00, 0x04, 0x09, 0x5F, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x31, 0x00, 0x02, +- 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x34, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x0B, +- 0x09, 0x15, 0x09, 0x16, 0x09, 0x17, 0x09, 0x1C, 0x09, 0x21, 0x09, 0x22, 0x09, 0x28, 0x09, 0x2B, +- 0x09, 0x2F, 0x09, 0x30, 0x09, 0x33, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, +- 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, +- 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x02, 0x09, 0x28, 0x09, 0x3C, +- 0x00, 0x02, 0x09, 0x30, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x33, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x15, +- 0x09, 0x3C, 0x00, 0x02, 0x09, 0x16, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x17, 0x09, 0x3C, 0x00, 0x02, +- 0x09, 0x1C, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x21, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x22, 0x09, 0x3C, +- 0x00, 0x02, 0x09, 0x2B, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x2F, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x0B, +- 0x09, 0x29, 0x09, 0x31, 0x09, 0x34, 0x09, 0x58, 0x09, 0x59, 0x09, 0x5A, 0x09, 0x5B, 0x09, 0x5C, +- 0x09, 0x5D, 0x09, 0x5E, 0x09, 0x5F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, ++ 0x00, 0x08, 0x00, 0x01, 0x00, 0x2A, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x20, 0x00, 0x01, ++ 0x00, 0x04, 0x09, 0x29, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x31, 0x00, 0x02, ++ 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x34, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x03, ++ 0x09, 0x28, 0x09, 0x30, 0x09, 0x33, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, ++ 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, 0x09, 0x28, 0x09, 0x3C, ++ 0x00, 0x02, 0x09, 0x30, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x33, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x03, ++ 0x09, 0x29, 0x09, 0x31, 0x09, 0x34, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x33, 0x04, 0x00, 0x75, 0x00, 0xF0, 0x01, 0x1A, 0x04, 0x5A, 0x05, 0x0C, 0x08, 0x3C, 0x09, 0x24, + 0x09, 0xD6, 0x09, 0xE0, 0x0A, 0x54, 0x0D, 0x84, 0x0D, 0x8E, 0x0D, 0x98, 0x11, 0x44, 0x11, 0xF6, + 0x15, 0x92, 0x16, 0xBC, 0x17, 0x6E, 0x17, 0x88, 0x18, 0xB2, 0x1C, 0x4E, 0x1C, 0x78, 0x1C, 0xA2, +@@ -1358,569 +1337,541 @@ + 0x1F, 0x81, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0xA0, + 0x1F, 0xA1, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xB3, 0x1F, 0xB6, 0x1F, 0xBC, 0x1F, 0xBE, 0x1F, 0xBF, + 0x1F, 0xC3, 0x1F, 0xC6, 0x1F, 0xCC, 0x1F, 0xF3, 0x1F, 0xF6, 0x1F, 0xFC, 0x1F, 0xFE, 0x21, 0x26, +- 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4C, 0x0A, 0x10, 0x12, 0x6E, 0x18, 0x84, 0x1E, 0x68, +- 0x22, 0x7A, 0x26, 0x68, 0x29, 0x12, 0x2B, 0x5C, 0x2D, 0x24, 0x2F, 0x04, 0x30, 0xB4, 0x32, 0x62, +- 0x33, 0xCA, 0x35, 0x32, 0x36, 0x9A, 0x37, 0x76, 0x38, 0x52, 0x39, 0x2E, 0x39, 0xFC, 0x3A, 0xCA, +- 0x3B, 0x98, 0x3C, 0x4A, 0x3C, 0xFC, 0x3D, 0x22, 0x3D, 0x48, 0x3D, 0x6E, 0x3D, 0x94, 0x3D, 0xBA, +- 0x3D, 0xE0, 0x3E, 0x06, 0x3E, 0x2C, 0x3E, 0x52, 0x3E, 0x78, 0x3E, 0x9E, 0x00, 0x01, 0x07, 0xCE, +- 0x00, 0xF9, 0x01, 0xF8, 0x01, 0xFE, 0x02, 0x04, 0x02, 0x0A, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1C, +- 0x02, 0x22, 0x02, 0x28, 0x02, 0x2E, 0x02, 0x34, 0x02, 0x3A, 0x02, 0x40, 0x02, 0x46, 0x02, 0x4C, +- 0x02, 0x52, 0x02, 0x58, 0x02, 0x5E, 0x02, 0x64, 0x02, 0x6A, 0x02, 0x70, 0x02, 0x76, 0x02, 0x7C, +- 0x02, 0x82, 0x02, 0x88, 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, 0x02, 0xA0, 0x02, 0xA6, 0x02, 0xAC, +- 0x02, 0xB2, 0x02, 0xB8, 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD6, 0x02, 0xDC, +- 0x02, 0xE2, 0x02, 0xE8, 0x02, 0xEE, 0x02, 0xF4, 0x02, 0xFA, 0x03, 0x00, 0x03, 0x06, 0x03, 0x0C, +- 0x03, 0x12, 0x03, 0x18, 0x03, 0x1E, 0x03, 0x24, 0x03, 0x2A, 0x03, 0x30, 0x03, 0x36, 0x03, 0x3C, +- 0x03, 0x42, 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, 0x03, 0x5A, 0x03, 0x60, 0x03, 0x66, 0x03, 0x6C, +- 0x03, 0x72, 0x03, 0x78, 0x03, 0x7E, 0x03, 0x84, 0x03, 0x8A, 0x03, 0x90, 0x03, 0x96, 0x03, 0x9C, +- 0x03, 0xA2, 0x03, 0xA8, 0x03, 0xAE, 0x03, 0xB4, 0x03, 0xBA, 0x03, 0xC0, 0x03, 0xC6, 0x03, 0xCC, +- 0x03, 0xD2, 0x03, 0xD8, 0x03, 0xDE, 0x03, 0xE4, 0x03, 0xEA, 0x03, 0xF0, 0x03, 0xF6, 0x03, 0xFC, +- 0x04, 0x02, 0x04, 0x08, 0x04, 0x0E, 0x04, 0x14, 0x04, 0x1A, 0x04, 0x20, 0x04, 0x26, 0x04, 0x2C, +- 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, 0x04, 0x44, 0x04, 0x4A, 0x04, 0x50, 0x04, 0x56, 0x04, 0x5C, +- 0x04, 0x62, 0x04, 0x68, 0x04, 0x6E, 0x04, 0x74, 0x04, 0x7A, 0x04, 0x80, 0x04, 0x86, 0x04, 0x8C, +- 0x04, 0x92, 0x04, 0x98, 0x04, 0x9E, 0x04, 0xA4, 0x04, 0xAA, 0x04, 0xB0, 0x04, 0xB6, 0x04, 0xBC, +- 0x04, 0xC2, 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD4, 0x04, 0xDA, 0x04, 0xE0, 0x04, 0xE6, 0x04, 0xEC, +- 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x10, 0x05, 0x16, 0x05, 0x1C, +- 0x05, 0x22, 0x05, 0x28, 0x05, 0x2E, 0x05, 0x34, 0x05, 0x3A, 0x05, 0x40, 0x05, 0x46, 0x05, 0x4C, +- 0x05, 0x52, 0x05, 0x58, 0x05, 0x5E, 0x05, 0x64, 0x05, 0x6A, 0x05, 0x70, 0x05, 0x76, 0x05, 0x7C, +- 0x05, 0x82, 0x05, 0x88, 0x05, 0x8E, 0x05, 0x94, 0x05, 0x9A, 0x05, 0xA0, 0x05, 0xA6, 0x05, 0xAC, +- 0x05, 0xB2, 0x05, 0xB8, 0x05, 0xBE, 0x05, 0xC4, 0x05, 0xCA, 0x05, 0xD0, 0x05, 0xD6, 0x05, 0xDC, +- 0x05, 0xE2, 0x05, 0xE8, 0x05, 0xEE, 0x05, 0xF4, 0x05, 0xFA, 0x06, 0x00, 0x06, 0x06, 0x06, 0x0C, +- 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x06, 0x30, 0x06, 0x36, 0x06, 0x3C, +- 0x06, 0x42, 0x06, 0x48, 0x06, 0x4E, 0x06, 0x54, 0x06, 0x5A, 0x06, 0x60, 0x06, 0x66, 0x06, 0x6C, +- 0x06, 0x72, 0x06, 0x78, 0x06, 0x7E, 0x06, 0x84, 0x06, 0x8A, 0x06, 0x90, 0x06, 0x96, 0x06, 0x9C, +- 0x06, 0xA2, 0x06, 0xA8, 0x06, 0xAE, 0x06, 0xB4, 0x06, 0xBA, 0x06, 0xC0, 0x06, 0xC6, 0x06, 0xCC, +- 0x06, 0xD2, 0x06, 0xD8, 0x06, 0xDE, 0x06, 0xE4, 0x06, 0xEA, 0x06, 0xF0, 0x06, 0xF6, 0x06, 0xFC, +- 0x07, 0x02, 0x07, 0x08, 0x07, 0x0E, 0x07, 0x14, 0x07, 0x1A, 0x07, 0x20, 0x07, 0x26, 0x07, 0x2C, +- 0x07, 0x32, 0x07, 0x38, 0x07, 0x3E, 0x07, 0x44, 0x07, 0x4A, 0x07, 0x50, 0x07, 0x56, 0x07, 0x5C, +- 0x07, 0x62, 0x07, 0x68, 0x07, 0x6E, 0x07, 0x74, 0x07, 0x7A, 0x07, 0x80, 0x07, 0x86, 0x07, 0x8C, +- 0x07, 0x92, 0x07, 0x98, 0x07, 0x9E, 0x07, 0xA4, 0x07, 0xAA, 0x07, 0xB0, 0x07, 0xB6, 0x07, 0xBC, +- 0x07, 0xC2, 0x07, 0xC8, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x01, 0x00, 0x02, 0x03, 0x91, 0x03, 0x01, +- 0x00, 0x02, 0x03, 0x95, 0x03, 0x01, 0x00, 0x02, 0x03, 0x97, 0x03, 0x01, 0x00, 0x02, 0x03, 0x99, +- 0x03, 0x01, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x01, 0x00, 0x02, +- 0x03, 0xA9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x44, 0x00, 0x02, 0x03, 0x99, 0x03, 0x08, +- 0x00, 0x02, 0x03, 0xA5, 0x03, 0x08, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB5, +- 0x03, 0x01, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x01, 0x00, 0x02, +- 0x03, 0xC5, 0x03, 0x44, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x08, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x08, +- 0x00, 0x02, 0x03, 0xBF, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC9, +- 0x03, 0x01, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x01, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x08, 0x00, 0x02, +- 0x03, 0xB1, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x00, +- 0x00, 0x02, 0x1F, 0x01, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x01, +- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x42, 0x00, 0x02, +- 0x03, 0x91, 0x03, 0x13, 0x00, 0x02, 0x03, 0x91, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x00, +- 0x00, 0x02, 0x1F, 0x09, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x09, +- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x42, 0x00, 0x02, +- 0x03, 0xB5, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x00, +- 0x00, 0x02, 0x1F, 0x11, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x11, +- 0x03, 0x01, 0x00, 0x02, 0x03, 0x95, 0x03, 0x13, 0x00, 0x02, 0x03, 0x95, 0x03, 0x14, 0x00, 0x02, +- 0x1F, 0x18, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x19, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x01, +- 0x00, 0x02, 0x1F, 0x19, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB7, +- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x00, 0x00, 0x02, +- 0x1F, 0x20, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x42, +- 0x00, 0x02, 0x1F, 0x21, 0x03, 0x42, 0x00, 0x02, 0x03, 0x97, 0x03, 0x13, 0x00, 0x02, 0x03, 0x97, +- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x00, 0x00, 0x02, +- 0x1F, 0x28, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x42, +- 0x00, 0x02, 0x1F, 0x29, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB9, +- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x00, 0x00, 0x02, +- 0x1F, 0x30, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x42, +- 0x00, 0x02, 0x1F, 0x31, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x13, 0x00, 0x02, 0x03, 0x99, +- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x00, 0x00, 0x02, +- 0x1F, 0x38, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x42, +- 0x00, 0x02, 0x1F, 0x39, 0x03, 0x42, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x13, 0x00, 0x02, 0x03, 0xBF, +- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x00, 0x00, 0x02, +- 0x1F, 0x40, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x01, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x13, +- 0x00, 0x02, 0x03, 0x9F, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x49, +- 0x03, 0x00, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x01, 0x00, 0x02, +- 0x03, 0xC5, 0x03, 0x13, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x00, +- 0x00, 0x02, 0x1F, 0x51, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x51, +- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x42, 0x00, 0x02, +- 0x03, 0xA5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x01, +- 0x00, 0x02, 0x1F, 0x59, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xC9, +- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x00, 0x00, 0x02, +- 0x1F, 0x60, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x42, +- 0x00, 0x02, 0x1F, 0x61, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xA9, +- 0x03, 0x14, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x00, 0x00, 0x02, +- 0x1F, 0x68, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x42, +- 0x00, 0x02, 0x1F, 0x69, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB1, +- 0x03, 0x01, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x01, 0x00, 0x02, +- 0x03, 0xB7, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x00, +- 0x00, 0x02, 0x03, 0xB9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x00, 0x00, 0x02, 0x03, 0xBF, +- 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x01, 0x00, 0x02, +- 0x03, 0xC9, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x45, +- 0x00, 0x02, 0x1F, 0x01, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x02, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x03, +- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x04, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x05, 0x03, 0x45, 0x00, 0x02, +- 0x1F, 0x06, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x07, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x45, +- 0x00, 0x02, 0x1F, 0x09, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0A, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0B, +- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0D, 0x03, 0x45, 0x00, 0x02, +- 0x1F, 0x0E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0F, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x45, +- 0x00, 0x02, 0x1F, 0x21, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x22, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x23, +- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x24, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x25, 0x03, 0x45, 0x00, 0x02, +- 0x1F, 0x26, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x27, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x45, +- 0x00, 0x02, 0x1F, 0x29, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2A, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2B, +- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2D, 0x03, 0x45, 0x00, 0x02, +- 0x1F, 0x2E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2F, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x45, +- 0x00, 0x02, 0x1F, 0x61, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x62, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x63, +- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x64, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x65, 0x03, 0x45, 0x00, 0x02, +- 0x1F, 0x66, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x67, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x45, +- 0x00, 0x02, 0x1F, 0x69, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6A, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6B, +- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6D, 0x03, 0x45, 0x00, 0x02, +- 0x1F, 0x6E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6F, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x06, +- 0x00, 0x02, 0x03, 0xB1, 0x03, 0x04, 0x00, 0x02, 0x1F, 0x70, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1, +- 0x03, 0x45, 0x00, 0x02, 0x03, 0xAC, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x42, 0x00, 0x02, +- 0x1F, 0xB3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, 0x03, 0x06, 0x00, 0x02, 0x03, 0x91, 0x03, 0x04, +- 0x00, 0x02, 0x03, 0x91, 0x03, 0x00, 0x00, 0x02, 0x03, 0x91, 0x03, 0x01, 0x00, 0x02, 0x03, 0x91, +- 0x03, 0x45, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x74, 0x03, 0x45, 0x00, 0x02, +- 0x03, 0xB7, 0x03, 0x45, 0x00, 0x02, 0x03, 0xAE, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x42, +- 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x95, 0x03, 0x00, 0x00, 0x02, 0x03, 0x95, +- 0x03, 0x01, 0x00, 0x02, 0x03, 0x97, 0x03, 0x00, 0x00, 0x02, 0x03, 0x97, 0x03, 0x01, 0x00, 0x02, +- 0x03, 0x97, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x01, +- 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x06, 0x00, 0x02, 0x03, 0xB9, +- 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x44, 0x00, 0x02, +- 0x03, 0xB9, 0x03, 0x42, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x06, +- 0x00, 0x02, 0x03, 0x99, 0x03, 0x04, 0x00, 0x02, 0x03, 0x99, 0x03, 0x00, 0x00, 0x02, 0x03, 0x99, +- 0x03, 0x01, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x01, 0x00, 0x02, +- 0x1F, 0xFE, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x06, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x04, +- 0x00, 0x02, 0x03, 0xCB, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x44, 0x00, 0x02, 0x03, 0xC1, ++ 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4C, 0x09, 0x66, 0x11, 0x1A, 0x17, 0x08, 0x1C, 0xC2, ++ 0x20, 0xBC, 0x24, 0x9E, 0x27, 0x3C, 0x29, 0x7A, 0x2B, 0x42, 0x2D, 0x22, 0x2E, 0xD2, 0x30, 0x80, ++ 0x31, 0xE8, 0x33, 0x50, 0x34, 0xB8, 0x35, 0x94, 0x36, 0x70, 0x37, 0x4C, 0x38, 0x1A, 0x38, 0xE8, ++ 0x39, 0xB6, 0x3A, 0x68, 0x3B, 0x1A, 0x3B, 0x40, 0x3B, 0x66, 0x3B, 0x8C, 0x3B, 0xB2, 0x3B, 0xD8, ++ 0x3B, 0xFE, 0x3C, 0x24, 0x3C, 0x4A, 0x3C, 0x70, 0x3C, 0x96, 0x3C, 0xBC, 0x00, 0x01, 0x07, 0x46, ++ 0x00, 0xE8, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xE8, 0x01, 0xEE, 0x01, 0xF4, 0x01, 0xFA, ++ 0x02, 0x00, 0x02, 0x06, 0x02, 0x0C, 0x02, 0x12, 0x02, 0x18, 0x02, 0x1E, 0x02, 0x24, 0x02, 0x2A, ++ 0x02, 0x30, 0x02, 0x36, 0x02, 0x3C, 0x02, 0x42, 0x02, 0x48, 0x02, 0x4E, 0x02, 0x54, 0x02, 0x5A, ++ 0x02, 0x60, 0x02, 0x66, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, 0x02, 0x8A, ++ 0x02, 0x90, 0x02, 0x96, 0x02, 0x9C, 0x02, 0xA2, 0x02, 0xA8, 0x02, 0xAE, 0x02, 0xB4, 0x02, 0xBA, ++ 0x02, 0xC0, 0x02, 0xC6, 0x02, 0xCC, 0x02, 0xD2, 0x02, 0xD8, 0x02, 0xDE, 0x02, 0xE4, 0x02, 0xEA, ++ 0x02, 0xF0, 0x02, 0xF6, 0x02, 0xFC, 0x03, 0x02, 0x03, 0x08, 0x03, 0x0E, 0x03, 0x14, 0x03, 0x1A, ++ 0x03, 0x20, 0x03, 0x26, 0x03, 0x2C, 0x03, 0x32, 0x03, 0x38, 0x03, 0x3E, 0x03, 0x44, 0x03, 0x4A, ++ 0x03, 0x50, 0x03, 0x56, 0x03, 0x5C, 0x03, 0x62, 0x03, 0x68, 0x03, 0x6E, 0x03, 0x74, 0x03, 0x7A, ++ 0x03, 0x80, 0x03, 0x86, 0x03, 0x8C, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA4, 0x03, 0xAA, ++ 0x03, 0xB0, 0x03, 0xB6, 0x03, 0xBC, 0x03, 0xC2, 0x03, 0xC8, 0x03, 0xCE, 0x03, 0xD4, 0x03, 0xDA, ++ 0x03, 0xE0, 0x03, 0xE6, 0x03, 0xEC, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x04, 0x04, 0x0A, ++ 0x04, 0x10, 0x04, 0x16, 0x04, 0x1C, 0x04, 0x22, 0x04, 0x28, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, ++ 0x04, 0x40, 0x04, 0x46, 0x04, 0x4C, 0x04, 0x52, 0x04, 0x58, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, ++ 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82, 0x04, 0x88, 0x04, 0x8E, 0x04, 0x94, 0x04, 0x9A, ++ 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAC, 0x04, 0xB2, 0x04, 0xB8, 0x04, 0xBE, 0x04, 0xC4, 0x04, 0xCA, ++ 0x04, 0xD0, 0x04, 0xD6, 0x04, 0xDC, 0x04, 0xE2, 0x04, 0xE8, 0x04, 0xEE, 0x04, 0xF4, 0x04, 0xFA, ++ 0x05, 0x00, 0x05, 0x06, 0x05, 0x0C, 0x05, 0x12, 0x05, 0x18, 0x05, 0x1E, 0x05, 0x24, 0x05, 0x2A, ++ 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A, ++ 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A, ++ 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x05, 0xBA, ++ 0x05, 0xC0, 0x05, 0xC6, 0x05, 0xCC, 0x05, 0xD2, 0x05, 0xD8, 0x05, 0xDE, 0x05, 0xE4, 0x05, 0xEA, ++ 0x05, 0xF0, 0x05, 0xF6, 0x05, 0xFC, 0x06, 0x02, 0x06, 0x08, 0x06, 0x0E, 0x06, 0x14, 0x06, 0x1A, ++ 0x06, 0x20, 0x06, 0x26, 0x06, 0x2C, 0x06, 0x32, 0x06, 0x38, 0x06, 0x3E, 0x06, 0x44, 0x06, 0x4A, ++ 0x06, 0x50, 0x06, 0x56, 0x06, 0x5C, 0x06, 0x62, 0x06, 0x68, 0x06, 0x6E, 0x06, 0x74, 0x06, 0x7A, ++ 0x06, 0x80, 0x06, 0x86, 0x06, 0x8C, 0x06, 0x92, 0x06, 0x98, 0x06, 0x9E, 0x06, 0xA4, 0x06, 0xAA, ++ 0x06, 0xB0, 0x06, 0xB6, 0x06, 0xBC, 0x06, 0xC2, 0x06, 0xC8, 0x06, 0xCE, 0x06, 0xD4, 0x06, 0xDA, ++ 0x06, 0xE0, 0x06, 0xE6, 0x06, 0xEC, 0x06, 0xF2, 0x06, 0xF8, 0x06, 0xFE, 0x07, 0x04, 0x07, 0x0A, ++ 0x07, 0x10, 0x07, 0x16, 0x07, 0x1C, 0x07, 0x22, 0x07, 0x28, 0x07, 0x2E, 0x07, 0x34, 0x07, 0x3A, ++ 0x07, 0x40, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x01, 0x00, 0x02, 0x03, 0x91, 0x03, 0x01, 0x00, 0x02, ++ 0x03, 0x95, 0x03, 0x01, 0x00, 0x02, 0x03, 0x97, 0x03, 0x01, 0x00, 0x02, 0x03, 0x99, 0x03, 0x01, ++ 0x00, 0x02, 0x03, 0x9F, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA9, ++ 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x44, 0x00, 0x02, 0x03, 0x99, 0x03, 0x08, 0x00, 0x02, ++ 0x03, 0xA5, 0x03, 0x08, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x01, ++ 0x00, 0x02, 0x03, 0xB7, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, ++ 0x03, 0x44, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x08, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x08, 0x00, 0x02, ++ 0x03, 0xBF, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x01, ++ 0x00, 0x02, 0x03, 0xD2, 0x03, 0x01, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x08, 0x00, 0x02, 0x03, 0xB1, ++ 0x03, 0x13, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x00, 0x00, 0x02, ++ 0x1F, 0x01, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x01, ++ 0x00, 0x02, 0x1F, 0x00, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, ++ 0x03, 0x13, 0x00, 0x02, 0x03, 0x91, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x00, 0x00, 0x02, ++ 0x1F, 0x09, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x01, ++ 0x00, 0x02, 0x1F, 0x08, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB5, ++ 0x03, 0x13, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x00, 0x00, 0x02, ++ 0x1F, 0x11, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x01, ++ 0x00, 0x02, 0x03, 0x95, 0x03, 0x13, 0x00, 0x02, 0x03, 0x95, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x18, ++ 0x03, 0x00, 0x00, 0x02, 0x1F, 0x19, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x01, 0x00, 0x02, ++ 0x1F, 0x19, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x14, ++ 0x00, 0x02, 0x1F, 0x20, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x20, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0x21, 0x03, 0x42, 0x00, 0x02, 0x03, 0x97, 0x03, 0x13, 0x00, 0x02, 0x03, 0x97, 0x03, 0x14, ++ 0x00, 0x02, 0x1F, 0x28, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x28, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0x29, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x14, ++ 0x00, 0x02, 0x1F, 0x30, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x30, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0x31, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x13, 0x00, 0x02, 0x03, 0x99, 0x03, 0x14, ++ 0x00, 0x02, 0x1F, 0x38, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x38, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0x39, 0x03, 0x42, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x13, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x14, ++ 0x00, 0x02, 0x1F, 0x40, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x40, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x01, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x13, 0x00, 0x02, ++ 0x03, 0x9F, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x00, ++ 0x00, 0x02, 0x1F, 0x48, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, ++ 0x03, 0x13, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x00, 0x00, 0x02, ++ 0x1F, 0x51, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x01, ++ 0x00, 0x02, 0x1F, 0x50, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, ++ 0x03, 0x14, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x01, 0x00, 0x02, ++ 0x1F, 0x59, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x14, ++ 0x00, 0x02, 0x1F, 0x60, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x60, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0x61, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x14, ++ 0x00, 0x02, 0x1F, 0x68, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x68, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0x69, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x00, ++ 0x00, 0x02, 0x03, 0xB7, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x00, 0x00, 0x02, 0x03, 0xBF, ++ 0x03, 0x00, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x00, 0x00, 0x02, ++ 0x1F, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x02, 0x03, 0x45, ++ 0x00, 0x02, 0x1F, 0x03, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x04, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x05, ++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x06, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x07, 0x03, 0x45, 0x00, 0x02, ++ 0x1F, 0x08, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0A, 0x03, 0x45, ++ 0x00, 0x02, 0x1F, 0x0B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0D, ++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0F, 0x03, 0x45, 0x00, 0x02, ++ 0x1F, 0x20, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x22, 0x03, 0x45, ++ 0x00, 0x02, 0x1F, 0x23, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x24, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x25, ++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x26, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x27, 0x03, 0x45, 0x00, 0x02, ++ 0x1F, 0x28, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2A, 0x03, 0x45, ++ 0x00, 0x02, 0x1F, 0x2B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2D, ++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2F, 0x03, 0x45, 0x00, 0x02, ++ 0x1F, 0x60, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x62, 0x03, 0x45, ++ 0x00, 0x02, 0x1F, 0x63, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x64, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x65, ++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x66, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x67, 0x03, 0x45, 0x00, 0x02, ++ 0x1F, 0x68, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6A, 0x03, 0x45, ++ 0x00, 0x02, 0x1F, 0x6B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6D, ++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6F, 0x03, 0x45, 0x00, 0x02, ++ 0x03, 0xB1, 0x03, 0x06, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x04, 0x00, 0x02, 0x1F, 0x70, 0x03, 0x45, ++ 0x00, 0x02, 0x03, 0xB1, 0x03, 0x45, 0x00, 0x02, 0x03, 0xAC, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1, ++ 0x03, 0x42, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, 0x03, 0x06, 0x00, 0x02, ++ 0x03, 0x91, 0x03, 0x04, 0x00, 0x02, 0x03, 0x91, 0x03, 0x00, 0x00, 0x02, 0x03, 0x91, 0x03, 0x45, ++ 0x00, 0x02, 0x00, 0xA8, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x74, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB7, ++ 0x03, 0x45, 0x00, 0x02, 0x03, 0xAE, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0xC3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x95, 0x03, 0x00, 0x00, 0x02, 0x03, 0x97, 0x03, 0x00, ++ 0x00, 0x02, 0x03, 0x97, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xBF, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x06, 0x00, 0x02, ++ 0x03, 0xB9, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x42, ++ 0x00, 0x02, 0x03, 0xCA, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x06, 0x00, 0x02, 0x03, 0x99, ++ 0x03, 0x04, 0x00, 0x02, 0x03, 0x99, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x00, 0x00, 0x02, ++ 0x1F, 0xFE, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x06, ++ 0x00, 0x02, 0x03, 0xC5, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC1, + 0x03, 0x13, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x14, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x42, 0x00, 0x02, + 0x03, 0xCB, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x06, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x04, +- 0x00, 0x02, 0x03, 0xA5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA1, +- 0x03, 0x14, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x00, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x01, 0x00, 0x02, +- 0x1F, 0x7C, 0x03, 0x45, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x45, 0x00, 0x02, 0x03, 0xCE, 0x03, 0x45, +- 0x00, 0x02, 0x03, 0xC9, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x9F, +- 0x03, 0x00, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x00, 0x00, 0x02, +- 0x03, 0xA9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x45, 0x00, 0x01, 0x00, 0xF9, 0x03, 0x85, +- 0x03, 0x86, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8A, 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, +- 0x03, 0xAA, 0x03, 0xAB, 0x03, 0xAC, 0x03, 0xAD, 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, +- 0x03, 0xCB, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, 0x03, 0xD3, 0x03, 0xD4, 0x1F, 0x00, 0x1F, 0x01, +- 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, 0x1F, 0x09, +- 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x11, +- 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x18, 0x1F, 0x19, 0x1F, 0x1A, 0x1F, 0x1B, +- 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x20, 0x1F, 0x21, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, +- 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, 0x1F, 0x29, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, +- 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, +- 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, 0x1F, 0x39, 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, +- 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x41, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, +- 0x1F, 0x48, 0x1F, 0x49, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x50, 0x1F, 0x51, +- 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x59, 0x1F, 0x5B, +- 0x1F, 0x5D, 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x61, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, +- 0x1F, 0x66, 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, +- 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x71, 0x1F, 0x72, 0x1F, 0x73, 0x1F, 0x74, 0x1F, 0x75, +- 0x1F, 0x76, 0x1F, 0x77, 0x1F, 0x78, 0x1F, 0x79, 0x1F, 0x7A, 0x1F, 0x7B, 0x1F, 0x7C, 0x1F, 0x7D, +- 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, +- 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, +- 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, +- 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, +- 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, +- 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, +- 0x1F, 0xB0, 0x1F, 0xB1, 0x1F, 0xB2, 0x1F, 0xB3, 0x1F, 0xB4, 0x1F, 0xB6, 0x1F, 0xB7, 0x1F, 0xB8, +- 0x1F, 0xB9, 0x1F, 0xBA, 0x1F, 0xBB, 0x1F, 0xBC, 0x1F, 0xC1, 0x1F, 0xC2, 0x1F, 0xC3, 0x1F, 0xC4, +- 0x1F, 0xC6, 0x1F, 0xC7, 0x1F, 0xC8, 0x1F, 0xC9, 0x1F, 0xCA, 0x1F, 0xCB, 0x1F, 0xCC, 0x1F, 0xCD, +- 0x1F, 0xCE, 0x1F, 0xCF, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xD6, 0x1F, 0xD7, +- 0x1F, 0xD8, 0x1F, 0xD9, 0x1F, 0xDA, 0x1F, 0xDB, 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xDF, 0x1F, 0xE0, +- 0x1F, 0xE1, 0x1F, 0xE2, 0x1F, 0xE3, 0x1F, 0xE4, 0x1F, 0xE5, 0x1F, 0xE6, 0x1F, 0xE7, 0x1F, 0xE8, +- 0x1F, 0xE9, 0x1F, 0xEA, 0x1F, 0xEB, 0x1F, 0xEC, 0x1F, 0xED, 0x1F, 0xEE, 0x1F, 0xF2, 0x1F, 0xF3, +- 0x1F, 0xF4, 0x1F, 0xF6, 0x1F, 0xF7, 0x1F, 0xF8, 0x1F, 0xF9, 0x1F, 0xFA, 0x1F, 0xFB, 0x1F, 0xFC, +- 0x00, 0x01, 0x06, 0xB8, 0x00, 0xD1, 0x01, 0xA8, 0x01, 0xAE, 0x01, 0xB4, 0x01, 0xBA, 0x01, 0xC0, +- 0x01, 0xC6, 0x01, 0xCC, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xDE, 0x01, 0xE4, 0x01, 0xEA, 0x01, 0xF0, +- 0x01, 0xF6, 0x01, 0xFC, 0x02, 0x02, 0x02, 0x08, 0x02, 0x0E, 0x02, 0x14, 0x02, 0x1A, 0x02, 0x20, +- 0x02, 0x26, 0x02, 0x2C, 0x02, 0x32, 0x02, 0x38, 0x02, 0x40, 0x02, 0x48, 0x02, 0x4E, 0x02, 0x54, +- 0x02, 0x5A, 0x02, 0x60, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7C, 0x02, 0x82, 0x02, 0x88, +- 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, 0x02, 0xA0, 0x02, 0xA6, 0x02, 0xAC, 0x02, 0xB2, 0x02, 0xB8, +- 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD8, 0x02, 0xE0, 0x02, 0xE6, 0x02, 0xEC, +- 0x02, 0xF2, 0x02, 0xF8, 0x02, 0xFE, 0x03, 0x06, 0x03, 0x0E, 0x03, 0x14, 0x03, 0x1A, 0x03, 0x20, +- 0x03, 0x26, 0x03, 0x2C, 0x03, 0x32, 0x03, 0x3A, 0x03, 0x42, 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, +- 0x03, 0x5A, 0x03, 0x60, 0x03, 0x68, 0x03, 0x70, 0x03, 0x76, 0x03, 0x7C, 0x03, 0x82, 0x03, 0x88, +- 0x03, 0x8E, 0x03, 0x94, 0x03, 0x9A, 0x03, 0xA0, 0x03, 0xA6, 0x03, 0xAC, 0x03, 0xB2, 0x03, 0xB8, +- 0x03, 0xBE, 0x03, 0xC4, 0x03, 0xCA, 0x03, 0xD2, 0x03, 0xDA, 0x03, 0xE0, 0x03, 0xE6, 0x03, 0xEE, +- 0x03, 0xF4, 0x03, 0xFA, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, 0x04, 0x14, 0x04, 0x1C, 0x04, 0x22, +- 0x04, 0x28, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, 0x04, 0x40, 0x04, 0x48, 0x04, 0x50, 0x04, 0x56, +- 0x04, 0x5C, 0x04, 0x62, 0x04, 0x68, 0x04, 0x6E, 0x04, 0x74, 0x04, 0x7A, 0x04, 0x80, 0x04, 0x86, +- 0x04, 0x8C, 0x04, 0x92, 0x04, 0x98, 0x04, 0x9E, 0x04, 0xA4, 0x04, 0xAA, 0x04, 0xB0, 0x04, 0xB6, +- 0x04, 0xBC, 0x04, 0xC2, 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD4, 0x04, 0xDA, 0x04, 0xE0, 0x04, 0xE6, +- 0x04, 0xEC, 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x10, 0x05, 0x16, +- 0x05, 0x1C, 0x05, 0x22, 0x05, 0x28, 0x05, 0x2E, 0x05, 0x34, 0x05, 0x3A, 0x05, 0x40, 0x05, 0x46, +- 0x05, 0x4C, 0x05, 0x52, 0x05, 0x58, 0x05, 0x5E, 0x05, 0x64, 0x05, 0x6A, 0x05, 0x70, 0x05, 0x76, +- 0x05, 0x7C, 0x05, 0x82, 0x05, 0x88, 0x05, 0x8E, 0x05, 0x94, 0x05, 0x9A, 0x05, 0xA0, 0x05, 0xA6, +- 0x05, 0xAC, 0x05, 0xB2, 0x05, 0xB8, 0x05, 0xBE, 0x05, 0xC4, 0x05, 0xCA, 0x05, 0xD0, 0x05, 0xD6, +- 0x05, 0xDC, 0x05, 0xE2, 0x05, 0xE8, 0x05, 0xEE, 0x05, 0xF4, 0x05, 0xFA, 0x06, 0x00, 0x06, 0x06, +- 0x06, 0x0C, 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x06, 0x30, 0x06, 0x36, +- 0x06, 0x3E, 0x06, 0x44, 0x06, 0x4A, 0x06, 0x50, 0x06, 0x56, 0x06, 0x5C, 0x06, 0x62, 0x06, 0x68, +- 0x06, 0x70, 0x06, 0x76, 0x06, 0x7C, 0x06, 0x82, 0x06, 0x88, 0x06, 0x8E, 0x06, 0x94, 0x06, 0x9A, +- 0x06, 0xA0, 0x06, 0xA6, 0x06, 0xAC, 0x06, 0xB2, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x41, 0x00, 0x02, +- 0x03, 0x91, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x41, 0x00, 0x02, 0x03, 0x97, 0x03, 0x41, +- 0x00, 0x02, 0x03, 0x99, 0x03, 0x41, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x41, 0x00, 0x02, 0x03, 0xA5, +- 0x03, 0x41, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x01, 0x00, 0x02, +- 0x03, 0xB1, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x41, +- 0x00, 0x02, 0x03, 0xB9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xBE, +- 0x03, 0x08, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x41, 0x00, 0x02, +- 0x03, 0xC9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x43, +- 0x00, 0x02, 0x1F, 0x00, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x00, +- 0x03, 0x41, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x42, +- 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, 0x03, 0x43, 0x00, 0x02, +- 0x1F, 0x08, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x41, +- 0x00, 0x02, 0x1F, 0x09, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, +- 0x03, 0x91, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x10, +- 0x03, 0x40, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x41, 0x00, 0x02, +- 0x1F, 0x11, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x40, +- 0x00, 0x02, 0x1F, 0x19, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x19, +- 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x40, 0x00, 0x02, +- 0x1F, 0x21, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x41, +- 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x42, +- 0x00, 0x02, 0x03, 0x97, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x29, +- 0x03, 0x40, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x41, 0x00, 0x03, +- 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, +- 0x03, 0xB9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x40, +- 0x00, 0x02, 0x1F, 0x31, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x31, +- 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, +- 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x40, 0x00, 0x02, +- 0x1F, 0x39, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x41, +- 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x42, +- 0x00, 0x02, 0x03, 0xBF, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x41, +- 0x03, 0x40, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x41, 0x00, 0x02, +- 0x03, 0x9F, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x40, +- 0x00, 0x02, 0x1F, 0x48, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5, +- 0x03, 0x43, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x40, 0x00, 0x02, +- 0x1F, 0x50, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, +- 0x03, 0x42, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x40, +- 0x00, 0x02, 0x1F, 0x59, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, +- 0x03, 0xC9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x40, +- 0x00, 0x02, 0x1F, 0x60, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, +- 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA9, +- 0x03, 0x43, 0x00, 0x02, 0x21, 0x26, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x40, 0x00, 0x02, +- 0x1F, 0x69, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x41, +- 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x42, +- 0x00, 0x02, 0x03, 0xB1, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB5, +- 0x03, 0x40, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x40, 0x00, 0x02, +- 0x03, 0xB7, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x41, +- 0x00, 0x02, 0x03, 0xBF, 0x03, 0x40, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5, +- 0x03, 0x40, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x40, 0x00, 0x02, +- 0x03, 0xC9, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x14, +- 0x00, 0x02, 0x1F, 0x80, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x80, +- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x42, 0x00, 0x02, +- 0x1F, 0x81, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x14, +- 0x00, 0x02, 0x1F, 0x88, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x88, +- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x42, 0x00, 0x02, +- 0x1F, 0x89, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x14, +- 0x00, 0x02, 0x1F, 0x90, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x90, +- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x42, 0x00, 0x02, +- 0x1F, 0x91, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x14, +- 0x00, 0x02, 0x1F, 0x98, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x98, +- 0x03, 0x01, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x42, 0x00, 0x02, +- 0x1F, 0x99, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x14, +- 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA0, +- 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x42, 0x00, 0x02, +- 0x1F, 0xA1, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x14, +- 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA8, +- 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x42, 0x00, 0x02, +- 0x1F, 0xA9, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x71, 0x03, 0x45, +- 0x00, 0x02, 0x1F, 0xB6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x91, 0x03, 0x40, 0x00, 0x02, 0x03, 0x91, +- 0x03, 0x41, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x75, 0x03, 0x45, 0x00, 0x02, +- 0x1F, 0xC6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x95, 0x03, 0x40, 0x00, 0x02, 0x03, 0x95, 0x03, 0x41, +- 0x00, 0x02, 0x03, 0x97, 0x03, 0x40, 0x00, 0x02, 0x03, 0x97, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBF, +- 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x06, 0x00, 0x02, +- 0x1F, 0xBE, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x40, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x01, +- 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x42, 0x00, 0x02, +- 0x03, 0x99, 0x03, 0x40, 0x00, 0x02, 0x03, 0x99, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x40, +- 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x40, 0x00, 0x02, 0x03, 0xCB, +- 0x03, 0x01, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x43, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x42, +- 0x00, 0x02, 0x03, 0xA5, 0x03, 0x40, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xA8, +- 0x03, 0x40, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x00, 0x00, 0x02, +- 0x1F, 0x7D, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x40, +- 0x00, 0x02, 0x03, 0x9F, 0x03, 0x41, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x40, 0x00, 0x02, 0x03, 0xA9, +- 0x03, 0x41, 0x00, 0x02, 0x21, 0x26, 0x03, 0x45, 0x00, 0x01, 0x00, 0xD1, 0x03, 0x85, 0x03, 0x86, +- 0x03, 0x88, 0x03, 0x89, 0x03, 0x8A, 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAC, +- 0x03, 0xAD, 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, +- 0x03, 0xD3, 0x1F, 0x00, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x07, +- 0x1F, 0x08, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, +- 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x18, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, +- 0x1F, 0x1D, 0x1F, 0x20, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, +- 0x1F, 0x28, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, +- 0x1F, 0x31, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, +- 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x42, +- 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x48, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, +- 0x1F, 0x50, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x5B, +- 0x1F, 0x5D, 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, +- 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, +- 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x71, 0x1F, 0x72, 0x1F, 0x73, 0x1F, 0x74, 0x1F, 0x75, 0x1F, 0x76, +- 0x1F, 0x77, 0x1F, 0x78, 0x1F, 0x79, 0x1F, 0x7A, 0x1F, 0x7B, 0x1F, 0x7C, 0x1F, 0x7D, 0x1F, 0x80, ++ 0x00, 0x02, 0x03, 0xA5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA1, 0x03, 0x14, 0x00, 0x02, 0x00, 0xA8, ++ 0x03, 0x00, 0x00, 0x02, 0x1F, 0x7C, 0x03, 0x45, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x45, 0x00, 0x02, ++ 0x03, 0xCE, 0x03, 0x45, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x42, ++ 0x00, 0x02, 0x03, 0x9F, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA9, ++ 0x03, 0x45, 0x00, 0x01, 0x00, 0xE8, 0x03, 0x85, 0x03, 0x86, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8A, ++ 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAA, 0x03, 0xAB, 0x03, 0xAC, 0x03, 0xAD, ++ 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, 0x03, 0xCB, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, ++ 0x03, 0xD3, 0x03, 0xD4, 0x1F, 0x00, 0x1F, 0x01, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, ++ 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, 0x1F, 0x09, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, ++ 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x11, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, ++ 0x1F, 0x18, 0x1F, 0x19, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x20, 0x1F, 0x21, ++ 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, 0x1F, 0x29, ++ 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, ++ 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, 0x1F, 0x39, ++ 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x41, ++ 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x48, 0x1F, 0x49, 0x1F, 0x4A, 0x1F, 0x4B, ++ 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x50, 0x1F, 0x51, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, ++ 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x59, 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x61, ++ 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, ++ 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x72, ++ 0x1F, 0x74, 0x1F, 0x76, 0x1F, 0x78, 0x1F, 0x7A, 0x1F, 0x7C, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, ++ 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, ++ 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, ++ 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, ++ 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, ++ 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, ++ 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB0, 0x1F, 0xB1, 0x1F, 0xB2, ++ 0x1F, 0xB3, 0x1F, 0xB4, 0x1F, 0xB6, 0x1F, 0xB7, 0x1F, 0xB8, 0x1F, 0xB9, 0x1F, 0xBA, 0x1F, 0xBC, ++ 0x1F, 0xC1, 0x1F, 0xC2, 0x1F, 0xC3, 0x1F, 0xC4, 0x1F, 0xC6, 0x1F, 0xC7, 0x1F, 0xC8, 0x1F, 0xCA, ++ 0x1F, 0xCC, 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xCF, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, 0x1F, 0xD6, ++ 0x1F, 0xD7, 0x1F, 0xD8, 0x1F, 0xD9, 0x1F, 0xDA, 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xDF, 0x1F, 0xE0, ++ 0x1F, 0xE1, 0x1F, 0xE2, 0x1F, 0xE4, 0x1F, 0xE5, 0x1F, 0xE6, 0x1F, 0xE7, 0x1F, 0xE8, 0x1F, 0xE9, ++ 0x1F, 0xEA, 0x1F, 0xEC, 0x1F, 0xED, 0x1F, 0xF2, 0x1F, 0xF3, 0x1F, 0xF4, 0x1F, 0xF6, 0x1F, 0xF7, ++ 0x1F, 0xF8, 0x1F, 0xFA, 0x1F, 0xFC, 0x00, 0x01, 0x06, 0x30, 0x00, 0xC0, 0x01, 0x86, 0x01, 0x8C, ++ 0x01, 0x92, 0x01, 0x98, 0x01, 0x9E, 0x01, 0xA4, 0x01, 0xAA, 0x01, 0xB0, 0x01, 0xB6, 0x01, 0xBC, ++ 0x01, 0xC2, 0x01, 0xC8, 0x01, 0xCE, 0x01, 0xD4, 0x01, 0xDA, 0x01, 0xE0, 0x01, 0xE6, 0x01, 0xEC, ++ 0x01, 0xF2, 0x01, 0xF8, 0x01, 0xFE, 0x02, 0x04, 0x02, 0x0A, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1E, ++ 0x02, 0x26, 0x02, 0x2C, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3E, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, ++ 0x02, 0x5A, 0x02, 0x60, 0x02, 0x66, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, ++ 0x02, 0x8A, 0x02, 0x90, 0x02, 0x96, 0x02, 0x9C, 0x02, 0xA2, 0x02, 0xA8, 0x02, 0xAE, 0x02, 0xB6, ++ 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD6, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, ++ 0x02, 0xF2, 0x02, 0xF8, 0x02, 0xFE, 0x03, 0x04, 0x03, 0x0A, 0x03, 0x10, 0x03, 0x18, 0x03, 0x20, ++ 0x03, 0x26, 0x03, 0x2C, 0x03, 0x32, 0x03, 0x38, 0x03, 0x3E, 0x03, 0x46, 0x03, 0x4E, 0x03, 0x54, ++ 0x03, 0x5A, 0x03, 0x60, 0x03, 0x66, 0x03, 0x6C, 0x03, 0x72, 0x03, 0x78, 0x03, 0x7E, 0x03, 0x84, ++ 0x03, 0x8A, 0x03, 0x90, 0x03, 0x96, 0x03, 0x9C, 0x03, 0xA2, 0x03, 0xA8, 0x03, 0xB0, 0x03, 0xB8, ++ 0x03, 0xBE, 0x03, 0xC4, 0x03, 0xCC, 0x03, 0xD2, 0x03, 0xD8, 0x03, 0xDE, 0x03, 0xE4, 0x03, 0xEA, ++ 0x03, 0xF2, 0x03, 0xFA, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, 0x04, 0x12, 0x04, 0x18, 0x04, 0x1E, ++ 0x04, 0x26, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, 0x04, 0x40, 0x04, 0x46, 0x04, 0x4C, 0x04, 0x52, ++ 0x04, 0x58, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82, ++ 0x04, 0x88, 0x04, 0x8E, 0x04, 0x94, 0x04, 0x9A, 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAC, 0x04, 0xB2, ++ 0x04, 0xB8, 0x04, 0xBE, 0x04, 0xC4, 0x04, 0xCA, 0x04, 0xD0, 0x04, 0xD6, 0x04, 0xDC, 0x04, 0xE2, ++ 0x04, 0xE8, 0x04, 0xEE, 0x04, 0xF4, 0x04, 0xFA, 0x05, 0x00, 0x05, 0x06, 0x05, 0x0C, 0x05, 0x12, ++ 0x05, 0x18, 0x05, 0x1E, 0x05, 0x24, 0x05, 0x2A, 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, ++ 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A, 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, ++ 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A, 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, ++ 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x05, 0xBA, 0x05, 0xC0, 0x05, 0xC6, 0x05, 0xCC, 0x05, 0xD2, ++ 0x05, 0xDA, 0x05, 0xE0, 0x05, 0xE6, 0x05, 0xEC, 0x05, 0xF2, 0x05, 0xF8, 0x06, 0x00, 0x06, 0x06, ++ 0x06, 0x0C, 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x00, 0x02, 0x00, 0xA8, ++ 0x03, 0x41, 0x00, 0x02, 0x03, 0x91, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x41, 0x00, 0x02, ++ 0x03, 0x97, 0x03, 0x41, 0x00, 0x02, 0x03, 0x99, 0x03, 0x41, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x41, ++ 0x00, 0x02, 0x03, 0xA5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCA, ++ 0x03, 0x01, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x41, 0x00, 0x02, ++ 0x03, 0xB7, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x01, ++ 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x08, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5, ++ 0x03, 0x41, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x41, 0x00, 0x02, ++ 0x03, 0xB1, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x40, ++ 0x00, 0x02, 0x1F, 0x00, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, ++ 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, ++ 0x03, 0x43, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x40, 0x00, 0x02, ++ 0x1F, 0x08, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, ++ 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x43, ++ 0x00, 0x02, 0x1F, 0x10, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x10, ++ 0x03, 0x41, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x43, 0x00, 0x02, ++ 0x1F, 0x18, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x19, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x41, ++ 0x00, 0x02, 0x1F, 0x19, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x20, ++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x41, 0x00, 0x02, ++ 0x1F, 0x21, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, ++ 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x97, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x40, ++ 0x00, 0x02, 0x1F, 0x29, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x29, ++ 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, ++ 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x14, 0x00, 0x02, ++ 0x1F, 0x30, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x41, ++ 0x00, 0x02, 0x1F, 0x31, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, ++ 0x03, 0xB9, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x38, ++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x41, 0x00, 0x02, ++ 0x1F, 0x39, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, ++ 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x40, ++ 0x00, 0x02, 0x1F, 0x41, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x41, ++ 0x03, 0x41, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x40, 0x00, 0x02, ++ 0x1F, 0x49, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x41, ++ 0x00, 0x02, 0x03, 0xC5, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x51, ++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x41, 0x00, 0x03, ++ 0x03, 0xC5, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0x59, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, ++ 0x03, 0x42, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x40, 0x00, 0x02, ++ 0x1F, 0x61, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x41, ++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x42, ++ 0x00, 0x02, 0x03, 0xA9, 0x03, 0x43, 0x00, 0x02, 0x21, 0x26, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x68, ++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x41, 0x00, 0x02, ++ 0x1F, 0x69, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, ++ 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x40, ++ 0x00, 0x02, 0x03, 0xB7, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x40, 0x00, 0x02, 0x03, 0xBF, ++ 0x03, 0x40, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x40, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x40, 0x00, 0x02, ++ 0x1F, 0xB3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x00, ++ 0x00, 0x02, 0x1F, 0x81, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x81, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0xBC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x00, ++ 0x00, 0x02, 0x1F, 0x89, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x89, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0xC3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x00, ++ 0x00, 0x02, 0x1F, 0x91, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x91, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0xCC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x00, ++ 0x00, 0x02, 0x1F, 0x99, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x99, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0xF3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x00, ++ 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA1, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0xFC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x00, ++ 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA9, ++ 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x42, 0x00, 0x02, ++ 0x1F, 0xB3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x71, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB6, 0x03, 0x45, ++ 0x00, 0x02, 0x03, 0x91, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x75, ++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x95, 0x03, 0x40, 0x00, 0x02, ++ 0x03, 0x97, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x41, ++ 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x06, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, ++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x42, ++ 0x00, 0x02, 0x03, 0x99, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xFE, ++ 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x40, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x43, 0x00, 0x03, ++ 0x03, 0xC5, 0x03, 0x08, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x40, 0x00, 0x02, 0x00, 0xA8, ++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x7D, 0x03, 0x45, 0x00, 0x02, ++ 0x1F, 0xF6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x40, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x40, ++ 0x00, 0x02, 0x21, 0x26, 0x03, 0x45, 0x00, 0x01, 0x00, 0xC0, 0x03, 0x85, 0x03, 0x86, 0x03, 0x88, ++ 0x03, 0x89, 0x03, 0x8A, 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAC, 0x03, 0xAD, ++ 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, 0x03, 0xD3, ++ 0x1F, 0x00, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, ++ 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x12, ++ 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x18, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, ++ 0x1F, 0x20, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, ++ 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, ++ 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, 0x1F, 0x3A, ++ 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x42, 0x1F, 0x43, ++ 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x48, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x50, ++ 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x5B, 0x1F, 0x5D, ++ 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x67, ++ 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, ++ 0x1F, 0x70, 0x1F, 0x72, 0x1F, 0x74, 0x1F, 0x76, 0x1F, 0x78, 0x1F, 0x7A, 0x1F, 0x7C, 0x1F, 0x80, + 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, + 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, + 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, + 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, + 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, + 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, +- 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xBA, 0x1F, 0xBB, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xC8, +- 0x1F, 0xC9, 0x1F, 0xCA, 0x1F, 0xCB, 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, +- 0x1F, 0xD3, 0x1F, 0xD6, 0x1F, 0xD7, 0x1F, 0xDA, 0x1F, 0xDB, 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xE2, +- 0x1F, 0xE3, 0x1F, 0xE4, 0x1F, 0xE7, 0x1F, 0xEA, 0x1F, 0xEB, 0x1F, 0xED, 0x1F, 0xEE, 0x1F, 0xF2, +- 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xF8, 0x1F, 0xF9, 0x1F, 0xFA, 0x1F, 0xFB, 0x1F, 0xFC, 0x00, 0x01, +- 0x05, 0x00, 0x00, 0x89, 0x01, 0x18, 0x01, 0x1E, 0x01, 0x24, 0x01, 0x2A, 0x01, 0x30, 0x01, 0x38, +- 0x01, 0x40, 0x01, 0x48, 0x01, 0x50, 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, +- 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB0, 0x01, 0xB8, +- 0x01, 0xC0, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD8, 0x01, 0xE0, 0x01, 0xE8, 0x01, 0xF0, 0x01, 0xF8, +- 0x02, 0x00, 0x02, 0x08, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, 0x02, 0x2E, 0x02, 0x36, +- 0x02, 0x3E, 0x02, 0x46, 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, +- 0x02, 0x7E, 0x02, 0x86, 0x02, 0x8E, 0x02, 0x96, 0x02, 0x9E, 0x02, 0xA6, 0x02, 0xAE, 0x02, 0xB6, +- 0x02, 0xBE, 0x02, 0xC6, 0x02, 0xCE, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, +- 0x02, 0xFE, 0x03, 0x06, 0x03, 0x0E, 0x03, 0x14, 0x03, 0x1C, 0x03, 0x24, 0x03, 0x2C, 0x03, 0x34, +- 0x03, 0x3C, 0x03, 0x44, 0x03, 0x4A, 0x03, 0x50, 0x03, 0x56, 0x03, 0x5E, 0x03, 0x64, 0x03, 0x6A, +- 0x03, 0x70, 0x03, 0x76, 0x03, 0x7E, 0x03, 0x86, 0x03, 0x8C, 0x03, 0x94, 0x03, 0x9A, 0x03, 0xA0, +- 0x03, 0xA6, 0x03, 0xAC, 0x03, 0xB4, 0x03, 0xBC, 0x03, 0xC2, 0x03, 0xCA, 0x03, 0xD0, 0x03, 0xD6, +- 0x03, 0xDC, 0x03, 0xE2, 0x03, 0xEA, 0x03, 0xF2, 0x03, 0xF8, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, +- 0x04, 0x12, 0x04, 0x18, 0x04, 0x20, 0x04, 0x28, 0x04, 0x2E, 0x04, 0x36, 0x04, 0x3C, 0x04, 0x42, +- 0x04, 0x48, 0x04, 0x4E, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6C, 0x04, 0x72, 0x04, 0x78, +- 0x04, 0x7E, 0x04, 0x84, 0x04, 0x8C, 0x04, 0x94, 0x04, 0x9A, 0x04, 0xA0, 0x04, 0xA8, 0x04, 0xAE, +- 0x04, 0xB4, 0x04, 0xBC, 0x04, 0xC4, 0x04, 0xCA, 0x04, 0xD2, 0x04, 0xDA, 0x04, 0xE0, 0x04, 0xE6, +- 0x04, 0xEC, 0x04, 0xF4, 0x04, 0xFA, 0x00, 0x02, 0x21, 0x26, 0x03, 0x01, 0x00, 0x02, 0x03, 0xCA, +- 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x01, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x41, 0x00, 0x03, +- 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, +- 0x03, 0xB1, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, +- 0x03, 0xB1, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, +- 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, +- 0x03, 0x91, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, +- 0x03, 0xB5, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, +- 0x03, 0xB5, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, +- 0x03, 0x95, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, +- 0x03, 0x95, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, +- 0x03, 0xB7, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, +- 0x03, 0xB7, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, +- 0x03, 0xB7, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, +- 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, +- 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x42, 0x00, 0x02, +- 0x1F, 0xBE, 0x03, 0x13, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, +- 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, +- 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBE, +- 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, +- 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x99, +- 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xBF, +- 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, +- 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, +- 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, +- 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, +- 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, +- 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, +- 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA5, +- 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, +- 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, +- 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x02, 0x21, 0x26, +- 0x03, 0x13, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, +- 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, +- 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x01, 0x00, 0x02, +- 0x1F, 0xB3, 0x03, 0x43, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x80, +- 0x03, 0x40, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x41, 0x00, 0x02, +- 0x1F, 0x81, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, +- 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, +- 0x03, 0x45, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x40, 0x00, 0x02, +- 0x1F, 0x88, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x42, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x43, +- 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x40, 0x00, 0x02, +- 0x1F, 0x91, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x41, +- 0x00, 0x03, 0x1F, 0x20, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x42, 0x03, 0x45, +- 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, +- 0x1F, 0x98, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x41, +- 0x00, 0x02, 0x1F, 0x99, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, +- 0x1F, 0x29, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x43, 0x00, 0x03, 0x03, 0xC9, +- 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x40, +- 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x60, +- 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xFC, +- 0x03, 0x43, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x40, +- 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA9, +- 0x03, 0x41, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x42, +- 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x01, 0x00, 0x03, +- 0x03, 0xB1, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xC3, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, +- 0x03, 0x00, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x42, +- 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x00, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x41, 0x00, 0x02, +- 0x1F, 0xF3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x42, +- 0x03, 0x45, 0x00, 0x02, 0x21, 0x26, 0x03, 0x00, 0x00, 0x02, 0x21, 0x26, 0x03, 0x01, 0x00, 0x01, +- 0x00, 0x89, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAF, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, +- 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x12, +- 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x22, +- 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, +- 0x1F, 0x2E, 0x1F, 0x30, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, +- 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, +- 0x1F, 0x45, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, +- 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, +- 0x1F, 0x66, 0x1F, 0x68, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, +- 0x1F, 0x76, 0x1F, 0x77, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, +- 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, +- 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, +- 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, +- 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, +- 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, +- 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, +- 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xD7, 0x1F, 0xE2, 0x1F, 0xE3, 0x1F, 0xF2, 0x1F, 0xF4, 0x1F, 0xF7, +- 0x1F, 0xFA, 0x1F, 0xFB, 0x00, 0x01, 0x04, 0xE2, 0x00, 0x7F, 0x01, 0x04, 0x01, 0x0A, 0x01, 0x10, +- 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3E, 0x01, 0x46, 0x01, 0x4E, +- 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x86, 0x01, 0x8E, +- 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBE, 0x01, 0xC6, 0x01, 0xCE, +- 0x01, 0xD6, 0x01, 0xDE, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, +- 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, +- 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x74, 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, +- 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBC, 0x02, 0xC2, 0x02, 0xCA, +- 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, 0x02, 0xEA, 0x02, 0xF0, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06, +- 0x03, 0x0E, 0x03, 0x16, 0x03, 0x1E, 0x03, 0x26, 0x03, 0x2E, 0x03, 0x36, 0x03, 0x3E, 0x03, 0x46, +- 0x03, 0x4E, 0x03, 0x56, 0x03, 0x5E, 0x03, 0x66, 0x03, 0x6E, 0x03, 0x76, 0x03, 0x7E, 0x03, 0x86, +- 0x03, 0x8E, 0x03, 0x96, 0x03, 0x9E, 0x03, 0xA6, 0x03, 0xAE, 0x03, 0xB6, 0x03, 0xBE, 0x03, 0xC6, +- 0x03, 0xCE, 0x03, 0xD6, 0x03, 0xDE, 0x03, 0xE6, 0x03, 0xEE, 0x03, 0xF6, 0x03, 0xFE, 0x04, 0x06, +- 0x04, 0x0E, 0x04, 0x16, 0x04, 0x1E, 0x04, 0x26, 0x04, 0x2E, 0x04, 0x36, 0x04, 0x3E, 0x04, 0x46, +- 0x04, 0x4E, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x66, 0x04, 0x6E, 0x04, 0x76, 0x04, 0x7E, 0x04, 0x84, +- 0x04, 0x8C, 0x04, 0x94, 0x04, 0x9A, 0x04, 0xA2, 0x04, 0xAA, 0x04, 0xB0, 0x04, 0xB8, 0x04, 0xC0, +- 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD6, 0x04, 0xDC, 0x00, 0x02, 0x21, 0x26, 0x03, 0x41, 0x00, 0x02, +- 0x1F, 0xBE, 0x03, 0x44, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, +- 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, +- 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, +- 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, +- 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, +- 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, +- 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, +- 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, +- 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, +- 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, +- 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, +- 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, +- 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x43, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x40, +- 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x41, +- 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x42, +- 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x40, +- 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x41, +- 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x40, +- 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x41, +- 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x40, +- 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x41, +- 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x40, +- 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x41, +- 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x41, +- 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x40, +- 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x41, +- 0x00, 0x02, 0x21, 0x26, 0x03, 0x43, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, +- 0x03, 0xA9, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, +- 0x03, 0xA9, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x42, 0x00, 0x02, +- 0x1F, 0xBE, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, +- 0x03, 0x45, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x00, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, +- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, +- 0x03, 0x45, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x00, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, +- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, +- 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x00, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, +- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, +- 0x03, 0x45, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x00, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, +- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, +- 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x00, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45, +- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, +- 0x03, 0x45, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x00, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, +- 0x03, 0x42, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x00, +- 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x42, +- 0x00, 0x03, 0x03, 0xB7, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x41, 0x00, 0x03, +- 0x03, 0xB7, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x40, 0x00, 0x02, +- 0x1F, 0xBE, 0x03, 0x44, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, +- 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, +- 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x42, 0x00, 0x02, 0x21, 0x26, 0x03, 0x40, +- 0x00, 0x02, 0x21, 0x26, 0x03, 0x41, 0x00, 0x01, 0x00, 0x7F, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAF, +- 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, +- 0x1F, 0x0D, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, +- 0x1F, 0x1D, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, +- 0x1F, 0x2D, 0x1F, 0x30, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x3A, +- 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x4A, +- 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x5B, +- 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x68, 0x1F, 0x6A, 0x1F, 0x6B, +- 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x76, 0x1F, 0x77, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, ++ 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xBA, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xC8, 0x1F, 0xCA, ++ 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, 0x1F, 0xD6, 0x1F, 0xD7, 0x1F, 0xDA, ++ 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xE2, 0x1F, 0xE4, 0x1F, 0xE7, 0x1F, 0xEA, 0x1F, 0xED, 0x1F, 0xF2, ++ 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xF8, 0x1F, 0xFA, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0xE0, 0x00, 0x85, ++ 0x01, 0x10, 0x01, 0x16, 0x01, 0x1C, 0x01, 0x22, 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x40, ++ 0x01, 0x48, 0x01, 0x50, 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, ++ 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB0, 0x01, 0xB8, 0x01, 0xC0, ++ 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD8, 0x01, 0xE0, 0x01, 0xE8, 0x01, 0xF0, 0x01, 0xF8, 0x02, 0x00, ++ 0x02, 0x08, 0x02, 0x0E, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, 0x02, 0x2E, 0x02, 0x36, 0x02, 0x3E, ++ 0x02, 0x46, 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E, ++ 0x02, 0x86, 0x02, 0x8E, 0x02, 0x96, 0x02, 0x9E, 0x02, 0xA6, 0x02, 0xAE, 0x02, 0xB6, 0x02, 0xBE, ++ 0x02, 0xC6, 0x02, 0xCE, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, ++ 0x03, 0x06, 0x03, 0x0C, 0x03, 0x14, 0x03, 0x1C, 0x03, 0x24, 0x03, 0x2C, 0x03, 0x34, 0x03, 0x3C, ++ 0x03, 0x42, 0x03, 0x48, 0x03, 0x50, 0x03, 0x56, 0x03, 0x5C, 0x03, 0x62, 0x03, 0x68, 0x03, 0x70, ++ 0x03, 0x78, 0x03, 0x7E, 0x03, 0x86, 0x03, 0x8C, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA6, ++ 0x03, 0xAE, 0x03, 0xB4, 0x03, 0xBC, 0x03, 0xC2, 0x03, 0xC8, 0x03, 0xCE, 0x03, 0xD4, 0x03, 0xDC, ++ 0x03, 0xE4, 0x03, 0xEA, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x04, 0x04, 0x0A, 0x04, 0x12, ++ 0x04, 0x1A, 0x04, 0x20, 0x04, 0x28, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, 0x04, 0x40, 0x04, 0x48, ++ 0x04, 0x50, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7E, ++ 0x04, 0x86, 0x04, 0x8C, 0x04, 0x92, 0x04, 0x9A, 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAE, 0x04, 0xB6, ++ 0x04, 0xBE, 0x04, 0xC6, 0x04, 0xCC, 0x04, 0xD2, 0x04, 0xDA, 0x00, 0x02, 0x21, 0x26, 0x03, 0x01, ++ 0x00, 0x02, 0x03, 0xCA, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x01, 0x00, 0x02, 0x03, 0xCB, ++ 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, ++ 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, ++ 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, ++ 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, ++ 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, ++ 0x03, 0x42, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, ++ 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, ++ 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, ++ 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, ++ 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, ++ 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, ++ 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, ++ 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, ++ 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, ++ 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x13, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x42, ++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x42, ++ 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, ++ 0x00, 0x02, 0x21, 0x26, 0x03, 0x13, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, ++ 0x03, 0xA9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, ++ 0x03, 0xA9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, ++ 0x21, 0x26, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xB3, ++ 0x03, 0x43, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x40, ++ 0x00, 0x02, 0x1F, 0x81, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x81, ++ 0x03, 0x41, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x42, ++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, ++ 0x00, 0x02, 0x1F, 0x88, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x88, ++ 0x03, 0x41, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x42, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x09, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x43, 0x00, 0x03, ++ 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x91, ++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x41, 0x00, 0x03, ++ 0x1F, 0x20, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, ++ 0x1F, 0xCC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x98, ++ 0x03, 0x40, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x41, 0x00, 0x02, ++ 0x1F, 0x99, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, ++ 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x43, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, ++ 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x40, 0x00, 0x02, ++ 0x1F, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x42, ++ 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x43, ++ 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x40, 0x00, 0x02, ++ 0x1F, 0xA9, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x41, ++ 0x00, 0x03, 0x1F, 0x68, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x42, 0x03, 0x45, ++ 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, ++ 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0xB7, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x00, ++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x00, ++ 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, ++ 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x21, 0x26, 0x03, 0x00, 0x00, 0x01, 0x00, 0x85, 0x03, 0x8F, ++ 0x03, 0x90, 0x03, 0xAF, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, ++ 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, ++ 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, ++ 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x30, ++ 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x3A, 0x1F, 0x3B, ++ 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x4A, ++ 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, ++ 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x68, ++ 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, 0x76, 0x1F, 0x80, ++ 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, ++ 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, ++ 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, ++ 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, ++ 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, ++ 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, ++ 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xD2, 0x1F, 0xD7, 0x1F, 0xE2, ++ 0x1F, 0xF2, 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xFA, 0x00, 0x01, 0x04, 0xC0, 0x00, 0x7B, 0x00, 0xFC, ++ 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, ++ 0x01, 0x3E, 0x01, 0x46, 0x01, 0x4E, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, ++ 0x01, 0x7E, 0x01, 0x86, 0x01, 0x8E, 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, ++ 0x01, 0xBE, 0x01, 0xC6, 0x01, 0xCE, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, ++ 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, ++ 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x74, ++ 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, ++ 0x02, 0xBA, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, 0x02, 0xE8, 0x02, 0xF0, ++ 0x02, 0xF8, 0x03, 0x00, 0x03, 0x08, 0x03, 0x10, 0x03, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x30, ++ 0x03, 0x38, 0x03, 0x40, 0x03, 0x48, 0x03, 0x50, 0x03, 0x58, 0x03, 0x60, 0x03, 0x68, 0x03, 0x70, ++ 0x03, 0x78, 0x03, 0x80, 0x03, 0x88, 0x03, 0x90, 0x03, 0x98, 0x03, 0xA0, 0x03, 0xA8, 0x03, 0xB0, ++ 0x03, 0xB8, 0x03, 0xC0, 0x03, 0xC8, 0x03, 0xD0, 0x03, 0xD8, 0x03, 0xE0, 0x03, 0xE8, 0x03, 0xF0, ++ 0x03, 0xF8, 0x04, 0x00, 0x04, 0x08, 0x04, 0x10, 0x04, 0x18, 0x04, 0x20, 0x04, 0x28, 0x04, 0x30, ++ 0x04, 0x38, 0x04, 0x40, 0x04, 0x48, 0x04, 0x50, 0x04, 0x58, 0x04, 0x60, 0x04, 0x68, 0x04, 0x70, ++ 0x04, 0x76, 0x04, 0x7E, 0x04, 0x86, 0x04, 0x8C, 0x04, 0x94, 0x04, 0x9C, 0x04, 0xA4, 0x04, 0xAC, ++ 0x04, 0xB2, 0x04, 0xBA, 0x00, 0x02, 0x21, 0x26, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x44, ++ 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, ++ 0x03, 0xB1, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, ++ 0x03, 0xB1, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, ++ 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, ++ 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, ++ 0x03, 0xB5, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, ++ 0x03, 0xB5, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, ++ 0x03, 0x95, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, ++ 0x03, 0x95, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, ++ 0x03, 0xB7, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, ++ 0x03, 0xB7, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, ++ 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, ++ 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x41, 0x00, 0x02, ++ 0x1F, 0xBE, 0x03, 0x43, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, ++ 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, ++ 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, ++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, ++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, ++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, ++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, ++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, ++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, ++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, ++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA5, ++ 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, ++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, ++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x41, 0x00, 0x02, 0x21, 0x26, ++ 0x03, 0x43, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, ++ 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, ++ 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x40, ++ 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, ++ 0x00, 0x03, 0x1F, 0x00, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x00, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x00, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x01, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x42, ++ 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, ++ 0x00, 0x03, 0x1F, 0x08, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x00, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x08, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x01, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x42, ++ 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, ++ 0x00, 0x03, 0x1F, 0x20, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x00, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x20, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x01, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x42, ++ 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, ++ 0x00, 0x03, 0x1F, 0x28, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x00, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x28, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x01, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x42, ++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, ++ 0x00, 0x03, 0x1F, 0x60, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x00, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x60, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x01, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x42, ++ 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, ++ 0x00, 0x03, 0x1F, 0x68, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x00, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x68, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x01, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x42, ++ 0x00, 0x03, 0x03, 0xB1, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x41, 0x00, 0x03, ++ 0x03, 0xB1, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, ++ 0x1F, 0xC3, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, ++ 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, ++ 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, ++ 0x03, 0x42, 0x00, 0x02, 0x21, 0x26, 0x03, 0x40, 0x00, 0x01, 0x00, 0x7B, 0x03, 0x8F, 0x03, 0x90, ++ 0x03, 0xAF, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x0A, 0x1F, 0x0B, ++ 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, ++ 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x2A, 0x1F, 0x2B, ++ 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x30, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, ++ 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, ++ 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, ++ 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x68, 0x1F, 0x6A, ++ 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x76, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, + 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, + 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, + 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, + 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, + 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, + 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xB7, +- 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xE2, 0x1F, 0xE3, 0x1F, 0xF2, +- 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xFA, 0x1F, 0xFB, 0x00, 0x01, 0x03, 0x62, 0x00, 0x56, 0x00, 0xB2, +- 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF2, +- 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, +- 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x52, 0x01, 0x5A, 0x01, 0x62, 0x01, 0x6A, 0x01, 0x72, +- 0x01, 0x7A, 0x01, 0x82, 0x01, 0x8A, 0x01, 0x92, 0x01, 0x9A, 0x01, 0xA2, 0x01, 0xAA, 0x01, 0xB2, +- 0x01, 0xBA, 0x01, 0xC2, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xDA, 0x01, 0xE2, 0x01, 0xEA, 0x01, 0xF2, +- 0x01, 0xFA, 0x02, 0x02, 0x02, 0x0A, 0x02, 0x12, 0x02, 0x1A, 0x02, 0x22, 0x02, 0x2A, 0x02, 0x32, +- 0x02, 0x3A, 0x02, 0x42, 0x02, 0x4A, 0x02, 0x52, 0x02, 0x5A, 0x02, 0x62, 0x02, 0x6A, 0x02, 0x72, +- 0x02, 0x7A, 0x02, 0x82, 0x02, 0x8A, 0x02, 0x92, 0x02, 0x9A, 0x02, 0xA2, 0x02, 0xAA, 0x02, 0xB2, +- 0x02, 0xBA, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, 0x02, 0xEA, 0x02, 0xF2, +- 0x02, 0xFA, 0x03, 0x02, 0x03, 0x0A, 0x03, 0x12, 0x03, 0x1A, 0x03, 0x22, 0x03, 0x2A, 0x03, 0x32, +- 0x03, 0x3A, 0x03, 0x42, 0x03, 0x4A, 0x03, 0x52, 0x03, 0x5A, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, +- 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, +- 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, +- 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, +- 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, +- 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, +- 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, +- 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, +- 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, +- 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, +- 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, +- 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x40, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x41, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, +- 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x40, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x41, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, +- 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x40, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x41, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, +- 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x40, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x41, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, +- 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x40, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x41, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, +- 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x40, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x41, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, +- 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x40, +- 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x01, 0x03, 0x45, 0x00, 0x01, 0x00, 0x56, 0x03, 0x90, +- 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, 0x1F, 0x12, 0x1F, 0x14, 0x1F, 0x1A, +- 0x1F, 0x1C, 0x1F, 0x22, 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, +- 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x3A, 0x1F, 0x3C, 0x1F, 0x42, 0x1F, 0x44, 0x1F, 0x4A, 0x1F, 0x4C, +- 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, 0x1F, 0x64, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, +- 0x1F, 0x6E, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, +- 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, +- 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, +- 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, +- 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, +- 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, +- 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xE3, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x03, 0x46, 0x00, 0x52, +- 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, +- 0x00, 0xEA, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, +- 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x52, 0x01, 0x5A, 0x01, 0x62, +- 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7A, 0x01, 0x82, 0x01, 0x8A, 0x01, 0x92, 0x01, 0x9A, 0x01, 0xA2, +- 0x01, 0xAA, 0x01, 0xB2, 0x01, 0xBA, 0x01, 0xC2, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xDC, 0x01, 0xE4, +- 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, +- 0x02, 0x2E, 0x02, 0x36, 0x02, 0x3E, 0x02, 0x46, 0x02, 0x50, 0x02, 0x58, 0x02, 0x60, 0x02, 0x68, +- 0x02, 0x70, 0x02, 0x78, 0x02, 0x80, 0x02, 0x8A, 0x02, 0x92, 0x02, 0x9A, 0x02, 0xA2, 0x02, 0xAA, +- 0x02, 0xB2, 0x02, 0xBA, 0x02, 0xC4, 0x02, 0xCC, 0x02, 0xD4, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, +- 0x02, 0xF4, 0x02, 0xFC, 0x03, 0x06, 0x03, 0x0E, 0x03, 0x16, 0x03, 0x1E, 0x03, 0x26, 0x03, 0x2E, +- 0x03, 0x36, 0x03, 0x3E, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, ++ 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xD2, 0x1F, 0xE2, 0x1F, 0xF2, 0x1F, 0xF4, 0x1F, 0xF7, ++ 0x1F, 0xFA, 0x00, 0x01, 0x03, 0x4E, 0x00, 0x54, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, ++ 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, ++ 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3E, 0x01, 0x46, ++ 0x01, 0x4E, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x86, ++ 0x01, 0x8E, 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBE, 0x01, 0xC6, ++ 0x01, 0xCE, 0x01, 0xD6, 0x01, 0xDE, 0x01, 0xE6, 0x01, 0xEE, 0x01, 0xF6, 0x01, 0xFE, 0x02, 0x06, ++ 0x02, 0x0E, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, 0x02, 0x2E, 0x02, 0x36, 0x02, 0x3E, 0x02, 0x46, ++ 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E, 0x02, 0x86, ++ 0x02, 0x8E, 0x02, 0x96, 0x02, 0x9E, 0x02, 0xA6, 0x02, 0xAE, 0x02, 0xB6, 0x02, 0xBE, 0x02, 0xC6, ++ 0x02, 0xCE, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06, ++ 0x03, 0x0E, 0x03, 0x16, 0x03, 0x1E, 0x03, 0x26, 0x03, 0x2E, 0x03, 0x36, 0x03, 0x3E, 0x03, 0x46, ++ 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x41, ++ 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, ++ 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x01, ++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, ++ 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, ++ 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x42, ++ 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x40, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x01, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x41, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x01, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x42, ++ 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x08, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x40, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x08, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x41, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x42, ++ 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x40, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x21, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x41, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x21, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x42, ++ 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x28, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x40, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x28, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x41, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x42, ++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x40, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x61, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x41, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x61, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x42, ++ 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, ++ 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x40, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x69, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x41, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0x69, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x42, ++ 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x40, 0x03, 0x45, ++ 0x00, 0x03, 0x03, 0xB1, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x40, 0x03, 0x45, ++ 0x00, 0x03, 0x03, 0xB7, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x01, 0x03, 0x45, ++ 0x00, 0x01, 0x00, 0x54, 0x03, 0x90, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, ++ 0x1F, 0x12, 0x1F, 0x14, 0x1F, 0x1A, 0x1F, 0x1C, 0x1F, 0x22, 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, ++ 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x3A, 0x1F, 0x3C, 0x1F, 0x42, ++ 0x1F, 0x44, 0x1F, 0x4A, 0x1F, 0x4C, 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, 0x1F, 0x64, 0x1F, 0x6A, ++ 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, ++ 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, ++ 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, ++ 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, ++ 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, ++ 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, ++ 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xD2, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x03, 0x3C, ++ 0x00, 0x51, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8, ++ 0x00, 0xE0, 0x00, 0xE8, 0x00, 0xF0, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x08, 0x01, 0x10, 0x01, 0x18, ++ 0x01, 0x20, 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x40, 0x01, 0x48, 0x01, 0x50, 0x01, 0x58, ++ 0x01, 0x60, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, ++ 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB0, 0x01, 0xB8, 0x01, 0xC0, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xDA, ++ 0x01, 0xE2, 0x01, 0xEA, 0x01, 0xF2, 0x01, 0xFA, 0x02, 0x02, 0x02, 0x0A, 0x02, 0x14, 0x02, 0x1C, ++ 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, ++ 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E, 0x02, 0x88, 0x02, 0x90, 0x02, 0x98, 0x02, 0xA0, ++ 0x02, 0xA8, 0x02, 0xB0, 0x02, 0xB8, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, ++ 0x02, 0xEA, 0x02, 0xF2, 0x02, 0xFA, 0x03, 0x04, 0x03, 0x0C, 0x03, 0x14, 0x03, 0x1C, 0x03, 0x24, ++ 0x03, 0x2C, 0x03, 0x34, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, +@@ -1960,1728 +1911,1637 @@ + 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x41, 0x03, 0x45, +- 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x41, +- 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x41, 0x03, 0x45, +- 0x00, 0x01, 0x00, 0x52, 0x03, 0x90, 0x1F, 0x02, 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, 0x1F, 0x12, +- 0x1F, 0x14, 0x1F, 0x1A, 0x1F, 0x1C, 0x1F, 0x22, 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, 0x1F, 0x32, +- 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x3A, 0x1F, 0x3C, 0x1F, 0x42, 0x1F, 0x44, 0x1F, 0x4A, +- 0x1F, 0x4C, 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, 0x1F, 0x64, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, +- 0x1F, 0x6D, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, +- 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, +- 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, +- 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, +- 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, +- 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, +- 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x02, 0x3A, 0x00, 0x36, 0x00, 0x72, +- 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x00, 0xB2, +- 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCC, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF6, +- 0x00, 0xFE, 0x01, 0x08, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, +- 0x01, 0x44, 0x01, 0x4E, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x80, +- 0x01, 0x8A, 0x01, 0x92, 0x01, 0x9A, 0x01, 0xA2, 0x01, 0xAA, 0x01, 0xB2, 0x01, 0xBC, 0x01, 0xC6, +- 0x01, 0xCE, 0x01, 0xD6, 0x01, 0xDE, 0x01, 0xE6, 0x01, 0xEE, 0x01, 0xF8, 0x02, 0x02, 0x02, 0x0A, +- 0x02, 0x12, 0x02, 0x1A, 0x02, 0x22, 0x02, 0x2A, 0x02, 0x32, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, +- 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, +- 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, +- 0x03, 0x40, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, +- 0x03, 0x41, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, +- 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, +- 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, +- 0x1F, 0x09, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, +- 0x1F, 0x09, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, +- 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, +- 0x03, 0x43, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, +- 0x03, 0x40, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, +- 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, +- 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, +- 0x1F, 0x28, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, +- 0x1F, 0x28, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, +- 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, +- 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45, +- 0x03, 0x40, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45, +- 0x03, 0x41, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, +- 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, +- 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, +- 0x1F, 0x69, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, +- 0x1F, 0x69, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, +- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, +- 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, +- 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, +- 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, +- 0x03, 0x01, 0x00, 0x01, 0x00, 0x36, 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C, +- 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, +- 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, +- 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, +- 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, +- 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, +- 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xD3, 0x1F, 0xF2, +- 0x1F, 0xF4, 0x00, 0x01, 0x01, 0xEA, 0x00, 0x2E, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, +- 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBE, +- 0x00, 0xC6, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE8, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, +- 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3E, 0x01, 0x46, +- 0x01, 0x50, 0x01, 0x5A, 0x01, 0x62, 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7A, 0x01, 0x84, 0x01, 0x8E, +- 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xC0, 0x01, 0xCA, 0x01, 0xD2, +- 0x01, 0xDA, 0x01, 0xE2, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, +- 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, +- 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, +- 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, +- 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, +- 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, +- 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x00, +- 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x01, +- 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, +- 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, +- 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xC3, +- 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, +- 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x00, +- 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x01, +- 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, +- 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, +- 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, +- 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, +- 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, +- 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x00, +- 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x01, +- 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, +- 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, +- 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, +- 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x2E, ++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x00, ++ 0x00, 0x03, 0x03, 0xC9, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, 0x00, 0x51, 0x03, 0x90, 0x1F, 0x02, ++ 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, 0x1F, 0x12, 0x1F, 0x14, 0x1F, 0x1A, 0x1F, 0x1C, 0x1F, 0x22, ++ 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x3A, ++ 0x1F, 0x3C, 0x1F, 0x42, 0x1F, 0x44, 0x1F, 0x4A, 0x1F, 0x4C, 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, ++ 0x1F, 0x64, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, ++ 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, ++ 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, ++ 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, ++ 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, ++ 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, ++ 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xD2, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, ++ 0x02, 0x30, 0x00, 0x35, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, ++ 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xCA, 0x00, 0xD4, 0x00, 0xDC, ++ 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, 0x01, 0x10, 0x01, 0x18, 0x01, 0x20, ++ 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x42, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, ++ 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7E, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA8, ++ 0x01, 0xB0, 0x01, 0xBA, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, ++ 0x01, 0xF6, 0x02, 0x00, 0x02, 0x08, 0x02, 0x10, 0x02, 0x18, 0x02, 0x20, 0x02, 0x28, 0x00, 0x03, ++ 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, ++ 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, ++ 0x21, 0x26, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, ++ 0x1F, 0x00, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, ++ 0x1F, 0x00, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, ++ 0x03, 0xB1, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, ++ 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, ++ 0x03, 0x40, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, ++ 0x03, 0x41, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, ++ 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, ++ 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, ++ 0x1F, 0x21, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, ++ 0x1F, 0x21, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, ++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, ++ 0x03, 0x43, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, ++ 0x03, 0x40, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, ++ 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, ++ 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, ++ 0x1F, 0x60, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, ++ 0x1F, 0x60, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, ++ 0x03, 0xC9, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, ++ 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, ++ 0x03, 0x40, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, ++ 0x03, 0x41, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, ++ 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, ++ 0x03, 0xB1, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, ++ 0x03, 0xB7, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, ++ 0x03, 0xC9, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, ++ 0x00, 0x35, 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x80, 0x1F, 0x82, ++ 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, ++ 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, ++ 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, ++ 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, ++ 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, ++ 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x01, 0xE0, ++ 0x00, 0x2D, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, ++ 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, ++ 0x00, 0xDC, 0x00, 0xE6, 0x00, 0xF0, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x08, 0x01, 0x10, 0x01, 0x1A, ++ 0x01, 0x24, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x60, ++ 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x82, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA4, ++ 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBE, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD8, 0x00, 0x03, 0x1F, 0xBE, ++ 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, ++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, ++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, ++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, ++ 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, ++ 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x00, ++ 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x01, ++ 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, ++ 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, ++ 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, ++ 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, ++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, ++ 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x00, ++ 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x01, ++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, ++ 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, ++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xF3, ++ 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, ++ 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x00, ++ 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x01, ++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, ++ 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, ++ 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x2D, + 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, + 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, + 0x1F, 0x8F, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x9A, + 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, + 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, +- 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB4, 0x1F, 0xC4, 0x1F, 0xD3, 0x1F, 0xF4, 0x00, 0x01, 0x01, 0x7C, +- 0x00, 0x24, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, 0x00, 0x66, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x7E, +- 0x00, 0x86, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC2, +- 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x04, +- 0x01, 0x0C, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x40, 0x01, 0x48, +- 0x01, 0x50, 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x72, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, +- 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, +- 0x03, 0x00, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, +- 0x03, 0x40, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, +- 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, +- 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, +- 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBC, +- 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, +- 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, +- 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, +- 0x03, 0xB7, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x40, +- 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x41, +- 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x42, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, +- 0x03, 0x40, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, +- 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x21, 0x26, +- 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, +- 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xFC, +- 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, +- 0x21, 0x26, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, +- 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, ++ 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB4, 0x1F, 0xC4, 0x1F, 0xF4, 0x00, 0x01, 0x01, 0x7C, 0x00, 0x24, ++ 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, 0x00, 0x66, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86, ++ 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC2, 0x00, 0xCA, ++ 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x04, 0x01, 0x0C, ++ 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x40, 0x01, 0x48, 0x01, 0x50, ++ 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x72, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x00, ++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x00, ++ 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x40, ++ 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x41, ++ 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x42, ++ 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, ++ 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, ++ 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, ++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xC3, ++ 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, ++ 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, ++ 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, ++ 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x40, ++ 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x41, ++ 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, ++ 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, ++ 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, ++ 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, ++ 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, ++ 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B, ++ 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, ++ 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, ++ 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, ++ 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x94, 0x00, 0x24, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, 0x00, 0x66, ++ 0x00, 0x6E, 0x00, 0x76, 0x00, 0x80, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAE, ++ 0x00, 0xB6, 0x00, 0xC0, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEE, 0x00, 0xF8, ++ 0x01, 0x00, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x38, 0x01, 0x40, ++ 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x80, 0x01, 0x8A, ++ 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x41, ++ 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x41, ++ 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x00, ++ 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, ++ 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, ++ 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x01, ++ 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, ++ 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, ++ 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, ++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, ++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, ++ 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, ++ 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x00, ++ 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, ++ 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, ++ 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, ++ 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, ++ 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x01, ++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x21, 0x26, ++ 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, ++ 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B, ++ 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, ++ 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, ++ 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, ++ 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6C, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x60, ++ 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA2, 0x00, 0xAA, ++ 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, ++ 0x00, 0xFE, 0x01, 0x06, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, ++ 0x01, 0x46, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x62, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x40, ++ 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, ++ 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, ++ 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, ++ 0x03, 0x91, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x41, ++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, ++ 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, ++ 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, ++ 0x03, 0xB7, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, ++ 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, ++ 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, ++ 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, ++ 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x40, ++ 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, ++ 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, ++ 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, ++ 0x03, 0xA9, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x41, ++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, ++ 0x03, 0x13, 0x03, 0x42, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x01, ++ 0x00, 0x20, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B, ++ 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, ++ 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, ++ 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, ++ 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6E, 0x00, 0x1E, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, ++ 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, ++ 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, ++ 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x01, 0x32, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x50, ++ 0x01, 0x5A, 0x01, 0x64, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, ++ 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x01, ++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, ++ 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, ++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, ++ 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, ++ 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x00, ++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, ++ 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, ++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, ++ 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, ++ 0x03, 0x97, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, ++ 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xC9, ++ 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, ++ 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, ++ 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, ++ 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, ++ 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, ++ 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, ++ 0x00, 0x01, 0x00, 0x1E, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, + 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, + 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, +- 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, +- 0x1F, 0xAE, 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x94, 0x00, 0x24, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, +- 0x00, 0x66, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x80, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA4, +- 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xC0, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEE, +- 0x00, 0xF8, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x38, +- 0x01, 0x40, 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x80, +- 0x01, 0x8A, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, +- 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, +- 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, +- 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, +- 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, +- 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, +- 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, +- 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, +- 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, +- 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, +- 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, +- 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, +- 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, +- 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, +- 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, +- 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x00, +- 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, +- 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, +- 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, +- 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, +- 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, +- 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, +- 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, +- 0x1F, 0xAE, 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6C, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x58, +- 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA2, +- 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, +- 0x00, 0xF4, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x01, 0x2C, 0x01, 0x34, +- 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x62, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, +- 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, +- 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, +- 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x40, +- 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, +- 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, +- 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, +- 0x03, 0xB7, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x41, +- 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, +- 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, +- 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, +- 0x03, 0x97, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, +- 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, +- 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, +- 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, +- 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x40, +- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, +- 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, +- 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, +- 0x00, 0x01, 0x00, 0x20, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, +- 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, +- 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, +- 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, +- 0x1F, 0xAE, 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6E, 0x00, 0x1E, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, +- 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, +- 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, +- 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x01, 0x32, 0x01, 0x3C, 0x01, 0x46, +- 0x01, 0x50, 0x01, 0x5A, 0x01, 0x64, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, +- 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, +- 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, +- 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x00, +- 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, +- 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, +- 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, +- 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, +- 0x03, 0xB7, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, +- 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, +- 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, +- 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, +- 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, +- 0x03, 0xC9, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, +- 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, +- 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, +- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, +- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, +- 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, +- 0x03, 0x42, 0x00, 0x01, 0x00, 0x1E, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, +- 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, +- 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, +- 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, +- 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, +- 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, +- 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, +- 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, +- 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, +- 0x03, 0xB1, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, +- 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, +- 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, +- 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, +- 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, +- 0x03, 0xB7, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, +- 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, +- 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, +- 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, +- 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, +- 0x03, 0xC9, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, +- 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, +- 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, +- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, +- 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, +- 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, +- 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, +- 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, +- 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, +- 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, +- 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, +- 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, +- 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, +- 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, +- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, +- 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, +- 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, +- 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, +- 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, +- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, +- 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, +- 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, +- 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, +- 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, +- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, +- 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, +- 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x19, +- 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, +- 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, +- 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, +- 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, +- 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, +- 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, +- 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, +- 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, +- 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, +- 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, +- 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, +- 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, +- 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, +- 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, +- 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, +- 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, +- 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, +- 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, +- 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, +- 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, +- 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, +- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, +- 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, +- 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, +- 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, +- 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, +- 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, +- 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, +- 0x03, 0xB1, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, +- 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, +- 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, +- 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, +- 0x03, 0xC9, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, +- 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, +- 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, +- 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, +- 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, +- 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, +- 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, +- 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, +- 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, +- 0x03, 0x91, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41, +- 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, +- 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, +- 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, +- 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, +- 0x03, 0xA9, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x40, +- 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, +- 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, +- 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, +- 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, +- 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, +- 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, +- 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, +- 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, +- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, +- 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, +- 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, +- 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, +- 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, +- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, +- 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, +- 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, +- 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, +- 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, +- 0x00, 0xAE, 0x00, 0x0E, 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, +- 0x00, 0x5E, 0x00, 0x68, 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, +- 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, +- 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, +- 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, +- 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, +- 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, +- 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, +- 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, +- 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, +- 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, +- 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, +- 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE, ++ 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, ++ 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, ++ 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, ++ 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, ++ 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x40, ++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, ++ 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, ++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, ++ 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, ++ 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x40, ++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, ++ 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, ++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, ++ 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, ++ 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x40, ++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, ++ 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, ++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, ++ 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, ++ 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x42, ++ 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, ++ 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, ++ 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, ++ 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, ++ 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, ++ 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, ++ 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, ++ 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, ++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, ++ 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, ++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, ++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, ++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, ++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, ++ 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, ++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, ++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, ++ 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, ++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, ++ 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, ++ 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, ++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, ++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, ++ 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, ++ 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, ++ 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, ++ 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, ++ 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, ++ 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, ++ 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, ++ 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, ++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, ++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, ++ 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, ++ 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, ++ 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, ++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, ++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, ++ 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, ++ 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, ++ 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, ++ 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, ++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, ++ 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, ++ 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x42, ++ 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, ++ 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, ++ 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, ++ 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, ++ 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, ++ 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, ++ 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, ++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, ++ 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, ++ 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x00, ++ 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, ++ 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, ++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, ++ 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, ++ 0x21, 0x26, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, ++ 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, ++ 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, ++ 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, ++ 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, ++ 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x40, ++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, ++ 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, ++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, ++ 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, ++ 0x03, 0x97, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x40, ++ 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, ++ 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, ++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, ++ 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x01, ++ 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, ++ 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, ++ 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, ++ 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, ++ 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, ++ 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, ++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, ++ 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, ++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, ++ 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, ++ 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, ++ 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, ++ 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, ++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, ++ 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, ++ 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xAE, + 0x00, 0x0E, 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, + 0x00, 0x68, 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, +- 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, +- 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, +- 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, +- 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, +- 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, +- 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, +- 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, +- 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, +- 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, ++ 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, ++ 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, ++ 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, ++ 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, ++ 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, ++ 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, ++ 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, ++ 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, ++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, + 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, + 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE, 0x00, 0x0E, + 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, 0x00, 0x68, + 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, 0x03, 0xB1, +- 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, +- 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, +- 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, +- 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, +- 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, +- 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, +- 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, +- 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, +- 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, 0x1F, 0x84, ++ 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, ++ 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, ++ 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, ++ 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, ++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, ++ 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, ++ 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, ++ 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, ++ 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, 0x1F, 0x84, + 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, +- 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, 0x00, 0x1E, ++ 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE, 0x00, 0x0E, 0x00, 0x22, ++ 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, 0x00, 0x68, 0x00, 0x72, ++ 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, ++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, ++ 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, ++ 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, ++ 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, ++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, ++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, ++ 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, ++ 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, ++ 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, ++ 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, ++ 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x28, ++ 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x78, ++ 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, ++ 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, ++ 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, ++ 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, ++ 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, ++ 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, ++ 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, ++ 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, 0x00, 0x0C, ++ 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, ++ 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, 0x00, 0x1E, + 0x00, 0x28, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, +- 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, +- 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, +- 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, +- 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, +- 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, +- 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, +- 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, +- 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, ++ 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, ++ 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, ++ 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, ++ 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, ++ 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, ++ 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, ++ 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, ++ 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x01, + 0x00, 0x0C, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, +- 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, +- 0x00, 0x1E, 0x00, 0x28, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, +- 0x00, 0x6E, 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, +- 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, +- 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, +- 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, +- 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, +- 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, +- 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, +- 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, +- 0x00, 0x01, 0x00, 0x0C, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, +- 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, +- 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, +- 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, ++ 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, ++ 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, ++ 0x21, 0x26, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, ++ 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, ++ 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, ++ 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, ++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, ++ 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, ++ 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, ++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, + 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, +- 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, ++ 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, +- 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, +- 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, +- 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, +- 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, ++ 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, ++ 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, ++ 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, ++ 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, + 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, +- 0x21, 0x26, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, +- 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, +- 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, +- 0x21, 0x26, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, +- 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, +- 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, ++ 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, ++ 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, ++ 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, ++ 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, ++ 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, ++ 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x01, + 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, +- 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, +- 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, +- 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, +- 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, +- 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, +- 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, +- 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, +- 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, +- 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, +- 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, +- 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, +- 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x4E, +- 0x00, 0x06, 0x00, 0x12, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3A, 0x00, 0x44, 0x00, 0x01, +- 0x00, 0x04, 0x0A, 0x59, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0A, 0x5A, 0x00, 0x02, +- 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0A, 0x5B, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04, +- 0x0A, 0x5E, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0A, 0x33, 0x00, 0x02, 0x0A, 0x3C, +- 0x00, 0x01, 0x00, 0x04, 0x0A, 0x36, 0x00, 0x02, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x06, 0x0A, 0x16, +- 0x0A, 0x17, 0x0A, 0x1C, 0x0A, 0x2B, 0x0A, 0x32, 0x0A, 0x38, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, +- 0x00, 0x08, 0x00, 0x01, 0x00, 0x36, 0x00, 0x06, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, +- 0x00, 0x2A, 0x00, 0x30, 0x00, 0x02, 0x0A, 0x32, 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x38, 0x0A, 0x3C, +- 0x00, 0x02, 0x0A, 0x16, 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x17, 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x1C, +- 0x0A, 0x3C, 0x00, 0x02, 0x0A, 0x2B, 0x0A, 0x3C, 0x00, 0x01, 0x00, 0x06, 0x0A, 0x33, 0x0A, 0x36, +- 0x0A, 0x59, 0x0A, 0x5A, 0x0A, 0x5B, 0x0A, 0x5E, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, +- 0x00, 0x01, 0x01, 0xB6, 0x00, 0x1A, 0x00, 0x3A, 0x00, 0x54, 0x00, 0x66, 0x00, 0x70, 0x00, 0x7A, +- 0x00, 0x84, 0x00, 0x96, 0x00, 0xA0, 0x00, 0xAA, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD8, 0x00, 0xE2, +- 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x30, 0x01, 0x3A, +- 0x01, 0x7C, 0x01, 0x86, 0x01, 0x90, 0x01, 0x9A, 0x01, 0xA4, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, +- 0x00, 0x14, 0xFB, 0x2E, 0x00, 0x02, 0x05, 0xB7, 0xFB, 0x2F, 0x00, 0x02, 0x05, 0xB8, 0xFB, 0x30, +- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x31, 0x00, 0x02, 0x05, 0xBC, +- 0xFB, 0x4C, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x32, 0x00, 0x02, 0x05, 0xBC, +- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x33, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x34, +- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x4B, 0x00, 0x02, 0x05, 0xB9, +- 0xFB, 0x35, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x36, 0x00, 0x02, 0x05, 0xBC, +- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x38, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, +- 0xFB, 0x1D, 0x00, 0x02, 0x05, 0xB4, 0xFB, 0x39, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, +- 0xFB, 0x3A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x3B, 0x00, 0x02, +- 0x05, 0xBC, 0xFB, 0x4D, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3C, 0x00, 0x02, +- 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3E, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, +- 0xFB, 0x40, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x41, 0x00, 0x02, 0x05, 0xBC, +- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x43, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, +- 0xFB, 0x44, 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x4E, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, +- 0xFB, 0x46, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x47, 0x00, 0x02, 0x05, 0xBC, +- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x48, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x07, 0x00, 0x10, 0x00, 0x18, +- 0x00, 0x20, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3C, 0xFB, 0x2C, 0x00, 0x03, 0x05, 0xBC, +- 0x05, 0xC1, 0xFB, 0x2D, 0x00, 0x03, 0x05, 0xBC, 0x05, 0xC2, 0xFB, 0x49, 0x00, 0x02, 0x05, 0xBC, +- 0xFB, 0x2C, 0x00, 0x03, 0x05, 0xC1, 0x05, 0xBC, 0xFB, 0x2A, 0x00, 0x02, 0x05, 0xC1, 0xFB, 0x2D, +- 0x00, 0x03, 0x05, 0xC2, 0x05, 0xBC, 0xFB, 0x2B, 0x00, 0x02, 0x05, 0xC2, 0x00, 0x01, 0x00, 0x04, +- 0xFB, 0x4A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x1F, 0x00, 0x02, 0x05, 0xB7, +- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x2C, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x2D, +- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x2C, 0x00, 0x02, 0x05, 0xC1, +- 0xFB, 0x2D, 0x00, 0x02, 0x05, 0xC2, 0x00, 0x01, 0x00, 0x1A, 0x05, 0xD0, 0x05, 0xD1, 0x05, 0xD2, +- 0x05, 0xD3, 0x05, 0xD4, 0x05, 0xD5, 0x05, 0xD6, 0x05, 0xD8, 0x05, 0xD9, 0x05, 0xDA, 0x05, 0xDB, +- 0x05, 0xDC, 0x05, 0xDE, 0x05, 0xE0, 0x05, 0xE1, 0x05, 0xE3, 0x05, 0xE4, 0x05, 0xE6, 0x05, 0xE7, +- 0x05, 0xE8, 0x05, 0xE9, 0x05, 0xEA, 0x05, 0xF2, 0xFB, 0x2A, 0xFB, 0x2B, 0xFB, 0x49, 0x00, 0x02, +- 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x01, 0x6C, 0x01, 0x8A, 0x01, 0xAC, 0x00, 0x01, 0x01, 0x16, +- 0x00, 0x22, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, +- 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, +- 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, +- 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xF8, 0x00, 0xFE, +- 0x01, 0x04, 0x01, 0x0A, 0x01, 0x10, 0x00, 0x02, 0x05, 0xD9, 0x05, 0xB4, 0x00, 0x02, 0x05, 0xF2, +- 0x05, 0xB7, 0x00, 0x02, 0x05, 0xE9, 0x05, 0xC1, 0x00, 0x02, 0x05, 0xE9, 0x05, 0xC2, 0x00, 0x02, +- 0xFB, 0x2A, 0x05, 0xBC, 0x00, 0x02, 0xFB, 0x2B, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD0, 0x05, 0xB7, +- 0x00, 0x02, 0x05, 0xD0, 0x05, 0xB8, 0x00, 0x02, 0x05, 0xD0, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD1, +- 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD2, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD3, 0x05, 0xBC, 0x00, 0x02, +- 0x05, 0xD4, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD5, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD6, 0x05, 0xBC, +- 0x00, 0x02, 0x05, 0xD8, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD9, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xDA, +- 0x05, 0xBC, 0x00, 0x02, 0x05, 0xDB, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xDC, 0x05, 0xBC, 0x00, 0x02, +- 0x05, 0xDE, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE0, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE1, 0x05, 0xBC, +- 0x00, 0x02, 0x05, 0xE3, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE4, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE6, +- 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE7, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xE8, 0x05, 0xBC, 0x00, 0x02, +- 0x05, 0xE9, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xEA, 0x05, 0xBC, 0x00, 0x02, 0x05, 0xD5, 0x05, 0xB9, +- 0x00, 0x02, 0x05, 0xD1, 0x05, 0xBF, 0x00, 0x02, 0x05, 0xDB, 0x05, 0xBF, 0x00, 0x02, 0x05, 0xE4, +- 0x05, 0xBF, 0x00, 0x01, 0x00, 0x22, 0xFB, 0x1D, 0xFB, 0x1F, 0xFB, 0x2A, 0xFB, 0x2B, 0xFB, 0x2C, +- 0xFB, 0x2D, 0xFB, 0x2E, 0xFB, 0x2F, 0xFB, 0x30, 0xFB, 0x31, 0xFB, 0x32, 0xFB, 0x33, 0xFB, 0x34, +- 0xFB, 0x35, 0xFB, 0x36, 0xFB, 0x38, 0xFB, 0x39, 0xFB, 0x3A, 0xFB, 0x3B, 0xFB, 0x3C, 0xFB, 0x3E, +- 0xFB, 0x40, 0xFB, 0x41, 0xFB, 0x43, 0xFB, 0x44, 0xFB, 0x46, 0xFB, 0x47, 0xFB, 0x48, 0xFB, 0x49, +- 0xFB, 0x4A, 0xFB, 0x4B, 0xFB, 0x4C, 0xFB, 0x4D, 0xFB, 0x4E, 0x00, 0x01, 0x00, 0x16, 0x00, 0x02, +- 0x00, 0x0A, 0x00, 0x10, 0x00, 0x02, 0xFB, 0x49, 0x05, 0xC1, 0x00, 0x02, 0xFB, 0x49, 0x05, 0xC2, +- 0x00, 0x01, 0x00, 0x02, 0xFB, 0x2C, 0xFB, 0x2D, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x02, 0x00, 0x0A, +- 0x00, 0x12, 0x00, 0x03, 0x05, 0xE9, 0x05, 0xBC, 0x05, 0xC1, 0x00, 0x03, 0x05, 0xE9, 0x05, 0xBC, +- 0x05, 0xC2, 0x00, 0x01, 0x00, 0x02, 0xFB, 0x2C, 0xFB, 0x2D, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x02, +- 0x00, 0x0A, 0x00, 0x12, 0x00, 0x03, 0x05, 0xE9, 0x05, 0xC1, 0x05, 0xBC, 0x00, 0x03, 0x05, 0xE9, +- 0x05, 0xC2, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x02, 0xFB, 0x2C, 0xFB, 0x2D, 0x00, 0x04, 0x00, 0x00, +- 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x36, 0x00, 0x16, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, +- 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x96, +- 0x00, 0xA0, 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBE, 0x00, 0xC8, 0x00, 0xD2, 0x00, 0xE4, 0x00, 0xF6, +- 0x01, 0x08, 0x01, 0x1A, 0x01, 0x2C, 0x00, 0x01, 0x00, 0x04, 0x30, 0x94, 0x00, 0x02, 0x30, 0x99, +- 0x00, 0x01, 0x00, 0x04, 0x30, 0x4C, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x4E, +- 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x50, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, +- 0x00, 0x04, 0x30, 0x52, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x54, 0x00, 0x02, +- 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x56, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, +- 0x30, 0x58, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x5A, 0x00, 0x02, 0x30, 0x99, +- 0x00, 0x01, 0x00, 0x04, 0x30, 0x5C, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x5E, +- 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x60, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, +- 0x00, 0x04, 0x30, 0x62, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x65, 0x00, 0x02, +- 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x67, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, +- 0x30, 0x69, 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x70, 0x00, 0x02, +- 0x30, 0x99, 0x30, 0x71, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x73, +- 0x00, 0x02, 0x30, 0x99, 0x30, 0x74, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, +- 0x30, 0x76, 0x00, 0x02, 0x30, 0x99, 0x30, 0x77, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, +- 0x00, 0x0C, 0x30, 0x79, 0x00, 0x02, 0x30, 0x99, 0x30, 0x7A, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, +- 0x00, 0x06, 0x00, 0x0C, 0x30, 0x7C, 0x00, 0x02, 0x30, 0x99, 0x30, 0x7D, 0x00, 0x02, 0x30, 0x9A, +- 0x00, 0x01, 0x00, 0x04, 0x30, 0x9E, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x16, 0x30, 0x46, +- 0x30, 0x4B, 0x30, 0x4D, 0x30, 0x4F, 0x30, 0x51, 0x30, 0x53, 0x30, 0x55, 0x30, 0x57, 0x30, 0x59, +- 0x30, 0x5B, 0x30, 0x5D, 0x30, 0x5F, 0x30, 0x61, 0x30, 0x64, 0x30, 0x66, 0x30, 0x68, 0x30, 0x6F, +- 0x30, 0x72, 0x30, 0x75, 0x30, 0x78, 0x30, 0x7B, 0x30, 0x9D, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, +- 0x00, 0x08, 0x00, 0x01, 0x00, 0xDE, 0x00, 0x1B, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, +- 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, +- 0x00, 0x84, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA2, 0x00, 0xA8, 0x00, 0xAE, +- 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC0, 0x00, 0xC6, 0x00, 0xCC, 0x00, 0xD2, 0x00, 0xD8, 0x00, 0x02, +- 0x30, 0x4B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x4D, 0x30, 0x99, 0x00, 0x02, 0x30, 0x4F, 0x30, 0x99, +- 0x00, 0x02, 0x30, 0x51, 0x30, 0x99, 0x00, 0x02, 0x30, 0x53, 0x30, 0x99, 0x00, 0x02, 0x30, 0x55, +- 0x30, 0x99, 0x00, 0x02, 0x30, 0x57, 0x30, 0x99, 0x00, 0x02, 0x30, 0x59, 0x30, 0x99, 0x00, 0x02, +- 0x30, 0x5B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5D, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5F, 0x30, 0x99, +- 0x00, 0x02, 0x30, 0x61, 0x30, 0x99, 0x00, 0x02, 0x30, 0x64, 0x30, 0x99, 0x00, 0x02, 0x30, 0x66, +- 0x30, 0x99, 0x00, 0x02, 0x30, 0x68, 0x30, 0x99, 0x00, 0x02, 0x30, 0x6F, 0x30, 0x99, 0x00, 0x02, +- 0x30, 0x6F, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x72, 0x30, 0x99, 0x00, 0x02, 0x30, 0x72, 0x30, 0x9A, +- 0x00, 0x02, 0x30, 0x75, 0x30, 0x99, 0x00, 0x02, 0x30, 0x75, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x78, +- 0x30, 0x99, 0x00, 0x02, 0x30, 0x78, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x7B, 0x30, 0x99, 0x00, 0x02, +- 0x30, 0x7B, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x46, 0x30, 0x99, 0x00, 0x02, 0x30, 0x9D, 0x30, 0x99, +- 0x00, 0x01, 0x00, 0x1B, 0x30, 0x4C, 0x30, 0x4E, 0x30, 0x50, 0x30, 0x52, 0x30, 0x54, 0x30, 0x56, +- 0x30, 0x58, 0x30, 0x5A, 0x30, 0x5C, 0x30, 0x5E, 0x30, 0x60, 0x30, 0x62, 0x30, 0x65, 0x30, 0x67, +- 0x30, 0x69, 0x30, 0x70, 0x30, 0x71, 0x30, 0x73, 0x30, 0x74, 0x30, 0x76, 0x30, 0x77, 0x30, 0x79, +- 0x30, 0x7A, 0x30, 0x7C, 0x30, 0x7D, 0x30, 0x94, 0x30, 0x9E, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, +- 0x00, 0x08, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x3A, 0x00, 0x01, +- 0x00, 0x04, 0x0C, 0xC0, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x18, +- 0x00, 0x1E, 0x0C, 0xCB, 0x00, 0x03, 0x0C, 0xC2, 0x0C, 0xD5, 0x0C, 0xCA, 0x00, 0x02, 0x0C, 0xC2, +- 0x0C, 0xC7, 0x00, 0x02, 0x0C, 0xD5, 0x0C, 0xC8, 0x00, 0x02, 0x0C, 0xD6, 0x00, 0x01, 0x00, 0x04, +- 0x0C, 0xCB, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x03, 0x0C, 0xBF, 0x0C, 0xC6, 0x0C, 0xCA, +- 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x46, 0x00, 0x01, 0x00, 0x2E, 0x00, 0x05, +- 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x02, 0x0C, 0xBF, 0x0C, 0xD5, +- 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xD5, 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xD6, 0x00, 0x02, 0x0C, 0xC6, +- 0x0C, 0xC2, 0x00, 0x02, 0x0C, 0xCA, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x05, 0x0C, 0xC0, 0x0C, 0xC7, +- 0x0C, 0xC8, 0x0C, 0xCA, 0x0C, 0xCB, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, +- 0x0C, 0xC6, 0x0C, 0xC2, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x01, 0x0C, 0xCB, 0x00, 0x04, 0x00, 0x00, +- 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x66, 0x00, 0x1A, 0x00, 0x3A, 0x00, 0x44, 0x00, 0x4E, +- 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, 0x00, 0x8A, 0x00, 0x94, 0x00, 0x9E, +- 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xDA, 0x00, 0xEC, 0x00, 0xFE, +- 0x01, 0x10, 0x01, 0x22, 0x01, 0x34, 0x01, 0x3E, 0x01, 0x48, 0x01, 0x52, 0x01, 0x5C, 0x00, 0x01, +- 0x00, 0x04, 0x30, 0xF4, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xAC, 0x00, 0x02, +- 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xAE, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, +- 0x30, 0xB0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB2, 0x00, 0x02, 0x30, 0x99, +- 0x00, 0x01, 0x00, 0x04, 0x30, 0xB4, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB6, +- 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB8, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, +- 0x00, 0x04, 0x30, 0xBA, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBC, 0x00, 0x02, +- 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBE, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, +- 0x30, 0xC0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC2, 0x00, 0x02, 0x30, 0x99, +- 0x00, 0x01, 0x00, 0x04, 0x30, 0xC5, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC7, +- 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC9, 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, +- 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD0, 0x00, 0x02, 0x30, 0x99, 0x30, 0xD1, 0x00, 0x02, 0x30, 0x9A, +- 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD3, 0x00, 0x02, 0x30, 0x99, 0x30, 0xD4, 0x00, 0x02, +- 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD6, 0x00, 0x02, 0x30, 0x99, 0x30, 0xD7, +- 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD9, 0x00, 0x02, 0x30, 0x99, +- 0x30, 0xDA, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xDC, 0x00, 0x02, +- 0x30, 0x99, 0x30, 0xDD, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF7, 0x00, 0x02, +- 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF8, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, +- 0x30, 0xF9, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xFA, 0x00, 0x02, 0x30, 0x99, +- 0x00, 0x01, 0x00, 0x04, 0x30, 0xFE, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x1A, 0x30, 0xA6, +- 0x30, 0xAB, 0x30, 0xAD, 0x30, 0xAF, 0x30, 0xB1, 0x30, 0xB3, 0x30, 0xB5, 0x30, 0xB7, 0x30, 0xB9, +- 0x30, 0xBB, 0x30, 0xBD, 0x30, 0xBF, 0x30, 0xC1, 0x30, 0xC4, 0x30, 0xC6, 0x30, 0xC8, 0x30, 0xCF, +- 0x30, 0xD2, 0x30, 0xD5, 0x30, 0xD8, 0x30, 0xDB, 0x30, 0xEF, 0x30, 0xF0, 0x30, 0xF1, 0x30, 0xF2, +- 0x30, 0xFD, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0xFE, 0x00, 0x1F, +- 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, +- 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, +- 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, +- 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xF8, 0x00, 0x02, +- 0x30, 0xAB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xAD, 0x30, 0x99, 0x00, 0x02, 0x30, 0xAF, 0x30, 0x99, +- 0x00, 0x02, 0x30, 0xB1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB3, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB5, +- 0x30, 0x99, 0x00, 0x02, 0x30, 0xB7, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB9, 0x30, 0x99, 0x00, 0x02, +- 0x30, 0xBB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBD, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBF, 0x30, 0x99, +- 0x00, 0x02, 0x30, 0xC1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC4, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC6, +- 0x30, 0x99, 0x00, 0x02, 0x30, 0xC8, 0x30, 0x99, 0x00, 0x02, 0x30, 0xCF, 0x30, 0x99, 0x00, 0x02, +- 0x30, 0xCF, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD2, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD2, 0x30, 0x9A, +- 0x00, 0x02, 0x30, 0xD5, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD5, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD8, +- 0x30, 0x99, 0x00, 0x02, 0x30, 0xD8, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xDB, 0x30, 0x99, 0x00, 0x02, +- 0x30, 0xDB, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xA6, 0x30, 0x99, 0x00, 0x02, 0x30, 0xEF, 0x30, 0x99, +- 0x00, 0x02, 0x30, 0xF0, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF2, +- 0x30, 0x99, 0x00, 0x02, 0x30, 0xFD, 0x30, 0x99, 0x00, 0x01, 0x00, 0x1F, 0x30, 0xAC, 0x30, 0xAE, +- 0x30, 0xB0, 0x30, 0xB2, 0x30, 0xB4, 0x30, 0xB6, 0x30, 0xB8, 0x30, 0xBA, 0x30, 0xBC, 0x30, 0xBE, +- 0x30, 0xC0, 0x30, 0xC2, 0x30, 0xC5, 0x30, 0xC7, 0x30, 0xC9, 0x30, 0xD0, 0x30, 0xD1, 0x30, 0xD3, +- 0x30, 0xD4, 0x30, 0xD6, 0x30, 0xD7, 0x30, 0xD9, 0x30, 0xDA, 0x30, 0xDC, 0x30, 0xDD, 0x30, 0xF4, +- 0x30, 0xF7, 0x30, 0xF8, 0x30, 0xF9, 0x30, 0xFA, 0x30, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, +- 0x00, 0x08, 0x00, 0x01, 0x1E, 0x9A, 0x00, 0x89, 0x01, 0x18, 0x02, 0x72, 0x02, 0x8C, 0x02, 0xE6, +- 0x03, 0x18, 0x04, 0x3E, 0x04, 0x48, 0x04, 0x8A, 0x04, 0xC4, 0x05, 0x6A, 0x05, 0x74, 0x05, 0xA6, +- 0x05, 0xF4, 0x06, 0x16, 0x06, 0x70, 0x08, 0x56, 0x08, 0x70, 0x08, 0xCE, 0x09, 0x42, 0x09, 0x7C, +- 0x0B, 0x14, 0x0B, 0x26, 0x0B, 0x68, 0x0B, 0x7A, 0x0B, 0xD4, 0x0C, 0x0E, 0x0D, 0x68, 0x0D, 0x82, +- 0x0D, 0xDC, 0x0E, 0x0E, 0x0F, 0x34, 0x0F, 0x3E, 0x0F, 0x80, 0x0F, 0xC2, 0x10, 0x60, 0x10, 0x72, +- 0x10, 0xA4, 0x10, 0xF2, 0x11, 0x14, 0x11, 0x6E, 0x13, 0x54, 0x13, 0x6E, 0x13, 0xCC, 0x14, 0x40, +- 0x14, 0x82, 0x16, 0x1A, 0x16, 0x2C, 0x16, 0x76, 0x16, 0x88, 0x16, 0xEA, 0x17, 0x24, 0x17, 0x5E, +- 0x17, 0x68, 0x17, 0x7A, 0x17, 0x94, 0x17, 0xA6, 0x17, 0xE0, 0x17, 0xF2, 0x17, 0xFC, 0x18, 0x06, +- 0x18, 0x40, 0x18, 0x6A, 0x18, 0x74, 0x18, 0x86, 0x18, 0x90, 0x18, 0x9A, 0x18, 0xCC, 0x19, 0x06, +- 0x19, 0x10, 0x19, 0x22, 0x19, 0x3C, 0x19, 0x4E, 0x19, 0x88, 0x19, 0x9A, 0x19, 0xA4, 0x19, 0xAE, +- 0x19, 0xE8, 0x1A, 0x12, 0x1A, 0x1C, 0x1A, 0x2E, 0x1A, 0x38, 0x1A, 0x42, 0x1A, 0x74, 0x1A, 0xAE, +- 0x1A, 0xE8, 0x1A, 0xF2, 0x1A, 0xFC, 0x1B, 0x1E, 0x1B, 0x40, 0x1B, 0x4A, 0x1B, 0x54, 0x1B, 0x7E, +- 0x1B, 0xA8, 0x1B, 0xB2, 0x1B, 0xBC, 0x1B, 0xC6, 0x1B, 0xD0, 0x1B, 0xEA, 0x1C, 0x04, 0x1C, 0x0E, +- 0x1C, 0x18, 0x1C, 0x22, 0x1C, 0x5C, 0x1C, 0x96, 0x1C, 0xD0, 0x1D, 0x0A, 0x1D, 0x14, 0x1D, 0x1E, +- 0x1D, 0x28, 0x1D, 0x32, 0x1D, 0x3C, 0x1D, 0x46, 0x1D, 0x50, 0x1D, 0x5A, 0x1D, 0x64, 0x1D, 0x6E, +- 0x1D, 0x78, 0x1D, 0x82, 0x1D, 0x8C, 0x1D, 0x96, 0x1D, 0xA0, 0x1D, 0xAA, 0x1D, 0xB4, 0x1D, 0xBE, +- 0x1D, 0xD0, 0x1D, 0xE2, 0x1D, 0xEC, 0x1D, 0xF6, 0x1E, 0x08, 0x1E, 0x1A, 0x1E, 0x24, 0x1E, 0x2E, +- 0x1E, 0x38, 0x1E, 0x42, 0x1E, 0x4C, 0x1E, 0x56, 0x1E, 0x88, 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54, +- 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, +- 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, +- 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, +- 0x01, 0x0C, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, +- 0x01, 0x42, 0x01, 0x48, 0x01, 0x4E, 0x01, 0x54, 0x00, 0xC0, 0x00, 0x02, 0x03, 0x00, 0x00, 0xC1, +- 0x00, 0x02, 0x03, 0x01, 0x1E, 0xA6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x03, +- 0x03, 0x02, 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xA8, 0x00, 0x03, +- 0x03, 0x02, 0x03, 0x09, 0x1E, 0xAC, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x03, +- 0x03, 0x02, 0x03, 0x40, 0x1E, 0xA4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xC2, 0x00, 0x02, +- 0x03, 0x02, 0x00, 0xC3, 0x00, 0x02, 0x03, 0x03, 0x01, 0x00, 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB0, +- 0x00, 0x03, 0x03, 0x06, 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x03, 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB4, +- 0x00, 0x03, 0x03, 0x06, 0x03, 0x03, 0x1E, 0xB2, 0x00, 0x03, 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB6, +- 0x00, 0x03, 0x03, 0x06, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x03, 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAE, +- 0x00, 0x03, 0x03, 0x06, 0x03, 0x41, 0x01, 0x02, 0x00, 0x02, 0x03, 0x06, 0x01, 0xE0, 0x00, 0x03, +- 0x03, 0x07, 0x03, 0x04, 0x02, 0x26, 0x00, 0x02, 0x03, 0x07, 0x01, 0xDE, 0x00, 0x03, 0x03, 0x08, +- 0x03, 0x04, 0x00, 0xC4, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA2, 0x00, 0x02, 0x03, 0x09, 0x01, 0xFA, +- 0x00, 0x03, 0x03, 0x0A, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x41, 0x00, 0xC5, +- 0x00, 0x02, 0x03, 0x0A, 0x01, 0xCD, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x00, 0x00, 0x02, 0x03, 0x0F, +- 0x02, 0x02, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xAC, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB6, +- 0x00, 0x03, 0x03, 0x23, 0x03, 0x06, 0x1E, 0xA0, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x00, 0x00, 0x02, +- 0x03, 0x25, 0x01, 0x04, 0x00, 0x02, 0x03, 0x28, 0x00, 0xC0, 0x00, 0x02, 0x03, 0x40, 0x00, 0xC1, +- 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x02, 0x00, 0x02, +- 0x03, 0x07, 0x1E, 0x04, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x06, 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A, +- 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, +- 0x00, 0x4C, 0x00, 0x54, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x01, 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, +- 0x03, 0x01, 0x01, 0x08, 0x00, 0x02, 0x03, 0x02, 0x01, 0x0A, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0C, +- 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x27, 0x03, 0x01, 0x1E, 0x08, 0x00, 0x03, +- 0x03, 0x27, 0x03, 0x41, 0x00, 0xC7, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x41, +- 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, +- 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x0A, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0E, 0x00, 0x02, +- 0x03, 0x0C, 0x1E, 0x0C, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x10, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x12, +- 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x0E, 0x00, 0x02, 0x03, 0x31, 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A, +- 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, +- 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, +- 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4, +- 0x00, 0xFA, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x00, 0xC8, +- 0x00, 0x02, 0x03, 0x00, 0x00, 0xC9, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, +- 0x03, 0x00, 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xC4, 0x00, 0x03, 0x03, 0x02, +- 0x03, 0x03, 0x1E, 0xC2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xC6, 0x00, 0x03, 0x03, 0x02, +- 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, +- 0x03, 0x41, 0x00, 0xCA, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBC, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x14, +- 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x16, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x1E, 0x14, +- 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x16, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x12, +- 0x00, 0x02, 0x03, 0x04, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x06, 0x03, 0x27, 0x01, 0x14, 0x00, 0x02, +- 0x03, 0x06, 0x01, 0x16, 0x00, 0x02, 0x03, 0x07, 0x00, 0xCB, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBA, +- 0x00, 0x02, 0x03, 0x09, 0x01, 0x1A, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x04, 0x00, 0x02, 0x03, 0x0F, +- 0x02, 0x06, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xC6, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB8, +- 0x00, 0x02, 0x03, 0x23, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x27, 0x03, 0x06, 0x02, 0x28, 0x00, 0x02, +- 0x03, 0x27, 0x01, 0x18, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x18, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1A, +- 0x00, 0x02, 0x03, 0x30, 0x00, 0xC8, 0x00, 0x02, 0x03, 0x40, 0x00, 0xC9, 0x00, 0x02, 0x03, 0x41, +- 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1E, 0x00, 0x02, 0x03, 0x07, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, +- 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x01, 0xF4, 0x00, 0x02, +- 0x03, 0x01, 0x01, 0x1C, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x20, 0x00, 0x02, 0x03, 0x04, 0x01, 0x1E, +- 0x00, 0x02, 0x03, 0x06, 0x01, 0x20, 0x00, 0x02, 0x03, 0x07, 0x01, 0xE6, 0x00, 0x02, 0x03, 0x0C, +- 0x01, 0x22, 0x00, 0x02, 0x03, 0x27, 0x01, 0xF4, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, +- 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x24, 0x00, 0x02, +- 0x03, 0x02, 0x1E, 0x22, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x26, 0x00, 0x02, 0x03, 0x08, 0x02, 0x1E, +- 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x24, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x28, 0x00, 0x02, 0x03, 0x27, +- 0x1E, 0x2A, 0x00, 0x02, 0x03, 0x2E, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, +- 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, +- 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, +- 0x00, 0xCC, 0x00, 0x02, 0x03, 0x00, 0x00, 0xCD, 0x00, 0x02, 0x03, 0x01, 0x00, 0xCE, 0x00, 0x02, +- 0x03, 0x02, 0x01, 0x28, 0x00, 0x02, 0x03, 0x03, 0x01, 0x2A, 0x00, 0x02, 0x03, 0x04, 0x01, 0x2C, +- 0x00, 0x02, 0x03, 0x06, 0x01, 0x30, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, +- 0x03, 0x01, 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xCF, 0x00, 0x02, 0x03, 0x08, +- 0x1E, 0xC8, 0x00, 0x02, 0x03, 0x09, 0x01, 0xCF, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x08, 0x00, 0x02, +- 0x03, 0x0F, 0x02, 0x0A, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCA, 0x00, 0x02, 0x03, 0x23, 0x01, 0x2E, +- 0x00, 0x02, 0x03, 0x28, 0x1E, 0x2C, 0x00, 0x02, 0x03, 0x30, 0x00, 0xCC, 0x00, 0x02, 0x03, 0x40, +- 0x00, 0xCD, 0x00, 0x02, 0x03, 0x41, 0x1E, 0x2E, 0x00, 0x02, 0x03, 0x44, 0x00, 0x01, 0x00, 0x04, +- 0x01, 0x34, 0x00, 0x02, 0x03, 0x02, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, +- 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE8, 0x00, 0x02, 0x03, 0x0C, +- 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x34, 0x00, 0x02, +- 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, +- 0x00, 0x28, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x01, 0x39, 0x00, 0x02, +- 0x03, 0x01, 0x1E, 0x38, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x01, 0x3D, 0x00, 0x02, 0x03, 0x0C, +- 0x1E, 0x38, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x36, 0x00, 0x02, 0x03, 0x23, 0x01, 0x3B, +- 0x00, 0x02, 0x03, 0x27, 0x1E, 0x3C, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x3A, 0x00, 0x02, 0x03, 0x31, +- 0x01, 0x39, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, +- 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x40, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x42, 0x00, 0x02, +- 0x03, 0x23, 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, +- 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, +- 0x01, 0xF8, 0x00, 0x02, 0x03, 0x00, 0x01, 0x43, 0x00, 0x02, 0x03, 0x01, 0x00, 0xD1, 0x00, 0x02, +- 0x03, 0x03, 0x1E, 0x44, 0x00, 0x02, 0x03, 0x07, 0x01, 0x47, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x46, +- 0x00, 0x02, 0x03, 0x23, 0x01, 0x45, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x4A, 0x00, 0x02, 0x03, 0x2D, +- 0x1E, 0x48, 0x00, 0x02, 0x03, 0x31, 0x01, 0xF8, 0x00, 0x02, 0x03, 0x40, 0x01, 0x43, 0x00, 0x02, +- 0x03, 0x41, 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8E, +- 0x00, 0x96, 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCC, +- 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, +- 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, +- 0x01, 0x4A, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, +- 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, +- 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xE0, 0x1E, 0xDC, 0x00, 0x03, +- 0x03, 0x00, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x01, +- 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, +- 0x1E, 0xD0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, +- 0x1E, 0xD4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD8, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, +- 0x1E, 0xD2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, +- 0x00, 0xD4, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4C, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x2C, +- 0x00, 0x03, 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4E, 0x00, 0x03, 0x03, 0x03, 0x03, 0x08, 0x1E, 0xE0, +- 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x00, 0xD5, +- 0x00, 0x02, 0x03, 0x03, 0x1E, 0x50, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x52, 0x00, 0x03, +- 0x03, 0x04, 0x03, 0x01, 0x01, 0xEC, 0x00, 0x03, 0x03, 0x04, 0x03, 0x28, 0x1E, 0x50, 0x00, 0x03, +- 0x03, 0x04, 0x03, 0x40, 0x1E, 0x52, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x4C, 0x00, 0x02, +- 0x03, 0x04, 0x01, 0x4E, 0x00, 0x02, 0x03, 0x06, 0x02, 0x30, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, +- 0x02, 0x2E, 0x00, 0x02, 0x03, 0x07, 0x02, 0x2A, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xD6, +- 0x00, 0x02, 0x03, 0x08, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xCE, 0x00, 0x02, +- 0x03, 0x09, 0x01, 0x50, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD1, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x0C, +- 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0E, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, +- 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xE0, 0x00, 0x03, 0x03, 0x1B, +- 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x1B, +- 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, +- 0x03, 0x41, 0x01, 0xA0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD8, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, +- 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCC, 0x00, 0x02, 0x03, 0x23, 0x01, 0xEC, +- 0x00, 0x03, 0x03, 0x28, 0x03, 0x04, 0x01, 0xEA, 0x00, 0x02, 0x03, 0x28, 0x1E, 0xDC, 0x00, 0x03, +- 0x03, 0x40, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x41, +- 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, +- 0x1E, 0x54, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x56, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x54, 0x00, 0x02, +- 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, +- 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x01, 0x54, 0x00, 0x02, 0x03, 0x01, +- 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x58, 0x00, 0x02, 0x03, 0x07, 0x01, 0x58, +- 0x00, 0x02, 0x03, 0x0C, 0x02, 0x10, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x12, 0x00, 0x02, 0x03, 0x11, +- 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5A, 0x00, 0x02, 0x03, 0x23, 0x01, 0x56, +- 0x00, 0x02, 0x03, 0x27, 0x1E, 0x5E, 0x00, 0x02, 0x03, 0x31, 0x01, 0x54, 0x00, 0x02, 0x03, 0x41, +- 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, +- 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6E, 0x1E, 0x64, 0x00, 0x03, +- 0x03, 0x01, 0x03, 0x07, 0x01, 0x5A, 0x00, 0x02, 0x03, 0x01, 0x01, 0x5C, 0x00, 0x02, 0x03, 0x02, +- 0x1E, 0x68, 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x60, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x66, +- 0x00, 0x03, 0x03, 0x0C, 0x03, 0x07, 0x01, 0x60, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x68, 0x00, 0x03, +- 0x03, 0x23, 0x03, 0x07, 0x1E, 0x62, 0x00, 0x02, 0x03, 0x23, 0x02, 0x18, 0x00, 0x02, 0x03, 0x26, +- 0x01, 0x5E, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x64, 0x00, 0x03, 0x03, 0x41, 0x03, 0x07, 0x01, 0x5A, +- 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, +- 0x00, 0x2E, 0x00, 0x34, 0x1E, 0x6A, 0x00, 0x02, 0x03, 0x07, 0x01, 0x64, 0x00, 0x02, 0x03, 0x0C, +- 0x1E, 0x6C, 0x00, 0x02, 0x03, 0x23, 0x02, 0x1A, 0x00, 0x02, 0x03, 0x26, 0x01, 0x62, 0x00, 0x02, +- 0x03, 0x27, 0x1E, 0x70, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6E, 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D, +- 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E, +- 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, +- 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00, +- 0x01, 0x06, 0x01, 0x0C, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, +- 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, +- 0x01, 0x76, 0x01, 0x7E, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x00, +- 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, +- 0x00, 0xDA, 0x00, 0x02, 0x03, 0x01, 0x00, 0xDB, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x78, 0x00, 0x03, +- 0x03, 0x03, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x03, +- 0x03, 0x03, 0x03, 0x41, 0x01, 0x68, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7A, 0x00, 0x03, 0x03, 0x04, +- 0x03, 0x08, 0x01, 0x6A, 0x00, 0x02, 0x03, 0x04, 0x01, 0x6C, 0x00, 0x02, 0x03, 0x06, 0x01, 0xDB, +- 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x01, 0xD7, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x01, 0xD5, +- 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x01, 0xD9, 0x00, 0x03, 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDB, +- 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x01, 0xD7, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xDC, +- 0x00, 0x02, 0x03, 0x08, 0x1E, 0xEC, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xE6, 0x00, 0x02, +- 0x03, 0x09, 0x01, 0x6E, 0x00, 0x02, 0x03, 0x0A, 0x01, 0x70, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD3, +- 0x00, 0x02, 0x03, 0x0C, 0x02, 0x14, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x16, 0x00, 0x02, 0x03, 0x11, +- 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, +- 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xEC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, +- 0x1E, 0xF0, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, +- 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xAF, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF0, +- 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xE4, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x72, 0x00, 0x02, +- 0x03, 0x24, 0x01, 0x72, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x76, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x74, +- 0x00, 0x02, 0x03, 0x30, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, +- 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xDA, 0x00, 0x02, 0x03, 0x41, +- 0x01, 0xD7, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x7C, 0x00, 0x02, +- 0x03, 0x03, 0x1E, 0x7E, 0x00, 0x02, 0x03, 0x23, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, +- 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x1E, 0x80, 0x00, 0x02, 0x03, 0x00, +- 0x1E, 0x82, 0x00, 0x02, 0x03, 0x01, 0x01, 0x74, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x86, 0x00, 0x02, +- 0x03, 0x07, 0x1E, 0x84, 0x00, 0x02, 0x03, 0x08, 0x1E, 0x88, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x80, +- 0x00, 0x02, 0x03, 0x40, 0x1E, 0x82, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, +- 0x1E, 0x8A, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8C, 0x00, 0x02, 0x03, 0x08, 0x00, 0x0B, 0x00, 0x18, +- 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, +- 0x00, 0x4E, 0x00, 0x54, 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x00, 0xDD, 0x00, 0x02, 0x03, 0x01, +- 0x01, 0x76, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF8, 0x00, 0x02, 0x03, 0x03, 0x02, 0x32, 0x00, 0x02, +- 0x03, 0x04, 0x1E, 0x8E, 0x00, 0x02, 0x03, 0x07, 0x01, 0x78, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF6, +- 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF4, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x40, +- 0x00, 0xDD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, +- 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x79, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x90, 0x00, 0x02, +- 0x03, 0x02, 0x01, 0x7B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x7D, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x92, +- 0x00, 0x02, 0x03, 0x23, 0x1E, 0x94, 0x00, 0x02, 0x03, 0x31, 0x01, 0x79, 0x00, 0x02, 0x03, 0x41, ++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, ++ 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, ++ 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, ++ 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, ++ 0x1F, 0xAC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x36, 0x00, 0x16, ++ 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x78, ++ 0x00, 0x82, 0x00, 0x8C, 0x00, 0x96, 0x00, 0xA0, 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBE, 0x00, 0xC8, ++ 0x00, 0xD2, 0x00, 0xE4, 0x00, 0xF6, 0x01, 0x08, 0x01, 0x1A, 0x01, 0x2C, 0x00, 0x01, 0x00, 0x04, ++ 0x30, 0x94, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x4C, 0x00, 0x02, 0x30, 0x99, ++ 0x00, 0x01, 0x00, 0x04, 0x30, 0x4E, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x50, ++ 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x52, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, ++ 0x00, 0x04, 0x30, 0x54, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x56, 0x00, 0x02, ++ 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x58, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, ++ 0x30, 0x5A, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x5C, 0x00, 0x02, 0x30, 0x99, ++ 0x00, 0x01, 0x00, 0x04, 0x30, 0x5E, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x60, ++ 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x62, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, ++ 0x00, 0x04, 0x30, 0x65, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x67, 0x00, 0x02, ++ 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x69, 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, 0x00, 0x06, ++ 0x00, 0x0C, 0x30, 0x70, 0x00, 0x02, 0x30, 0x99, 0x30, 0x71, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, ++ 0x00, 0x06, 0x00, 0x0C, 0x30, 0x73, 0x00, 0x02, 0x30, 0x99, 0x30, 0x74, 0x00, 0x02, 0x30, 0x9A, ++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x76, 0x00, 0x02, 0x30, 0x99, 0x30, 0x77, 0x00, 0x02, ++ 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x79, 0x00, 0x02, 0x30, 0x99, 0x30, 0x7A, ++ 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x7C, 0x00, 0x02, 0x30, 0x99, ++ 0x30, 0x7D, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x01, 0x00, 0x04, 0x30, 0x9E, 0x00, 0x02, 0x30, 0x99, ++ 0x00, 0x01, 0x00, 0x16, 0x30, 0x46, 0x30, 0x4B, 0x30, 0x4D, 0x30, 0x4F, 0x30, 0x51, 0x30, 0x53, ++ 0x30, 0x55, 0x30, 0x57, 0x30, 0x59, 0x30, 0x5B, 0x30, 0x5D, 0x30, 0x5F, 0x30, 0x61, 0x30, 0x64, ++ 0x30, 0x66, 0x30, 0x68, 0x30, 0x6F, 0x30, 0x72, 0x30, 0x75, 0x30, 0x78, 0x30, 0x7B, 0x30, 0x9D, ++ 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0xDE, 0x00, 0x1B, 0x00, 0x3C, ++ 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, ++ 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x84, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, 0x00, 0x9C, ++ 0x00, 0xA2, 0x00, 0xA8, 0x00, 0xAE, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC0, 0x00, 0xC6, 0x00, 0xCC, ++ 0x00, 0xD2, 0x00, 0xD8, 0x00, 0x02, 0x30, 0x4B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x4D, 0x30, 0x99, ++ 0x00, 0x02, 0x30, 0x4F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x51, 0x30, 0x99, 0x00, 0x02, 0x30, 0x53, ++ 0x30, 0x99, 0x00, 0x02, 0x30, 0x55, 0x30, 0x99, 0x00, 0x02, 0x30, 0x57, 0x30, 0x99, 0x00, 0x02, ++ 0x30, 0x59, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5D, 0x30, 0x99, ++ 0x00, 0x02, 0x30, 0x5F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x61, 0x30, 0x99, 0x00, 0x02, 0x30, 0x64, ++ 0x30, 0x99, 0x00, 0x02, 0x30, 0x66, 0x30, 0x99, 0x00, 0x02, 0x30, 0x68, 0x30, 0x99, 0x00, 0x02, ++ 0x30, 0x6F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x6F, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x72, 0x30, 0x99, ++ 0x00, 0x02, 0x30, 0x72, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x75, 0x30, 0x99, 0x00, 0x02, 0x30, 0x75, ++ 0x30, 0x9A, 0x00, 0x02, 0x30, 0x78, 0x30, 0x99, 0x00, 0x02, 0x30, 0x78, 0x30, 0x9A, 0x00, 0x02, ++ 0x30, 0x7B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x7B, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x46, 0x30, 0x99, ++ 0x00, 0x02, 0x30, 0x9D, 0x30, 0x99, 0x00, 0x01, 0x00, 0x1B, 0x30, 0x4C, 0x30, 0x4E, 0x30, 0x50, ++ 0x30, 0x52, 0x30, 0x54, 0x30, 0x56, 0x30, 0x58, 0x30, 0x5A, 0x30, 0x5C, 0x30, 0x5E, 0x30, 0x60, ++ 0x30, 0x62, 0x30, 0x65, 0x30, 0x67, 0x30, 0x69, 0x30, 0x70, 0x30, 0x71, 0x30, 0x73, 0x30, 0x74, ++ 0x30, 0x76, 0x30, 0x77, 0x30, 0x79, 0x30, 0x7A, 0x30, 0x7C, 0x30, 0x7D, 0x30, 0x94, 0x30, 0x9E, ++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x00, 0x0C, ++ 0x00, 0x16, 0x00, 0x3A, 0x00, 0x01, 0x00, 0x04, 0x0C, 0xC0, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x04, ++ 0x00, 0x0A, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x0C, 0xCB, 0x00, 0x03, 0x0C, 0xC2, 0x0C, 0xD5, ++ 0x0C, 0xCA, 0x00, 0x02, 0x0C, 0xC2, 0x0C, 0xC7, 0x00, 0x02, 0x0C, 0xD5, 0x0C, 0xC8, 0x00, 0x02, ++ 0x0C, 0xD6, 0x00, 0x01, 0x00, 0x04, 0x0C, 0xCB, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x03, ++ 0x0C, 0xBF, 0x0C, 0xC6, 0x0C, 0xCA, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x46, ++ 0x00, 0x01, 0x00, 0x2E, 0x00, 0x05, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, ++ 0x00, 0x02, 0x0C, 0xBF, 0x0C, 0xD5, 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xD5, 0x00, 0x02, 0x0C, 0xC6, ++ 0x0C, 0xD6, 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xC2, 0x00, 0x02, 0x0C, 0xCA, 0x0C, 0xD5, 0x00, 0x01, ++ 0x00, 0x05, 0x0C, 0xC0, 0x0C, 0xC7, 0x0C, 0xC8, 0x0C, 0xCA, 0x0C, 0xCB, 0x00, 0x01, 0x00, 0x10, ++ 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x0C, 0xC6, 0x0C, 0xC2, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x01, ++ 0x0C, 0xCB, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x66, 0x00, 0x1A, ++ 0x00, 0x3A, 0x00, 0x44, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, ++ 0x00, 0x8A, 0x00, 0x94, 0x00, 0x9E, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, ++ 0x00, 0xDA, 0x00, 0xEC, 0x00, 0xFE, 0x01, 0x10, 0x01, 0x22, 0x01, 0x34, 0x01, 0x3E, 0x01, 0x48, ++ 0x01, 0x52, 0x01, 0x5C, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF4, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, ++ 0x00, 0x04, 0x30, 0xAC, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xAE, 0x00, 0x02, ++ 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, ++ 0x30, 0xB2, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB4, 0x00, 0x02, 0x30, 0x99, ++ 0x00, 0x01, 0x00, 0x04, 0x30, 0xB6, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB8, ++ 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBA, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, ++ 0x00, 0x04, 0x30, 0xBC, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBE, 0x00, 0x02, ++ 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, ++ 0x30, 0xC2, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC5, 0x00, 0x02, 0x30, 0x99, ++ 0x00, 0x01, 0x00, 0x04, 0x30, 0xC7, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC9, ++ 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD0, 0x00, 0x02, 0x30, 0x99, ++ 0x30, 0xD1, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD3, 0x00, 0x02, ++ 0x30, 0x99, 0x30, 0xD4, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD6, ++ 0x00, 0x02, 0x30, 0x99, 0x30, 0xD7, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, ++ 0x30, 0xD9, 0x00, 0x02, 0x30, 0x99, 0x30, 0xDA, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, ++ 0x00, 0x0C, 0x30, 0xDC, 0x00, 0x02, 0x30, 0x99, 0x30, 0xDD, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x01, ++ 0x00, 0x04, 0x30, 0xF7, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF8, 0x00, 0x02, ++ 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF9, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, ++ 0x30, 0xFA, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xFE, 0x00, 0x02, 0x30, 0x99, ++ 0x00, 0x01, 0x00, 0x1A, 0x30, 0xA6, 0x30, 0xAB, 0x30, 0xAD, 0x30, 0xAF, 0x30, 0xB1, 0x30, 0xB3, ++ 0x30, 0xB5, 0x30, 0xB7, 0x30, 0xB9, 0x30, 0xBB, 0x30, 0xBD, 0x30, 0xBF, 0x30, 0xC1, 0x30, 0xC4, ++ 0x30, 0xC6, 0x30, 0xC8, 0x30, 0xCF, 0x30, 0xD2, 0x30, 0xD5, 0x30, 0xD8, 0x30, 0xDB, 0x30, 0xEF, ++ 0x30, 0xF0, 0x30, 0xF1, 0x30, 0xF2, 0x30, 0xFD, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, ++ 0x00, 0x01, 0x00, 0xFE, 0x00, 0x1F, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, ++ 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, ++ 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, ++ 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, ++ 0x00, 0xF2, 0x00, 0xF8, 0x00, 0x02, 0x30, 0xAB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xAD, 0x30, 0x99, ++ 0x00, 0x02, 0x30, 0xAF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB3, ++ 0x30, 0x99, 0x00, 0x02, 0x30, 0xB5, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB7, 0x30, 0x99, 0x00, 0x02, ++ 0x30, 0xB9, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBD, 0x30, 0x99, ++ 0x00, 0x02, 0x30, 0xBF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC4, ++ 0x30, 0x99, 0x00, 0x02, 0x30, 0xC6, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC8, 0x30, 0x99, 0x00, 0x02, ++ 0x30, 0xCF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xCF, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD2, 0x30, 0x99, ++ 0x00, 0x02, 0x30, 0xD2, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD5, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD5, ++ 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD8, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD8, 0x30, 0x9A, 0x00, 0x02, ++ 0x30, 0xDB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xDB, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xA6, 0x30, 0x99, ++ 0x00, 0x02, 0x30, 0xEF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF0, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF1, ++ 0x30, 0x99, 0x00, 0x02, 0x30, 0xF2, 0x30, 0x99, 0x00, 0x02, 0x30, 0xFD, 0x30, 0x99, 0x00, 0x01, ++ 0x00, 0x1F, 0x30, 0xAC, 0x30, 0xAE, 0x30, 0xB0, 0x30, 0xB2, 0x30, 0xB4, 0x30, 0xB6, 0x30, 0xB8, ++ 0x30, 0xBA, 0x30, 0xBC, 0x30, 0xBE, 0x30, 0xC0, 0x30, 0xC2, 0x30, 0xC5, 0x30, 0xC7, 0x30, 0xC9, ++ 0x30, 0xD0, 0x30, 0xD1, 0x30, 0xD3, 0x30, 0xD4, 0x30, 0xD6, 0x30, 0xD7, 0x30, 0xD9, 0x30, 0xDA, ++ 0x30, 0xDC, 0x30, 0xDD, 0x30, 0xF4, 0x30, 0xF7, 0x30, 0xF8, 0x30, 0xF9, 0x30, 0xFA, 0x30, 0xFE, ++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x1E, 0x9A, 0x00, 0x89, 0x01, 0x18, ++ 0x02, 0x72, 0x02, 0x8C, 0x02, 0xE6, 0x03, 0x18, 0x04, 0x3E, 0x04, 0x48, 0x04, 0x8A, 0x04, 0xC4, ++ 0x05, 0x6A, 0x05, 0x74, 0x05, 0xA6, 0x05, 0xF4, 0x06, 0x16, 0x06, 0x70, 0x08, 0x56, 0x08, 0x70, ++ 0x08, 0xCE, 0x09, 0x42, 0x09, 0x7C, 0x0B, 0x14, 0x0B, 0x26, 0x0B, 0x68, 0x0B, 0x7A, 0x0B, 0xD4, ++ 0x0C, 0x0E, 0x0D, 0x68, 0x0D, 0x82, 0x0D, 0xDC, 0x0E, 0x0E, 0x0F, 0x34, 0x0F, 0x3E, 0x0F, 0x80, ++ 0x0F, 0xC2, 0x10, 0x60, 0x10, 0x72, 0x10, 0xA4, 0x10, 0xF2, 0x11, 0x14, 0x11, 0x6E, 0x13, 0x54, ++ 0x13, 0x6E, 0x13, 0xCC, 0x14, 0x40, 0x14, 0x82, 0x16, 0x1A, 0x16, 0x2C, 0x16, 0x76, 0x16, 0x88, ++ 0x16, 0xEA, 0x17, 0x24, 0x17, 0x5E, 0x17, 0x68, 0x17, 0x7A, 0x17, 0x94, 0x17, 0xA6, 0x17, 0xE0, ++ 0x17, 0xF2, 0x17, 0xFC, 0x18, 0x06, 0x18, 0x40, 0x18, 0x6A, 0x18, 0x74, 0x18, 0x86, 0x18, 0x90, ++ 0x18, 0x9A, 0x18, 0xCC, 0x19, 0x06, 0x19, 0x10, 0x19, 0x22, 0x19, 0x3C, 0x19, 0x4E, 0x19, 0x88, ++ 0x19, 0x9A, 0x19, 0xA4, 0x19, 0xAE, 0x19, 0xE8, 0x1A, 0x12, 0x1A, 0x1C, 0x1A, 0x2E, 0x1A, 0x38, ++ 0x1A, 0x42, 0x1A, 0x74, 0x1A, 0xAE, 0x1A, 0xE8, 0x1A, 0xF2, 0x1A, 0xFC, 0x1B, 0x1E, 0x1B, 0x40, ++ 0x1B, 0x4A, 0x1B, 0x54, 0x1B, 0x7E, 0x1B, 0xA8, 0x1B, 0xB2, 0x1B, 0xBC, 0x1B, 0xC6, 0x1B, 0xD0, ++ 0x1B, 0xEA, 0x1C, 0x04, 0x1C, 0x0E, 0x1C, 0x18, 0x1C, 0x22, 0x1C, 0x5C, 0x1C, 0x96, 0x1C, 0xD0, ++ 0x1D, 0x0A, 0x1D, 0x14, 0x1D, 0x1E, 0x1D, 0x28, 0x1D, 0x32, 0x1D, 0x3C, 0x1D, 0x46, 0x1D, 0x50, ++ 0x1D, 0x5A, 0x1D, 0x64, 0x1D, 0x6E, 0x1D, 0x78, 0x1D, 0x82, 0x1D, 0x8C, 0x1D, 0x96, 0x1D, 0xA0, ++ 0x1D, 0xAA, 0x1D, 0xB4, 0x1D, 0xBE, 0x1D, 0xD0, 0x1D, 0xE2, 0x1D, 0xEC, 0x1D, 0xF6, 0x1E, 0x08, ++ 0x1E, 0x1A, 0x1E, 0x24, 0x1E, 0x2E, 0x1E, 0x38, 0x1E, 0x42, 0x1E, 0x4C, 0x1E, 0x56, 0x1E, 0x88, + 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, + 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, + 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0, + 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, +- 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4E, 0x01, 0x54, 0x00, 0xE0, +- 0x00, 0x02, 0x03, 0x00, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, +- 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xAB, 0x00, 0x03, 0x03, 0x02, +- 0x03, 0x03, 0x1E, 0xA9, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xAD, 0x00, 0x03, 0x03, 0x02, +- 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, +- 0x03, 0x41, 0x00, 0xE2, 0x00, 0x02, 0x03, 0x02, 0x00, 0xE3, 0x00, 0x02, 0x03, 0x03, 0x01, 0x01, +- 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB1, 0x00, 0x03, 0x03, 0x06, 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x03, +- 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x03, 0x03, 0x06, 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x03, +- 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x06, 0x03, 0x23, 0x1E, 0xB1, 0x00, 0x03, +- 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x03, 0x03, 0x06, 0x03, 0x41, 0x01, 0x03, 0x00, 0x02, +- 0x03, 0x06, 0x01, 0xE1, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x27, 0x00, 0x02, 0x03, 0x07, +- 0x01, 0xDF, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xE4, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA3, +- 0x00, 0x02, 0x03, 0x09, 0x01, 0xFB, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x01, 0x01, 0xFB, 0x00, 0x03, +- 0x03, 0x0A, 0x03, 0x41, 0x00, 0xE5, 0x00, 0x02, 0x03, 0x0A, 0x01, 0xCE, 0x00, 0x02, 0x03, 0x0C, +- 0x02, 0x01, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x03, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xAD, 0x00, 0x03, +- 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x23, 0x03, 0x06, 0x1E, 0xA1, 0x00, 0x02, +- 0x03, 0x23, 0x1E, 0x01, 0x00, 0x02, 0x03, 0x25, 0x01, 0x05, 0x00, 0x02, 0x03, 0x28, 0x00, 0xE0, +- 0x00, 0x02, 0x03, 0x40, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, +- 0x00, 0x14, 0x1E, 0x03, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x05, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x07, ++ 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4E, 0x01, 0x54, 0x00, 0xC0, ++ 0x00, 0x02, 0x03, 0x00, 0x00, 0xC1, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xA6, 0x00, 0x03, 0x03, 0x02, ++ 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x03, 0x03, 0x02, ++ 0x03, 0x03, 0x1E, 0xA8, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xAC, 0x00, 0x03, 0x03, 0x02, ++ 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xA4, 0x00, 0x03, 0x03, 0x02, ++ 0x03, 0x41, 0x00, 0xC2, 0x00, 0x02, 0x03, 0x02, 0x00, 0xC3, 0x00, 0x02, 0x03, 0x03, 0x01, 0x00, ++ 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB0, 0x00, 0x03, 0x03, 0x06, 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x03, ++ 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB4, 0x00, 0x03, 0x03, 0x06, 0x03, 0x03, 0x1E, 0xB2, 0x00, 0x03, ++ 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB6, 0x00, 0x03, 0x03, 0x06, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x03, ++ 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAE, 0x00, 0x03, 0x03, 0x06, 0x03, 0x41, 0x01, 0x02, 0x00, 0x02, ++ 0x03, 0x06, 0x01, 0xE0, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x26, 0x00, 0x02, 0x03, 0x07, ++ 0x01, 0xDE, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xC4, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA2, ++ 0x00, 0x02, 0x03, 0x09, 0x01, 0xFA, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x03, ++ 0x03, 0x0A, 0x03, 0x41, 0x00, 0xC5, 0x00, 0x02, 0x03, 0x0A, 0x01, 0xCD, 0x00, 0x02, 0x03, 0x0C, ++ 0x02, 0x00, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x02, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xAC, 0x00, 0x03, ++ 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB6, 0x00, 0x03, 0x03, 0x23, 0x03, 0x06, 0x1E, 0xA0, 0x00, 0x02, ++ 0x03, 0x23, 0x1E, 0x00, 0x00, 0x02, 0x03, 0x25, 0x01, 0x04, 0x00, 0x02, 0x03, 0x28, 0x00, 0xC0, ++ 0x00, 0x02, 0x03, 0x40, 0x00, 0xC1, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, ++ 0x00, 0x14, 0x1E, 0x02, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x04, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x06, + 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, +- 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x01, +- 0x03, 0x27, 0x01, 0x07, 0x00, 0x02, 0x03, 0x01, 0x01, 0x09, 0x00, 0x02, 0x03, 0x02, 0x01, 0x0B, +- 0x00, 0x02, 0x03, 0x07, 0x01, 0x0D, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, +- 0x03, 0x01, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, 0x03, 0x41, 0x00, 0xE7, 0x00, 0x02, 0x03, 0x27, +- 0x1E, 0x09, 0x00, 0x03, 0x03, 0x41, 0x03, 0x27, 0x01, 0x07, 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, +- 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x0B, 0x00, 0x02, +- 0x03, 0x07, 0x01, 0x0F, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x0D, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x11, +- 0x00, 0x02, 0x03, 0x27, 0x1E, 0x13, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x0F, 0x00, 0x02, 0x03, 0x31, ++ 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x01, ++ 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, 0x03, 0x01, 0x01, 0x08, 0x00, 0x02, 0x03, 0x02, 0x01, 0x0A, ++ 0x00, 0x02, 0x03, 0x07, 0x01, 0x0C, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x27, ++ 0x03, 0x01, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x27, 0x03, 0x41, 0x00, 0xC7, 0x00, 0x02, 0x03, 0x27, ++ 0x1E, 0x08, 0x00, 0x03, 0x03, 0x41, 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, ++ 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x0A, 0x00, 0x02, ++ 0x03, 0x07, 0x01, 0x0E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x0C, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x10, ++ 0x00, 0x02, 0x03, 0x27, 0x1E, 0x12, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x0E, 0x00, 0x02, 0x03, 0x31, + 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, + 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, + 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, + 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14, +- 0x01, 0x1A, 0x01, 0x20, 0x00, 0xE8, 0x00, 0x02, 0x03, 0x00, 0x00, 0xE9, 0x00, 0x02, 0x03, 0x01, +- 0x1E, 0xC1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xBF, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, +- 0x1E, 0xC5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xC3, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, +- 0x1E, 0xC7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xC1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, +- 0x1E, 0xBF, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xEA, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBD, +- 0x00, 0x02, 0x03, 0x03, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x17, 0x00, 0x03, +- 0x03, 0x04, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x17, 0x00, 0x03, +- 0x03, 0x04, 0x03, 0x41, 0x01, 0x13, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x06, +- 0x03, 0x27, 0x01, 0x15, 0x00, 0x02, 0x03, 0x06, 0x01, 0x17, 0x00, 0x02, 0x03, 0x07, 0x00, 0xEB, +- 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBB, 0x00, 0x02, 0x03, 0x09, 0x01, 0x1B, 0x00, 0x02, 0x03, 0x0C, +- 0x02, 0x05, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x07, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xC7, 0x00, 0x03, +- 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB9, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x27, +- 0x03, 0x06, 0x02, 0x29, 0x00, 0x02, 0x03, 0x27, 0x01, 0x19, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x19, +- 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1B, 0x00, 0x02, 0x03, 0x30, 0x00, 0xE8, 0x00, 0x02, 0x03, 0x40, +- 0x00, 0xE9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1F, 0x00, 0x02, 0x03, 0x07, ++ 0x01, 0x1A, 0x01, 0x20, 0x00, 0xC8, 0x00, 0x02, 0x03, 0x00, 0x00, 0xC9, 0x00, 0x02, 0x03, 0x01, ++ 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, ++ 0x1E, 0xC4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xC2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, ++ 0x1E, 0xC6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, ++ 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xCA, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBC, ++ 0x00, 0x02, 0x03, 0x03, 0x1E, 0x14, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x16, 0x00, 0x03, ++ 0x03, 0x04, 0x03, 0x01, 0x1E, 0x14, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x16, 0x00, 0x03, ++ 0x03, 0x04, 0x03, 0x41, 0x01, 0x12, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x06, ++ 0x03, 0x27, 0x01, 0x14, 0x00, 0x02, 0x03, 0x06, 0x01, 0x16, 0x00, 0x02, 0x03, 0x07, 0x00, 0xCB, ++ 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBA, 0x00, 0x02, 0x03, 0x09, 0x01, 0x1A, 0x00, 0x02, 0x03, 0x0C, ++ 0x02, 0x04, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x06, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xC6, 0x00, 0x03, ++ 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB8, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x27, ++ 0x03, 0x06, 0x02, 0x28, 0x00, 0x02, 0x03, 0x27, 0x01, 0x18, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x18, ++ 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1A, 0x00, 0x02, 0x03, 0x30, 0x00, 0xC8, 0x00, 0x02, 0x03, 0x40, ++ 0x00, 0xC9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1E, 0x00, 0x02, 0x03, 0x07, + 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, +- 0x00, 0x3C, 0x01, 0xF5, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1D, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x21, +- 0x00, 0x02, 0x03, 0x04, 0x01, 0x1F, 0x00, 0x02, 0x03, 0x06, 0x01, 0x21, 0x00, 0x02, 0x03, 0x07, +- 0x01, 0xE7, 0x00, 0x02, 0x03, 0x0C, 0x01, 0x23, 0x00, 0x02, 0x03, 0x27, 0x01, 0xF5, 0x00, 0x02, +- 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, +- 0x00, 0x36, 0x00, 0x3C, 0x01, 0x25, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x23, 0x00, 0x02, 0x03, 0x07, +- 0x1E, 0x27, 0x00, 0x02, 0x03, 0x08, 0x02, 0x1F, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x25, 0x00, 0x02, +- 0x03, 0x23, 0x1E, 0x29, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x2B, 0x00, 0x02, 0x03, 0x2E, 0x1E, 0x96, +- 0x00, 0x02, 0x03, 0x31, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, +- 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, +- 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0x00, 0xEC, 0x00, 0x02, +- 0x03, 0x00, 0x00, 0xED, 0x00, 0x02, 0x03, 0x01, 0x00, 0xEE, 0x00, 0x02, 0x03, 0x02, 0x01, 0x29, +- 0x00, 0x02, 0x03, 0x03, 0x01, 0x2B, 0x00, 0x02, 0x03, 0x04, 0x01, 0x2D, 0x00, 0x02, 0x03, 0x06, +- 0x1E, 0x2F, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1E, 0x2F, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, +- 0x00, 0xEF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xC9, 0x00, 0x02, 0x03, 0x09, 0x01, 0xD0, 0x00, 0x02, +- 0x03, 0x0C, 0x02, 0x09, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0B, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCB, +- 0x00, 0x02, 0x03, 0x23, 0x01, 0x2F, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x2D, 0x00, 0x02, 0x03, 0x30, +- 0x00, 0xEC, 0x00, 0x02, 0x03, 0x40, 0x00, 0xED, 0x00, 0x02, 0x03, 0x41, 0x1E, 0x2F, 0x00, 0x02, +- 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0x35, 0x00, 0x02, 0x03, 0x02, 0x01, 0xF0, +- 0x00, 0x02, 0x03, 0x0C, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, +- 0x00, 0x2C, 0x1E, 0x31, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE9, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x33, +- 0x00, 0x02, 0x03, 0x23, 0x01, 0x37, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x35, 0x00, 0x02, 0x03, 0x31, +- 0x1E, 0x31, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, +- 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x01, 0x3A, 0x00, 0x02, 0x03, 0x01, +- 0x1E, 0x39, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x01, 0x3E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x39, +- 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x37, 0x00, 0x02, 0x03, 0x23, 0x01, 0x3C, 0x00, 0x02, +- 0x03, 0x27, 0x1E, 0x3D, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x3B, 0x00, 0x02, 0x03, 0x31, 0x01, 0x3A, +- 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x3F, +- 0x00, 0x02, 0x03, 0x01, 0x1E, 0x41, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x43, 0x00, 0x02, 0x03, 0x23, +- 0x1E, 0x3F, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, +- 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x01, 0xF9, +- 0x00, 0x02, 0x03, 0x00, 0x01, 0x44, 0x00, 0x02, 0x03, 0x01, 0x00, 0xF1, 0x00, 0x02, 0x03, 0x03, +- 0x1E, 0x45, 0x00, 0x02, 0x03, 0x07, 0x01, 0x48, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x47, 0x00, 0x02, +- 0x03, 0x23, 0x01, 0x46, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x4B, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x49, +- 0x00, 0x02, 0x03, 0x31, 0x01, 0xF9, 0x00, 0x02, 0x03, 0x40, 0x01, 0x44, 0x00, 0x02, 0x03, 0x41, +- 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, +- 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, +- 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, +- 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x4A, +- 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, +- 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBC, +- 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xE0, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x00, +- 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, +- 0x00, 0xF3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD3, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xD1, +- 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xD5, +- 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD9, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xD3, +- 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xF4, +- 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x2D, 0x00, 0x03, +- 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x03, 0x03, 0x03, 0x03, 0x08, 0x1E, 0xE1, 0x00, 0x03, +- 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x00, 0xF5, 0x00, 0x02, +- 0x03, 0x03, 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, +- 0x03, 0x01, 0x01, 0xED, 0x00, 0x03, 0x03, 0x04, 0x03, 0x28, 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, +- 0x03, 0x40, 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x4D, 0x00, 0x02, 0x03, 0x04, +- 0x01, 0x4F, 0x00, 0x02, 0x03, 0x06, 0x02, 0x31, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x2F, +- 0x00, 0x02, 0x03, 0x07, 0x02, 0x2B, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xF6, 0x00, 0x02, +- 0x03, 0x08, 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xCF, 0x00, 0x02, 0x03, 0x09, +- 0x01, 0x51, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD2, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x0D, 0x00, 0x02, +- 0x03, 0x0F, 0x02, 0x0F, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, +- 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xE1, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, +- 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xE3, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, +- 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, +- 0x01, 0xA1, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD9, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xE3, +- 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCD, 0x00, 0x02, 0x03, 0x23, 0x01, 0xED, 0x00, 0x03, +- 0x03, 0x28, 0x03, 0x04, 0x01, 0xEB, 0x00, 0x02, 0x03, 0x28, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x40, +- 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, +- 0x00, 0xF3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x55, +- 0x00, 0x02, 0x03, 0x01, 0x1E, 0x57, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x55, 0x00, 0x02, 0x03, 0x41, +- 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, +- 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x01, 0x55, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x5D, +- 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x59, 0x00, 0x02, 0x03, 0x07, 0x01, 0x59, 0x00, 0x02, +- 0x03, 0x0C, 0x02, 0x11, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x13, 0x00, 0x02, 0x03, 0x11, 0x1E, 0x5D, +- 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5B, 0x00, 0x02, 0x03, 0x23, 0x01, 0x57, 0x00, 0x02, +- 0x03, 0x27, 0x1E, 0x5F, 0x00, 0x02, 0x03, 0x31, 0x01, 0x55, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0D, +- 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, +- 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6E, 0x1E, 0x65, 0x00, 0x03, 0x03, 0x01, +- 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, 0x03, 0x01, 0x01, 0x5D, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x69, +- 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x61, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x67, 0x00, 0x03, +- 0x03, 0x0C, 0x03, 0x07, 0x01, 0x61, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x69, 0x00, 0x03, 0x03, 0x23, +- 0x03, 0x07, 0x1E, 0x63, 0x00, 0x02, 0x03, 0x23, 0x02, 0x19, 0x00, 0x02, 0x03, 0x26, 0x01, 0x5F, +- 0x00, 0x02, 0x03, 0x27, 0x1E, 0x65, 0x00, 0x03, 0x03, 0x41, 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, +- 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, +- 0x00, 0x36, 0x00, 0x3C, 0x1E, 0x6B, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x97, 0x00, 0x02, 0x03, 0x08, +- 0x01, 0x65, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x6D, 0x00, 0x02, 0x03, 0x23, 0x02, 0x1B, 0x00, 0x02, +- 0x03, 0x26, 0x01, 0x63, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x71, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6F, ++ 0x00, 0x3C, 0x01, 0xF4, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1C, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x20, ++ 0x00, 0x02, 0x03, 0x04, 0x01, 0x1E, 0x00, 0x02, 0x03, 0x06, 0x01, 0x20, 0x00, 0x02, 0x03, 0x07, ++ 0x01, 0xE6, 0x00, 0x02, 0x03, 0x0C, 0x01, 0x22, 0x00, 0x02, 0x03, 0x27, 0x01, 0xF4, 0x00, 0x02, ++ 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, ++ 0x00, 0x34, 0x01, 0x24, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x22, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x26, ++ 0x00, 0x02, 0x03, 0x08, 0x02, 0x1E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x24, 0x00, 0x02, 0x03, 0x23, ++ 0x1E, 0x28, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x2A, 0x00, 0x02, 0x03, 0x2E, 0x00, 0x14, 0x00, 0x2A, ++ 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, ++ 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, ++ 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xCC, 0x00, 0x02, 0x03, 0x00, 0x00, 0xCD, 0x00, 0x02, ++ 0x03, 0x01, 0x00, 0xCE, 0x00, 0x02, 0x03, 0x02, 0x01, 0x28, 0x00, 0x02, 0x03, 0x03, 0x01, 0x2A, ++ 0x00, 0x02, 0x03, 0x04, 0x01, 0x2C, 0x00, 0x02, 0x03, 0x06, 0x01, 0x30, 0x00, 0x02, 0x03, 0x07, ++ 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, ++ 0x00, 0xCF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xC8, 0x00, 0x02, 0x03, 0x09, 0x01, 0xCF, 0x00, 0x02, ++ 0x03, 0x0C, 0x02, 0x08, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0A, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCA, ++ 0x00, 0x02, 0x03, 0x23, 0x01, 0x2E, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x2C, 0x00, 0x02, 0x03, 0x30, ++ 0x00, 0xCC, 0x00, 0x02, 0x03, 0x40, 0x00, 0xCD, 0x00, 0x02, 0x03, 0x41, 0x1E, 0x2E, 0x00, 0x02, ++ 0x03, 0x44, 0x00, 0x01, 0x00, 0x04, 0x01, 0x34, 0x00, 0x02, 0x03, 0x02, 0x00, 0x06, 0x00, 0x0E, ++ 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x01, ++ 0x01, 0xE8, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, 0x00, 0x02, ++ 0x03, 0x27, 0x1E, 0x34, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, ++ 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, ++ 0x00, 0x48, 0x01, 0x39, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x38, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, ++ 0x01, 0x3D, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x38, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x36, ++ 0x00, 0x02, 0x03, 0x23, 0x01, 0x3B, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x3C, 0x00, 0x02, 0x03, 0x2D, ++ 0x1E, 0x3A, 0x00, 0x02, 0x03, 0x31, 0x01, 0x39, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, ++ 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x40, 0x00, 0x02, ++ 0x03, 0x07, 0x1E, 0x42, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, ++ 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, ++ 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x01, 0xF8, 0x00, 0x02, 0x03, 0x00, 0x01, 0x43, 0x00, 0x02, ++ 0x03, 0x01, 0x00, 0xD1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x44, 0x00, 0x02, 0x03, 0x07, 0x01, 0x47, ++ 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x46, 0x00, 0x02, 0x03, 0x23, 0x01, 0x45, 0x00, 0x02, 0x03, 0x27, ++ 0x1E, 0x4A, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x48, 0x00, 0x02, 0x03, 0x31, 0x01, 0xF8, 0x00, 0x02, ++ 0x03, 0x40, 0x01, 0x43, 0x00, 0x02, 0x03, 0x41, 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, ++ 0x00, 0x80, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, ++ 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, ++ 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, ++ 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, ++ 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, ++ 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, ++ 0x01, 0xE0, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x00, ++ 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD2, ++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xD0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD6, ++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xD4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD8, ++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xD2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD0, ++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xD4, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4C, 0x00, 0x03, ++ 0x03, 0x03, 0x03, 0x01, 0x02, 0x2C, 0x00, 0x03, 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4E, 0x00, 0x03, ++ 0x03, 0x03, 0x03, 0x08, 0x1E, 0xE0, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x03, ++ 0x03, 0x03, 0x03, 0x41, 0x00, 0xD5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x50, 0x00, 0x03, 0x03, 0x04, ++ 0x03, 0x00, 0x1E, 0x52, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0xEC, 0x00, 0x03, 0x03, 0x04, ++ 0x03, 0x28, 0x1E, 0x50, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x52, 0x00, 0x03, 0x03, 0x04, ++ 0x03, 0x41, 0x01, 0x4C, 0x00, 0x02, 0x03, 0x04, 0x01, 0x4E, 0x00, 0x02, 0x03, 0x06, 0x02, 0x30, ++ 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x2E, 0x00, 0x02, 0x03, 0x07, 0x02, 0x2A, 0x00, 0x03, ++ 0x03, 0x08, 0x03, 0x04, 0x00, 0xD6, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x09, ++ 0x03, 0x1B, 0x1E, 0xCE, 0x00, 0x02, 0x03, 0x09, 0x01, 0x50, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD1, ++ 0x00, 0x02, 0x03, 0x0C, 0x02, 0x0C, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0E, 0x00, 0x02, 0x03, 0x11, ++ 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, ++ 0x1E, 0xE0, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, ++ 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, ++ 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xA0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD8, ++ 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCC, ++ 0x00, 0x02, 0x03, 0x23, 0x01, 0xEC, 0x00, 0x03, 0x03, 0x28, 0x03, 0x04, 0x01, 0xEA, 0x00, 0x02, ++ 0x03, 0x28, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x40, ++ 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, ++ 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x54, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x56, 0x00, 0x02, ++ 0x03, 0x07, 0x1E, 0x54, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, ++ 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, ++ 0x01, 0x54, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x58, ++ 0x00, 0x02, 0x03, 0x07, 0x01, 0x58, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x10, 0x00, 0x02, 0x03, 0x0F, ++ 0x02, 0x12, 0x00, 0x02, 0x03, 0x11, 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5A, ++ 0x00, 0x02, 0x03, 0x23, 0x01, 0x56, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x5E, 0x00, 0x02, 0x03, 0x31, ++ 0x01, 0x54, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, ++ 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, ++ 0x00, 0x6E, 0x1E, 0x64, 0x00, 0x03, 0x03, 0x01, 0x03, 0x07, 0x01, 0x5A, 0x00, 0x02, 0x03, 0x01, ++ 0x01, 0x5C, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x68, 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x60, ++ 0x00, 0x02, 0x03, 0x07, 0x1E, 0x66, 0x00, 0x03, 0x03, 0x0C, 0x03, 0x07, 0x01, 0x60, 0x00, 0x02, ++ 0x03, 0x0C, 0x1E, 0x68, 0x00, 0x03, 0x03, 0x23, 0x03, 0x07, 0x1E, 0x62, 0x00, 0x02, 0x03, 0x23, ++ 0x02, 0x18, 0x00, 0x02, 0x03, 0x26, 0x01, 0x5E, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x64, 0x00, 0x03, ++ 0x03, 0x41, 0x03, 0x07, 0x01, 0x5A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, ++ 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0x6A, 0x00, 0x02, 0x03, 0x07, ++ 0x01, 0x64, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x6C, 0x00, 0x02, 0x03, 0x23, 0x02, 0x1A, 0x00, 0x02, ++ 0x03, 0x26, 0x01, 0x62, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x70, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6E, + 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, + 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, + 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE, + 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0C, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, + 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E, + 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92, +- 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xF9, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, +- 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x00, 0xFB, 0x00, 0x02, +- 0x03, 0x02, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x03, 0x03, 0x03, +- 0x03, 0x1B, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x01, 0x69, 0x00, 0x02, 0x03, 0x03, +- 0x1E, 0x7B, 0x00, 0x03, 0x03, 0x04, 0x03, 0x08, 0x01, 0x6B, 0x00, 0x02, 0x03, 0x04, 0x01, 0x6D, +- 0x00, 0x02, 0x03, 0x06, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x01, 0xD8, 0x00, 0x03, +- 0x03, 0x08, 0x03, 0x01, 0x01, 0xD6, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x01, 0xDA, 0x00, 0x03, +- 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x01, 0xD8, 0x00, 0x03, +- 0x03, 0x08, 0x03, 0x41, 0x00, 0xFC, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xED, 0x00, 0x03, 0x03, 0x09, +- 0x03, 0x1B, 0x1E, 0xE7, 0x00, 0x02, 0x03, 0x09, 0x01, 0x6F, 0x00, 0x02, 0x03, 0x0A, 0x01, 0x71, +- 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD4, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x15, 0x00, 0x02, 0x03, 0x0F, +- 0x02, 0x17, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE9, +- 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xED, +- 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xF1, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEB, +- 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xB0, +- 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF1, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xE5, 0x00, 0x02, +- 0x03, 0x23, 0x1E, 0x73, 0x00, 0x02, 0x03, 0x24, 0x01, 0x73, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x77, +- 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x75, 0x00, 0x02, 0x03, 0x30, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x40, +- 0x03, 0x1B, 0x00, 0xF9, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, +- 0x00, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x01, 0xD8, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, +- 0x00, 0x0C, 0x1E, 0x7D, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7F, 0x00, 0x02, 0x03, 0x23, 0x00, 0x09, +- 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, +- 0x00, 0x44, 0x1E, 0x81, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x83, 0x00, 0x02, 0x03, 0x01, 0x01, 0x75, +- 0x00, 0x02, 0x03, 0x02, 0x1E, 0x87, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x85, 0x00, 0x02, 0x03, 0x08, +- 0x1E, 0x98, 0x00, 0x02, 0x03, 0x0A, 0x1E, 0x89, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x81, 0x00, 0x02, +- 0x03, 0x40, 0x1E, 0x83, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x8B, +- 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8D, 0x00, 0x02, 0x03, 0x08, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, +- 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, +- 0x00, 0x56, 0x00, 0x5C, 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x00, 0x00, 0xFD, 0x00, 0x02, 0x03, 0x01, +- 0x01, 0x77, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF9, 0x00, 0x02, 0x03, 0x03, 0x02, 0x33, 0x00, 0x02, +- 0x03, 0x04, 0x1E, 0x8F, 0x00, 0x02, 0x03, 0x07, 0x00, 0xFF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF7, +- 0x00, 0x02, 0x03, 0x09, 0x1E, 0x99, 0x00, 0x02, 0x03, 0x0A, 0x1E, 0xF5, 0x00, 0x02, 0x03, 0x23, +- 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x40, 0x00, 0xFD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, +- 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x7A, 0x00, 0x02, +- 0x03, 0x01, 0x1E, 0x91, 0x00, 0x02, 0x03, 0x02, 0x01, 0x7C, 0x00, 0x02, 0x03, 0x07, 0x01, 0x7E, +- 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x93, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x95, 0x00, 0x02, 0x03, 0x31, +- 0x01, 0x7A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, +- 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA6, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x02, +- 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xA8, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAC, +- 0x00, 0x02, 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xA4, 0x00, 0x02, 0x03, 0x41, +- 0x00, 0x01, 0x00, 0x04, 0x01, 0xDE, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, +- 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, +- 0x00, 0x0E, 0x00, 0x14, 0x01, 0xFC, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE2, 0x00, 0x02, 0x03, 0x04, +- 0x01, 0xFC, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x08, 0x00, 0x02, +- 0x03, 0x01, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, +- 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xC0, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBE, +- 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC4, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xC2, 0x00, 0x02, 0x03, 0x09, +- 0x1E, 0xC6, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xBE, 0x00, 0x02, +- 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x2E, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2E, +- 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, +- 0x00, 0x04, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, +- 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xD2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD0, +- 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD6, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xD4, 0x00, 0x02, 0x03, 0x09, +- 0x1E, 0xD8, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xD0, 0x00, 0x02, +- 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4C, +- 0x00, 0x02, 0x03, 0x01, 0x02, 0x2C, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x4E, 0x00, 0x02, 0x03, 0x08, +- 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, +- 0x02, 0x2A, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFE, 0x00, 0x02, +- 0x03, 0x01, 0x01, 0xFE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEA, 0x00, 0x02, +- 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE8, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, +- 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x01, 0xDB, 0x00, 0x02, 0x03, 0x00, +- 0x01, 0xD7, 0x00, 0x02, 0x03, 0x01, 0x01, 0xD5, 0x00, 0x02, 0x03, 0x04, 0x01, 0xD9, 0x00, 0x02, +- 0x03, 0x0C, 0x01, 0xDB, 0x00, 0x02, 0x03, 0x40, 0x01, 0xD7, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, +- 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA7, +- 0x00, 0x02, 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xAB, 0x00, 0x02, 0x03, 0x03, +- 0x1E, 0xA9, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAD, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x02, +- 0x03, 0x40, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x01, 0xDF, 0x00, 0x02, +- 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFB, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFB, +- 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x01, 0xFD, 0x00, 0x02, +- 0x03, 0x01, 0x01, 0xE3, 0x00, 0x02, 0x03, 0x04, 0x01, 0xFD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, +- 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x41, +- 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, +- 0x1E, 0xC1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBF, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC5, 0x00, 0x02, +- 0x03, 0x03, 0x1E, 0xC3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xC7, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC1, +- 0x00, 0x02, 0x03, 0x40, 0x1E, 0xBF, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, +- 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, +- 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x1B, +- 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, +- 0x1E, 0xD3, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD1, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x02, +- 0x03, 0x03, 0x1E, 0xD5, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xD9, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD3, +- 0x00, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, +- 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4D, 0x00, 0x02, 0x03, 0x01, 0x02, 0x2D, 0x00, 0x02, +- 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xE1, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4D, +- 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x02, 0x2B, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, +- 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFF, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFF, 0x00, 0x02, 0x03, 0x41, +- 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE9, +- 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, +- 0x00, 0x2C, 0x01, 0xDC, 0x00, 0x02, 0x03, 0x00, 0x01, 0xD8, 0x00, 0x02, 0x03, 0x01, 0x01, 0xD6, +- 0x00, 0x02, 0x03, 0x04, 0x01, 0xDA, 0x00, 0x02, 0x03, 0x0C, 0x01, 0xDC, 0x00, 0x02, 0x03, 0x40, +- 0x01, 0xD8, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, +- 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xB0, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x02, +- 0x03, 0x01, 0x1E, 0xB4, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xB2, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB6, +- 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xAE, 0x00, 0x02, 0x03, 0x41, +- 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, +- 0x1E, 0xB1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x02, +- 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB7, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB1, +- 0x00, 0x02, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x08, +- 0x00, 0x02, 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x27, 0x00, 0x04, +- 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x14, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x16, +- 0x00, 0x02, 0x03, 0x01, 0x1E, 0x14, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x16, 0x00, 0x02, 0x03, 0x41, +- 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x15, 0x00, 0x02, 0x03, 0x00, +- 0x1E, 0x17, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x17, 0x00, 0x02, +- 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, +- 0x1E, 0x1D, 0x00, 0x02, 0x03, 0x27, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, +- 0x00, 0x24, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x52, 0x00, 0x02, 0x03, 0x01, 0x01, 0xEC, +- 0x00, 0x02, 0x03, 0x28, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x52, 0x00, 0x02, 0x03, 0x41, +- 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x51, 0x00, 0x02, +- 0x03, 0x00, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x01, 0x01, 0xED, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x51, +- 0x00, 0x02, 0x03, 0x40, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x64, +- 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x65, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, +- 0x00, 0x04, 0x1E, 0x66, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x67, 0x00, 0x02, +- 0x03, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x78, 0x00, 0x02, 0x03, 0x01, +- 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, +- 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x79, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x02, 0x03, 0x1B, +- 0x1E, 0x79, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x7A, 0x00, 0x02, 0x03, 0x08, +- 0x00, 0x01, 0x00, 0x04, 0x1E, 0x7B, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x9B, +- 0x00, 0x02, 0x03, 0x07, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, +- 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x01, +- 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xE2, 0x00, 0x02, +- 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, +- 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDD, +- 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xE1, 0x00, 0x02, 0x03, 0x03, +- 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xE3, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xDD, 0x00, 0x02, +- 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, +- 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xEA, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, +- 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xEC, 0x00, 0x02, 0x03, 0x09, +- 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xEA, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x02, ++ 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, ++ 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xDA, 0x00, 0x02, 0x03, 0x01, 0x00, 0xDB, 0x00, 0x02, ++ 0x03, 0x02, 0x1E, 0x78, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x03, ++ 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x01, 0x68, 0x00, 0x02, 0x03, 0x03, ++ 0x1E, 0x7A, 0x00, 0x03, 0x03, 0x04, 0x03, 0x08, 0x01, 0x6A, 0x00, 0x02, 0x03, 0x04, 0x01, 0x6C, ++ 0x00, 0x02, 0x03, 0x06, 0x01, 0xDB, 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x01, 0xD7, 0x00, 0x03, ++ 0x03, 0x08, 0x03, 0x01, 0x01, 0xD5, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x01, 0xD9, 0x00, 0x03, ++ 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDB, 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x01, 0xD7, 0x00, 0x03, ++ 0x03, 0x08, 0x03, 0x41, 0x00, 0xDC, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xEC, 0x00, 0x03, 0x03, 0x09, ++ 0x03, 0x1B, 0x1E, 0xE6, 0x00, 0x02, 0x03, 0x09, 0x01, 0x6E, 0x00, 0x02, 0x03, 0x0A, 0x01, 0x70, ++ 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD3, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x14, 0x00, 0x02, 0x03, 0x0F, ++ 0x02, 0x16, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE8, ++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xEC, ++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xF0, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEA, ++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xAF, ++ 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF0, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xE4, 0x00, 0x02, ++ 0x03, 0x23, 0x1E, 0x72, 0x00, 0x02, 0x03, 0x24, 0x01, 0x72, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x76, ++ 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x74, 0x00, 0x02, 0x03, 0x30, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x40, ++ 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, ++ 0x00, 0xDA, 0x00, 0x02, 0x03, 0x41, 0x01, 0xD7, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, ++ 0x00, 0x0C, 0x1E, 0x7C, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7E, 0x00, 0x02, 0x03, 0x23, 0x00, 0x08, ++ 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, ++ 0x1E, 0x80, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x82, 0x00, 0x02, 0x03, 0x01, 0x01, 0x74, 0x00, 0x02, ++ 0x03, 0x02, 0x1E, 0x86, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x84, 0x00, 0x02, 0x03, 0x08, 0x1E, 0x88, ++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0x80, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x82, 0x00, 0x02, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x8A, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8C, 0x00, 0x02, ++ 0x03, 0x08, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, ++ 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x00, ++ 0x00, 0xDD, 0x00, 0x02, 0x03, 0x01, 0x01, 0x76, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF8, 0x00, 0x02, ++ 0x03, 0x03, 0x02, 0x32, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x8E, 0x00, 0x02, 0x03, 0x07, 0x01, 0x78, ++ 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF6, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF4, 0x00, 0x02, 0x03, 0x23, ++ 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x40, 0x00, 0xDD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, ++ 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x79, 0x00, 0x02, ++ 0x03, 0x01, 0x1E, 0x90, 0x00, 0x02, 0x03, 0x02, 0x01, 0x7B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x7D, ++ 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x92, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x94, 0x00, 0x02, 0x03, 0x31, ++ 0x01, 0x79, 0x00, 0x02, 0x03, 0x41, 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, ++ 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, ++ 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, ++ 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x14, ++ 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x48, ++ 0x01, 0x4E, 0x01, 0x54, 0x00, 0xE0, 0x00, 0x02, 0x03, 0x00, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x01, ++ 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, ++ 0x1E, 0xAB, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xA9, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, ++ 0x1E, 0xAD, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, ++ 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xE2, 0x00, 0x02, 0x03, 0x02, 0x00, 0xE3, ++ 0x00, 0x02, 0x03, 0x03, 0x01, 0x01, 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB1, 0x00, 0x03, 0x03, 0x06, ++ 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x03, 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x03, 0x03, 0x06, ++ 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x03, 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x06, ++ 0x03, 0x23, 0x1E, 0xB1, 0x00, 0x03, 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x03, 0x03, 0x06, ++ 0x03, 0x41, 0x01, 0x03, 0x00, 0x02, 0x03, 0x06, 0x01, 0xE1, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, ++ 0x02, 0x27, 0x00, 0x02, 0x03, 0x07, 0x01, 0xDF, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xE4, ++ 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA3, 0x00, 0x02, 0x03, 0x09, 0x01, 0xFB, 0x00, 0x03, 0x03, 0x0A, ++ 0x03, 0x01, 0x01, 0xFB, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x41, 0x00, 0xE5, 0x00, 0x02, 0x03, 0x0A, ++ 0x01, 0xCE, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x01, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x03, 0x00, 0x02, ++ 0x03, 0x11, 0x1E, 0xAD, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x23, ++ 0x03, 0x06, 0x1E, 0xA1, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x01, 0x00, 0x02, 0x03, 0x25, 0x01, 0x05, ++ 0x00, 0x02, 0x03, 0x28, 0x00, 0xE0, 0x00, 0x02, 0x03, 0x40, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x03, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x05, ++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0x07, 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, ++ 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, ++ 0x1E, 0x09, 0x00, 0x03, 0x03, 0x01, 0x03, 0x27, 0x01, 0x07, 0x00, 0x02, 0x03, 0x01, 0x01, 0x09, ++ 0x00, 0x02, 0x03, 0x02, 0x01, 0x0B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0D, 0x00, 0x02, 0x03, 0x0C, ++ 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, 0x03, 0x01, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, 0x03, 0x41, ++ 0x00, 0xE7, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x41, 0x03, 0x27, 0x01, 0x07, ++ 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, ++ 0x00, 0x2C, 0x1E, 0x0B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0F, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x0D, ++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0x11, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x13, 0x00, 0x02, 0x03, 0x2D, ++ 0x1E, 0x0F, 0x00, 0x02, 0x03, 0x31, 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, ++ 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, ++ 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, ++ 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x02, ++ 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x00, 0xE8, 0x00, 0x02, 0x03, 0x00, ++ 0x00, 0xE9, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xBF, ++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xC5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xC3, ++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xC7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xC1, ++ 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xBF, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xEA, ++ 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBD, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, ++ 0x03, 0x00, 0x1E, 0x17, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, ++ 0x03, 0x40, 0x1E, 0x17, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x13, 0x00, 0x02, 0x03, 0x04, ++ 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x06, 0x03, 0x27, 0x01, 0x15, 0x00, 0x02, 0x03, 0x06, 0x01, 0x17, ++ 0x00, 0x02, 0x03, 0x07, 0x00, 0xEB, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBB, 0x00, 0x02, 0x03, 0x09, ++ 0x01, 0x1B, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x05, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x07, 0x00, 0x02, ++ 0x03, 0x11, 0x1E, 0xC7, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB9, 0x00, 0x02, 0x03, 0x23, ++ 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x27, 0x03, 0x06, 0x02, 0x29, 0x00, 0x02, 0x03, 0x27, 0x01, 0x19, ++ 0x00, 0x02, 0x03, 0x28, 0x1E, 0x19, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1B, 0x00, 0x02, 0x03, 0x30, ++ 0x00, 0xE8, 0x00, 0x02, 0x03, 0x40, 0x00, 0xE9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, ++ 0x1E, 0x1F, 0x00, 0x02, 0x03, 0x07, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, ++ 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x01, 0xF5, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1D, ++ 0x00, 0x02, 0x03, 0x02, 0x1E, 0x21, 0x00, 0x02, 0x03, 0x04, 0x01, 0x1F, 0x00, 0x02, 0x03, 0x06, ++ 0x01, 0x21, 0x00, 0x02, 0x03, 0x07, 0x01, 0xE7, 0x00, 0x02, 0x03, 0x0C, 0x01, 0x23, 0x00, 0x02, ++ 0x03, 0x27, 0x01, 0xF5, 0x00, 0x02, 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, ++ 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x01, 0x25, 0x00, 0x02, 0x03, 0x02, ++ 0x1E, 0x23, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x27, 0x00, 0x02, 0x03, 0x08, 0x02, 0x1F, 0x00, 0x02, ++ 0x03, 0x0C, 0x1E, 0x25, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x29, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x2B, ++ 0x00, 0x02, 0x03, 0x2E, 0x1E, 0x96, 0x00, 0x02, 0x03, 0x31, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, ++ 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, ++ 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, ++ 0x00, 0x98, 0x00, 0xEC, 0x00, 0x02, 0x03, 0x00, 0x00, 0xED, 0x00, 0x02, 0x03, 0x01, 0x00, 0xEE, ++ 0x00, 0x02, 0x03, 0x02, 0x01, 0x29, 0x00, 0x02, 0x03, 0x03, 0x01, 0x2B, 0x00, 0x02, 0x03, 0x04, ++ 0x01, 0x2D, 0x00, 0x02, 0x03, 0x06, 0x1E, 0x2F, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1E, 0x2F, ++ 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xEF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xC9, 0x00, 0x02, ++ 0x03, 0x09, 0x01, 0xD0, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x09, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0B, ++ 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCB, 0x00, 0x02, 0x03, 0x23, 0x01, 0x2F, 0x00, 0x02, 0x03, 0x28, ++ 0x1E, 0x2D, 0x00, 0x02, 0x03, 0x30, 0x00, 0xEC, 0x00, 0x02, 0x03, 0x40, 0x00, 0xED, 0x00, 0x02, ++ 0x03, 0x41, 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0x35, ++ 0x00, 0x02, 0x03, 0x02, 0x01, 0xF0, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, ++ 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x31, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE9, ++ 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x33, 0x00, 0x02, 0x03, 0x23, 0x01, 0x37, 0x00, 0x02, 0x03, 0x27, ++ 0x1E, 0x35, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x31, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, 0x00, 0x14, ++ 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, ++ 0x01, 0x3A, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x39, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x01, 0x3E, ++ 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x39, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x37, 0x00, 0x02, ++ 0x03, 0x23, 0x01, 0x3C, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x3D, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x3B, ++ 0x00, 0x02, 0x03, 0x31, 0x01, 0x3A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, ++ 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x3F, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x41, 0x00, 0x02, 0x03, 0x07, ++ 0x1E, 0x43, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x3F, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, ++ 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, ++ 0x00, 0x4E, 0x00, 0x54, 0x01, 0xF9, 0x00, 0x02, 0x03, 0x00, 0x01, 0x44, 0x00, 0x02, 0x03, 0x01, ++ 0x00, 0xF1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x45, 0x00, 0x02, 0x03, 0x07, 0x01, 0x48, 0x00, 0x02, ++ 0x03, 0x0C, 0x1E, 0x47, 0x00, 0x02, 0x03, 0x23, 0x01, 0x46, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x4B, ++ 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x49, 0x00, 0x02, 0x03, 0x31, 0x01, 0xF9, 0x00, 0x02, 0x03, 0x40, ++ 0x01, 0x44, 0x00, 0x02, 0x03, 0x41, 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, ++ 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, ++ 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xFA, ++ 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x34, ++ 0x01, 0x3C, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x68, ++ 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA6, ++ 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xE0, ++ 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, ++ 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xF3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD3, 0x00, 0x03, ++ 0x03, 0x02, 0x03, 0x00, 0x1E, 0xD1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x03, ++ 0x03, 0x02, 0x03, 0x03, 0x1E, 0xD5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD9, 0x00, 0x03, ++ 0x03, 0x02, 0x03, 0x23, 0x1E, 0xD3, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x03, ++ 0x03, 0x02, 0x03, 0x41, 0x00, 0xF4, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, ++ 0x03, 0x01, 0x02, 0x2D, 0x00, 0x03, 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x03, 0x03, 0x03, ++ 0x03, 0x08, 0x1E, 0xE1, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, ++ 0x03, 0x41, 0x00, 0xF5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, ++ 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0xED, 0x00, 0x03, 0x03, 0x04, 0x03, 0x28, ++ 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, ++ 0x01, 0x4D, 0x00, 0x02, 0x03, 0x04, 0x01, 0x4F, 0x00, 0x02, 0x03, 0x06, 0x02, 0x31, 0x00, 0x03, ++ 0x03, 0x07, 0x03, 0x04, 0x02, 0x2F, 0x00, 0x02, 0x03, 0x07, 0x02, 0x2B, 0x00, 0x03, 0x03, 0x08, ++ 0x03, 0x04, 0x00, 0xF6, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, ++ 0x1E, 0xCF, 0x00, 0x02, 0x03, 0x09, 0x01, 0x51, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD2, 0x00, 0x02, ++ 0x03, 0x0C, 0x02, 0x0D, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0F, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xDD, ++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xE1, ++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xE3, ++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xDB, ++ 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xA1, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD9, 0x00, 0x03, ++ 0x03, 0x23, 0x03, 0x02, 0x1E, 0xE3, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCD, 0x00, 0x02, ++ 0x03, 0x23, 0x01, 0xED, 0x00, 0x03, 0x03, 0x28, 0x03, 0x04, 0x01, 0xEB, 0x00, 0x02, 0x03, 0x28, ++ 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDB, ++ 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xF3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, ++ 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x55, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x57, 0x00, 0x02, 0x03, 0x07, ++ 0x1E, 0x55, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, ++ 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x01, 0x55, ++ 0x00, 0x02, 0x03, 0x01, 0x1E, 0x5D, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x59, 0x00, 0x02, ++ 0x03, 0x07, 0x01, 0x59, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x11, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x13, ++ 0x00, 0x02, 0x03, 0x11, 0x1E, 0x5D, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5B, 0x00, 0x02, ++ 0x03, 0x23, 0x01, 0x57, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x5F, 0x00, 0x02, 0x03, 0x31, 0x01, 0x55, ++ 0x00, 0x02, 0x03, 0x41, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, ++ 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6E, ++ 0x1E, 0x65, 0x00, 0x03, 0x03, 0x01, 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, 0x03, 0x01, 0x01, 0x5D, ++ 0x00, 0x02, 0x03, 0x02, 0x1E, 0x69, 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x61, 0x00, 0x02, ++ 0x03, 0x07, 0x1E, 0x67, 0x00, 0x03, 0x03, 0x0C, 0x03, 0x07, 0x01, 0x61, 0x00, 0x02, 0x03, 0x0C, ++ 0x1E, 0x69, 0x00, 0x03, 0x03, 0x23, 0x03, 0x07, 0x1E, 0x63, 0x00, 0x02, 0x03, 0x23, 0x02, 0x19, ++ 0x00, 0x02, 0x03, 0x26, 0x01, 0x5F, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x65, 0x00, 0x03, 0x03, 0x41, ++ 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, ++ 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x1E, 0x6B, 0x00, 0x02, 0x03, 0x07, ++ 0x1E, 0x97, 0x00, 0x02, 0x03, 0x08, 0x01, 0x65, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x6D, 0x00, 0x02, ++ 0x03, 0x23, 0x02, 0x1B, 0x00, 0x02, 0x03, 0x26, 0x01, 0x63, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x71, ++ 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6F, 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D, 0x00, 0x5C, 0x00, 0x64, ++ 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9C, ++ 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8, ++ 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0C, ++ 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, ++ 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7E, ++ 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xF9, ++ 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xFA, 0x00, 0x02, ++ 0x03, 0x01, 0x00, 0xFB, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, ++ 0x1E, 0xEF, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, ++ 0x01, 0x69, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7B, 0x00, 0x03, 0x03, 0x04, 0x03, 0x08, 0x01, 0x6B, ++ 0x00, 0x02, 0x03, 0x04, 0x01, 0x6D, 0x00, 0x02, 0x03, 0x06, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, ++ 0x03, 0x00, 0x01, 0xD8, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x01, 0xD6, 0x00, 0x03, 0x03, 0x08, ++ 0x03, 0x04, 0x01, 0xDA, 0x00, 0x03, 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, ++ 0x03, 0x40, 0x01, 0xD8, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xFC, 0x00, 0x02, 0x03, 0x08, ++ 0x1E, 0xED, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xE7, 0x00, 0x02, 0x03, 0x09, 0x01, 0x6F, ++ 0x00, 0x02, 0x03, 0x0A, 0x01, 0x71, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD4, 0x00, 0x02, 0x03, 0x0C, ++ 0x02, 0x15, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x17, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xEB, 0x00, 0x03, ++ 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x03, ++ 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xED, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xF1, 0x00, 0x03, ++ 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x03, ++ 0x03, 0x1B, 0x03, 0x41, 0x01, 0xB0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF1, 0x00, 0x03, 0x03, 0x23, ++ 0x03, 0x1B, 0x1E, 0xE5, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x73, 0x00, 0x02, 0x03, 0x24, 0x01, 0x73, ++ 0x00, 0x02, 0x03, 0x28, 0x1E, 0x77, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x75, 0x00, 0x02, 0x03, 0x30, ++ 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xF9, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, ++ 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x01, 0xD8, 0x00, 0x02, ++ 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x7D, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7F, ++ 0x00, 0x02, 0x03, 0x23, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, ++ 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x1E, 0x81, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x83, ++ 0x00, 0x02, 0x03, 0x01, 0x01, 0x75, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x87, 0x00, 0x02, 0x03, 0x07, ++ 0x1E, 0x85, 0x00, 0x02, 0x03, 0x08, 0x1E, 0x98, 0x00, 0x02, 0x03, 0x0A, 0x1E, 0x89, 0x00, 0x02, ++ 0x03, 0x23, 0x1E, 0x81, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x83, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, ++ 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x8B, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8D, 0x00, 0x02, 0x03, 0x08, ++ 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, ++ 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x00, ++ 0x00, 0xFD, 0x00, 0x02, 0x03, 0x01, 0x01, 0x77, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF9, 0x00, 0x02, ++ 0x03, 0x03, 0x02, 0x33, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x8F, 0x00, 0x02, 0x03, 0x07, 0x00, 0xFF, ++ 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF7, 0x00, 0x02, 0x03, 0x09, 0x1E, 0x99, 0x00, 0x02, 0x03, 0x0A, ++ 0x1E, 0xF5, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x40, 0x00, 0xFD, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, +- 0x00, 0x34, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEF, +- 0x00, 0x02, 0x03, 0x03, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF1, 0x00, 0x02, 0x03, 0x23, +- 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, +- 0x01, 0xEE, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x01, 0xEC, 0x00, 0x02, 0x03, 0x04, +- 0x00, 0x01, 0x00, 0x04, 0x01, 0xED, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xE0, +- 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xE1, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, +- 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1D, 0x00, 0x02, +- 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x02, 0x30, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, +- 0x02, 0x31, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xEF, 0x00, 0x02, 0x03, 0x0C, +- 0x00, 0x01, 0x00, 0x04, 0x1E, 0x38, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x39, +- 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x5C, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, +- 0x00, 0x04, 0x1E, 0x5D, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x68, 0x00, 0x02, +- 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x69, 0x00, 0x02, 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, +- 0x1E, 0x68, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x69, 0x00, 0x02, 0x03, 0x07, +- 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAC, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xB6, 0x00, 0x02, +- 0x03, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAD, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xB7, +- 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xC6, 0x00, 0x02, 0x03, 0x02, 0x00, 0x01, +- 0x00, 0x04, 0x1E, 0xC7, 0x00, 0x02, 0x03, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xD8, +- 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE2, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, +- 0x1E, 0xD9, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE3, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, +- 0x1E, 0xDE, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x1B, +- 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF1, +- 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEC, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, +- 0x00, 0x04, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, +- 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE8, 0x00, 0x02, +- 0x03, 0x0C, 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x34, +- 0x00, 0x02, 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, +- 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x89, +- 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, +- 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x4D, 0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50, +- 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, +- 0x00, 0x5A, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, +- 0x00, 0x68, 0x00, 0x69, 0x00, 0x6A, 0x00, 0x6B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x6E, 0x00, 0x6F, +- 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, +- 0x00, 0x79, 0x00, 0x7A, 0x00, 0xC2, 0x00, 0xC4, 0x00, 0xC5, 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xCA, +- 0x00, 0xCF, 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD8, 0x00, 0xD9, +- 0x00, 0xDA, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xE4, 0x00, 0xE5, 0x00, 0xE6, 0x00, 0xE7, 0x00, 0xEA, +- 0x00, 0xEF, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, 0x00, 0xF6, 0x00, 0xF8, 0x00, 0xF9, +- 0x00, 0xFA, 0x00, 0xFC, 0x01, 0x02, 0x01, 0x03, 0x01, 0x06, 0x01, 0x07, 0x01, 0x12, 0x01, 0x13, +- 0x01, 0x14, 0x01, 0x15, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x5A, 0x01, 0x5B, 0x01, 0x60, 0x01, 0x61, +- 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x7F, 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, +- 0x01, 0xB0, 0x01, 0xB7, 0x01, 0xEA, 0x01, 0xEB, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, +- 0x02, 0x2E, 0x02, 0x2F, 0x02, 0x92, 0x1E, 0x36, 0x1E, 0x37, 0x1E, 0x5A, 0x1E, 0x5B, 0x1E, 0x60, +- 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, 0x1E, 0xA0, 0x1E, 0xA1, 0x1E, 0xB8, 0x1E, 0xB9, 0x1E, 0xCC, +- 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xE4, 0x1E, 0xE5, 0x1E, 0xE6, 0x1E, 0xE7, 0x21, 0x2A, +- 0x21, 0x2B, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x14, 0x13, 0x92, 0x1A, 0xA8, 0x1E, 0x46, +- 0x21, 0xB8, 0x22, 0x76, 0x23, 0x04, 0x00, 0x01, 0x0F, 0x96, 0x01, 0xF2, 0x03, 0xEA, 0x03, 0xF0, +- 0x03, 0xF6, 0x03, 0xFC, 0x04, 0x02, 0x04, 0x08, 0x04, 0x0E, 0x04, 0x14, 0x04, 0x1A, 0x04, 0x20, +- 0x04, 0x26, 0x04, 0x2C, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, 0x04, 0x44, 0x04, 0x4A, 0x04, 0x50, +- 0x04, 0x56, 0x04, 0x5C, 0x04, 0x62, 0x04, 0x68, 0x04, 0x6E, 0x04, 0x74, 0x04, 0x7A, 0x04, 0x80, +- 0x04, 0x86, 0x04, 0x8C, 0x04, 0x92, 0x04, 0x98, 0x04, 0x9E, 0x04, 0xA4, 0x04, 0xAA, 0x04, 0xB0, +- 0x04, 0xB6, 0x04, 0xBC, 0x04, 0xC2, 0x04, 0xC8, 0x04, 0xCE, 0x04, 0xD4, 0x04, 0xDA, 0x04, 0xE0, +- 0x04, 0xE6, 0x04, 0xEC, 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x10, +- 0x05, 0x16, 0x05, 0x1C, 0x05, 0x22, 0x05, 0x28, 0x05, 0x2E, 0x05, 0x34, 0x05, 0x3A, 0x05, 0x40, +- 0x05, 0x46, 0x05, 0x4C, 0x05, 0x52, 0x05, 0x58, 0x05, 0x5E, 0x05, 0x64, 0x05, 0x6A, 0x05, 0x70, +- 0x05, 0x76, 0x05, 0x7C, 0x05, 0x82, 0x05, 0x88, 0x05, 0x8E, 0x05, 0x94, 0x05, 0x9A, 0x05, 0xA0, +- 0x05, 0xA6, 0x05, 0xAC, 0x05, 0xB2, 0x05, 0xB8, 0x05, 0xBE, 0x05, 0xC4, 0x05, 0xCA, 0x05, 0xD0, +- 0x05, 0xD6, 0x05, 0xDC, 0x05, 0xE2, 0x05, 0xE8, 0x05, 0xEE, 0x05, 0xF4, 0x05, 0xFA, 0x06, 0x00, +- 0x06, 0x06, 0x06, 0x0C, 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x06, 0x30, +- 0x06, 0x36, 0x06, 0x3C, 0x06, 0x42, 0x06, 0x48, 0x06, 0x4E, 0x06, 0x54, 0x06, 0x5A, 0x06, 0x60, +- 0x06, 0x66, 0x06, 0x6C, 0x06, 0x72, 0x06, 0x78, 0x06, 0x7E, 0x06, 0x84, 0x06, 0x8A, 0x06, 0x90, +- 0x06, 0x96, 0x06, 0x9C, 0x06, 0xA2, 0x06, 0xA8, 0x06, 0xAE, 0x06, 0xB4, 0x06, 0xBA, 0x06, 0xC0, +- 0x06, 0xC6, 0x06, 0xCC, 0x06, 0xD2, 0x06, 0xD8, 0x06, 0xDE, 0x06, 0xE4, 0x06, 0xEA, 0x06, 0xF0, +- 0x06, 0xF6, 0x06, 0xFC, 0x07, 0x02, 0x07, 0x08, 0x07, 0x0E, 0x07, 0x14, 0x07, 0x1A, 0x07, 0x20, +- 0x07, 0x26, 0x07, 0x2C, 0x07, 0x32, 0x07, 0x38, 0x07, 0x3E, 0x07, 0x44, 0x07, 0x4A, 0x07, 0x50, +- 0x07, 0x56, 0x07, 0x5C, 0x07, 0x62, 0x07, 0x68, 0x07, 0x6E, 0x07, 0x74, 0x07, 0x7A, 0x07, 0x80, +- 0x07, 0x86, 0x07, 0x8C, 0x07, 0x92, 0x07, 0x98, 0x07, 0x9E, 0x07, 0xA4, 0x07, 0xAA, 0x07, 0xB0, +- 0x07, 0xB6, 0x07, 0xBC, 0x07, 0xC2, 0x07, 0xC8, 0x07, 0xCE, 0x07, 0xD4, 0x07, 0xDA, 0x07, 0xE0, +- 0x07, 0xE6, 0x07, 0xEC, 0x07, 0xF2, 0x07, 0xF8, 0x07, 0xFE, 0x08, 0x04, 0x08, 0x0A, 0x08, 0x10, +- 0x08, 0x16, 0x08, 0x1C, 0x08, 0x22, 0x08, 0x28, 0x08, 0x2E, 0x08, 0x34, 0x08, 0x3A, 0x08, 0x40, +- 0x08, 0x46, 0x08, 0x4C, 0x08, 0x52, 0x08, 0x58, 0x08, 0x5E, 0x08, 0x64, 0x08, 0x6A, 0x08, 0x70, +- 0x08, 0x76, 0x08, 0x7C, 0x08, 0x82, 0x08, 0x88, 0x08, 0x8E, 0x08, 0x94, 0x08, 0x9A, 0x08, 0xA0, +- 0x08, 0xA6, 0x08, 0xAC, 0x08, 0xB2, 0x08, 0xB8, 0x08, 0xBE, 0x08, 0xC4, 0x08, 0xCA, 0x08, 0xD0, +- 0x08, 0xD6, 0x08, 0xDC, 0x08, 0xE2, 0x08, 0xE8, 0x08, 0xEE, 0x08, 0xF4, 0x08, 0xFA, 0x09, 0x00, +- 0x09, 0x06, 0x09, 0x0C, 0x09, 0x12, 0x09, 0x18, 0x09, 0x1E, 0x09, 0x24, 0x09, 0x2A, 0x09, 0x30, +- 0x09, 0x36, 0x09, 0x3C, 0x09, 0x42, 0x09, 0x48, 0x09, 0x4E, 0x09, 0x54, 0x09, 0x5A, 0x09, 0x60, +- 0x09, 0x66, 0x09, 0x6C, 0x09, 0x72, 0x09, 0x78, 0x09, 0x7E, 0x09, 0x84, 0x09, 0x8A, 0x09, 0x90, +- 0x09, 0x96, 0x09, 0x9C, 0x09, 0xA2, 0x09, 0xA8, 0x09, 0xAE, 0x09, 0xB4, 0x09, 0xBA, 0x09, 0xC0, +- 0x09, 0xC6, 0x09, 0xCC, 0x09, 0xD2, 0x09, 0xD8, 0x09, 0xDE, 0x09, 0xE4, 0x09, 0xEA, 0x09, 0xF0, +- 0x09, 0xF6, 0x09, 0xFC, 0x0A, 0x02, 0x0A, 0x08, 0x0A, 0x0E, 0x0A, 0x14, 0x0A, 0x1A, 0x0A, 0x20, +- 0x0A, 0x26, 0x0A, 0x2C, 0x0A, 0x32, 0x0A, 0x38, 0x0A, 0x3E, 0x0A, 0x44, 0x0A, 0x4A, 0x0A, 0x50, +- 0x0A, 0x56, 0x0A, 0x5C, 0x0A, 0x62, 0x0A, 0x68, 0x0A, 0x6E, 0x0A, 0x74, 0x0A, 0x7A, 0x0A, 0x80, +- 0x0A, 0x86, 0x0A, 0x8C, 0x0A, 0x92, 0x0A, 0x98, 0x0A, 0x9E, 0x0A, 0xA4, 0x0A, 0xAA, 0x0A, 0xB0, +- 0x0A, 0xB6, 0x0A, 0xBC, 0x0A, 0xC2, 0x0A, 0xC8, 0x0A, 0xCE, 0x0A, 0xD4, 0x0A, 0xDA, 0x0A, 0xE0, +- 0x0A, 0xE6, 0x0A, 0xEC, 0x0A, 0xF2, 0x0A, 0xF8, 0x0A, 0xFE, 0x0B, 0x04, 0x0B, 0x0A, 0x0B, 0x10, +- 0x0B, 0x16, 0x0B, 0x1C, 0x0B, 0x22, 0x0B, 0x28, 0x0B, 0x2E, 0x0B, 0x34, 0x0B, 0x3A, 0x0B, 0x40, +- 0x0B, 0x46, 0x0B, 0x4C, 0x0B, 0x52, 0x0B, 0x58, 0x0B, 0x5E, 0x0B, 0x64, 0x0B, 0x6A, 0x0B, 0x70, +- 0x0B, 0x76, 0x0B, 0x7C, 0x0B, 0x82, 0x0B, 0x88, 0x0B, 0x8E, 0x0B, 0x94, 0x0B, 0x9A, 0x0B, 0xA0, +- 0x0B, 0xA6, 0x0B, 0xAC, 0x0B, 0xB2, 0x0B, 0xB8, 0x0B, 0xBE, 0x0B, 0xC4, 0x0B, 0xCA, 0x0B, 0xD0, +- 0x0B, 0xD6, 0x0B, 0xDC, 0x0B, 0xE2, 0x0B, 0xE8, 0x0B, 0xEE, 0x0B, 0xF4, 0x0B, 0xFA, 0x0C, 0x00, +- 0x0C, 0x06, 0x0C, 0x0C, 0x0C, 0x12, 0x0C, 0x18, 0x0C, 0x1E, 0x0C, 0x24, 0x0C, 0x2A, 0x0C, 0x30, +- 0x0C, 0x36, 0x0C, 0x3C, 0x0C, 0x42, 0x0C, 0x48, 0x0C, 0x4E, 0x0C, 0x54, 0x0C, 0x5A, 0x0C, 0x60, +- 0x0C, 0x66, 0x0C, 0x6C, 0x0C, 0x72, 0x0C, 0x78, 0x0C, 0x7E, 0x0C, 0x84, 0x0C, 0x8A, 0x0C, 0x90, +- 0x0C, 0x96, 0x0C, 0x9C, 0x0C, 0xA2, 0x0C, 0xA8, 0x0C, 0xAE, 0x0C, 0xB4, 0x0C, 0xBA, 0x0C, 0xC0, +- 0x0C, 0xC6, 0x0C, 0xCC, 0x0C, 0xD2, 0x0C, 0xD8, 0x0C, 0xDE, 0x0C, 0xE4, 0x0C, 0xEA, 0x0C, 0xF0, +- 0x0C, 0xF6, 0x0C, 0xFC, 0x0D, 0x02, 0x0D, 0x08, 0x0D, 0x0E, 0x0D, 0x14, 0x0D, 0x1A, 0x0D, 0x20, +- 0x0D, 0x26, 0x0D, 0x2C, 0x0D, 0x32, 0x0D, 0x38, 0x0D, 0x3E, 0x0D, 0x44, 0x0D, 0x4A, 0x0D, 0x50, +- 0x0D, 0x56, 0x0D, 0x5C, 0x0D, 0x62, 0x0D, 0x68, 0x0D, 0x6E, 0x0D, 0x74, 0x0D, 0x7A, 0x0D, 0x80, +- 0x0D, 0x86, 0x0D, 0x8C, 0x0D, 0x92, 0x0D, 0x98, 0x0D, 0x9E, 0x0D, 0xA4, 0x0D, 0xAA, 0x0D, 0xB0, +- 0x0D, 0xB6, 0x0D, 0xBC, 0x0D, 0xC2, 0x0D, 0xC8, 0x0D, 0xCE, 0x0D, 0xD4, 0x0D, 0xDA, 0x0D, 0xE0, +- 0x0D, 0xE6, 0x0D, 0xEC, 0x0D, 0xF2, 0x0D, 0xF8, 0x0D, 0xFE, 0x0E, 0x04, 0x0E, 0x0A, 0x0E, 0x10, +- 0x0E, 0x16, 0x0E, 0x1C, 0x0E, 0x22, 0x0E, 0x28, 0x0E, 0x2E, 0x0E, 0x34, 0x0E, 0x3A, 0x0E, 0x40, +- 0x0E, 0x46, 0x0E, 0x4C, 0x0E, 0x52, 0x0E, 0x58, 0x0E, 0x5E, 0x0E, 0x64, 0x0E, 0x6A, 0x0E, 0x70, +- 0x0E, 0x76, 0x0E, 0x7C, 0x0E, 0x82, 0x0E, 0x88, 0x0E, 0x8E, 0x0E, 0x94, 0x0E, 0x9A, 0x0E, 0xA0, +- 0x0E, 0xA6, 0x0E, 0xAC, 0x0E, 0xB2, 0x0E, 0xB8, 0x0E, 0xBE, 0x0E, 0xC4, 0x0E, 0xCA, 0x0E, 0xD0, +- 0x0E, 0xD6, 0x0E, 0xDC, 0x0E, 0xE2, 0x0E, 0xE8, 0x0E, 0xEE, 0x0E, 0xF4, 0x0E, 0xFA, 0x0F, 0x00, +- 0x0F, 0x06, 0x0F, 0x0C, 0x0F, 0x12, 0x0F, 0x18, 0x0F, 0x1E, 0x0F, 0x24, 0x0F, 0x2A, 0x0F, 0x30, +- 0x0F, 0x36, 0x0F, 0x3C, 0x0F, 0x42, 0x0F, 0x48, 0x0F, 0x4E, 0x0F, 0x54, 0x0F, 0x5A, 0x0F, 0x60, +- 0x0F, 0x66, 0x0F, 0x6C, 0x0F, 0x72, 0x0F, 0x78, 0x0F, 0x7E, 0x0F, 0x84, 0x0F, 0x8A, 0x0F, 0x90, +- 0x00, 0x02, 0x00, 0x41, 0x03, 0x00, 0x00, 0x02, 0x00, 0x41, 0x03, 0x01, 0x00, 0x02, 0x00, 0x41, +- 0x03, 0x02, 0x00, 0x02, 0x00, 0x41, 0x03, 0x03, 0x00, 0x02, 0x00, 0x41, 0x03, 0x08, 0x00, 0x02, +- 0x00, 0x41, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x43, 0x03, 0x27, 0x00, 0x02, 0x00, 0x45, 0x03, 0x00, +- 0x00, 0x02, 0x00, 0x45, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, 0x03, 0x02, 0x00, 0x02, 0x00, 0x45, +- 0x03, 0x08, 0x00, 0x02, 0x00, 0x49, 0x03, 0x00, 0x00, 0x02, 0x00, 0x49, 0x03, 0x01, 0x00, 0x02, +- 0x00, 0x49, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x08, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x03, +- 0x00, 0x02, 0x00, 0x4F, 0x03, 0x00, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4F, +- 0x03, 0x02, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x08, 0x00, 0x02, +- 0x00, 0x55, 0x03, 0x00, 0x00, 0x02, 0x00, 0x55, 0x03, 0x01, 0x00, 0x02, 0x00, 0x55, 0x03, 0x02, +- 0x00, 0x02, 0x00, 0x55, 0x03, 0x08, 0x00, 0x02, 0x00, 0x59, 0x03, 0x01, 0x00, 0x02, 0x00, 0x61, +- 0x03, 0x00, 0x00, 0x02, 0x00, 0x61, 0x03, 0x01, 0x00, 0x02, 0x00, 0x61, 0x03, 0x02, 0x00, 0x02, +- 0x00, 0x61, 0x03, 0x03, 0x00, 0x02, 0x00, 0x61, 0x03, 0x08, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0A, +- 0x00, 0x02, 0x00, 0x63, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x00, 0x00, 0x02, 0x00, 0x65, +- 0x03, 0x01, 0x00, 0x02, 0x00, 0x65, 0x03, 0x02, 0x00, 0x02, 0x00, 0x65, 0x03, 0x08, 0x00, 0x02, +- 0x00, 0x69, 0x03, 0x00, 0x00, 0x02, 0x00, 0x69, 0x03, 0x01, 0x00, 0x02, 0x00, 0x69, 0x03, 0x02, +- 0x00, 0x02, 0x00, 0x69, 0x03, 0x08, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x03, 0x00, 0x02, 0x00, 0x6F, +- 0x03, 0x00, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x02, 0x00, 0x02, +- 0x00, 0x6F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x08, 0x00, 0x02, 0x00, 0x75, 0x03, 0x00, +- 0x00, 0x02, 0x00, 0x75, 0x03, 0x01, 0x00, 0x02, 0x00, 0x75, 0x03, 0x02, 0x00, 0x02, 0x00, 0x75, +- 0x03, 0x08, 0x00, 0x02, 0x00, 0x79, 0x03, 0x01, 0x00, 0x02, 0x00, 0x79, 0x03, 0x08, 0x00, 0x02, +- 0x00, 0x41, 0x03, 0x04, 0x00, 0x02, 0x00, 0x61, 0x03, 0x04, 0x00, 0x02, 0x00, 0x41, 0x03, 0x06, +- 0x00, 0x02, 0x00, 0x61, 0x03, 0x06, 0x00, 0x02, 0x00, 0x41, 0x03, 0x28, 0x00, 0x02, 0x00, 0x61, +- 0x03, 0x28, 0x00, 0x02, 0x00, 0x43, 0x03, 0x01, 0x00, 0x02, 0x00, 0x63, 0x03, 0x01, 0x00, 0x02, +- 0x00, 0x43, 0x03, 0x02, 0x00, 0x02, 0x00, 0x63, 0x03, 0x02, 0x00, 0x02, 0x00, 0x43, 0x03, 0x07, +- 0x00, 0x02, 0x00, 0x63, 0x03, 0x07, 0x00, 0x02, 0x00, 0x43, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x63, +- 0x03, 0x0C, 0x00, 0x02, 0x00, 0x44, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x64, 0x03, 0x0C, 0x00, 0x02, +- 0x00, 0x45, 0x03, 0x04, 0x00, 0x02, 0x00, 0x65, 0x03, 0x04, 0x00, 0x02, 0x00, 0x45, 0x03, 0x06, +- 0x00, 0x02, 0x00, 0x65, 0x03, 0x06, 0x00, 0x02, 0x00, 0x45, 0x03, 0x07, 0x00, 0x02, 0x00, 0x65, +- 0x03, 0x07, 0x00, 0x02, 0x00, 0x45, 0x03, 0x28, 0x00, 0x02, 0x00, 0x65, 0x03, 0x28, 0x00, 0x02, +- 0x00, 0x45, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x65, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x47, 0x03, 0x02, +- 0x00, 0x02, 0x00, 0x67, 0x03, 0x02, 0x00, 0x02, 0x00, 0x47, 0x03, 0x06, 0x00, 0x02, 0x00, 0x67, +- 0x03, 0x06, 0x00, 0x02, 0x00, 0x47, 0x03, 0x07, 0x00, 0x02, 0x00, 0x67, 0x03, 0x07, 0x00, 0x02, +- 0x00, 0x47, 0x03, 0x27, 0x00, 0x02, 0x00, 0x67, 0x03, 0x27, 0x00, 0x02, 0x00, 0x48, 0x03, 0x02, +- 0x00, 0x02, 0x00, 0x68, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x03, 0x00, 0x02, 0x00, 0x69, +- 0x03, 0x03, 0x00, 0x02, 0x00, 0x49, 0x03, 0x04, 0x00, 0x02, 0x00, 0x69, 0x03, 0x04, 0x00, 0x02, +- 0x00, 0x49, 0x03, 0x06, 0x00, 0x02, 0x00, 0x69, 0x03, 0x06, 0x00, 0x02, 0x00, 0x49, 0x03, 0x28, +- 0x00, 0x02, 0x00, 0x69, 0x03, 0x28, 0x00, 0x02, 0x00, 0x49, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4A, +- 0x03, 0x02, 0x00, 0x02, 0x00, 0x6A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x27, 0x00, 0x02, +- 0x00, 0x6B, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x01, +- 0x00, 0x02, 0x00, 0x4C, 0x03, 0x27, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, +- 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x01, 0x00, 0x02, +- 0x00, 0x6E, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x27, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x27, +- 0x00, 0x02, 0x00, 0x4E, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, +- 0x03, 0x04, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x06, 0x00, 0x02, +- 0x00, 0x6F, 0x03, 0x06, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x0B, +- 0x00, 0x02, 0x00, 0x52, 0x03, 0x01, 0x00, 0x02, 0x00, 0x72, 0x03, 0x01, 0x00, 0x02, 0x00, 0x52, +- 0x03, 0x27, 0x00, 0x02, 0x00, 0x72, 0x03, 0x27, 0x00, 0x02, 0x00, 0x52, 0x03, 0x0C, 0x00, 0x02, +- 0x00, 0x72, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x53, 0x03, 0x01, 0x00, 0x02, 0x00, 0x73, 0x03, 0x01, +- 0x00, 0x02, 0x00, 0x53, 0x03, 0x02, 0x00, 0x02, 0x00, 0x73, 0x03, 0x02, 0x00, 0x02, 0x00, 0x53, +- 0x03, 0x27, 0x00, 0x02, 0x00, 0x73, 0x03, 0x27, 0x00, 0x02, 0x00, 0x53, 0x03, 0x0C, 0x00, 0x02, +- 0x00, 0x73, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x54, 0x03, 0x27, 0x00, 0x02, 0x00, 0x74, 0x03, 0x27, +- 0x00, 0x02, 0x00, 0x54, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x74, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x55, +- 0x03, 0x03, 0x00, 0x02, 0x00, 0x75, 0x03, 0x03, 0x00, 0x02, 0x00, 0x55, 0x03, 0x04, 0x00, 0x02, +- 0x00, 0x75, 0x03, 0x04, 0x00, 0x02, 0x00, 0x55, 0x03, 0x06, 0x00, 0x02, 0x00, 0x75, 0x03, 0x06, +- 0x00, 0x02, 0x00, 0x55, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x55, +- 0x03, 0x0B, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x55, 0x03, 0x28, 0x00, 0x02, +- 0x00, 0x75, 0x03, 0x28, 0x00, 0x02, 0x00, 0x57, 0x03, 0x02, 0x00, 0x02, 0x00, 0x77, 0x03, 0x02, +- 0x00, 0x02, 0x00, 0x59, 0x03, 0x02, 0x00, 0x02, 0x00, 0x79, 0x03, 0x02, 0x00, 0x02, 0x00, 0x59, +- 0x03, 0x08, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x01, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x01, 0x00, 0x02, +- 0x00, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x07, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x0C, +- 0x00, 0x02, 0x00, 0x7A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x6F, +- 0x03, 0x1B, 0x00, 0x02, 0x00, 0x55, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x75, 0x03, 0x1B, 0x00, 0x02, +- 0x00, 0x41, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x49, 0x03, 0x0C, +- 0x00, 0x02, 0x00, 0x69, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6F, +- 0x03, 0x0C, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0C, 0x00, 0x02, +- 0x00, 0xDC, 0x03, 0x04, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x04, 0x00, 0x02, 0x00, 0x55, 0x03, 0x44, +- 0x00, 0x02, 0x00, 0x75, 0x03, 0x44, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x0C, 0x00, 0x02, 0x00, 0xFC, +- 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x00, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x02, +- 0x00, 0xC4, 0x03, 0x04, 0x00, 0x02, 0x00, 0xE4, 0x03, 0x04, 0x00, 0x02, 0x02, 0x26, 0x03, 0x04, +- 0x00, 0x02, 0x02, 0x27, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xE6, +- 0x03, 0x04, 0x00, 0x02, 0x00, 0x47, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x67, 0x03, 0x0C, 0x00, 0x02, +- 0x00, 0x4B, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x28, +- 0x00, 0x02, 0x00, 0x6F, 0x03, 0x28, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x28, 0x00, 0x02, 0x01, 0x4D, +- 0x03, 0x28, 0x00, 0x02, 0x01, 0xB7, 0x03, 0x0C, 0x00, 0x02, 0x02, 0x92, 0x03, 0x0C, 0x00, 0x02, +- 0x00, 0x6A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x47, 0x03, 0x01, 0x00, 0x02, 0x00, 0x67, 0x03, 0x01, +- 0x00, 0x02, 0x00, 0x4E, 0x03, 0x00, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x00, 0x00, 0x02, 0x00, 0xC5, +- 0x03, 0x01, 0x00, 0x02, 0x00, 0xE5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x01, 0x00, 0x02, +- 0x00, 0xE6, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD8, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF8, 0x03, 0x01, +- 0x00, 0x02, 0x00, 0x41, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x41, +- 0x03, 0x11, 0x00, 0x02, 0x00, 0x61, 0x03, 0x11, 0x00, 0x02, 0x00, 0x45, 0x03, 0x0F, 0x00, 0x02, +- 0x00, 0x65, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x45, 0x03, 0x11, 0x00, 0x02, 0x00, 0x65, 0x03, 0x11, +- 0x00, 0x02, 0x00, 0x49, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x69, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x49, +- 0x03, 0x11, 0x00, 0x02, 0x00, 0x69, 0x03, 0x11, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0F, 0x00, 0x02, +- 0x00, 0x6F, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x11, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x11, +- 0x00, 0x02, 0x00, 0x52, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x72, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x52, +- 0x03, 0x11, 0x00, 0x02, 0x00, 0x72, 0x03, 0x11, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0F, 0x00, 0x02, +- 0x00, 0x75, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x55, 0x03, 0x11, 0x00, 0x02, 0x00, 0x75, 0x03, 0x11, +- 0x00, 0x02, 0x00, 0x53, 0x03, 0x26, 0x00, 0x02, 0x00, 0x73, 0x03, 0x26, 0x00, 0x02, 0x00, 0x54, +- 0x03, 0x26, 0x00, 0x02, 0x00, 0x74, 0x03, 0x26, 0x00, 0x02, 0x00, 0x48, 0x03, 0x0C, 0x00, 0x02, +- 0x00, 0x68, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x41, 0x03, 0x07, 0x00, 0x02, 0x00, 0x61, 0x03, 0x07, +- 0x00, 0x02, 0x00, 0x45, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x27, 0x00, 0x02, 0x00, 0xD6, +- 0x03, 0x04, 0x00, 0x02, 0x00, 0xF6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x04, 0x00, 0x02, +- 0x00, 0xF5, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x07, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x07, +- 0x00, 0x02, 0x02, 0x2E, 0x03, 0x04, 0x00, 0x02, 0x02, 0x2F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x59, +- 0x03, 0x04, 0x00, 0x02, 0x00, 0x79, 0x03, 0x04, 0x00, 0x02, 0x00, 0x41, 0x03, 0x25, 0x00, 0x02, +- 0x00, 0x61, 0x03, 0x25, 0x00, 0x02, 0x00, 0x42, 0x03, 0x07, 0x00, 0x02, 0x00, 0x62, 0x03, 0x07, +- 0x00, 0x02, 0x00, 0x42, 0x03, 0x23, 0x00, 0x02, 0x00, 0x62, 0x03, 0x23, 0x00, 0x02, 0x00, 0x42, +- 0x03, 0x31, 0x00, 0x02, 0x00, 0x62, 0x03, 0x31, 0x00, 0x02, 0x00, 0xC7, 0x03, 0x01, 0x00, 0x02, +- 0x00, 0xE7, 0x03, 0x01, 0x00, 0x02, 0x00, 0x44, 0x03, 0x07, 0x00, 0x02, 0x00, 0x64, 0x03, 0x07, +- 0x00, 0x02, 0x00, 0x44, 0x03, 0x23, 0x00, 0x02, 0x00, 0x64, 0x03, 0x23, 0x00, 0x02, 0x00, 0x44, +- 0x03, 0x31, 0x00, 0x02, 0x00, 0x64, 0x03, 0x31, 0x00, 0x02, 0x00, 0x44, 0x03, 0x27, 0x00, 0x02, +- 0x00, 0x64, 0x03, 0x27, 0x00, 0x02, 0x00, 0x44, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x64, 0x03, 0x2D, +- 0x00, 0x02, 0x01, 0x12, 0x03, 0x00, 0x00, 0x02, 0x01, 0x13, 0x03, 0x00, 0x00, 0x02, 0x01, 0x12, +- 0x03, 0x01, 0x00, 0x02, 0x01, 0x13, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, 0x03, 0x2D, 0x00, 0x02, +- 0x00, 0x65, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x45, 0x03, 0x30, 0x00, 0x02, 0x00, 0x65, 0x03, 0x30, +- 0x00, 0x02, 0x01, 0x14, 0x03, 0x27, 0x00, 0x02, 0x01, 0x15, 0x03, 0x27, 0x00, 0x02, 0x00, 0x46, +- 0x03, 0x07, 0x00, 0x02, 0x00, 0x66, 0x03, 0x07, 0x00, 0x02, 0x00, 0x47, 0x03, 0x04, 0x00, 0x02, +- 0x00, 0x67, 0x03, 0x04, 0x00, 0x02, 0x00, 0x48, 0x03, 0x07, 0x00, 0x02, 0x00, 0x68, 0x03, 0x07, +- 0x00, 0x02, 0x00, 0x48, 0x03, 0x23, 0x00, 0x02, 0x00, 0x68, 0x03, 0x23, 0x00, 0x02, 0x00, 0x48, +- 0x03, 0x08, 0x00, 0x02, 0x00, 0x68, 0x03, 0x08, 0x00, 0x02, 0x00, 0x48, 0x03, 0x27, 0x00, 0x02, +- 0x00, 0x68, 0x03, 0x27, 0x00, 0x02, 0x00, 0x48, 0x03, 0x2E, 0x00, 0x02, 0x00, 0x68, 0x03, 0x2E, +- 0x00, 0x02, 0x00, 0x49, 0x03, 0x30, 0x00, 0x02, 0x00, 0x69, 0x03, 0x30, 0x00, 0x02, 0x00, 0x49, +- 0x03, 0x44, 0x00, 0x02, 0x00, 0x69, 0x03, 0x44, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x01, 0x00, 0x02, +- 0x00, 0x6B, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x23, +- 0x00, 0x02, 0x00, 0x4B, 0x03, 0x31, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4C, +- 0x03, 0x23, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x23, 0x00, 0x02, 0x1E, 0x36, 0x03, 0x04, 0x00, 0x02, +- 0x1E, 0x37, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x31, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x31, +- 0x00, 0x02, 0x00, 0x4C, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x4D, +- 0x03, 0x01, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x07, 0x00, 0x02, +- 0x00, 0x6D, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x23, +- 0x00, 0x02, 0x00, 0x4E, 0x03, 0x07, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4E, +- 0x03, 0x23, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x31, 0x00, 0x02, +- 0x00, 0x6E, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x2D, +- 0x00, 0x02, 0x00, 0xD5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD5, +- 0x03, 0x08, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x00, 0x00, 0x02, +- 0x01, 0x4D, 0x03, 0x00, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x01, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x01, +- 0x00, 0x02, 0x00, 0x50, 0x03, 0x01, 0x00, 0x02, 0x00, 0x70, 0x03, 0x01, 0x00, 0x02, 0x00, 0x50, +- 0x03, 0x07, 0x00, 0x02, 0x00, 0x70, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, 0x03, 0x07, 0x00, 0x02, +- 0x00, 0x72, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, 0x03, 0x23, 0x00, 0x02, 0x00, 0x72, 0x03, 0x23, +- 0x00, 0x02, 0x1E, 0x5A, 0x03, 0x04, 0x00, 0x02, 0x1E, 0x5B, 0x03, 0x04, 0x00, 0x02, 0x00, 0x52, +- 0x03, 0x31, 0x00, 0x02, 0x00, 0x72, 0x03, 0x31, 0x00, 0x02, 0x00, 0x53, 0x03, 0x07, 0x00, 0x02, +- 0x00, 0x73, 0x03, 0x07, 0x00, 0x02, 0x00, 0x53, 0x03, 0x23, 0x00, 0x02, 0x00, 0x73, 0x03, 0x23, +- 0x00, 0x02, 0x01, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x01, 0x5B, 0x03, 0x07, 0x00, 0x02, 0x01, 0x60, +- 0x03, 0x07, 0x00, 0x02, 0x01, 0x61, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x60, 0x03, 0x23, 0x00, 0x02, +- 0x1E, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x54, 0x03, 0x07, 0x00, 0x02, 0x00, 0x74, 0x03, 0x07, +- 0x00, 0x02, 0x00, 0x54, 0x03, 0x23, 0x00, 0x02, 0x00, 0x74, 0x03, 0x23, 0x00, 0x02, 0x00, 0x54, +- 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x31, 0x00, 0x02, 0x00, 0x54, 0x03, 0x2D, 0x00, 0x02, +- 0x00, 0x74, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x55, 0x03, 0x24, 0x00, 0x02, 0x00, 0x75, 0x03, 0x24, +- 0x00, 0x02, 0x00, 0x55, 0x03, 0x30, 0x00, 0x02, 0x00, 0x75, 0x03, 0x30, 0x00, 0x02, 0x00, 0x55, +- 0x03, 0x2D, 0x00, 0x02, 0x00, 0x75, 0x03, 0x2D, 0x00, 0x02, 0x01, 0x68, 0x03, 0x01, 0x00, 0x02, +- 0x01, 0x69, 0x03, 0x01, 0x00, 0x02, 0x01, 0x6A, 0x03, 0x08, 0x00, 0x02, 0x01, 0x6B, 0x03, 0x08, +- 0x00, 0x02, 0x00, 0x56, 0x03, 0x03, 0x00, 0x02, 0x00, 0x76, 0x03, 0x03, 0x00, 0x02, 0x00, 0x56, +- 0x03, 0x23, 0x00, 0x02, 0x00, 0x76, 0x03, 0x23, 0x00, 0x02, 0x00, 0x57, 0x03, 0x00, 0x00, 0x02, +- 0x00, 0x77, 0x03, 0x00, 0x00, 0x02, 0x00, 0x57, 0x03, 0x01, 0x00, 0x02, 0x00, 0x77, 0x03, 0x01, +- 0x00, 0x02, 0x00, 0x57, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, 0x03, 0x08, 0x00, 0x02, 0x00, 0x57, +- 0x03, 0x07, 0x00, 0x02, 0x00, 0x77, 0x03, 0x07, 0x00, 0x02, 0x00, 0x57, 0x03, 0x23, 0x00, 0x02, +- 0x00, 0x77, 0x03, 0x23, 0x00, 0x02, 0x00, 0x58, 0x03, 0x07, 0x00, 0x02, 0x00, 0x78, 0x03, 0x07, +- 0x00, 0x02, 0x00, 0x58, 0x03, 0x08, 0x00, 0x02, 0x00, 0x78, 0x03, 0x08, 0x00, 0x02, 0x00, 0x59, +- 0x03, 0x07, 0x00, 0x02, 0x00, 0x79, 0x03, 0x07, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x02, 0x00, 0x02, +- 0x00, 0x7A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x23, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x23, +- 0x00, 0x02, 0x00, 0x5A, 0x03, 0x31, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x31, 0x00, 0x02, 0x00, 0x68, +- 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, 0x03, 0x0A, 0x00, 0x02, +- 0x00, 0x79, 0x03, 0x0A, 0x00, 0x02, 0x01, 0x7F, 0x03, 0x07, 0x00, 0x02, 0x00, 0x41, 0x03, 0x23, +- 0x00, 0x02, 0x00, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x41, 0x03, 0x09, 0x00, 0x02, 0x00, 0x61, +- 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x01, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x01, 0x00, 0x02, +- 0x00, 0xC2, 0x03, 0x00, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x00, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x09, +- 0x00, 0x02, 0x00, 0xE2, 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x03, 0x00, 0x02, 0x00, 0xE2, +- 0x03, 0x03, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x23, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x23, 0x00, 0x02, +- 0x01, 0x02, 0x03, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x01, 0x00, 0x02, 0x01, 0x02, 0x03, 0x00, +- 0x00, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, 0x02, 0x01, 0x02, 0x03, 0x09, 0x00, 0x02, 0x01, 0x03, +- 0x03, 0x09, 0x00, 0x02, 0x01, 0x02, 0x03, 0x03, 0x00, 0x02, 0x01, 0x03, 0x03, 0x03, 0x00, 0x02, +- 0x01, 0x02, 0x03, 0x23, 0x00, 0x02, 0x01, 0x03, 0x03, 0x23, 0x00, 0x02, 0x00, 0x45, 0x03, 0x23, +- 0x00, 0x02, 0x00, 0x65, 0x03, 0x23, 0x00, 0x02, 0x00, 0x45, 0x03, 0x09, 0x00, 0x02, 0x00, 0x65, +- 0x03, 0x09, 0x00, 0x02, 0x00, 0x45, 0x03, 0x03, 0x00, 0x02, 0x00, 0x65, 0x03, 0x03, 0x00, 0x02, +- 0x00, 0xCA, 0x03, 0x01, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x01, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x00, +- 0x00, 0x02, 0x00, 0xEA, 0x03, 0x00, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x09, 0x00, 0x02, 0x00, 0xEA, +- 0x03, 0x09, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x03, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x03, 0x00, 0x02, +- 0x00, 0xCA, 0x03, 0x23, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x23, 0x00, 0x02, 0x00, 0x49, 0x03, 0x09, +- 0x00, 0x02, 0x00, 0x69, 0x03, 0x09, 0x00, 0x02, 0x00, 0x49, 0x03, 0x23, 0x00, 0x02, 0x00, 0x69, +- 0x03, 0x23, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x23, 0x00, 0x02, +- 0x00, 0x4F, 0x03, 0x09, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x09, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x01, +- 0x00, 0x02, 0x00, 0xF4, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x00, 0x00, 0x02, 0x00, 0xF4, +- 0x03, 0x00, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x09, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x09, 0x00, 0x02, +- 0x00, 0xD4, 0x03, 0x03, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x03, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x23, +- 0x00, 0x02, 0x00, 0xF4, 0x03, 0x23, 0x00, 0x02, 0x00, 0xD3, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF3, +- 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD2, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF2, 0x03, 0x1B, 0x00, 0x02, +- 0x01, 0xA0, 0x03, 0x09, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x09, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x1B, +- 0x00, 0x02, 0x00, 0xF5, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x23, 0x00, 0x02, 0x01, 0xA1, +- 0x03, 0x23, 0x00, 0x02, 0x00, 0x55, 0x03, 0x23, 0x00, 0x02, 0x00, 0x75, 0x03, 0x23, 0x00, 0x02, +- 0x00, 0x55, 0x03, 0x09, 0x00, 0x02, 0x00, 0x75, 0x03, 0x09, 0x00, 0x02, 0x00, 0xDA, 0x03, 0x1B, +- 0x00, 0x02, 0x00, 0xFA, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD9, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF9, +- 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x09, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x09, 0x00, 0x02, +- 0x01, 0x68, 0x03, 0x1B, 0x00, 0x02, 0x01, 0x69, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x23, +- 0x00, 0x02, 0x01, 0xB0, 0x03, 0x23, 0x00, 0x02, 0x00, 0x59, 0x03, 0x00, 0x00, 0x02, 0x00, 0x79, +- 0x03, 0x00, 0x00, 0x02, 0x00, 0x59, 0x03, 0x23, 0x00, 0x02, 0x00, 0x79, 0x03, 0x23, 0x00, 0x02, +- 0x00, 0x59, 0x03, 0x09, 0x00, 0x02, 0x00, 0x79, 0x03, 0x09, 0x00, 0x02, 0x00, 0x59, 0x03, 0x03, +- 0x00, 0x02, 0x00, 0x79, 0x03, 0x03, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0A, 0x00, 0x01, 0x01, 0xF2, +- 0x00, 0xC0, 0x00, 0xC1, 0x00, 0xC2, 0x00, 0xC3, 0x00, 0xC4, 0x00, 0xC5, 0x00, 0xC7, 0x00, 0xC8, +- 0x00, 0xC9, 0x00, 0xCA, 0x00, 0xCB, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xCE, 0x00, 0xCF, 0x00, 0xD1, +- 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDB, +- 0x00, 0xDC, 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE2, 0x00, 0xE3, 0x00, 0xE4, 0x00, 0xE5, +- 0x00, 0xE7, 0x00, 0xE8, 0x00, 0xE9, 0x00, 0xEA, 0x00, 0xEB, 0x00, 0xEC, 0x00, 0xED, 0x00, 0xEE, +- 0x00, 0xEF, 0x00, 0xF1, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, 0x00, 0xF6, 0x00, 0xF9, +- 0x00, 0xFA, 0x00, 0xFB, 0x00, 0xFC, 0x00, 0xFD, 0x00, 0xFF, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, +- 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0A, +- 0x01, 0x0B, 0x01, 0x0C, 0x01, 0x0D, 0x01, 0x0E, 0x01, 0x0F, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, +- 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1A, 0x01, 0x1B, 0x01, 0x1C, +- 0x01, 0x1D, 0x01, 0x1E, 0x01, 0x1F, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, +- 0x01, 0x25, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2A, 0x01, 0x2B, 0x01, 0x2C, 0x01, 0x2D, 0x01, 0x2E, +- 0x01, 0x2F, 0x01, 0x30, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x39, 0x01, 0x3A, +- 0x01, 0x3B, 0x01, 0x3C, 0x01, 0x3D, 0x01, 0x3E, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, +- 0x01, 0x47, 0x01, 0x48, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x4E, 0x01, 0x4F, 0x01, 0x50, 0x01, 0x51, +- 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5A, 0x01, 0x5B, +- 0x01, 0x5C, 0x01, 0x5D, 0x01, 0x5E, 0x01, 0x5F, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, +- 0x01, 0x64, 0x01, 0x65, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x6C, 0x01, 0x6D, +- 0x01, 0x6E, 0x01, 0x6F, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, +- 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7A, 0x01, 0x7B, 0x01, 0x7C, 0x01, 0x7D, +- 0x01, 0x7E, 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, 0x01, 0xB0, 0x01, 0xCD, 0x01, 0xCE, 0x01, 0xCF, +- 0x01, 0xD0, 0x01, 0xD1, 0x01, 0xD2, 0x01, 0xD3, 0x01, 0xD4, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, +- 0x01, 0xD8, 0x01, 0xD9, 0x01, 0xDA, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, +- 0x01, 0xE1, 0x01, 0xE2, 0x01, 0xE3, 0x01, 0xE6, 0x01, 0xE7, 0x01, 0xE8, 0x01, 0xE9, 0x01, 0xEA, +- 0x01, 0xEB, 0x01, 0xEC, 0x01, 0xED, 0x01, 0xEE, 0x01, 0xEF, 0x01, 0xF0, 0x01, 0xF4, 0x01, 0xF5, +- 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFA, 0x01, 0xFB, 0x01, 0xFC, 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, +- 0x02, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, +- 0x02, 0x08, 0x02, 0x09, 0x02, 0x0A, 0x02, 0x0B, 0x02, 0x0C, 0x02, 0x0D, 0x02, 0x0E, 0x02, 0x0F, +- 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, +- 0x02, 0x18, 0x02, 0x19, 0x02, 0x1A, 0x02, 0x1B, 0x02, 0x1E, 0x02, 0x1F, 0x02, 0x26, 0x02, 0x27, +- 0x02, 0x28, 0x02, 0x29, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, 0x02, 0x2D, 0x02, 0x2E, 0x02, 0x2F, +- 0x02, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x1E, 0x00, 0x1E, 0x01, 0x1E, 0x02, 0x1E, 0x03, +- 0x1E, 0x04, 0x1E, 0x05, 0x1E, 0x06, 0x1E, 0x07, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x0A, 0x1E, 0x0B, +- 0x1E, 0x0C, 0x1E, 0x0D, 0x1E, 0x0E, 0x1E, 0x0F, 0x1E, 0x10, 0x1E, 0x11, 0x1E, 0x12, 0x1E, 0x13, +- 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x18, 0x1E, 0x19, 0x1E, 0x1A, 0x1E, 0x1B, +- 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1E, 0x20, 0x1E, 0x21, 0x1E, 0x22, 0x1E, 0x23, +- 0x1E, 0x24, 0x1E, 0x25, 0x1E, 0x26, 0x1E, 0x27, 0x1E, 0x28, 0x1E, 0x29, 0x1E, 0x2A, 0x1E, 0x2B, +- 0x1E, 0x2C, 0x1E, 0x2D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x1E, 0x33, +- 0x1E, 0x34, 0x1E, 0x35, 0x1E, 0x36, 0x1E, 0x37, 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x3A, 0x1E, 0x3B, +- 0x1E, 0x3C, 0x1E, 0x3D, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x40, 0x1E, 0x41, 0x1E, 0x42, 0x1E, 0x43, +- 0x1E, 0x44, 0x1E, 0x45, 0x1E, 0x46, 0x1E, 0x47, 0x1E, 0x48, 0x1E, 0x49, 0x1E, 0x4A, 0x1E, 0x4B, +- 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x4E, 0x1E, 0x4F, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, +- 0x1E, 0x54, 0x1E, 0x55, 0x1E, 0x56, 0x1E, 0x57, 0x1E, 0x58, 0x1E, 0x59, 0x1E, 0x5A, 0x1E, 0x5B, +- 0x1E, 0x5C, 0x1E, 0x5D, 0x1E, 0x5E, 0x1E, 0x5F, 0x1E, 0x60, 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, +- 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x6A, 0x1E, 0x6B, +- 0x1E, 0x6C, 0x1E, 0x6D, 0x1E, 0x6E, 0x1E, 0x6F, 0x1E, 0x70, 0x1E, 0x71, 0x1E, 0x72, 0x1E, 0x73, +- 0x1E, 0x74, 0x1E, 0x75, 0x1E, 0x76, 0x1E, 0x77, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0x7A, 0x1E, 0x7B, +- 0x1E, 0x7C, 0x1E, 0x7D, 0x1E, 0x7E, 0x1E, 0x7F, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, +- 0x1E, 0x84, 0x1E, 0x85, 0x1E, 0x86, 0x1E, 0x87, 0x1E, 0x88, 0x1E, 0x89, 0x1E, 0x8A, 0x1E, 0x8B, +- 0x1E, 0x8C, 0x1E, 0x8D, 0x1E, 0x8E, 0x1E, 0x8F, 0x1E, 0x90, 0x1E, 0x91, 0x1E, 0x92, 0x1E, 0x93, +- 0x1E, 0x94, 0x1E, 0x95, 0x1E, 0x96, 0x1E, 0x97, 0x1E, 0x98, 0x1E, 0x99, 0x1E, 0x9B, 0x1E, 0xA0, +- 0x1E, 0xA1, 0x1E, 0xA2, 0x1E, 0xA3, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xA8, +- 0x1E, 0xA9, 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, +- 0x1E, 0xB1, 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, 0x1E, 0xB5, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xB8, +- 0x1E, 0xB9, 0x1E, 0xBA, 0x1E, 0xBB, 0x1E, 0xBC, 0x1E, 0xBD, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, +- 0x1E, 0xC1, 0x1E, 0xC2, 0x1E, 0xC3, 0x1E, 0xC4, 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xC8, +- 0x1E, 0xC9, 0x1E, 0xCA, 0x1E, 0xCB, 0x1E, 0xCC, 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xD0, +- 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD4, 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, +- 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, +- 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE4, 0x1E, 0xE5, 0x1E, 0xE6, 0x1E, 0xE7, 0x1E, 0xE8, ++ 0x00, 0x34, 0x01, 0x7A, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x91, 0x00, 0x02, 0x03, 0x02, 0x01, 0x7C, ++ 0x00, 0x02, 0x03, 0x07, 0x01, 0x7E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x93, 0x00, 0x02, 0x03, 0x23, ++ 0x1E, 0x95, 0x00, 0x02, 0x03, 0x31, 0x01, 0x7A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, ++ 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA6, 0x00, 0x02, ++ 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xA8, ++ 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAC, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x02, 0x03, 0x40, ++ 0x1E, 0xA4, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x01, 0xDE, 0x00, 0x02, 0x03, 0x04, ++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, ++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x01, 0xFC, 0x00, 0x02, 0x03, 0x01, ++ 0x01, 0xE2, 0x00, 0x02, 0x03, 0x04, 0x01, 0xFC, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, ++ 0x00, 0x0C, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, ++ 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xC0, ++ 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBE, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC4, 0x00, 0x02, 0x03, 0x03, ++ 0x1E, 0xC2, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xC6, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x02, ++ 0x03, 0x40, 0x1E, 0xBE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x2E, ++ 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2E, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDC, ++ 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x07, ++ 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xD2, ++ 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD0, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD6, 0x00, 0x02, 0x03, 0x03, ++ 0x1E, 0xD4, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xD8, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD2, 0x00, 0x02, ++ 0x03, 0x40, 0x1E, 0xD0, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, ++ 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4C, 0x00, 0x02, 0x03, 0x01, 0x02, 0x2C, 0x00, 0x02, 0x03, 0x04, ++ 0x1E, 0x4E, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x02, ++ 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x02, 0x2A, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, ++ 0x00, 0x0C, 0x01, 0xFE, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, ++ 0x00, 0x04, 0x1E, 0xEA, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE8, 0x00, 0x02, ++ 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, ++ 0x01, 0xDB, 0x00, 0x02, 0x03, 0x00, 0x01, 0xD7, 0x00, 0x02, 0x03, 0x01, 0x01, 0xD5, 0x00, 0x02, ++ 0x03, 0x04, 0x01, 0xD9, 0x00, 0x02, 0x03, 0x0C, 0x01, 0xDB, 0x00, 0x02, 0x03, 0x40, 0x01, 0xD7, ++ 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, ++ 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA7, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x01, ++ 0x1E, 0xAB, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xA9, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAD, 0x00, 0x02, ++ 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, ++ 0x00, 0x04, 0x01, 0xDF, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFB, ++ 0x00, 0x02, 0x03, 0x01, 0x01, 0xFB, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, ++ 0x00, 0x14, 0x01, 0xFD, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE3, 0x00, 0x02, 0x03, 0x04, 0x01, 0xFD, ++ 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x01, ++ 0x1E, 0x09, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, ++ 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xC1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBF, 0x00, 0x02, ++ 0x03, 0x01, 0x1E, 0xC5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xC3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xC7, ++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC1, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xBF, 0x00, 0x02, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2F, 0x00, 0x02, ++ 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, ++ 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, ++ 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xD3, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD1, 0x00, 0x02, ++ 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xD5, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xD9, ++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD3, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x02, 0x03, 0x41, ++ 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4D, 0x00, 0x02, ++ 0x03, 0x01, 0x02, 0x2D, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xE1, ++ 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4D, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x02, 0x2B, ++ 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFF, 0x00, 0x02, 0x03, 0x01, ++ 0x01, 0xFF, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x1B, ++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE9, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, ++ 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x01, 0xDC, 0x00, 0x02, 0x03, 0x00, 0x01, 0xD8, ++ 0x00, 0x02, 0x03, 0x01, 0x01, 0xD6, 0x00, 0x02, 0x03, 0x04, 0x01, 0xDA, 0x00, 0x02, 0x03, 0x0C, ++ 0x01, 0xDC, 0x00, 0x02, 0x03, 0x40, 0x01, 0xD8, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, ++ 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xB0, 0x00, 0x02, ++ 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xB4, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xB2, ++ 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB6, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x02, 0x03, 0x40, ++ 0x1E, 0xAE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, ++ 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xB1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x02, ++ 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB7, ++ 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB1, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x02, 0x03, 0x41, ++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x09, ++ 0x00, 0x02, 0x03, 0x27, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x14, ++ 0x00, 0x02, 0x03, 0x00, 0x1E, 0x16, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x14, 0x00, 0x02, 0x03, 0x40, ++ 0x1E, 0x16, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, ++ 0x1E, 0x15, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x17, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x02, ++ 0x03, 0x40, 0x1E, 0x17, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, ++ 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1D, 0x00, 0x02, 0x03, 0x27, 0x00, 0x05, 0x00, 0x0C, ++ 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x52, ++ 0x00, 0x02, 0x03, 0x01, 0x01, 0xEC, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x40, ++ 0x1E, 0x52, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, ++ 0x00, 0x24, 0x1E, 0x51, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x01, 0x01, 0xED, ++ 0x00, 0x02, 0x03, 0x28, 0x1E, 0x51, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x41, ++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0x64, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x65, ++ 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x66, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, ++ 0x00, 0x04, 0x1E, 0x67, 0x00, 0x02, 0x03, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, ++ 0x1E, 0x78, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x02, ++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x79, 0x00, 0x02, 0x03, 0x01, ++ 0x1E, 0xEF, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x79, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, ++ 0x1E, 0x7A, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x7B, 0x00, 0x02, 0x03, 0x08, ++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0x9B, 0x00, 0x02, 0x03, 0x07, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, ++ 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x00, ++ 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x02, ++ 0x03, 0x09, 0x1E, 0xE2, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDA, ++ 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, ++ 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x01, ++ 0x1E, 0xE1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xE3, 0x00, 0x02, ++ 0x03, 0x23, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, ++ 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xEA, ++ 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x03, ++ 0x1E, 0xEC, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xEA, 0x00, 0x02, ++ 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, ++ 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, ++ 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x09, ++ 0x1E, 0xF1, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x02, ++ 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x01, 0xEE, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x01, 0x00, 0x04, ++ 0x01, 0xEC, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xED, 0x00, 0x02, 0x03, 0x04, ++ 0x00, 0x01, 0x00, 0x04, 0x01, 0xE0, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xE1, ++ 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, ++ 0x00, 0x04, 0x1E, 0x1D, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x02, 0x30, 0x00, 0x02, ++ 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x02, 0x31, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, ++ 0x01, 0xEF, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x38, 0x00, 0x02, 0x03, 0x04, ++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0x39, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x5C, ++ 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x5D, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, ++ 0x00, 0x04, 0x1E, 0x68, 0x00, 0x02, 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x69, 0x00, 0x02, ++ 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x68, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, ++ 0x1E, 0x69, 0x00, 0x02, 0x03, 0x07, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAC, 0x00, 0x02, ++ 0x03, 0x02, 0x1E, 0xB6, 0x00, 0x02, 0x03, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAD, ++ 0x00, 0x02, 0x03, 0x02, 0x1E, 0xB7, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xC6, ++ 0x00, 0x02, 0x03, 0x02, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xC7, 0x00, 0x02, 0x03, 0x02, 0x00, 0x02, ++ 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xD8, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE2, 0x00, 0x02, 0x03, 0x1B, ++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xD9, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE3, 0x00, 0x02, ++ 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDE, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, ++ 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x1B, ++ 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF1, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEC, ++ 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, ++ 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, ++ 0x03, 0x01, 0x01, 0xE8, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, ++ 0x00, 0x02, 0x03, 0x27, 0x1E, 0x34, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, ++ 0x03, 0x41, 0x00, 0x01, 0x00, 0x89, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, ++ 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x4D, ++ 0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, ++ 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5A, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, ++ 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6A, 0x00, 0x6B, 0x00, 0x6C, ++ 0x00, 0x6D, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, ++ 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7A, 0x00, 0xC2, 0x00, 0xC4, 0x00, 0xC5, ++ 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xCA, 0x00, 0xCF, 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, ++ 0x00, 0xD6, 0x00, 0xD8, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xE4, 0x00, 0xE5, ++ 0x00, 0xE6, 0x00, 0xE7, 0x00, 0xEA, 0x00, 0xEF, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, ++ 0x00, 0xF6, 0x00, 0xF8, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFC, 0x01, 0x02, 0x01, 0x03, 0x01, 0x06, ++ 0x01, 0x07, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x5A, ++ 0x01, 0x5B, 0x01, 0x60, 0x01, 0x61, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x7F, ++ 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, 0x01, 0xB0, 0x01, 0xB7, 0x01, 0xEA, 0x01, 0xEB, 0x02, 0x26, ++ 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2E, 0x02, 0x2F, 0x02, 0x92, 0x1E, 0x36, 0x1E, 0x37, ++ 0x1E, 0x5A, 0x1E, 0x5B, 0x1E, 0x60, 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, 0x1E, 0xA0, 0x1E, 0xA1, ++ 0x1E, 0xB8, 0x1E, 0xB9, 0x1E, 0xCC, 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xE4, 0x1E, 0xE5, ++ 0x1E, 0xE6, 0x1E, 0xE7, 0x21, 0x2A, 0x21, 0x2B, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x14, ++ 0x13, 0x88, 0x1A, 0x9E, 0x1E, 0x3C, 0x21, 0xAE, 0x22, 0x6C, 0x22, 0xFA, 0x00, 0x01, 0x0F, 0x8E, ++ 0x01, 0xF1, 0x03, 0xE8, 0x03, 0xEE, 0x03, 0xF4, 0x03, 0xFA, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, ++ 0x04, 0x12, 0x04, 0x18, 0x04, 0x1E, 0x04, 0x24, 0x04, 0x2A, 0x04, 0x30, 0x04, 0x36, 0x04, 0x3C, ++ 0x04, 0x42, 0x04, 0x48, 0x04, 0x4E, 0x04, 0x54, 0x04, 0x5A, 0x04, 0x60, 0x04, 0x66, 0x04, 0x6C, ++ 0x04, 0x72, 0x04, 0x78, 0x04, 0x7E, 0x04, 0x84, 0x04, 0x8A, 0x04, 0x90, 0x04, 0x96, 0x04, 0x9C, ++ 0x04, 0xA2, 0x04, 0xA8, 0x04, 0xAE, 0x04, 0xB4, 0x04, 0xBA, 0x04, 0xC0, 0x04, 0xC6, 0x04, 0xCC, ++ 0x04, 0xD2, 0x04, 0xD8, 0x04, 0xDE, 0x04, 0xE4, 0x04, 0xEA, 0x04, 0xF0, 0x04, 0xF6, 0x04, 0xFC, ++ 0x05, 0x02, 0x05, 0x08, 0x05, 0x0E, 0x05, 0x14, 0x05, 0x1A, 0x05, 0x20, 0x05, 0x26, 0x05, 0x2C, ++ 0x05, 0x32, 0x05, 0x38, 0x05, 0x3E, 0x05, 0x44, 0x05, 0x4A, 0x05, 0x50, 0x05, 0x56, 0x05, 0x5C, ++ 0x05, 0x62, 0x05, 0x68, 0x05, 0x6E, 0x05, 0x74, 0x05, 0x7A, 0x05, 0x80, 0x05, 0x86, 0x05, 0x8C, ++ 0x05, 0x92, 0x05, 0x98, 0x05, 0x9E, 0x05, 0xA4, 0x05, 0xAA, 0x05, 0xB0, 0x05, 0xB6, 0x05, 0xBC, ++ 0x05, 0xC2, 0x05, 0xC8, 0x05, 0xCE, 0x05, 0xD4, 0x05, 0xDA, 0x05, 0xE0, 0x05, 0xE6, 0x05, 0xEC, ++ 0x05, 0xF2, 0x05, 0xF8, 0x05, 0xFE, 0x06, 0x04, 0x06, 0x0A, 0x06, 0x10, 0x06, 0x16, 0x06, 0x1C, ++ 0x06, 0x22, 0x06, 0x28, 0x06, 0x2E, 0x06, 0x34, 0x06, 0x3A, 0x06, 0x40, 0x06, 0x46, 0x06, 0x4C, ++ 0x06, 0x52, 0x06, 0x58, 0x06, 0x5E, 0x06, 0x64, 0x06, 0x6A, 0x06, 0x70, 0x06, 0x76, 0x06, 0x7C, ++ 0x06, 0x82, 0x06, 0x88, 0x06, 0x8E, 0x06, 0x94, 0x06, 0x9A, 0x06, 0xA0, 0x06, 0xA6, 0x06, 0xAC, ++ 0x06, 0xB2, 0x06, 0xB8, 0x06, 0xBE, 0x06, 0xC4, 0x06, 0xCA, 0x06, 0xD0, 0x06, 0xD6, 0x06, 0xDC, ++ 0x06, 0xE2, 0x06, 0xE8, 0x06, 0xEE, 0x06, 0xF4, 0x06, 0xFA, 0x07, 0x00, 0x07, 0x06, 0x07, 0x0C, ++ 0x07, 0x12, 0x07, 0x18, 0x07, 0x1E, 0x07, 0x24, 0x07, 0x2A, 0x07, 0x30, 0x07, 0x36, 0x07, 0x3C, ++ 0x07, 0x42, 0x07, 0x48, 0x07, 0x4E, 0x07, 0x54, 0x07, 0x5A, 0x07, 0x60, 0x07, 0x66, 0x07, 0x6C, ++ 0x07, 0x72, 0x07, 0x78, 0x07, 0x7E, 0x07, 0x84, 0x07, 0x8A, 0x07, 0x90, 0x07, 0x96, 0x07, 0x9C, ++ 0x07, 0xA2, 0x07, 0xA8, 0x07, 0xAE, 0x07, 0xB4, 0x07, 0xBA, 0x07, 0xC0, 0x07, 0xC6, 0x07, 0xCC, ++ 0x07, 0xD2, 0x07, 0xD8, 0x07, 0xDE, 0x07, 0xE4, 0x07, 0xEA, 0x07, 0xF0, 0x07, 0xF6, 0x07, 0xFC, ++ 0x08, 0x02, 0x08, 0x08, 0x08, 0x0E, 0x08, 0x14, 0x08, 0x1A, 0x08, 0x20, 0x08, 0x26, 0x08, 0x2C, ++ 0x08, 0x32, 0x08, 0x38, 0x08, 0x3E, 0x08, 0x44, 0x08, 0x4A, 0x08, 0x50, 0x08, 0x56, 0x08, 0x5C, ++ 0x08, 0x62, 0x08, 0x68, 0x08, 0x6E, 0x08, 0x74, 0x08, 0x7A, 0x08, 0x80, 0x08, 0x86, 0x08, 0x8C, ++ 0x08, 0x92, 0x08, 0x98, 0x08, 0x9E, 0x08, 0xA4, 0x08, 0xAA, 0x08, 0xB0, 0x08, 0xB6, 0x08, 0xBC, ++ 0x08, 0xC2, 0x08, 0xC8, 0x08, 0xCE, 0x08, 0xD4, 0x08, 0xDA, 0x08, 0xE0, 0x08, 0xE6, 0x08, 0xEC, ++ 0x08, 0xF2, 0x08, 0xF8, 0x08, 0xFE, 0x09, 0x04, 0x09, 0x0A, 0x09, 0x10, 0x09, 0x16, 0x09, 0x1C, ++ 0x09, 0x22, 0x09, 0x28, 0x09, 0x2E, 0x09, 0x34, 0x09, 0x3A, 0x09, 0x40, 0x09, 0x46, 0x09, 0x4C, ++ 0x09, 0x52, 0x09, 0x58, 0x09, 0x5E, 0x09, 0x64, 0x09, 0x6A, 0x09, 0x70, 0x09, 0x76, 0x09, 0x7C, ++ 0x09, 0x82, 0x09, 0x88, 0x09, 0x8E, 0x09, 0x94, 0x09, 0x9A, 0x09, 0xA0, 0x09, 0xA6, 0x09, 0xAC, ++ 0x09, 0xB2, 0x09, 0xB8, 0x09, 0xBE, 0x09, 0xC4, 0x09, 0xCA, 0x09, 0xD0, 0x09, 0xD6, 0x09, 0xDC, ++ 0x09, 0xE2, 0x09, 0xE8, 0x09, 0xEE, 0x09, 0xF4, 0x09, 0xFA, 0x0A, 0x00, 0x0A, 0x06, 0x0A, 0x0C, ++ 0x0A, 0x12, 0x0A, 0x18, 0x0A, 0x1E, 0x0A, 0x24, 0x0A, 0x2A, 0x0A, 0x30, 0x0A, 0x36, 0x0A, 0x3C, ++ 0x0A, 0x42, 0x0A, 0x48, 0x0A, 0x4E, 0x0A, 0x54, 0x0A, 0x5A, 0x0A, 0x60, 0x0A, 0x66, 0x0A, 0x6C, ++ 0x0A, 0x72, 0x0A, 0x78, 0x0A, 0x7E, 0x0A, 0x84, 0x0A, 0x8A, 0x0A, 0x90, 0x0A, 0x96, 0x0A, 0x9C, ++ 0x0A, 0xA2, 0x0A, 0xA8, 0x0A, 0xAE, 0x0A, 0xB4, 0x0A, 0xBA, 0x0A, 0xC0, 0x0A, 0xC6, 0x0A, 0xCC, ++ 0x0A, 0xD2, 0x0A, 0xD8, 0x0A, 0xDE, 0x0A, 0xE4, 0x0A, 0xEA, 0x0A, 0xF0, 0x0A, 0xF6, 0x0A, 0xFC, ++ 0x0B, 0x02, 0x0B, 0x08, 0x0B, 0x0E, 0x0B, 0x14, 0x0B, 0x1A, 0x0B, 0x20, 0x0B, 0x26, 0x0B, 0x2C, ++ 0x0B, 0x32, 0x0B, 0x38, 0x0B, 0x3E, 0x0B, 0x44, 0x0B, 0x4A, 0x0B, 0x50, 0x0B, 0x56, 0x0B, 0x5C, ++ 0x0B, 0x62, 0x0B, 0x68, 0x0B, 0x6E, 0x0B, 0x74, 0x0B, 0x7A, 0x0B, 0x80, 0x0B, 0x86, 0x0B, 0x8C, ++ 0x0B, 0x92, 0x0B, 0x98, 0x0B, 0x9E, 0x0B, 0xA4, 0x0B, 0xAA, 0x0B, 0xB0, 0x0B, 0xB6, 0x0B, 0xBC, ++ 0x0B, 0xC2, 0x0B, 0xC8, 0x0B, 0xCE, 0x0B, 0xD4, 0x0B, 0xDA, 0x0B, 0xE0, 0x0B, 0xE6, 0x0B, 0xEC, ++ 0x0B, 0xF2, 0x0B, 0xF8, 0x0B, 0xFE, 0x0C, 0x04, 0x0C, 0x0A, 0x0C, 0x10, 0x0C, 0x16, 0x0C, 0x1C, ++ 0x0C, 0x22, 0x0C, 0x28, 0x0C, 0x2E, 0x0C, 0x34, 0x0C, 0x3A, 0x0C, 0x40, 0x0C, 0x46, 0x0C, 0x4C, ++ 0x0C, 0x52, 0x0C, 0x58, 0x0C, 0x5E, 0x0C, 0x64, 0x0C, 0x6A, 0x0C, 0x70, 0x0C, 0x76, 0x0C, 0x7C, ++ 0x0C, 0x82, 0x0C, 0x88, 0x0C, 0x8E, 0x0C, 0x94, 0x0C, 0x9A, 0x0C, 0xA0, 0x0C, 0xA6, 0x0C, 0xAC, ++ 0x0C, 0xB2, 0x0C, 0xB8, 0x0C, 0xBE, 0x0C, 0xC4, 0x0C, 0xCA, 0x0C, 0xD0, 0x0C, 0xD6, 0x0C, 0xDC, ++ 0x0C, 0xE2, 0x0C, 0xE8, 0x0C, 0xEE, 0x0C, 0xF4, 0x0C, 0xFA, 0x0D, 0x00, 0x0D, 0x06, 0x0D, 0x0C, ++ 0x0D, 0x12, 0x0D, 0x18, 0x0D, 0x1E, 0x0D, 0x24, 0x0D, 0x2A, 0x0D, 0x30, 0x0D, 0x36, 0x0D, 0x3C, ++ 0x0D, 0x42, 0x0D, 0x48, 0x0D, 0x4E, 0x0D, 0x54, 0x0D, 0x5A, 0x0D, 0x60, 0x0D, 0x66, 0x0D, 0x6C, ++ 0x0D, 0x72, 0x0D, 0x78, 0x0D, 0x7E, 0x0D, 0x84, 0x0D, 0x8A, 0x0D, 0x90, 0x0D, 0x96, 0x0D, 0x9C, ++ 0x0D, 0xA2, 0x0D, 0xA8, 0x0D, 0xAE, 0x0D, 0xB4, 0x0D, 0xBA, 0x0D, 0xC0, 0x0D, 0xC6, 0x0D, 0xCC, ++ 0x0D, 0xD2, 0x0D, 0xD8, 0x0D, 0xDE, 0x0D, 0xE4, 0x0D, 0xEA, 0x0D, 0xF0, 0x0D, 0xF6, 0x0D, 0xFC, ++ 0x0E, 0x02, 0x0E, 0x08, 0x0E, 0x0E, 0x0E, 0x14, 0x0E, 0x1A, 0x0E, 0x20, 0x0E, 0x26, 0x0E, 0x2C, ++ 0x0E, 0x32, 0x0E, 0x38, 0x0E, 0x3E, 0x0E, 0x44, 0x0E, 0x4A, 0x0E, 0x50, 0x0E, 0x56, 0x0E, 0x5C, ++ 0x0E, 0x62, 0x0E, 0x68, 0x0E, 0x6E, 0x0E, 0x74, 0x0E, 0x7A, 0x0E, 0x80, 0x0E, 0x86, 0x0E, 0x8C, ++ 0x0E, 0x92, 0x0E, 0x98, 0x0E, 0x9E, 0x0E, 0xA4, 0x0E, 0xAA, 0x0E, 0xB0, 0x0E, 0xB6, 0x0E, 0xBC, ++ 0x0E, 0xC2, 0x0E, 0xC8, 0x0E, 0xCE, 0x0E, 0xD4, 0x0E, 0xDA, 0x0E, 0xE0, 0x0E, 0xE6, 0x0E, 0xEC, ++ 0x0E, 0xF2, 0x0E, 0xF8, 0x0E, 0xFE, 0x0F, 0x04, 0x0F, 0x0A, 0x0F, 0x10, 0x0F, 0x16, 0x0F, 0x1C, ++ 0x0F, 0x22, 0x0F, 0x28, 0x0F, 0x2E, 0x0F, 0x34, 0x0F, 0x3A, 0x0F, 0x40, 0x0F, 0x46, 0x0F, 0x4C, ++ 0x0F, 0x52, 0x0F, 0x58, 0x0F, 0x5E, 0x0F, 0x64, 0x0F, 0x6A, 0x0F, 0x70, 0x0F, 0x76, 0x0F, 0x7C, ++ 0x0F, 0x82, 0x0F, 0x88, 0x00, 0x02, 0x00, 0x41, 0x03, 0x00, 0x00, 0x02, 0x00, 0x41, 0x03, 0x01, ++ 0x00, 0x02, 0x00, 0x41, 0x03, 0x02, 0x00, 0x02, 0x00, 0x41, 0x03, 0x03, 0x00, 0x02, 0x00, 0x41, ++ 0x03, 0x08, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x43, 0x03, 0x27, 0x00, 0x02, ++ 0x00, 0x45, 0x03, 0x00, 0x00, 0x02, 0x00, 0x45, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, 0x03, 0x02, ++ 0x00, 0x02, 0x00, 0x45, 0x03, 0x08, 0x00, 0x02, 0x00, 0x49, 0x03, 0x00, 0x00, 0x02, 0x00, 0x49, ++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x49, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x08, 0x00, 0x02, ++ 0x00, 0x4E, 0x03, 0x03, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x00, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x01, ++ 0x00, 0x02, 0x00, 0x4F, 0x03, 0x02, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x4F, ++ 0x03, 0x08, 0x00, 0x02, 0x00, 0x55, 0x03, 0x00, 0x00, 0x02, 0x00, 0x55, 0x03, 0x01, 0x00, 0x02, ++ 0x00, 0x55, 0x03, 0x02, 0x00, 0x02, 0x00, 0x55, 0x03, 0x08, 0x00, 0x02, 0x00, 0x59, 0x03, 0x01, ++ 0x00, 0x02, 0x00, 0x61, 0x03, 0x00, 0x00, 0x02, 0x00, 0x61, 0x03, 0x01, 0x00, 0x02, 0x00, 0x61, ++ 0x03, 0x02, 0x00, 0x02, 0x00, 0x61, 0x03, 0x03, 0x00, 0x02, 0x00, 0x61, 0x03, 0x08, 0x00, 0x02, ++ 0x00, 0x61, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x63, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x00, ++ 0x00, 0x02, 0x00, 0x65, 0x03, 0x01, 0x00, 0x02, 0x00, 0x65, 0x03, 0x02, 0x00, 0x02, 0x00, 0x65, ++ 0x03, 0x08, 0x00, 0x02, 0x00, 0x69, 0x03, 0x00, 0x00, 0x02, 0x00, 0x69, 0x03, 0x01, 0x00, 0x02, ++ 0x00, 0x69, 0x03, 0x02, 0x00, 0x02, 0x00, 0x69, 0x03, 0x08, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x03, ++ 0x00, 0x02, 0x00, 0x6F, 0x03, 0x00, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6F, ++ 0x03, 0x02, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x08, 0x00, 0x02, ++ 0x00, 0x75, 0x03, 0x00, 0x00, 0x02, 0x00, 0x75, 0x03, 0x01, 0x00, 0x02, 0x00, 0x75, 0x03, 0x02, ++ 0x00, 0x02, 0x00, 0x75, 0x03, 0x08, 0x00, 0x02, 0x00, 0x79, 0x03, 0x01, 0x00, 0x02, 0x00, 0x79, ++ 0x03, 0x08, 0x00, 0x02, 0x00, 0x41, 0x03, 0x04, 0x00, 0x02, 0x00, 0x61, 0x03, 0x04, 0x00, 0x02, ++ 0x00, 0x41, 0x03, 0x06, 0x00, 0x02, 0x00, 0x61, 0x03, 0x06, 0x00, 0x02, 0x00, 0x41, 0x03, 0x28, ++ 0x00, 0x02, 0x00, 0x61, 0x03, 0x28, 0x00, 0x02, 0x00, 0x43, 0x03, 0x01, 0x00, 0x02, 0x00, 0x63, ++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x43, 0x03, 0x02, 0x00, 0x02, 0x00, 0x63, 0x03, 0x02, 0x00, 0x02, ++ 0x00, 0x43, 0x03, 0x07, 0x00, 0x02, 0x00, 0x63, 0x03, 0x07, 0x00, 0x02, 0x00, 0x43, 0x03, 0x0C, ++ 0x00, 0x02, 0x00, 0x63, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x44, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x64, ++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x45, 0x03, 0x04, 0x00, 0x02, 0x00, 0x65, 0x03, 0x04, 0x00, 0x02, ++ 0x00, 0x45, 0x03, 0x06, 0x00, 0x02, 0x00, 0x65, 0x03, 0x06, 0x00, 0x02, 0x00, 0x45, 0x03, 0x07, ++ 0x00, 0x02, 0x00, 0x65, 0x03, 0x07, 0x00, 0x02, 0x00, 0x45, 0x03, 0x28, 0x00, 0x02, 0x00, 0x65, ++ 0x03, 0x28, 0x00, 0x02, 0x00, 0x45, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x65, 0x03, 0x0C, 0x00, 0x02, ++ 0x00, 0x47, 0x03, 0x02, 0x00, 0x02, 0x00, 0x67, 0x03, 0x02, 0x00, 0x02, 0x00, 0x47, 0x03, 0x06, ++ 0x00, 0x02, 0x00, 0x67, 0x03, 0x06, 0x00, 0x02, 0x00, 0x47, 0x03, 0x07, 0x00, 0x02, 0x00, 0x67, ++ 0x03, 0x07, 0x00, 0x02, 0x00, 0x47, 0x03, 0x27, 0x00, 0x02, 0x00, 0x67, 0x03, 0x27, 0x00, 0x02, ++ 0x00, 0x48, 0x03, 0x02, 0x00, 0x02, 0x00, 0x68, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x03, ++ 0x00, 0x02, 0x00, 0x69, 0x03, 0x03, 0x00, 0x02, 0x00, 0x49, 0x03, 0x04, 0x00, 0x02, 0x00, 0x69, ++ 0x03, 0x04, 0x00, 0x02, 0x00, 0x49, 0x03, 0x06, 0x00, 0x02, 0x00, 0x69, 0x03, 0x06, 0x00, 0x02, ++ 0x00, 0x49, 0x03, 0x28, 0x00, 0x02, 0x00, 0x69, 0x03, 0x28, 0x00, 0x02, 0x00, 0x49, 0x03, 0x07, ++ 0x00, 0x02, 0x00, 0x4A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x6A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x4B, ++ 0x03, 0x27, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x01, 0x00, 0x02, ++ 0x00, 0x6C, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x27, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x27, ++ 0x00, 0x02, 0x00, 0x4C, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4E, ++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x27, 0x00, 0x02, ++ 0x00, 0x6E, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x0C, ++ 0x00, 0x02, 0x00, 0x4F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, ++ 0x03, 0x06, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x06, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0B, 0x00, 0x02, ++ 0x00, 0x6F, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x52, 0x03, 0x01, 0x00, 0x02, 0x00, 0x72, 0x03, 0x01, ++ 0x00, 0x02, 0x00, 0x52, 0x03, 0x27, 0x00, 0x02, 0x00, 0x72, 0x03, 0x27, 0x00, 0x02, 0x00, 0x52, ++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x72, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x53, 0x03, 0x01, 0x00, 0x02, ++ 0x00, 0x73, 0x03, 0x01, 0x00, 0x02, 0x00, 0x53, 0x03, 0x02, 0x00, 0x02, 0x00, 0x73, 0x03, 0x02, ++ 0x00, 0x02, 0x00, 0x53, 0x03, 0x27, 0x00, 0x02, 0x00, 0x73, 0x03, 0x27, 0x00, 0x02, 0x00, 0x53, ++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x73, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x54, 0x03, 0x27, 0x00, 0x02, ++ 0x00, 0x74, 0x03, 0x27, 0x00, 0x02, 0x00, 0x54, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x74, 0x03, 0x0C, ++ 0x00, 0x02, 0x00, 0x55, 0x03, 0x03, 0x00, 0x02, 0x00, 0x75, 0x03, 0x03, 0x00, 0x02, 0x00, 0x55, ++ 0x03, 0x04, 0x00, 0x02, 0x00, 0x75, 0x03, 0x04, 0x00, 0x02, 0x00, 0x55, 0x03, 0x06, 0x00, 0x02, ++ 0x00, 0x75, 0x03, 0x06, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0A, ++ 0x00, 0x02, 0x00, 0x55, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x55, ++ 0x03, 0x28, 0x00, 0x02, 0x00, 0x75, 0x03, 0x28, 0x00, 0x02, 0x00, 0x57, 0x03, 0x02, 0x00, 0x02, ++ 0x00, 0x77, 0x03, 0x02, 0x00, 0x02, 0x00, 0x59, 0x03, 0x02, 0x00, 0x02, 0x00, 0x79, 0x03, 0x02, ++ 0x00, 0x02, 0x00, 0x59, 0x03, 0x08, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x01, 0x00, 0x02, 0x00, 0x7A, ++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x07, 0x00, 0x02, ++ 0x00, 0x5A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x1B, ++ 0x00, 0x02, 0x00, 0x6F, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x55, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x75, ++ 0x03, 0x1B, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0C, 0x00, 0x02, ++ 0x00, 0x49, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x69, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0C, ++ 0x00, 0x02, 0x00, 0x6F, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x75, ++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x04, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x04, 0x00, 0x02, ++ 0x00, 0x55, 0x03, 0x44, 0x00, 0x02, 0x00, 0x75, 0x03, 0x44, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x0C, ++ 0x00, 0x02, 0x00, 0xFC, 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x00, 0x00, 0x02, 0x00, 0xFC, ++ 0x03, 0x00, 0x00, 0x02, 0x00, 0xC4, 0x03, 0x04, 0x00, 0x02, 0x00, 0xE4, 0x03, 0x04, 0x00, 0x02, ++ 0x02, 0x26, 0x03, 0x04, 0x00, 0x02, 0x02, 0x27, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x04, ++ 0x00, 0x02, 0x00, 0xE6, 0x03, 0x04, 0x00, 0x02, 0x00, 0x47, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x67, ++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x0C, 0x00, 0x02, ++ 0x00, 0x4F, 0x03, 0x28, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x28, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x28, ++ 0x00, 0x02, 0x01, 0x4D, 0x03, 0x28, 0x00, 0x02, 0x01, 0xB7, 0x03, 0x0C, 0x00, 0x02, 0x02, 0x92, ++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x47, 0x03, 0x01, 0x00, 0x02, ++ 0x00, 0x67, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x00, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x00, ++ 0x00, 0x02, 0x00, 0xC5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xE5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xC6, ++ 0x03, 0x01, 0x00, 0x02, 0x00, 0xE6, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD8, 0x03, 0x01, 0x00, 0x02, ++ 0x00, 0xF8, 0x03, 0x01, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0F, ++ 0x00, 0x02, 0x00, 0x41, 0x03, 0x11, 0x00, 0x02, 0x00, 0x61, 0x03, 0x11, 0x00, 0x02, 0x00, 0x45, ++ 0x03, 0x0F, 0x00, 0x02, 0x00, 0x65, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x45, 0x03, 0x11, 0x00, 0x02, ++ 0x00, 0x65, 0x03, 0x11, 0x00, 0x02, 0x00, 0x49, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x69, 0x03, 0x0F, ++ 0x00, 0x02, 0x00, 0x49, 0x03, 0x11, 0x00, 0x02, 0x00, 0x69, 0x03, 0x11, 0x00, 0x02, 0x00, 0x4F, ++ 0x03, 0x0F, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x11, 0x00, 0x02, ++ 0x00, 0x6F, 0x03, 0x11, 0x00, 0x02, 0x00, 0x52, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x72, 0x03, 0x0F, ++ 0x00, 0x02, 0x00, 0x52, 0x03, 0x11, 0x00, 0x02, 0x00, 0x72, 0x03, 0x11, 0x00, 0x02, 0x00, 0x55, ++ 0x03, 0x0F, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x55, 0x03, 0x11, 0x00, 0x02, ++ 0x00, 0x75, 0x03, 0x11, 0x00, 0x02, 0x00, 0x53, 0x03, 0x26, 0x00, 0x02, 0x00, 0x73, 0x03, 0x26, ++ 0x00, 0x02, 0x00, 0x54, 0x03, 0x26, 0x00, 0x02, 0x00, 0x74, 0x03, 0x26, 0x00, 0x02, 0x00, 0x48, ++ 0x03, 0x0C, 0x00, 0x02, 0x00, 0x68, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x41, 0x03, 0x07, 0x00, 0x02, ++ 0x00, 0x61, 0x03, 0x07, 0x00, 0x02, 0x00, 0x45, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x27, ++ 0x00, 0x02, 0x00, 0xD6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xF6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xD5, ++ 0x03, 0x04, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x07, 0x00, 0x02, ++ 0x00, 0x6F, 0x03, 0x07, 0x00, 0x02, 0x02, 0x2E, 0x03, 0x04, 0x00, 0x02, 0x02, 0x2F, 0x03, 0x04, ++ 0x00, 0x02, 0x00, 0x59, 0x03, 0x04, 0x00, 0x02, 0x00, 0x79, 0x03, 0x04, 0x00, 0x02, 0x00, 0x41, ++ 0x03, 0x25, 0x00, 0x02, 0x00, 0x61, 0x03, 0x25, 0x00, 0x02, 0x00, 0x42, 0x03, 0x07, 0x00, 0x02, ++ 0x00, 0x62, 0x03, 0x07, 0x00, 0x02, 0x00, 0x42, 0x03, 0x23, 0x00, 0x02, 0x00, 0x62, 0x03, 0x23, ++ 0x00, 0x02, 0x00, 0x42, 0x03, 0x31, 0x00, 0x02, 0x00, 0x62, 0x03, 0x31, 0x00, 0x02, 0x00, 0xC7, ++ 0x03, 0x01, 0x00, 0x02, 0x00, 0xE7, 0x03, 0x01, 0x00, 0x02, 0x00, 0x44, 0x03, 0x07, 0x00, 0x02, ++ 0x00, 0x64, 0x03, 0x07, 0x00, 0x02, 0x00, 0x44, 0x03, 0x23, 0x00, 0x02, 0x00, 0x64, 0x03, 0x23, ++ 0x00, 0x02, 0x00, 0x44, 0x03, 0x31, 0x00, 0x02, 0x00, 0x64, 0x03, 0x31, 0x00, 0x02, 0x00, 0x44, ++ 0x03, 0x27, 0x00, 0x02, 0x00, 0x64, 0x03, 0x27, 0x00, 0x02, 0x00, 0x44, 0x03, 0x2D, 0x00, 0x02, ++ 0x00, 0x64, 0x03, 0x2D, 0x00, 0x02, 0x01, 0x12, 0x03, 0x00, 0x00, 0x02, 0x01, 0x13, 0x03, 0x00, ++ 0x00, 0x02, 0x01, 0x12, 0x03, 0x01, 0x00, 0x02, 0x01, 0x13, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, ++ 0x03, 0x2D, 0x00, 0x02, 0x00, 0x65, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x45, 0x03, 0x30, 0x00, 0x02, ++ 0x00, 0x65, 0x03, 0x30, 0x00, 0x02, 0x01, 0x14, 0x03, 0x27, 0x00, 0x02, 0x01, 0x15, 0x03, 0x27, ++ 0x00, 0x02, 0x00, 0x46, 0x03, 0x07, 0x00, 0x02, 0x00, 0x66, 0x03, 0x07, 0x00, 0x02, 0x00, 0x47, ++ 0x03, 0x04, 0x00, 0x02, 0x00, 0x67, 0x03, 0x04, 0x00, 0x02, 0x00, 0x48, 0x03, 0x07, 0x00, 0x02, ++ 0x00, 0x68, 0x03, 0x07, 0x00, 0x02, 0x00, 0x48, 0x03, 0x23, 0x00, 0x02, 0x00, 0x68, 0x03, 0x23, ++ 0x00, 0x02, 0x00, 0x48, 0x03, 0x08, 0x00, 0x02, 0x00, 0x68, 0x03, 0x08, 0x00, 0x02, 0x00, 0x48, ++ 0x03, 0x27, 0x00, 0x02, 0x00, 0x68, 0x03, 0x27, 0x00, 0x02, 0x00, 0x48, 0x03, 0x2E, 0x00, 0x02, ++ 0x00, 0x68, 0x03, 0x2E, 0x00, 0x02, 0x00, 0x49, 0x03, 0x30, 0x00, 0x02, 0x00, 0x69, 0x03, 0x30, ++ 0x00, 0x02, 0x00, 0x49, 0x03, 0x44, 0x00, 0x02, 0x00, 0x69, 0x03, 0x44, 0x00, 0x02, 0x00, 0x4B, ++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x23, 0x00, 0x02, ++ 0x00, 0x6B, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x31, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x31, ++ 0x00, 0x02, 0x00, 0x4C, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x23, 0x00, 0x02, 0x1E, 0x36, ++ 0x03, 0x04, 0x00, 0x02, 0x1E, 0x37, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x31, 0x00, 0x02, ++ 0x00, 0x6C, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x2D, ++ 0x00, 0x02, 0x00, 0x4D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4D, ++ 0x03, 0x07, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x23, 0x00, 0x02, ++ 0x00, 0x6D, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x07, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x07, ++ 0x00, 0x02, 0x00, 0x4E, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4E, ++ 0x03, 0x31, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x2D, 0x00, 0x02, ++ 0x00, 0x6E, 0x03, 0x2D, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x01, ++ 0x00, 0x02, 0x00, 0xD5, 0x03, 0x08, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, ++ 0x03, 0x00, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x00, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x01, 0x00, 0x02, ++ 0x01, 0x4D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x50, 0x03, 0x01, 0x00, 0x02, 0x00, 0x70, 0x03, 0x01, ++ 0x00, 0x02, 0x00, 0x50, 0x03, 0x07, 0x00, 0x02, 0x00, 0x70, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, ++ 0x03, 0x07, 0x00, 0x02, 0x00, 0x72, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, 0x03, 0x23, 0x00, 0x02, ++ 0x00, 0x72, 0x03, 0x23, 0x00, 0x02, 0x1E, 0x5A, 0x03, 0x04, 0x00, 0x02, 0x1E, 0x5B, 0x03, 0x04, ++ 0x00, 0x02, 0x00, 0x52, 0x03, 0x31, 0x00, 0x02, 0x00, 0x72, 0x03, 0x31, 0x00, 0x02, 0x00, 0x53, ++ 0x03, 0x07, 0x00, 0x02, 0x00, 0x73, 0x03, 0x07, 0x00, 0x02, 0x00, 0x53, 0x03, 0x23, 0x00, 0x02, ++ 0x00, 0x73, 0x03, 0x23, 0x00, 0x02, 0x01, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x01, 0x5B, 0x03, 0x07, ++ 0x00, 0x02, 0x01, 0x60, 0x03, 0x07, 0x00, 0x02, 0x01, 0x61, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x60, ++ 0x03, 0x23, 0x00, 0x02, 0x1E, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x54, 0x03, 0x07, 0x00, 0x02, ++ 0x00, 0x74, 0x03, 0x07, 0x00, 0x02, 0x00, 0x54, 0x03, 0x23, 0x00, 0x02, 0x00, 0x74, 0x03, 0x23, ++ 0x00, 0x02, 0x00, 0x54, 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x31, 0x00, 0x02, 0x00, 0x54, ++ 0x03, 0x2D, 0x00, 0x02, 0x00, 0x74, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x55, 0x03, 0x24, 0x00, 0x02, ++ 0x00, 0x75, 0x03, 0x24, 0x00, 0x02, 0x00, 0x55, 0x03, 0x30, 0x00, 0x02, 0x00, 0x75, 0x03, 0x30, ++ 0x00, 0x02, 0x00, 0x55, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x75, 0x03, 0x2D, 0x00, 0x02, 0x01, 0x68, ++ 0x03, 0x01, 0x00, 0x02, 0x01, 0x69, 0x03, 0x01, 0x00, 0x02, 0x01, 0x6A, 0x03, 0x08, 0x00, 0x02, ++ 0x01, 0x6B, 0x03, 0x08, 0x00, 0x02, 0x00, 0x56, 0x03, 0x03, 0x00, 0x02, 0x00, 0x76, 0x03, 0x03, ++ 0x00, 0x02, 0x00, 0x56, 0x03, 0x23, 0x00, 0x02, 0x00, 0x76, 0x03, 0x23, 0x00, 0x02, 0x00, 0x57, ++ 0x03, 0x00, 0x00, 0x02, 0x00, 0x77, 0x03, 0x00, 0x00, 0x02, 0x00, 0x57, 0x03, 0x01, 0x00, 0x02, ++ 0x00, 0x77, 0x03, 0x01, 0x00, 0x02, 0x00, 0x57, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, 0x03, 0x08, ++ 0x00, 0x02, 0x00, 0x57, 0x03, 0x07, 0x00, 0x02, 0x00, 0x77, 0x03, 0x07, 0x00, 0x02, 0x00, 0x57, ++ 0x03, 0x23, 0x00, 0x02, 0x00, 0x77, 0x03, 0x23, 0x00, 0x02, 0x00, 0x58, 0x03, 0x07, 0x00, 0x02, ++ 0x00, 0x78, 0x03, 0x07, 0x00, 0x02, 0x00, 0x58, 0x03, 0x08, 0x00, 0x02, 0x00, 0x78, 0x03, 0x08, ++ 0x00, 0x02, 0x00, 0x59, 0x03, 0x07, 0x00, 0x02, 0x00, 0x79, 0x03, 0x07, 0x00, 0x02, 0x00, 0x5A, ++ 0x03, 0x02, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x23, 0x00, 0x02, ++ 0x00, 0x7A, 0x03, 0x23, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x31, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x31, ++ 0x00, 0x02, 0x00, 0x68, 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, ++ 0x03, 0x0A, 0x00, 0x02, 0x00, 0x79, 0x03, 0x0A, 0x00, 0x02, 0x01, 0x7F, 0x03, 0x07, 0x00, 0x02, ++ 0x00, 0x41, 0x03, 0x23, 0x00, 0x02, 0x00, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x41, 0x03, 0x09, ++ 0x00, 0x02, 0x00, 0x61, 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x01, 0x00, 0x02, 0x00, 0xE2, ++ 0x03, 0x01, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x00, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x00, 0x00, 0x02, ++ 0x00, 0xC2, 0x03, 0x09, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x03, ++ 0x00, 0x02, 0x00, 0xE2, 0x03, 0x03, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x23, 0x00, 0x02, 0x00, 0xE2, ++ 0x03, 0x23, 0x00, 0x02, 0x01, 0x02, 0x03, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x01, 0x00, 0x02, ++ 0x01, 0x02, 0x03, 0x00, 0x00, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, 0x02, 0x01, 0x02, 0x03, 0x09, ++ 0x00, 0x02, 0x01, 0x03, 0x03, 0x09, 0x00, 0x02, 0x01, 0x02, 0x03, 0x03, 0x00, 0x02, 0x01, 0x03, ++ 0x03, 0x03, 0x00, 0x02, 0x01, 0x02, 0x03, 0x23, 0x00, 0x02, 0x01, 0x03, 0x03, 0x23, 0x00, 0x02, ++ 0x00, 0x45, 0x03, 0x23, 0x00, 0x02, 0x00, 0x65, 0x03, 0x23, 0x00, 0x02, 0x00, 0x45, 0x03, 0x09, ++ 0x00, 0x02, 0x00, 0x65, 0x03, 0x09, 0x00, 0x02, 0x00, 0x45, 0x03, 0x03, 0x00, 0x02, 0x00, 0x65, ++ 0x03, 0x03, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x01, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x01, 0x00, 0x02, ++ 0x00, 0xCA, 0x03, 0x00, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x00, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x09, ++ 0x00, 0x02, 0x00, 0xEA, 0x03, 0x09, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x03, 0x00, 0x02, 0x00, 0xEA, ++ 0x03, 0x03, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x23, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x23, 0x00, 0x02, ++ 0x00, 0x49, 0x03, 0x09, 0x00, 0x02, 0x00, 0x69, 0x03, 0x09, 0x00, 0x02, 0x00, 0x49, 0x03, 0x23, ++ 0x00, 0x02, 0x00, 0x69, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6F, ++ 0x03, 0x23, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x09, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x09, 0x00, 0x02, ++ 0x00, 0xD4, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x00, ++ 0x00, 0x02, 0x00, 0xF4, 0x03, 0x00, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x09, 0x00, 0x02, 0x00, 0xF4, ++ 0x03, 0x09, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x03, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x03, 0x00, 0x02, ++ 0x00, 0xD4, 0x03, 0x23, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x23, 0x00, 0x02, 0x00, 0xD3, 0x03, 0x1B, ++ 0x00, 0x02, 0x00, 0xF3, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD2, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF2, ++ 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x09, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x09, 0x00, 0x02, ++ 0x00, 0xD5, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x23, ++ 0x00, 0x02, 0x01, 0xA1, 0x03, 0x23, 0x00, 0x02, 0x00, 0x55, 0x03, 0x23, 0x00, 0x02, 0x00, 0x75, ++ 0x03, 0x23, 0x00, 0x02, 0x00, 0x55, 0x03, 0x09, 0x00, 0x02, 0x00, 0x75, 0x03, 0x09, 0x00, 0x02, ++ 0x00, 0xDA, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xFA, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD9, 0x03, 0x1B, ++ 0x00, 0x02, 0x00, 0xF9, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x09, 0x00, 0x02, 0x01, 0xB0, ++ 0x03, 0x09, 0x00, 0x02, 0x01, 0x68, 0x03, 0x1B, 0x00, 0x02, 0x01, 0x69, 0x03, 0x1B, 0x00, 0x02, ++ 0x01, 0xAF, 0x03, 0x23, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x23, 0x00, 0x02, 0x00, 0x59, 0x03, 0x00, ++ 0x00, 0x02, 0x00, 0x79, 0x03, 0x00, 0x00, 0x02, 0x00, 0x59, 0x03, 0x23, 0x00, 0x02, 0x00, 0x79, ++ 0x03, 0x23, 0x00, 0x02, 0x00, 0x59, 0x03, 0x09, 0x00, 0x02, 0x00, 0x79, 0x03, 0x09, 0x00, 0x02, ++ 0x00, 0x59, 0x03, 0x03, 0x00, 0x02, 0x00, 0x79, 0x03, 0x03, 0x00, 0x01, 0x01, 0xF1, 0x00, 0xC0, ++ 0x00, 0xC1, 0x00, 0xC2, 0x00, 0xC3, 0x00, 0xC4, 0x00, 0xC5, 0x00, 0xC7, 0x00, 0xC8, 0x00, 0xC9, ++ 0x00, 0xCA, 0x00, 0xCB, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xCE, 0x00, 0xCF, 0x00, 0xD1, 0x00, 0xD2, ++ 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDB, 0x00, 0xDC, ++ 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE2, 0x00, 0xE3, 0x00, 0xE4, 0x00, 0xE5, 0x00, 0xE7, ++ 0x00, 0xE8, 0x00, 0xE9, 0x00, 0xEA, 0x00, 0xEB, 0x00, 0xEC, 0x00, 0xED, 0x00, 0xEE, 0x00, 0xEF, ++ 0x00, 0xF1, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, 0x00, 0xF6, 0x00, 0xF9, 0x00, 0xFA, ++ 0x00, 0xFB, 0x00, 0xFC, 0x00, 0xFD, 0x00, 0xFF, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03, ++ 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0A, 0x01, 0x0B, ++ 0x01, 0x0C, 0x01, 0x0D, 0x01, 0x0E, 0x01, 0x0F, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, ++ 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1A, 0x01, 0x1B, 0x01, 0x1C, 0x01, 0x1D, ++ 0x01, 0x1E, 0x01, 0x1F, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, ++ 0x01, 0x28, 0x01, 0x29, 0x01, 0x2A, 0x01, 0x2B, 0x01, 0x2C, 0x01, 0x2D, 0x01, 0x2E, 0x01, 0x2F, ++ 0x01, 0x30, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x39, 0x01, 0x3A, 0x01, 0x3B, ++ 0x01, 0x3C, 0x01, 0x3D, 0x01, 0x3E, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, ++ 0x01, 0x48, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x4E, 0x01, 0x4F, 0x01, 0x50, 0x01, 0x51, 0x01, 0x54, ++ 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5A, 0x01, 0x5B, 0x01, 0x5C, ++ 0x01, 0x5D, 0x01, 0x5E, 0x01, 0x5F, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, ++ 0x01, 0x65, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x6C, 0x01, 0x6D, 0x01, 0x6E, ++ 0x01, 0x6F, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, ++ 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7A, 0x01, 0x7B, 0x01, 0x7C, 0x01, 0x7D, 0x01, 0x7E, ++ 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, 0x01, 0xB0, 0x01, 0xCD, 0x01, 0xCE, 0x01, 0xCF, 0x01, 0xD0, ++ 0x01, 0xD1, 0x01, 0xD2, 0x01, 0xD3, 0x01, 0xD4, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, 0x01, 0xD8, ++ 0x01, 0xD9, 0x01, 0xDA, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, 0x01, 0xE1, ++ 0x01, 0xE2, 0x01, 0xE3, 0x01, 0xE6, 0x01, 0xE7, 0x01, 0xE8, 0x01, 0xE9, 0x01, 0xEA, 0x01, 0xEB, ++ 0x01, 0xEC, 0x01, 0xED, 0x01, 0xEE, 0x01, 0xEF, 0x01, 0xF0, 0x01, 0xF4, 0x01, 0xF5, 0x01, 0xF8, ++ 0x01, 0xF9, 0x01, 0xFA, 0x01, 0xFB, 0x01, 0xFC, 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, 0x02, 0x00, ++ 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, ++ 0x02, 0x09, 0x02, 0x0A, 0x02, 0x0B, 0x02, 0x0C, 0x02, 0x0D, 0x02, 0x0E, 0x02, 0x0F, 0x02, 0x10, ++ 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, ++ 0x02, 0x19, 0x02, 0x1A, 0x02, 0x1B, 0x02, 0x1E, 0x02, 0x1F, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, ++ 0x02, 0x29, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, 0x02, 0x2D, 0x02, 0x2E, 0x02, 0x2F, 0x02, 0x30, ++ 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x1E, 0x00, 0x1E, 0x01, 0x1E, 0x02, 0x1E, 0x03, 0x1E, 0x04, ++ 0x1E, 0x05, 0x1E, 0x06, 0x1E, 0x07, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x0A, 0x1E, 0x0B, 0x1E, 0x0C, ++ 0x1E, 0x0D, 0x1E, 0x0E, 0x1E, 0x0F, 0x1E, 0x10, 0x1E, 0x11, 0x1E, 0x12, 0x1E, 0x13, 0x1E, 0x14, ++ 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x18, 0x1E, 0x19, 0x1E, 0x1A, 0x1E, 0x1B, 0x1E, 0x1C, ++ 0x1E, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1E, 0x20, 0x1E, 0x21, 0x1E, 0x22, 0x1E, 0x23, 0x1E, 0x24, ++ 0x1E, 0x25, 0x1E, 0x26, 0x1E, 0x27, 0x1E, 0x28, 0x1E, 0x29, 0x1E, 0x2A, 0x1E, 0x2B, 0x1E, 0x2C, ++ 0x1E, 0x2D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x1E, 0x33, 0x1E, 0x34, ++ 0x1E, 0x35, 0x1E, 0x36, 0x1E, 0x37, 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x3A, 0x1E, 0x3B, 0x1E, 0x3C, ++ 0x1E, 0x3D, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x40, 0x1E, 0x41, 0x1E, 0x42, 0x1E, 0x43, 0x1E, 0x44, ++ 0x1E, 0x45, 0x1E, 0x46, 0x1E, 0x47, 0x1E, 0x48, 0x1E, 0x49, 0x1E, 0x4A, 0x1E, 0x4B, 0x1E, 0x4C, ++ 0x1E, 0x4D, 0x1E, 0x4E, 0x1E, 0x4F, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x54, ++ 0x1E, 0x55, 0x1E, 0x56, 0x1E, 0x57, 0x1E, 0x58, 0x1E, 0x59, 0x1E, 0x5A, 0x1E, 0x5B, 0x1E, 0x5C, ++ 0x1E, 0x5D, 0x1E, 0x5E, 0x1E, 0x5F, 0x1E, 0x60, 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, 0x1E, 0x64, ++ 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x6A, 0x1E, 0x6B, 0x1E, 0x6C, ++ 0x1E, 0x6D, 0x1E, 0x6E, 0x1E, 0x6F, 0x1E, 0x70, 0x1E, 0x71, 0x1E, 0x72, 0x1E, 0x73, 0x1E, 0x74, ++ 0x1E, 0x75, 0x1E, 0x76, 0x1E, 0x77, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0x7A, 0x1E, 0x7B, 0x1E, 0x7C, ++ 0x1E, 0x7D, 0x1E, 0x7E, 0x1E, 0x7F, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, 0x1E, 0x84, ++ 0x1E, 0x85, 0x1E, 0x86, 0x1E, 0x87, 0x1E, 0x88, 0x1E, 0x89, 0x1E, 0x8A, 0x1E, 0x8B, 0x1E, 0x8C, ++ 0x1E, 0x8D, 0x1E, 0x8E, 0x1E, 0x8F, 0x1E, 0x90, 0x1E, 0x91, 0x1E, 0x92, 0x1E, 0x93, 0x1E, 0x94, ++ 0x1E, 0x95, 0x1E, 0x96, 0x1E, 0x97, 0x1E, 0x98, 0x1E, 0x99, 0x1E, 0x9B, 0x1E, 0xA0, 0x1E, 0xA1, ++ 0x1E, 0xA2, 0x1E, 0xA3, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xA8, 0x1E, 0xA9, ++ 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, ++ 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, 0x1E, 0xB5, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xB8, 0x1E, 0xB9, ++ 0x1E, 0xBA, 0x1E, 0xBB, 0x1E, 0xBC, 0x1E, 0xBD, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, ++ 0x1E, 0xC2, 0x1E, 0xC3, 0x1E, 0xC4, 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xC8, 0x1E, 0xC9, ++ 0x1E, 0xCA, 0x1E, 0xCB, 0x1E, 0xCC, 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xD0, 0x1E, 0xD1, ++ 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD4, 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, 0x1E, 0xD9, ++ 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, ++ 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE4, 0x1E, 0xE5, 0x1E, 0xE6, 0x1E, 0xE7, 0x1E, 0xE8, 0x1E, 0xE9, ++ 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, ++ 0x1E, 0xF2, 0x1E, 0xF3, 0x1E, 0xF4, 0x1E, 0xF5, 0x1E, 0xF6, 0x1E, 0xF7, 0x1E, 0xF8, 0x1E, 0xF9, ++ 0x00, 0x01, 0x05, 0xBA, 0x00, 0xAC, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, ++ 0x01, 0x7C, 0x01, 0x82, 0x01, 0x88, 0x01, 0x8E, 0x01, 0x94, 0x01, 0x9A, 0x01, 0xA0, 0x01, 0xA6, ++ 0x01, 0xAC, 0x01, 0xB2, 0x01, 0xB8, 0x01, 0xBE, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD0, 0x01, 0xD6, ++ 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xE8, 0x01, 0xEE, 0x01, 0xF4, 0x01, 0xFA, 0x02, 0x00, 0x02, 0x06, ++ 0x02, 0x0C, 0x02, 0x12, 0x02, 0x18, 0x02, 0x1E, 0x02, 0x24, 0x02, 0x2A, 0x02, 0x30, 0x02, 0x38, ++ 0x02, 0x40, 0x02, 0x46, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x62, 0x02, 0x68, 0x02, 0x70, ++ 0x02, 0x78, 0x02, 0x80, 0x02, 0x88, 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, 0x02, 0xA0, 0x02, 0xA6, ++ 0x02, 0xAC, 0x02, 0xB2, 0x02, 0xB8, 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD6, ++ 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06, 0x03, 0x0C, 0x03, 0x12, ++ 0x03, 0x18, 0x03, 0x1E, 0x03, 0x24, 0x03, 0x2A, 0x03, 0x30, 0x03, 0x36, 0x03, 0x3C, 0x03, 0x42, ++ 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, 0x03, 0x5A, 0x03, 0x62, 0x03, 0x6A, 0x03, 0x70, 0x03, 0x76, ++ 0x03, 0x7C, 0x03, 0x82, 0x03, 0x8A, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA4, 0x03, 0xAA, ++ 0x03, 0xB0, 0x03, 0xB6, 0x03, 0xBE, 0x03, 0xC6, 0x03, 0xCE, 0x03, 0xD6, 0x03, 0xDE, 0x03, 0xE6, ++ 0x03, 0xEC, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x06, 0x04, 0x0E, 0x04, 0x14, 0x04, 0x1A, ++ 0x04, 0x20, 0x04, 0x26, 0x04, 0x2C, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, 0x04, 0x46, 0x04, 0x4E, ++ 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82, ++ 0x04, 0x8A, 0x04, 0x92, 0x04, 0x9A, 0x04, 0xA2, 0x04, 0xA8, 0x04, 0xAE, 0x04, 0xB4, 0x04, 0xBA, ++ 0x04, 0xC0, 0x04, 0xC6, 0x04, 0xCE, 0x04, 0xD6, 0x04, 0xDE, 0x04, 0xE6, 0x04, 0xEC, 0x04, 0xF2, ++ 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x12, 0x05, 0x1A, 0x05, 0x22, 0x05, 0x2A, ++ 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A, ++ 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A, ++ 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x00, 0x02, ++ 0x00, 0x41, 0x03, 0x40, 0x00, 0x02, 0x00, 0x41, 0x03, 0x41, 0x00, 0x02, 0x00, 0x45, 0x03, 0x40, ++ 0x00, 0x02, 0x00, 0x45, 0x03, 0x41, 0x00, 0x02, 0x00, 0x49, 0x03, 0x40, 0x00, 0x02, 0x00, 0x49, ++ 0x03, 0x41, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x40, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x41, 0x00, 0x02, ++ 0x00, 0x55, 0x03, 0x40, 0x00, 0x02, 0x00, 0x55, 0x03, 0x41, 0x00, 0x02, 0x00, 0x59, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0x61, 0x03, 0x40, 0x00, 0x02, 0x00, 0x61, 0x03, 0x41, 0x00, 0x02, 0x00, 0x65, ++ 0x03, 0x40, 0x00, 0x02, 0x00, 0x65, 0x03, 0x41, 0x00, 0x02, 0x00, 0x69, 0x03, 0x40, 0x00, 0x02, ++ 0x00, 0x69, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x40, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0x75, 0x03, 0x40, 0x00, 0x02, 0x00, 0x75, 0x03, 0x41, 0x00, 0x02, 0x00, 0x79, ++ 0x03, 0x41, 0x00, 0x02, 0x00, 0x43, 0x03, 0x41, 0x00, 0x02, 0x00, 0x63, 0x03, 0x41, 0x00, 0x02, ++ 0x21, 0x2A, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0x4E, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x41, 0x00, 0x02, 0x00, 0x52, ++ 0x03, 0x41, 0x00, 0x02, 0x00, 0x72, 0x03, 0x41, 0x00, 0x02, 0x00, 0x53, 0x03, 0x41, 0x00, 0x02, ++ 0x00, 0x73, 0x03, 0x41, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x41, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x04, ++ 0x00, 0x02, 0x00, 0xDC, 0x03, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, ++ 0x03, 0x08, 0x03, 0x0C, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, ++ 0x03, 0x40, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x08, 0x03, 0x04, ++ 0x00, 0x03, 0x00, 0x61, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x41, 0x03, 0x07, 0x03, 0x04, ++ 0x00, 0x03, 0x00, 0x61, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x0C, 0x00, 0x02, ++ 0x01, 0xEA, 0x03, 0x04, 0x00, 0x02, 0x01, 0xEB, 0x03, 0x04, 0x00, 0x02, 0x00, 0x47, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0x67, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x40, 0x00, 0x02, 0x00, 0x6E, ++ 0x03, 0x40, 0x00, 0x02, 0x00, 0xC5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE5, 0x03, 0x41, 0x00, 0x02, ++ 0x00, 0xC6, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE6, 0x03, 0x41, 0x00, 0x02, 0x00, 0xD8, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0xF8, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, ++ 0x00, 0x6F, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x04, 0x00, 0x03, ++ 0x00, 0x6F, 0x03, 0x03, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x07, 0x03, 0x04, 0x00, 0x03, ++ 0x00, 0x6F, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC7, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE7, ++ 0x03, 0x41, 0x00, 0x02, 0x01, 0x12, 0x03, 0x40, 0x00, 0x02, 0x01, 0x13, 0x03, 0x40, 0x00, 0x02, ++ 0x01, 0x12, 0x03, 0x41, 0x00, 0x02, 0x01, 0x13, 0x03, 0x41, 0x00, 0x02, 0x02, 0x28, 0x03, 0x06, ++ 0x00, 0x02, 0x02, 0x29, 0x03, 0x06, 0x00, 0x02, 0x00, 0xCF, 0x03, 0x01, 0x00, 0x02, 0x00, 0xEF, ++ 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x41, 0x00, 0x02, ++ 0x21, 0x2A, 0x03, 0x23, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x31, 0x00, 0x03, 0x00, 0x4C, 0x03, 0x04, ++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x6C, 0x03, 0x04, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0x6D, 0x03, 0x41, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF5, ++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x08, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, ++ 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x40, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x40, 0x00, 0x02, ++ 0x01, 0x4C, 0x03, 0x41, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x41, 0x00, 0x02, 0x00, 0x50, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0x70, 0x03, 0x41, 0x00, 0x03, 0x00, 0x52, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, ++ 0x00, 0x72, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, 0x00, 0x53, 0x03, 0x01, 0x03, 0x07, 0x00, 0x03, ++ 0x00, 0x73, 0x03, 0x01, 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x0C, 0x03, 0x07, 0x00, 0x03, ++ 0x00, 0x73, 0x03, 0x0C, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x62, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x63, ++ 0x03, 0x07, 0x00, 0x02, 0x01, 0x68, 0x03, 0x41, 0x00, 0x02, 0x01, 0x69, 0x03, 0x41, 0x00, 0x03, ++ 0x00, 0x55, 0x03, 0x04, 0x03, 0x08, 0x00, 0x03, 0x00, 0x75, 0x03, 0x04, 0x03, 0x08, 0x00, 0x02, ++ 0x00, 0x57, 0x03, 0x40, 0x00, 0x02, 0x00, 0x77, 0x03, 0x40, 0x00, 0x02, 0x00, 0x57, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0x77, 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE2, ++ 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x40, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x40, 0x00, 0x03, ++ 0x00, 0x41, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, ++ 0x00, 0x41, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, ++ 0x1E, 0xA0, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xA1, 0x03, 0x02, 0x00, 0x02, 0x01, 0x02, 0x03, 0x41, ++ 0x00, 0x02, 0x01, 0x03, 0x03, 0x41, 0x00, 0x02, 0x01, 0x02, 0x03, 0x40, 0x00, 0x02, 0x01, 0x03, ++ 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x09, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, ++ 0x03, 0x09, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x03, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, ++ 0x03, 0x03, 0x00, 0x02, 0x1E, 0xA0, 0x03, 0x06, 0x00, 0x02, 0x1E, 0xA1, 0x03, 0x06, 0x00, 0x02, ++ 0x00, 0xCA, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x41, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x40, ++ 0x00, 0x02, 0x00, 0xEA, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, ++ 0x00, 0x65, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, ++ 0x00, 0x65, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xB8, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xB9, ++ 0x03, 0x02, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x41, 0x00, 0x02, ++ 0x00, 0xD4, 0x03, 0x40, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, ++ 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, ++ 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xCC, 0x03, 0x02, ++ 0x00, 0x02, 0x1E, 0xCD, 0x03, 0x02, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x01, 0x00, 0x02, 0x01, 0xA1, ++ 0x03, 0x01, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x00, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x00, 0x00, 0x02, ++ 0x1E, 0xCE, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xCF, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x03, ++ 0x00, 0x02, 0x01, 0xA1, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xCC, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xCD, ++ 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x01, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x01, 0x00, 0x02, ++ 0x01, 0xAF, 0x03, 0x00, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x00, 0x00, 0x02, 0x1E, 0xE6, 0x03, 0x1B, ++ 0x00, 0x02, 0x1E, 0xE7, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x03, 0x00, 0x02, 0x01, 0xB0, ++ 0x03, 0x03, 0x00, 0x02, 0x1E, 0xE4, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xE5, 0x03, 0x1B, 0x00, 0x02, ++ 0x00, 0x59, 0x03, 0x40, 0x00, 0x02, 0x00, 0x79, 0x03, 0x40, 0x00, 0x01, 0x00, 0xAC, 0x00, 0xC0, ++ 0x00, 0xC1, 0x00, 0xC8, 0x00, 0xC9, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD9, ++ 0x00, 0xDA, 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE8, 0x00, 0xE9, 0x00, 0xEC, 0x00, 0xED, ++ 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFD, 0x01, 0x06, 0x01, 0x07, 0x01, 0x36, ++ 0x01, 0x39, 0x01, 0x3A, 0x01, 0x43, 0x01, 0x44, 0x01, 0x54, 0x01, 0x55, 0x01, 0x5A, 0x01, 0x5B, ++ 0x01, 0x79, 0x01, 0x7A, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xD9, 0x01, 0xDA, ++ 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, 0x01, 0xE1, 0x01, 0xE8, 0x01, 0xEC, ++ 0x01, 0xED, 0x01, 0xF4, 0x01, 0xF5, 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFA, 0x01, 0xFB, 0x01, 0xFC, ++ 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, 0x02, 0x2D, 0x02, 0x30, ++ 0x02, 0x31, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x1C, ++ 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x1E, 0x34, 0x1E, 0x38, ++ 0x1E, 0x39, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x4E, 0x1E, 0x4F, 0x1E, 0x50, ++ 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x54, 0x1E, 0x55, 0x1E, 0x5C, 0x1E, 0x5D, 0x1E, 0x64, ++ 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0x7A, ++ 0x1E, 0x7B, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, ++ 0x1E, 0xA7, 0x1E, 0xA8, 0x1E, 0xA9, 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, ++ 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, 0x1E, 0xB5, 0x1E, 0xB6, ++ 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC2, 0x1E, 0xC3, 0x1E, 0xC4, ++ 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD4, ++ 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, ++ 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE8, + 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, +- 0x1E, 0xF1, 0x1E, 0xF2, 0x1E, 0xF3, 0x1E, 0xF4, 0x1E, 0xF5, 0x1E, 0xF6, 0x1E, 0xF7, 0x1E, 0xF8, +- 0x1E, 0xF9, 0x21, 0x2B, 0x00, 0x01, 0x05, 0xBA, 0x00, 0xAC, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, +- 0x01, 0x70, 0x01, 0x76, 0x01, 0x7C, 0x01, 0x82, 0x01, 0x88, 0x01, 0x8E, 0x01, 0x94, 0x01, 0x9A, +- 0x01, 0xA0, 0x01, 0xA6, 0x01, 0xAC, 0x01, 0xB2, 0x01, 0xB8, 0x01, 0xBE, 0x01, 0xC4, 0x01, 0xCA, +- 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xE8, 0x01, 0xEE, 0x01, 0xF4, 0x01, 0xFA, +- 0x02, 0x00, 0x02, 0x06, 0x02, 0x0C, 0x02, 0x12, 0x02, 0x18, 0x02, 0x1E, 0x02, 0x24, 0x02, 0x2A, +- 0x02, 0x30, 0x02, 0x38, 0x02, 0x40, 0x02, 0x46, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x62, +- 0x02, 0x68, 0x02, 0x70, 0x02, 0x78, 0x02, 0x80, 0x02, 0x88, 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, +- 0x02, 0xA0, 0x02, 0xA6, 0x02, 0xAC, 0x02, 0xB2, 0x02, 0xB8, 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, +- 0x02, 0xD0, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06, +- 0x03, 0x0C, 0x03, 0x12, 0x03, 0x18, 0x03, 0x1E, 0x03, 0x24, 0x03, 0x2A, 0x03, 0x30, 0x03, 0x36, +- 0x03, 0x3C, 0x03, 0x42, 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, 0x03, 0x5A, 0x03, 0x62, 0x03, 0x6A, +- 0x03, 0x70, 0x03, 0x76, 0x03, 0x7C, 0x03, 0x82, 0x03, 0x8A, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, +- 0x03, 0xA4, 0x03, 0xAA, 0x03, 0xB0, 0x03, 0xB6, 0x03, 0xBE, 0x03, 0xC6, 0x03, 0xCE, 0x03, 0xD6, +- 0x03, 0xDE, 0x03, 0xE6, 0x03, 0xEC, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x06, 0x04, 0x0E, +- 0x04, 0x14, 0x04, 0x1A, 0x04, 0x20, 0x04, 0x26, 0x04, 0x2C, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, +- 0x04, 0x46, 0x04, 0x4E, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, +- 0x04, 0x7C, 0x04, 0x82, 0x04, 0x8A, 0x04, 0x92, 0x04, 0x9A, 0x04, 0xA2, 0x04, 0xA8, 0x04, 0xAE, +- 0x04, 0xB4, 0x04, 0xBA, 0x04, 0xC0, 0x04, 0xC6, 0x04, 0xCE, 0x04, 0xD6, 0x04, 0xDE, 0x04, 0xE6, +- 0x04, 0xEC, 0x04, 0xF2, 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x12, 0x05, 0x1A, +- 0x05, 0x22, 0x05, 0x2A, 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4E, +- 0x05, 0x54, 0x05, 0x5A, 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7E, +- 0x05, 0x84, 0x05, 0x8A, 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, 0x05, 0xA8, 0x05, 0xAE, +- 0x05, 0xB4, 0x00, 0x02, 0x00, 0x41, 0x03, 0x40, 0x00, 0x02, 0x00, 0x41, 0x03, 0x41, 0x00, 0x02, +- 0x00, 0x45, 0x03, 0x40, 0x00, 0x02, 0x00, 0x45, 0x03, 0x41, 0x00, 0x02, 0x00, 0x49, 0x03, 0x40, +- 0x00, 0x02, 0x00, 0x49, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x40, 0x00, 0x02, 0x00, 0x4F, +- 0x03, 0x41, 0x00, 0x02, 0x00, 0x55, 0x03, 0x40, 0x00, 0x02, 0x00, 0x55, 0x03, 0x41, 0x00, 0x02, +- 0x00, 0x59, 0x03, 0x41, 0x00, 0x02, 0x00, 0x61, 0x03, 0x40, 0x00, 0x02, 0x00, 0x61, 0x03, 0x41, +- 0x00, 0x02, 0x00, 0x65, 0x03, 0x40, 0x00, 0x02, 0x00, 0x65, 0x03, 0x41, 0x00, 0x02, 0x00, 0x69, +- 0x03, 0x40, 0x00, 0x02, 0x00, 0x69, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x40, 0x00, 0x02, +- 0x00, 0x6F, 0x03, 0x41, 0x00, 0x02, 0x00, 0x75, 0x03, 0x40, 0x00, 0x02, 0x00, 0x75, 0x03, 0x41, +- 0x00, 0x02, 0x00, 0x79, 0x03, 0x41, 0x00, 0x02, 0x00, 0x43, 0x03, 0x41, 0x00, 0x02, 0x00, 0x63, +- 0x03, 0x41, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x41, 0x00, 0x02, +- 0x00, 0x6C, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x41, +- 0x00, 0x02, 0x00, 0x52, 0x03, 0x41, 0x00, 0x02, 0x00, 0x72, 0x03, 0x41, 0x00, 0x02, 0x00, 0x53, +- 0x03, 0x41, 0x00, 0x02, 0x00, 0x73, 0x03, 0x41, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x41, 0x00, 0x02, +- 0x00, 0x7A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x75, +- 0x03, 0x08, 0x03, 0x04, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x01, +- 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x0C, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x0C, +- 0x00, 0x02, 0x00, 0xDC, 0x03, 0x40, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, +- 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x61, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x41, +- 0x03, 0x07, 0x03, 0x04, 0x00, 0x03, 0x00, 0x61, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x21, 0x2A, +- 0x03, 0x0C, 0x00, 0x02, 0x01, 0xEA, 0x03, 0x04, 0x00, 0x02, 0x01, 0xEB, 0x03, 0x04, 0x00, 0x02, +- 0x00, 0x47, 0x03, 0x41, 0x00, 0x02, 0x00, 0x67, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x40, +- 0x00, 0x02, 0x00, 0x6E, 0x03, 0x40, 0x00, 0x02, 0x00, 0xC5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE5, +- 0x03, 0x41, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE6, 0x03, 0x41, 0x00, 0x02, +- 0x00, 0xD8, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF8, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x08, +- 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, +- 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x07, +- 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC7, 0x03, 0x41, +- 0x00, 0x02, 0x00, 0xE7, 0x03, 0x41, 0x00, 0x02, 0x01, 0x12, 0x03, 0x40, 0x00, 0x02, 0x01, 0x13, +- 0x03, 0x40, 0x00, 0x02, 0x01, 0x12, 0x03, 0x41, 0x00, 0x02, 0x01, 0x13, 0x03, 0x41, 0x00, 0x02, +- 0x02, 0x28, 0x03, 0x06, 0x00, 0x02, 0x02, 0x29, 0x03, 0x06, 0x00, 0x02, 0x00, 0xCF, 0x03, 0x01, +- 0x00, 0x02, 0x00, 0xEF, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6B, +- 0x03, 0x41, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x23, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x31, 0x00, 0x03, +- 0x00, 0x4C, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, 0x00, 0x6C, 0x03, 0x04, 0x03, 0x23, 0x00, 0x02, +- 0x00, 0x4D, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x41, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x41, +- 0x00, 0x02, 0x00, 0xF5, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x08, 0x00, 0x03, +- 0x00, 0x6F, 0x03, 0x03, 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x40, 0x00, 0x02, 0x01, 0x4D, +- 0x03, 0x40, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x41, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x41, 0x00, 0x02, +- 0x00, 0x50, 0x03, 0x41, 0x00, 0x02, 0x00, 0x70, 0x03, 0x41, 0x00, 0x03, 0x00, 0x52, 0x03, 0x04, +- 0x03, 0x23, 0x00, 0x03, 0x00, 0x72, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, 0x00, 0x53, 0x03, 0x01, +- 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x01, 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x0C, +- 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x0C, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x62, 0x03, 0x07, +- 0x00, 0x02, 0x1E, 0x63, 0x03, 0x07, 0x00, 0x02, 0x01, 0x68, 0x03, 0x41, 0x00, 0x02, 0x01, 0x69, +- 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x04, 0x03, 0x08, 0x00, 0x03, 0x00, 0x75, 0x03, 0x04, +- 0x03, 0x08, 0x00, 0x02, 0x00, 0x57, 0x03, 0x40, 0x00, 0x02, 0x00, 0x77, 0x03, 0x40, 0x00, 0x02, +- 0x00, 0x57, 0x03, 0x41, 0x00, 0x02, 0x00, 0x77, 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x41, +- 0x00, 0x02, 0x00, 0xE2, 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x40, 0x00, 0x02, 0x00, 0xE2, +- 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, +- 0x03, 0x09, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, +- 0x03, 0x03, 0x00, 0x02, 0x1E, 0xA0, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xA1, 0x03, 0x02, 0x00, 0x02, +- 0x01, 0x02, 0x03, 0x41, 0x00, 0x02, 0x01, 0x03, 0x03, 0x41, 0x00, 0x02, 0x01, 0x02, 0x03, 0x40, +- 0x00, 0x02, 0x01, 0x03, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x09, 0x00, 0x03, +- 0x00, 0x61, 0x03, 0x06, 0x03, 0x09, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x03, 0x00, 0x03, +- 0x00, 0x61, 0x03, 0x06, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xA0, 0x03, 0x06, 0x00, 0x02, 0x1E, 0xA1, +- 0x03, 0x06, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x41, 0x00, 0x02, +- 0x00, 0xCA, 0x03, 0x40, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, +- 0x03, 0x09, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, +- 0x03, 0x03, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xB8, 0x03, 0x02, +- 0x00, 0x02, 0x1E, 0xB9, 0x03, 0x02, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF4, +- 0x03, 0x41, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x40, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x40, 0x00, 0x03, +- 0x00, 0x4F, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, +- 0x00, 0x4F, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, +- 0x1E, 0xCC, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xCD, 0x03, 0x02, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x01, +- 0x00, 0x02, 0x01, 0xA1, 0x03, 0x01, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x00, 0x00, 0x02, 0x01, 0xA1, +- 0x03, 0x00, 0x00, 0x02, 0x1E, 0xCE, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xCF, 0x03, 0x1B, 0x00, 0x02, +- 0x01, 0xA0, 0x03, 0x03, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xCC, 0x03, 0x1B, +- 0x00, 0x02, 0x1E, 0xCD, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x01, 0x00, 0x02, 0x01, 0xB0, +- 0x03, 0x01, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x00, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x00, 0x00, 0x02, +- 0x1E, 0xE6, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xE7, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x03, +- 0x00, 0x02, 0x01, 0xB0, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xE4, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xE5, +- 0x03, 0x1B, 0x00, 0x02, 0x00, 0x59, 0x03, 0x40, 0x00, 0x02, 0x00, 0x79, 0x03, 0x40, 0x00, 0x01, +- 0x00, 0xAC, 0x00, 0xC0, 0x00, 0xC1, 0x00, 0xC8, 0x00, 0xC9, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xD2, +- 0x00, 0xD3, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE8, 0x00, 0xE9, +- 0x00, 0xEC, 0x00, 0xED, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFD, 0x01, 0x06, +- 0x01, 0x07, 0x01, 0x36, 0x01, 0x39, 0x01, 0x3A, 0x01, 0x43, 0x01, 0x44, 0x01, 0x54, 0x01, 0x55, +- 0x01, 0x5A, 0x01, 0x5B, 0x01, 0x79, 0x01, 0x7A, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, 0x01, 0xD8, +- 0x01, 0xD9, 0x01, 0xDA, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, 0x01, 0xE1, +- 0x01, 0xE8, 0x01, 0xEC, 0x01, 0xED, 0x01, 0xF4, 0x01, 0xF5, 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFA, +- 0x01, 0xFB, 0x01, 0xFC, 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, +- 0x02, 0x2D, 0x02, 0x30, 0x02, 0x31, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, +- 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, +- 0x1E, 0x34, 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x4E, +- 0x1E, 0x4F, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x54, 0x1E, 0x55, 0x1E, 0x5C, +- 0x1E, 0x5D, 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, +- 0x1E, 0x79, 0x1E, 0x7A, 0x1E, 0x7B, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, 0x1E, 0xA4, +- 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xA8, 0x1E, 0xA9, 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, +- 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, +- 0x1E, 0xB5, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC2, +- 0x1E, 0xC3, 0x1E, 0xC4, 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, +- 0x1E, 0xD3, 0x1E, 0xD4, 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, ++ 0x1E, 0xF1, 0x1E, 0xF2, 0x1E, 0xF3, 0x00, 0x01, 0x02, 0xFC, 0x00, 0x4F, 0x00, 0xA4, 0x00, 0xAA, ++ 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, ++ 0x00, 0xEA, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, ++ 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C, ++ 0x01, 0x64, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, ++ 0x01, 0xA4, 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC, ++ 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C, ++ 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, ++ 0x02, 0x64, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, ++ 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBA, 0x02, 0xC0, 0x02, 0xC6, 0x02, 0xCC, ++ 0x02, 0xD4, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, 0x02, 0xF4, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x41, ++ 0x00, 0x02, 0x00, 0xFC, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, ++ 0x00, 0x75, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x28, 0x00, 0x03, ++ 0x00, 0x6F, 0x03, 0x04, 0x03, 0x28, 0x00, 0x02, 0x21, 0x2B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61, ++ 0x03, 0x0A, 0x03, 0x01, 0x00, 0x02, 0x01, 0x06, 0x03, 0x27, 0x00, 0x02, 0x01, 0x07, 0x03, 0x27, ++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x00, ++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x01, ++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x06, 0x03, 0x27, 0x00, 0x03, 0x00, 0x65, 0x03, 0x06, 0x03, 0x27, ++ 0x00, 0x02, 0x00, 0xCF, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEF, 0x03, 0x41, 0x00, 0x02, 0x21, 0x2A, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x4C, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x6C, 0x03, 0x23, ++ 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, ++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x52, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x72, 0x03, 0x23, ++ 0x03, 0x04, 0x00, 0x03, 0x00, 0x53, 0x03, 0x41, 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x41, ++ 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x07, 0x03, 0x23, 0x00, 0x03, 0x00, 0x73, 0x03, 0x07, ++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, ++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, ++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x00, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, ++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x23, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, ++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, ++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, ++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, ++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, ++ 0x03, 0x23, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x41, 0x00, 0x02, ++ 0x01, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x09, ++ 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, ++ 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, ++ 0x03, 0x23, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x41, ++ 0x00, 0x02, 0x01, 0xB0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x40, 0x00, 0x02, 0x01, 0xB0, ++ 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x09, ++ 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03, ++ 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, ++ 0x03, 0x23, 0x00, 0x01, 0x00, 0x4F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xEC, ++ 0x01, 0xED, 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, ++ 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x38, 0x1E, 0x39, ++ 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x5C, 0x1E, 0x5D, ++ 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0xA4, 0x1E, 0xA5, ++ 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, ++ 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC6, 0x1E, 0xC7, ++ 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, ++ 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, ++ 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, ++ 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x02, 0xDC, 0x00, 0x49, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, ++ 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE6, ++ 0x00, 0xEE, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, ++ 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, ++ 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA4, ++ 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC, 0x01, 0xE4, ++ 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, ++ 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, ++ 0x02, 0x6C, 0x02, 0x74, 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, ++ 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBC, 0x02, 0xC4, 0x02, 0xCC, 0x02, 0xD4, 0x00, 0x03, 0x00, 0x55, ++ 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, ++ 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, ++ 0x03, 0x28, 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x28, 0x03, 0x04, 0x00, 0x02, 0x21, 0x2B, ++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x43, 0x03, 0x01, ++ 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x01, 0x03, 0x27, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, ++ 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, ++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x45, 0x03, 0x27, ++ 0x03, 0x06, 0x00, 0x03, 0x00, 0x65, 0x03, 0x27, 0x03, 0x06, 0x00, 0x03, 0x00, 0x49, 0x03, 0x08, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x69, 0x03, 0x08, 0x03, 0x01, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, 0x03, 0x40, ++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x53, 0x03, 0x23, 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x23, 0x03, 0x07, ++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x40, ++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x61, 0x03, 0x23, 0x03, 0x02, ++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, 0x03, 0x40, ++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x06, 0x00, 0x03, 0x00, 0x61, 0x03, 0x23, 0x03, 0x06, ++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x40, ++ 0x00, 0x03, 0x00, 0x45, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x65, 0x03, 0x23, 0x03, 0x02, ++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x40, ++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x23, 0x03, 0x02, ++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x01, 0x03, 0x1B, ++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x00, 0x03, 0x1B, ++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x09, ++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x03, ++ 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x23, 0x03, 0x1B, ++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x01, 0x03, 0x1B, ++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x00, 0x03, 0x1B, ++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x09, ++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x03, ++ 0x00, 0x03, 0x00, 0x55, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x23, 0x03, 0x1B, ++ 0x00, 0x01, 0x00, 0x49, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xEC, 0x01, 0xED, ++ 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, ++ 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x50, ++ 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0xA4, ++ 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, ++ 0x1E, 0xB1, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC6, ++ 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, + 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, + 0x1E, 0xE3, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, +- 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x1E, 0xF2, 0x1E, 0xF3, 0x00, 0x01, 0x02, 0xFC, 0x00, 0x4F, +- 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD6, +- 0x00, 0xDE, 0x00, 0xE4, 0x00, 0xEA, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, +- 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, +- 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, +- 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA4, 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, +- 0x01, 0xD4, 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, +- 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, +- 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, +- 0x02, 0x8C, 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBA, 0x02, 0xC0, +- 0x02, 0xC6, 0x02, 0xCC, 0x02, 0xD4, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, 0x02, 0xF4, 0x00, 0x02, +- 0x00, 0xDC, 0x03, 0x41, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, +- 0x03, 0x00, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, +- 0x03, 0x28, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, 0x03, 0x28, 0x00, 0x02, 0x21, 0x2B, 0x03, 0x01, +- 0x00, 0x03, 0x00, 0x61, 0x03, 0x0A, 0x03, 0x01, 0x00, 0x02, 0x01, 0x06, 0x03, 0x27, 0x00, 0x02, +- 0x01, 0x07, 0x03, 0x27, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x65, +- 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x65, +- 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x45, 0x03, 0x06, 0x03, 0x27, 0x00, 0x03, 0x00, 0x65, +- 0x03, 0x06, 0x03, 0x27, 0x00, 0x02, 0x00, 0xCF, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEF, 0x03, 0x41, +- 0x00, 0x02, 0x21, 0x2A, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4C, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, +- 0x00, 0x6C, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, +- 0x00, 0x6F, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, +- 0x00, 0x6F, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, +- 0x00, 0x6F, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x52, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, +- 0x00, 0x72, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x53, 0x03, 0x41, 0x03, 0x07, 0x00, 0x03, +- 0x00, 0x73, 0x03, 0x41, 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x07, 0x03, 0x23, 0x00, 0x03, +- 0x00, 0x73, 0x03, 0x07, 0x03, 0x23, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, +- 0x00, 0x75, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, +- 0x00, 0x61, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, +- 0x00, 0x61, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, +- 0x00, 0x61, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x01, 0x00, 0x03, +- 0x00, 0x61, 0x03, 0x06, 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x00, 0x00, 0x03, +- 0x00, 0x61, 0x03, 0x06, 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x23, 0x00, 0x03, +- 0x00, 0x61, 0x03, 0x06, 0x03, 0x23, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, +- 0x00, 0x65, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, +- 0x00, 0x65, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, +- 0x00, 0x65, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, +- 0x00, 0x6F, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, +- 0x00, 0x6F, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, +- 0x00, 0x6F, 0x03, 0x02, 0x03, 0x23, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xA1, +- 0x03, 0x41, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x40, 0x00, 0x03, +- 0x00, 0x4F, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, +- 0x00, 0x4F, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, +- 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x02, +- 0x01, 0xAF, 0x03, 0x41, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x40, +- 0x00, 0x02, 0x01, 0xB0, 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, +- 0x00, 0x75, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, +- 0x00, 0x75, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x03, +- 0x00, 0x75, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x01, 0x00, 0x4F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, +- 0x01, 0xDC, 0x01, 0xEC, 0x01, 0xED, 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, +- 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, +- 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, +- 0x1E, 0x5C, 0x1E, 0x5D, 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, +- 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, +- 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, +- 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, 0x1E, 0xD9, +- 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, +- 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, +- 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x02, 0xDC, 0x00, 0x49, 0x00, 0x98, +- 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD6, +- 0x00, 0xDE, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, +- 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, 0x01, 0x54, +- 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x94, +- 0x01, 0x9C, 0x01, 0xA4, 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, +- 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, +- 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, +- 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x74, 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, +- 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBC, 0x02, 0xC4, 0x02, 0xCC, 0x02, 0xD4, +- 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x01, +- 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x40, +- 0x00, 0x03, 0x00, 0x4F, 0x03, 0x28, 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x28, 0x03, 0x04, +- 0x00, 0x02, 0x21, 0x2B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, +- 0x00, 0x43, 0x03, 0x01, 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x01, 0x03, 0x27, 0x00, 0x03, +- 0x00, 0x45, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, +- 0x00, 0x45, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, +- 0x00, 0x45, 0x03, 0x27, 0x03, 0x06, 0x00, 0x03, 0x00, 0x65, 0x03, 0x27, 0x03, 0x06, 0x00, 0x03, +- 0x00, 0x49, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x69, 0x03, 0x08, 0x03, 0x01, 0x00, 0x02, +- 0x21, 0x2A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, +- 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, +- 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, +- 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x53, 0x03, 0x23, 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, +- 0x03, 0x23, 0x03, 0x07, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, +- 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, +- 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, +- 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x61, +- 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, +- 0x03, 0x06, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, +- 0x03, 0x06, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x06, 0x00, 0x03, 0x00, 0x61, +- 0x03, 0x23, 0x03, 0x06, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, +- 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, +- 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x65, +- 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, +- 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, +- 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x6F, +- 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, +- 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, +- 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, +- 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, +- 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, +- 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, +- 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, +- 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x75, +- 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x75, +- 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x55, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, +- 0x03, 0x23, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x49, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, 0x01, 0xDC, +- 0x01, 0xEC, 0x01, 0xED, 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, +- 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x4C, +- 0x1E, 0x4D, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, +- 0x1E, 0x79, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, +- 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, +- 0x1E, 0xC1, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, +- 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, +- 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, +- 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x00, 0x9C, 0x00, 0x0F, +- 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, +- 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x03, +- 0x00, 0x55, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, +- 0x00, 0x41, 0x03, 0x0A, 0x03, 0x01, 0x00, 0x03, 0x00, 0x43, 0x03, 0x27, 0x03, 0x01, 0x00, 0x03, +- 0x00, 0x63, 0x03, 0x27, 0x03, 0x01, 0x00, 0x03, 0x00, 0x49, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, +- 0x00, 0x69, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, +- 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, +- 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, +- 0x00, 0x75, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, +- 0x00, 0x75, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xFA, +- 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, +- 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x74, 0x00, 0x0B, 0x00, 0x1C, +- 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, +- 0x00, 0x64, 0x00, 0x6C, 0x00, 0x03, 0x00, 0x41, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x43, +- 0x03, 0x27, 0x03, 0x41, 0x00, 0x03, 0x00, 0x63, 0x03, 0x27, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, +- 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, +- 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, +- 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, +- 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x01, 0x00, 0x0B, +- 0x01, 0xFA, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, +- 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x6A, 0x00, 0x0A, 0x00, 0x1A, 0x00, 0x22, +- 0x00, 0x2A, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, +- 0x00, 0x03, 0x00, 0x43, 0x03, 0x41, 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x41, 0x03, 0x27, +- 0x00, 0x03, 0x00, 0x4F, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x41, 0x03, 0x1B, +- 0x00, 0x03, 0x00, 0x4F, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x40, 0x03, 0x1B, +- 0x00, 0x03, 0x00, 0x55, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x41, 0x03, 0x1B, +- 0x00, 0x03, 0x00, 0x55, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x40, 0x03, 0x1B, +- 0x00, 0x01, 0x00, 0x0A, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, +- 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, +- 0x00, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, +- 0x0D, 0x4A, 0x00, 0x02, 0x0D, 0x3E, 0x0D, 0x4C, 0x00, 0x02, 0x0D, 0x57, 0x00, 0x01, 0x00, 0x04, +- 0x0D, 0x4B, 0x00, 0x02, 0x0D, 0x3E, 0x00, 0x01, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x47, 0x00, 0x02, +- 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, +- 0x00, 0x18, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x3E, 0x00, 0x02, 0x0D, 0x47, 0x0D, 0x3E, 0x00, 0x02, +- 0x0D, 0x46, 0x0D, 0x57, 0x00, 0x01, 0x00, 0x03, 0x0D, 0x4A, 0x0D, 0x4B, 0x0D, 0x4C, 0x00, 0x04, ++ 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x00, 0x9C, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2C, ++ 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, ++ 0x00, 0x74, 0x00, 0x7C, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, ++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x0A, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x43, 0x03, 0x27, 0x03, 0x01, 0x00, 0x03, 0x00, 0x63, 0x03, 0x27, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x49, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x69, 0x03, 0x08, ++ 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, ++ 0x03, 0x00, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, ++ 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, ++ 0x03, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xFA, 0x1E, 0x08, 0x1E, 0x09, ++ 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9, ++ 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x74, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C, ++ 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, ++ 0x00, 0x03, 0x00, 0x41, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x43, 0x03, 0x27, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x63, 0x03, 0x27, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x40, ++ 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x41, ++ 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x40, ++ 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x01, 0x00, 0x0B, 0x01, 0xFA, 0x1E, 0x08, ++ 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, ++ 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x6A, 0x00, 0x0A, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32, ++ 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x03, 0x00, 0x43, ++ 0x03, 0x41, 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x41, 0x03, 0x27, 0x00, 0x03, 0x00, 0x4F, ++ 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, ++ 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, ++ 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, ++ 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x0A, ++ 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9, ++ 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x26, ++ 0x00, 0x02, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x0D, 0x4A, 0x00, 0x02, ++ 0x0D, 0x3E, 0x0D, 0x4C, 0x00, 0x02, 0x0D, 0x57, 0x00, 0x01, 0x00, 0x04, 0x0D, 0x4B, 0x00, 0x02, ++ 0x0D, 0x3E, 0x00, 0x01, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x47, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, ++ 0x00, 0x08, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, ++ 0x0D, 0x46, 0x0D, 0x3E, 0x00, 0x02, 0x0D, 0x47, 0x0D, 0x3E, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x57, ++ 0x00, 0x01, 0x00, 0x03, 0x0D, 0x4A, 0x0D, 0x4B, 0x0D, 0x4C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, ++ 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x10, 0x26, ++ 0x00, 0x02, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x01, 0x10, 0x25, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, ++ 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x10, 0x25, 0x10, 0x2E, ++ 0x00, 0x01, 0x00, 0x01, 0x10, 0x26, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, ++ 0x00, 0x22, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x0B, 0x4B, ++ 0x00, 0x02, 0x0B, 0x3E, 0x0B, 0x48, 0x00, 0x02, 0x0B, 0x56, 0x0B, 0x4C, 0x00, 0x02, 0x0B, 0x57, ++ 0x00, 0x01, 0x00, 0x01, 0x0B, 0x47, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, ++ 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x56, ++ 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x3E, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x57, 0x00, 0x01, 0x00, 0x03, ++ 0x0B, 0x48, 0x0B, 0x4B, 0x0B, 0x4C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, ++ 0x00, 0x38, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x18, ++ 0x00, 0x1E, 0x0D, 0xDA, 0x00, 0x02, 0x0D, 0xCA, 0x0D, 0xDD, 0x00, 0x03, 0x0D, 0xCF, 0x0D, 0xCA, ++ 0x0D, 0xDC, 0x00, 0x02, 0x0D, 0xCF, 0x0D, 0xDE, 0x00, 0x02, 0x0D, 0xDF, 0x00, 0x01, 0x00, 0x04, ++ 0x0D, 0xDD, 0x00, 0x02, 0x0D, 0xCA, 0x00, 0x01, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xDC, 0x00, 0x02, ++ 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x3C, 0x00, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x0E, ++ 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xCA, 0x00, 0x02, 0x0D, 0xD9, ++ 0x0D, 0xCF, 0x00, 0x02, 0x0D, 0xDC, 0x0D, 0xCA, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xDF, 0x00, 0x01, ++ 0x00, 0x04, 0x0D, 0xDA, 0x0D, 0xDC, 0x0D, 0xDD, 0x0D, 0xDE, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, ++ 0x00, 0x08, 0x00, 0x03, 0x0D, 0xD9, 0x0D, 0xCF, 0x0D, 0xCA, 0x00, 0x01, 0x00, 0x01, 0x0D, 0xDD, ++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x32, 0x00, 0x03, 0x00, 0x0C, ++ 0x00, 0x16, 0x00, 0x28, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x00, 0x02, 0x0B, 0xD7, 0x00, 0x02, ++ 0x00, 0x06, 0x00, 0x0C, 0x0B, 0xCA, 0x00, 0x02, 0x0B, 0xBE, 0x0B, 0xCC, 0x00, 0x02, 0x0B, 0xD7, ++ 0x00, 0x01, 0x00, 0x04, 0x0B, 0xCB, 0x00, 0x02, 0x0B, 0xBE, 0x00, 0x01, 0x00, 0x03, 0x0B, 0x92, ++ 0x0B, 0xC6, 0x0B, 0xC7, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x26, ++ 0x00, 0x04, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, 0x0B, 0x92, 0x0B, 0xD7, ++ 0x00, 0x02, 0x0B, 0xC6, 0x0B, 0xBE, 0x00, 0x02, 0x0B, 0xC7, 0x0B, 0xBE, 0x00, 0x02, 0x0B, 0xC6, ++ 0x0B, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x0B, 0xCA, 0x0B, 0xCB, 0x0B, 0xCC, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, +- 0x00, 0x04, 0x10, 0x26, 0x00, 0x02, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x01, 0x10, 0x25, 0x00, 0x02, ++ 0x00, 0x04, 0x0C, 0x48, 0x00, 0x02, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, 0x0C, 0x46, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, +- 0x10, 0x25, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x01, 0x10, 0x26, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, +- 0x00, 0x08, 0x00, 0x01, 0x00, 0x3A, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x20, 0x00, 0x01, +- 0x00, 0x04, 0x0B, 0x5C, 0x00, 0x02, 0x0B, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x5D, 0x00, 0x02, +- 0x0B, 0x3C, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x0B, 0x4B, 0x00, 0x02, 0x0B, 0x3E, +- 0x0B, 0x48, 0x00, 0x02, 0x0B, 0x56, 0x0B, 0x4C, 0x00, 0x02, 0x0B, 0x57, 0x00, 0x01, 0x00, 0x03, +- 0x0B, 0x21, 0x0B, 0x22, 0x0B, 0x47, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, +- 0x00, 0x2E, 0x00, 0x05, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x02, +- 0x0B, 0x47, 0x0B, 0x56, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x3E, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x57, +- 0x00, 0x02, 0x0B, 0x21, 0x0B, 0x3C, 0x00, 0x02, 0x0B, 0x22, 0x0B, 0x3C, 0x00, 0x01, 0x00, 0x05, +- 0x0B, 0x48, 0x0B, 0x4B, 0x0B, 0x4C, 0x0B, 0x5C, 0x0B, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, +- 0x00, 0x08, 0x00, 0x01, 0x00, 0x38, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x0A, +- 0x00, 0x10, 0x00, 0x18, 0x00, 0x1E, 0x0D, 0xDA, 0x00, 0x02, 0x0D, 0xCA, 0x0D, 0xDD, 0x00, 0x03, +- 0x0D, 0xCF, 0x0D, 0xCA, 0x0D, 0xDC, 0x00, 0x02, 0x0D, 0xCF, 0x0D, 0xDE, 0x00, 0x02, 0x0D, 0xDF, +- 0x00, 0x01, 0x00, 0x04, 0x0D, 0xDD, 0x00, 0x02, 0x0D, 0xCA, 0x00, 0x01, 0x00, 0x02, 0x0D, 0xD9, +- 0x0D, 0xDC, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x3C, 0x00, 0x01, 0x00, 0x26, +- 0x00, 0x04, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xCA, +- 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xCF, 0x00, 0x02, 0x0D, 0xDC, 0x0D, 0xCA, 0x00, 0x02, 0x0D, 0xD9, +- 0x0D, 0xDF, 0x00, 0x01, 0x00, 0x04, 0x0D, 0xDA, 0x0D, 0xDC, 0x0D, 0xDD, 0x0D, 0xDE, 0x00, 0x01, +- 0x00, 0x10, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x0D, 0xD9, 0x0D, 0xCF, 0x0D, 0xCA, 0x00, 0x01, +- 0x00, 0x01, 0x0D, 0xDD, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x32, +- 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x28, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x00, 0x02, +- 0x0B, 0xD7, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x0B, 0xCA, 0x00, 0x02, 0x0B, 0xBE, 0x0B, 0xCC, +- 0x00, 0x02, 0x0B, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x0B, 0xCB, 0x00, 0x02, 0x0B, 0xBE, 0x00, 0x01, +- 0x00, 0x03, 0x0B, 0x92, 0x0B, 0xC6, 0x0B, 0xC7, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, +- 0x00, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, +- 0x0B, 0x92, 0x0B, 0xD7, 0x00, 0x02, 0x0B, 0xC6, 0x0B, 0xBE, 0x00, 0x02, 0x0B, 0xC7, 0x0B, 0xBE, +- 0x00, 0x02, 0x0B, 0xC6, 0x0B, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x0B, 0xCA, 0x0B, 0xCB, +- 0x0B, 0xCC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, +- 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x0C, 0x48, 0x00, 0x02, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, +- 0x0C, 0x46, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, +- 0x00, 0x08, 0x00, 0x02, 0x0C, 0x46, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, 0x0C, 0x48, 0x00, 0x04, +- 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0xEE, 0x00, 0x12, 0x00, 0x2A, 0x00, 0x34, +- 0x00, 0x3E, 0x00, 0x48, 0x00, 0x52, 0x00, 0x5C, 0x00, 0x66, 0x00, 0x80, 0x00, 0x8A, 0x00, 0x94, +- 0x00, 0x9E, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xDA, 0x00, 0xE4, +- 0x00, 0x01, 0x00, 0x04, 0x0F, 0x69, 0x00, 0x02, 0x0F, 0xB5, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x43, +- 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x4D, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, +- 0x00, 0x04, 0x0F, 0x52, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x57, 0x00, 0x02, +- 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x5C, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x03, 0x00, 0x08, +- 0x00, 0x0E, 0x00, 0x14, 0x0F, 0x73, 0x00, 0x02, 0x0F, 0x72, 0x0F, 0x75, 0x00, 0x02, 0x0F, 0x74, +- 0x0F, 0x81, 0x00, 0x02, 0x0F, 0x80, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x73, 0x00, 0x02, 0x0F, 0x71, +- 0x00, 0x01, 0x00, 0x04, 0x0F, 0x75, 0x00, 0x02, 0x0F, 0x71, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x81, +- 0x00, 0x02, 0x0F, 0x71, 0x00, 0x01, 0x00, 0x04, 0x0F, 0xB9, 0x00, 0x02, 0x0F, 0xB5, 0x00, 0x01, +- 0x00, 0x04, 0x0F, 0x93, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x9D, 0x00, 0x02, +- 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0xA2, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, +- 0x0F, 0xA7, 0x00, 0x02, 0x0F, 0xB7, 0x00, 0x01, 0x00, 0x04, 0x0F, 0xAC, 0x00, 0x02, 0x0F, 0xB7, +- 0x00, 0x01, 0x00, 0x04, 0x0F, 0x76, 0x00, 0x02, 0x0F, 0x80, 0x00, 0x01, 0x00, 0x04, 0x0F, 0x78, +- 0x00, 0x02, 0x0F, 0x80, 0x00, 0x01, 0x00, 0x12, 0x0F, 0x40, 0x0F, 0x42, 0x0F, 0x4C, 0x0F, 0x51, +- 0x0F, 0x56, 0x0F, 0x5B, 0x0F, 0x71, 0x0F, 0x72, 0x0F, 0x74, 0x0F, 0x80, 0x0F, 0x90, 0x0F, 0x92, +- 0x0F, 0x9C, 0x0F, 0xA1, 0x0F, 0xA6, 0x0F, 0xAB, 0x0F, 0xB2, 0x0F, 0xB3, 0x00, 0x02, 0x00, 0x00, +- 0x00, 0x02, 0x00, 0x0A, 0x00, 0xBE, 0x00, 0x01, 0x00, 0x8E, 0x00, 0x11, 0x00, 0x28, 0x00, 0x2E, +- 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, +- 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x02, +- 0x0F, 0x42, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x4C, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x51, 0x0F, 0xB7, +- 0x00, 0x02, 0x0F, 0x56, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x5B, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x40, +- 0x0F, 0xB5, 0x00, 0x02, 0x0F, 0x71, 0x0F, 0x72, 0x00, 0x02, 0x0F, 0x71, 0x0F, 0x74, 0x00, 0x02, +- 0x0F, 0xB2, 0x0F, 0x80, 0x00, 0x02, 0x0F, 0xB3, 0x0F, 0x80, 0x00, 0x02, 0x0F, 0x71, 0x0F, 0x80, +- 0x00, 0x02, 0x0F, 0x92, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0x9C, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0xA1, +- 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0xA6, 0x0F, 0xB7, 0x00, 0x02, 0x0F, 0xAB, 0x0F, 0xB7, 0x00, 0x02, +- 0x0F, 0x90, 0x0F, 0xB5, 0x00, 0x01, 0x00, 0x11, 0x0F, 0x43, 0x0F, 0x4D, 0x0F, 0x52, 0x0F, 0x57, +- 0x0F, 0x5C, 0x0F, 0x69, 0x0F, 0x73, 0x0F, 0x75, 0x0F, 0x76, 0x0F, 0x78, 0x0F, 0x81, 0x0F, 0x93, +- 0x0F, 0x9D, 0x0F, 0xA2, 0x0F, 0xA7, 0x0F, 0xAC, 0x0F, 0xB9, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x03, +- 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, 0x0F, 0x72, 0x0F, 0x71, 0x00, 0x02, 0x0F, 0x74, +- 0x0F, 0x71, 0x00, 0x02, 0x0F, 0x80, 0x0F, 0x71, 0x00, 0x01, 0x00, 0x03, 0x0F, 0x73, 0x0F, 0x75, +- 0x0F, 0x81 ++ 0x0C, 0x46, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, 0x0C, 0x48, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, ++ 0x00, 0x08, 0x00, 0x01, 0x00, 0x8A, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3A, ++ 0x00, 0x44, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, 0x00, 0x01, ++ 0x00, 0x04, 0x1B, 0x06, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x08, 0x00, 0x02, ++ 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x0A, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, ++ 0x1B, 0x0C, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x0E, 0x00, 0x02, 0x1B, 0x35, ++ 0x00, 0x01, 0x00, 0x04, 0x1B, 0x12, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x3B, ++ 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x3D, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, ++ 0x00, 0x04, 0x1B, 0x40, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x41, 0x00, 0x02, ++ 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x43, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x0B, ++ 0x1B, 0x05, 0x1B, 0x07, 0x1B, 0x09, 0x1B, 0x0B, 0x1B, 0x0D, 0x1B, 0x11, 0x1B, 0x3A, 0x1B, 0x3C, ++ 0x1B, 0x3E, 0x1B, 0x3F, 0x1B, 0x42, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, ++ 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, ++ 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x02, 0x1B, 0x05, 0x1B, 0x35, ++ 0x00, 0x02, 0x1B, 0x07, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x09, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x0B, ++ 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x0D, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x11, 0x1B, 0x35, 0x00, 0x02, ++ 0x1B, 0x3A, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x3C, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x3E, 0x1B, 0x35, ++ 0x00, 0x02, 0x1B, 0x3F, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x42, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x0B, ++ 0x1B, 0x06, 0x1B, 0x08, 0x1B, 0x0A, 0x1B, 0x0C, 0x1B, 0x0E, 0x1B, 0x12, 0x1B, 0x3B, 0x1B, 0x3D, ++ 0x1B, 0x40, 0x1B, 0x41, 0x1B, 0x43 + }; + + const le_uint8 CanonShaping::glyphDefinitionTable[] = { +@@ -3701,7 +3561,7 @@ + 0xFC, 0x00, 0xFC, 0x5D, 0x00, 0x02, 0xFC, 0x64, 0xFC, 0xF1, 0x00, 0x02, 0xFC, 0xF5, 0xFD, 0x3D, + 0x00, 0x02, 0xFD, 0x50, 0xFD, 0x8F, 0x00, 0x02, 0xFD, 0x92, 0xFD, 0xC7, 0x00, 0x02, 0xFD, 0xF0, + 0xFD, 0xFC, 0x00, 0x02, 0xFE, 0x80, 0xFE, 0xF4, 0x00, 0x01, 0xFE, 0xF5, 0xFE, 0xFC, 0x00, 0x02, +- 0x00, 0x02, 0x00, 0xC1, 0x03, 0x00, 0x03, 0x14, 0x00, 0xE6, 0x03, 0x15, 0x03, 0x15, 0x00, 0xE8, ++ 0x00, 0x02, 0x00, 0xCE, 0x03, 0x00, 0x03, 0x14, 0x00, 0xE6, 0x03, 0x15, 0x03, 0x15, 0x00, 0xE8, + 0x03, 0x16, 0x03, 0x19, 0x00, 0xDC, 0x03, 0x1A, 0x03, 0x1A, 0x00, 0xE8, 0x03, 0x1B, 0x03, 0x1B, + 0x00, 0xD8, 0x03, 0x1C, 0x03, 0x20, 0x00, 0xDC, 0x03, 0x21, 0x03, 0x22, 0x00, 0xCA, 0x03, 0x23, + 0x03, 0x26, 0x00, 0xDC, 0x03, 0x27, 0x03, 0x28, 0x00, 0xCA, 0x03, 0x29, 0x03, 0x33, 0x00, 0xDC, +@@ -3719,61 +3579,66 @@ + 0x05, 0xA7, 0x00, 0xDC, 0x05, 0xA8, 0x05, 0xA8, 0x00, 0xE6, 0x05, 0xA9, 0x05, 0xA9, 0x00, 0xE8, + 0x05, 0xAA, 0x05, 0xAA, 0x00, 0xDC, 0x05, 0xAB, 0x05, 0xAC, 0x00, 0xE6, 0x05, 0xAD, 0x05, 0xAD, + 0x00, 0xDE, 0x05, 0xAE, 0x05, 0xAE, 0x00, 0xE8, 0x05, 0xAF, 0x05, 0xAF, 0x00, 0xE6, 0x05, 0xB0, +- 0x05, 0xB8, 0x00, 0xDC, 0x05, 0xB9, 0x05, 0xB9, 0x00, 0x1B, 0x05, 0xBB, 0x05, 0xBB, 0x00, 0xDC, +- 0x05, 0xBC, 0x05, 0xBC, 0x00, 0x15, 0x05, 0xBD, 0x05, 0xBD, 0x00, 0xDC, 0x05, 0xBF, 0x05, 0xBF, +- 0x00, 0x17, 0x05, 0xC1, 0x05, 0xC1, 0x00, 0x0A, 0x05, 0xC2, 0x05, 0xC2, 0x00, 0x0B, 0x05, 0xC4, +- 0x05, 0xC4, 0x00, 0xE6, 0x05, 0xC5, 0x05, 0xC5, 0x00, 0xDC, 0x05, 0xC7, 0x05, 0xC7, 0x00, 0x12, +- 0x06, 0x10, 0x06, 0x15, 0x00, 0xE6, 0x06, 0x4B, 0x06, 0x4C, 0x00, 0x1F, 0x06, 0x4D, 0x06, 0x4D, +- 0x00, 0x1E, 0x06, 0x4E, 0x06, 0x4F, 0x00, 0x1F, 0x06, 0x50, 0x06, 0x50, 0x00, 0x1E, 0x06, 0x51, +- 0x06, 0x51, 0x00, 0x1C, 0x06, 0x52, 0x06, 0x52, 0x00, 0x1F, 0x06, 0x53, 0x06, 0x53, 0x00, 0x20, +- 0x06, 0x54, 0x06, 0x55, 0x00, 0x1B, 0x06, 0x56, 0x06, 0x56, 0x00, 0x1D, 0x06, 0x57, 0x06, 0x58, +- 0x00, 0x1F, 0x06, 0x59, 0x06, 0x5B, 0x00, 0xE6, 0x06, 0x5C, 0x06, 0x5C, 0x00, 0xDC, 0x06, 0x5D, +- 0x06, 0x5E, 0x00, 0xE6, 0x06, 0x70, 0x06, 0x70, 0x00, 0x1D, 0x06, 0xD6, 0x06, 0xDC, 0x00, 0xE6, +- 0x06, 0xDF, 0x06, 0xE0, 0x00, 0xE6, 0x06, 0xE1, 0x06, 0xE1, 0x00, 0x1F, 0x06, 0xE2, 0x06, 0xE2, +- 0x00, 0xE6, 0x06, 0xE3, 0x06, 0xE3, 0x00, 0xDC, 0x06, 0xE4, 0x06, 0xE4, 0x00, 0xE6, 0x06, 0xE7, +- 0x06, 0xE8, 0x00, 0xE6, 0x06, 0xEA, 0x06, 0xEA, 0x00, 0xDC, 0x06, 0xEB, 0x06, 0xEC, 0x00, 0xE6, +- 0x06, 0xED, 0x06, 0xED, 0x00, 0xDC, 0x07, 0x11, 0x07, 0x11, 0x00, 0x24, 0x07, 0x30, 0x07, 0x30, +- 0x00, 0xE6, 0x07, 0x31, 0x07, 0x31, 0x00, 0xDC, 0x07, 0x32, 0x07, 0x33, 0x00, 0xE6, 0x07, 0x34, +- 0x07, 0x34, 0x00, 0xDC, 0x07, 0x35, 0x07, 0x36, 0x00, 0xE6, 0x07, 0x37, 0x07, 0x39, 0x00, 0xDC, +- 0x07, 0x3A, 0x07, 0x3A, 0x00, 0xE6, 0x07, 0x3B, 0x07, 0x3C, 0x00, 0xDC, 0x07, 0x3D, 0x07, 0x3D, +- 0x00, 0xE6, 0x07, 0x3E, 0x07, 0x3E, 0x00, 0xDC, 0x07, 0x3F, 0x07, 0x41, 0x00, 0xE6, 0x07, 0x42, +- 0x07, 0x42, 0x00, 0xDC, 0x07, 0x43, 0x07, 0x43, 0x00, 0xE6, 0x07, 0x44, 0x07, 0x44, 0x00, 0xDC, +- 0x07, 0x45, 0x07, 0x45, 0x00, 0xE6, 0x07, 0x46, 0x07, 0x46, 0x00, 0xDC, 0x07, 0x47, 0x07, 0x47, +- 0x00, 0xE6, 0x07, 0x48, 0x07, 0x48, 0x00, 0xDC, 0x07, 0x49, 0x07, 0x4A, 0x00, 0xE6, 0x09, 0x3C, +- 0x09, 0x3C, 0x00, 0x07, 0x09, 0x4D, 0x09, 0x4D, 0x00, 0x09, 0x09, 0x51, 0x09, 0x51, 0x00, 0xE6, +- 0x09, 0x52, 0x09, 0x52, 0x00, 0xDC, 0x09, 0x53, 0x09, 0x54, 0x00, 0xE6, 0x09, 0xBC, 0x09, 0xBC, +- 0x00, 0x07, 0x09, 0xCD, 0x09, 0xCD, 0x00, 0x09, 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x07, 0x0A, 0x4D, +- 0x0A, 0x4D, 0x00, 0x09, 0x0A, 0xBC, 0x0A, 0xBC, 0x00, 0x07, 0x0A, 0xCD, 0x0A, 0xCD, 0x00, 0x09, +- 0x0B, 0x3C, 0x0B, 0x3C, 0x00, 0x07, 0x0B, 0x4D, 0x0B, 0x4D, 0x00, 0x09, 0x0B, 0xCD, 0x0B, 0xCD, +- 0x00, 0x09, 0x0C, 0x4D, 0x0C, 0x4D, 0x00, 0x09, 0x0C, 0x55, 0x0C, 0x55, 0x00, 0x54, 0x0C, 0x56, +- 0x0C, 0x56, 0x00, 0x5B, 0x0C, 0xBC, 0x0C, 0xBC, 0x00, 0x07, 0x0C, 0xCD, 0x0C, 0xCD, 0x00, 0x09, +- 0x0D, 0x4D, 0x0D, 0x4D, 0x00, 0x09, 0x0D, 0xCA, 0x0D, 0xCA, 0x00, 0x09, 0x0E, 0x38, 0x0E, 0x39, +- 0x00, 0x67, 0x0E, 0x3A, 0x0E, 0x3A, 0x00, 0x09, 0x0E, 0x48, 0x0E, 0x4B, 0x00, 0x6B, 0x0E, 0xB8, +- 0x0E, 0xB9, 0x00, 0x76, 0x0E, 0xC8, 0x0E, 0xCB, 0x00, 0x7A, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0xDC, +- 0x0F, 0x35, 0x0F, 0x35, 0x00, 0xDC, 0x0F, 0x37, 0x0F, 0x37, 0x00, 0xDC, 0x0F, 0x39, 0x0F, 0x39, +- 0x00, 0xD8, 0x0F, 0x71, 0x0F, 0x71, 0x00, 0x81, 0x0F, 0x72, 0x0F, 0x72, 0x00, 0x82, 0x0F, 0x74, +- 0x0F, 0x74, 0x00, 0x84, 0x0F, 0x7A, 0x0F, 0x7D, 0x00, 0x82, 0x0F, 0x80, 0x0F, 0x80, 0x00, 0x82, +- 0x0F, 0x82, 0x0F, 0x83, 0x00, 0xE6, 0x0F, 0x84, 0x0F, 0x84, 0x00, 0x09, 0x0F, 0x86, 0x0F, 0x87, +- 0x00, 0xE6, 0x0F, 0xC6, 0x0F, 0xC6, 0x00, 0xDC, 0x10, 0x37, 0x10, 0x37, 0x00, 0x07, 0x10, 0x39, +- 0x10, 0x39, 0x00, 0x09, 0x13, 0x5F, 0x13, 0x5F, 0x00, 0xE6, 0x17, 0x14, 0x17, 0x14, 0x00, 0x09, +- 0x17, 0x34, 0x17, 0x34, 0x00, 0x09, 0x17, 0xD2, 0x17, 0xD2, 0x00, 0x09, 0x17, 0xDD, 0x17, 0xDD, +- 0x00, 0xE6, 0x18, 0xA9, 0x18, 0xA9, 0x00, 0xE4, 0x19, 0x39, 0x19, 0x39, 0x00, 0xDE, 0x19, 0x3A, +- 0x19, 0x3A, 0x00, 0xE6, 0x19, 0x3B, 0x19, 0x3B, 0x00, 0xDC, 0x1A, 0x17, 0x1A, 0x17, 0x00, 0xE6, +- 0x1A, 0x18, 0x1A, 0x18, 0x00, 0xDC, 0x1D, 0xC0, 0x1D, 0xC1, 0x00, 0xE6, 0x1D, 0xC2, 0x1D, 0xC2, +- 0x00, 0xDC, 0x1D, 0xC3, 0x1D, 0xC3, 0x00, 0xE6, 0x20, 0xD0, 0x20, 0xD1, 0x00, 0xE6, 0x20, 0xD2, +- 0x20, 0xD3, 0x00, 0x01, 0x20, 0xD4, 0x20, 0xD7, 0x00, 0xE6, 0x20, 0xD8, 0x20, 0xDA, 0x00, 0x01, +- 0x20, 0xDB, 0x20, 0xDC, 0x00, 0xE6, 0x20, 0xE1, 0x20, 0xE1, 0x00, 0xE6, 0x20, 0xE5, 0x20, 0xE6, +- 0x00, 0x01, 0x20, 0xE7, 0x20, 0xE7, 0x00, 0xE6, 0x20, 0xE8, 0x20, 0xE8, 0x00, 0xDC, 0x20, 0xE9, +- 0x20, 0xE9, 0x00, 0xE6, 0x20, 0xEA, 0x20, 0xEB, 0x00, 0x01, 0x30, 0x2A, 0x30, 0x2A, 0x00, 0xDA, +- 0x30, 0x2B, 0x30, 0x2B, 0x00, 0xE4, 0x30, 0x2C, 0x30, 0x2C, 0x00, 0xE8, 0x30, 0x2D, 0x30, 0x2D, +- 0x00, 0xDE, 0x30, 0x2E, 0x30, 0x2F, 0x00, 0xE0, 0x30, 0x99, 0x30, 0x9A, 0x00, 0x08, 0xA8, 0x06, +- 0xA8, 0x06, 0x00, 0x09, 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x1A, 0xFE, 0x20, 0xFE, 0x23, 0x00, 0xE6, +- 0x0A, 0x0D, 0x0A, 0x0D, 0x00, 0xDC, 0x0A, 0x0F, 0x0A, 0x0F, 0x00, 0xE6, 0x0A, 0x38, 0x0A, 0x38, +- 0x00, 0xE6, 0x0A, 0x39, 0x0A, 0x39, 0x00, 0x01, 0x0A, 0x3A, 0x0A, 0x3A, 0x00, 0xDC, 0x0A, 0x3F, +- 0x0A, 0x3F, 0x00, 0x09, 0xD1, 0x65, 0xD1, 0x66, 0x00, 0xD8, 0xD1, 0x67, 0xD1, 0x69, 0x00, 0x01, +- 0xD1, 0x6D, 0xD1, 0x6D, 0x00, 0xE2, 0xD1, 0x6E, 0xD1, 0x72, 0x00, 0xD8, 0xD1, 0x7B, 0xD1, 0x82, +- 0x00, 0xDC, 0xD1, 0x85, 0xD1, 0x89, 0x00, 0xE6, 0xD1, 0x8A, 0xD1, 0x8B, 0x00, 0xDC, 0xD1, 0xAA, +- 0xD1, 0xAD, 0x00, 0xE6, 0xD2, 0x42, 0xD2, 0x44, 0x00, 0xE6 ++ 0x05, 0xB8, 0x00, 0xDC, 0x05, 0xB9, 0x05, 0xB9, 0x00, 0x1B, 0x05, 0xBA, 0x05, 0xBA, 0x00, 0x13, ++ 0x05, 0xBB, 0x05, 0xBB, 0x00, 0xDC, 0x05, 0xBC, 0x05, 0xBC, 0x00, 0x15, 0x05, 0xBD, 0x05, 0xBD, ++ 0x00, 0xDC, 0x05, 0xBF, 0x05, 0xBF, 0x00, 0x17, 0x05, 0xC1, 0x05, 0xC1, 0x00, 0x0A, 0x05, 0xC2, ++ 0x05, 0xC2, 0x00, 0x0B, 0x05, 0xC4, 0x05, 0xC4, 0x00, 0xE6, 0x05, 0xC5, 0x05, 0xC5, 0x00, 0xDC, ++ 0x05, 0xC7, 0x05, 0xC7, 0x00, 0x12, 0x06, 0x10, 0x06, 0x15, 0x00, 0xE6, 0x06, 0x4B, 0x06, 0x4C, ++ 0x00, 0x1F, 0x06, 0x4D, 0x06, 0x4D, 0x00, 0x1E, 0x06, 0x4E, 0x06, 0x4F, 0x00, 0x1F, 0x06, 0x50, ++ 0x06, 0x50, 0x00, 0x1E, 0x06, 0x51, 0x06, 0x51, 0x00, 0x1C, 0x06, 0x52, 0x06, 0x52, 0x00, 0x1F, ++ 0x06, 0x53, 0x06, 0x53, 0x00, 0x20, 0x06, 0x54, 0x06, 0x55, 0x00, 0x1B, 0x06, 0x56, 0x06, 0x56, ++ 0x00, 0x1D, 0x06, 0x57, 0x06, 0x58, 0x00, 0x1F, 0x06, 0x59, 0x06, 0x5B, 0x00, 0xE6, 0x06, 0x5C, ++ 0x06, 0x5C, 0x00, 0xDC, 0x06, 0x5D, 0x06, 0x5E, 0x00, 0xE6, 0x06, 0x70, 0x06, 0x70, 0x00, 0x1D, ++ 0x06, 0xD6, 0x06, 0xDC, 0x00, 0xE6, 0x06, 0xDF, 0x06, 0xE0, 0x00, 0xE6, 0x06, 0xE1, 0x06, 0xE1, ++ 0x00, 0x1F, 0x06, 0xE2, 0x06, 0xE2, 0x00, 0xE6, 0x06, 0xE3, 0x06, 0xE3, 0x00, 0xDC, 0x06, 0xE4, ++ 0x06, 0xE4, 0x00, 0xE6, 0x06, 0xE7, 0x06, 0xE8, 0x00, 0xE6, 0x06, 0xEA, 0x06, 0xEA, 0x00, 0xDC, ++ 0x06, 0xEB, 0x06, 0xEC, 0x00, 0xE6, 0x06, 0xED, 0x06, 0xED, 0x00, 0xDC, 0x07, 0x11, 0x07, 0x11, ++ 0x00, 0x24, 0x07, 0x30, 0x07, 0x30, 0x00, 0xE6, 0x07, 0x31, 0x07, 0x31, 0x00, 0xDC, 0x07, 0x32, ++ 0x07, 0x33, 0x00, 0xE6, 0x07, 0x34, 0x07, 0x34, 0x00, 0xDC, 0x07, 0x35, 0x07, 0x36, 0x00, 0xE6, ++ 0x07, 0x37, 0x07, 0x39, 0x00, 0xDC, 0x07, 0x3A, 0x07, 0x3A, 0x00, 0xE6, 0x07, 0x3B, 0x07, 0x3C, ++ 0x00, 0xDC, 0x07, 0x3D, 0x07, 0x3D, 0x00, 0xE6, 0x07, 0x3E, 0x07, 0x3E, 0x00, 0xDC, 0x07, 0x3F, ++ 0x07, 0x41, 0x00, 0xE6, 0x07, 0x42, 0x07, 0x42, 0x00, 0xDC, 0x07, 0x43, 0x07, 0x43, 0x00, 0xE6, ++ 0x07, 0x44, 0x07, 0x44, 0x00, 0xDC, 0x07, 0x45, 0x07, 0x45, 0x00, 0xE6, 0x07, 0x46, 0x07, 0x46, ++ 0x00, 0xDC, 0x07, 0x47, 0x07, 0x47, 0x00, 0xE6, 0x07, 0x48, 0x07, 0x48, 0x00, 0xDC, 0x07, 0x49, ++ 0x07, 0x4A, 0x00, 0xE6, 0x07, 0xEB, 0x07, 0xF1, 0x00, 0xE6, 0x07, 0xF2, 0x07, 0xF2, 0x00, 0xDC, ++ 0x07, 0xF3, 0x07, 0xF3, 0x00, 0xE6, 0x09, 0x3C, 0x09, 0x3C, 0x00, 0x07, 0x09, 0x4D, 0x09, 0x4D, ++ 0x00, 0x09, 0x09, 0x51, 0x09, 0x51, 0x00, 0xE6, 0x09, 0x52, 0x09, 0x52, 0x00, 0xDC, 0x09, 0x53, ++ 0x09, 0x54, 0x00, 0xE6, 0x09, 0xBC, 0x09, 0xBC, 0x00, 0x07, 0x09, 0xCD, 0x09, 0xCD, 0x00, 0x09, ++ 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x07, 0x0A, 0x4D, 0x0A, 0x4D, 0x00, 0x09, 0x0A, 0xBC, 0x0A, 0xBC, ++ 0x00, 0x07, 0x0A, 0xCD, 0x0A, 0xCD, 0x00, 0x09, 0x0B, 0x3C, 0x0B, 0x3C, 0x00, 0x07, 0x0B, 0x4D, ++ 0x0B, 0x4D, 0x00, 0x09, 0x0B, 0xCD, 0x0B, 0xCD, 0x00, 0x09, 0x0C, 0x4D, 0x0C, 0x4D, 0x00, 0x09, ++ 0x0C, 0x55, 0x0C, 0x55, 0x00, 0x54, 0x0C, 0x56, 0x0C, 0x56, 0x00, 0x5B, 0x0C, 0xBC, 0x0C, 0xBC, ++ 0x00, 0x07, 0x0C, 0xCD, 0x0C, 0xCD, 0x00, 0x09, 0x0D, 0x4D, 0x0D, 0x4D, 0x00, 0x09, 0x0D, 0xCA, ++ 0x0D, 0xCA, 0x00, 0x09, 0x0E, 0x38, 0x0E, 0x39, 0x00, 0x67, 0x0E, 0x3A, 0x0E, 0x3A, 0x00, 0x09, ++ 0x0E, 0x48, 0x0E, 0x4B, 0x00, 0x6B, 0x0E, 0xB8, 0x0E, 0xB9, 0x00, 0x76, 0x0E, 0xC8, 0x0E, 0xCB, ++ 0x00, 0x7A, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0xDC, 0x0F, 0x35, 0x0F, 0x35, 0x00, 0xDC, 0x0F, 0x37, ++ 0x0F, 0x37, 0x00, 0xDC, 0x0F, 0x39, 0x0F, 0x39, 0x00, 0xD8, 0x0F, 0x71, 0x0F, 0x71, 0x00, 0x81, ++ 0x0F, 0x72, 0x0F, 0x72, 0x00, 0x82, 0x0F, 0x74, 0x0F, 0x74, 0x00, 0x84, 0x0F, 0x7A, 0x0F, 0x7D, ++ 0x00, 0x82, 0x0F, 0x80, 0x0F, 0x80, 0x00, 0x82, 0x0F, 0x82, 0x0F, 0x83, 0x00, 0xE6, 0x0F, 0x84, ++ 0x0F, 0x84, 0x00, 0x09, 0x0F, 0x86, 0x0F, 0x87, 0x00, 0xE6, 0x0F, 0xC6, 0x0F, 0xC6, 0x00, 0xDC, ++ 0x10, 0x37, 0x10, 0x37, 0x00, 0x07, 0x10, 0x39, 0x10, 0x39, 0x00, 0x09, 0x13, 0x5F, 0x13, 0x5F, ++ 0x00, 0xE6, 0x17, 0x14, 0x17, 0x14, 0x00, 0x09, 0x17, 0x34, 0x17, 0x34, 0x00, 0x09, 0x17, 0xD2, ++ 0x17, 0xD2, 0x00, 0x09, 0x17, 0xDD, 0x17, 0xDD, 0x00, 0xE6, 0x18, 0xA9, 0x18, 0xA9, 0x00, 0xE4, ++ 0x19, 0x39, 0x19, 0x39, 0x00, 0xDE, 0x19, 0x3A, 0x19, 0x3A, 0x00, 0xE6, 0x19, 0x3B, 0x19, 0x3B, ++ 0x00, 0xDC, 0x1A, 0x17, 0x1A, 0x17, 0x00, 0xE6, 0x1A, 0x18, 0x1A, 0x18, 0x00, 0xDC, 0x1B, 0x34, ++ 0x1B, 0x34, 0x00, 0x07, 0x1B, 0x44, 0x1B, 0x44, 0x00, 0x09, 0x1B, 0x6B, 0x1B, 0x6B, 0x00, 0xE6, ++ 0x1B, 0x6C, 0x1B, 0x6C, 0x00, 0xDC, 0x1B, 0x6D, 0x1B, 0x73, 0x00, 0xE6, 0x1D, 0xC0, 0x1D, 0xC1, ++ 0x00, 0xE6, 0x1D, 0xC2, 0x1D, 0xC2, 0x00, 0xDC, 0x1D, 0xC3, 0x1D, 0xC9, 0x00, 0xE6, 0x1D, 0xCA, ++ 0x1D, 0xCA, 0x00, 0xDC, 0x1D, 0xFE, 0x1D, 0xFE, 0x00, 0xE6, 0x1D, 0xFF, 0x1D, 0xFF, 0x00, 0xDC, ++ 0x20, 0xD0, 0x20, 0xD1, 0x00, 0xE6, 0x20, 0xD2, 0x20, 0xD3, 0x00, 0x01, 0x20, 0xD4, 0x20, 0xD7, ++ 0x00, 0xE6, 0x20, 0xD8, 0x20, 0xDA, 0x00, 0x01, 0x20, 0xDB, 0x20, 0xDC, 0x00, 0xE6, 0x20, 0xE1, ++ 0x20, 0xE1, 0x00, 0xE6, 0x20, 0xE5, 0x20, 0xE6, 0x00, 0x01, 0x20, 0xE7, 0x20, 0xE7, 0x00, 0xE6, ++ 0x20, 0xE8, 0x20, 0xE8, 0x00, 0xDC, 0x20, 0xE9, 0x20, 0xE9, 0x00, 0xE6, 0x20, 0xEA, 0x20, 0xEB, ++ 0x00, 0x01, 0x20, 0xEC, 0x20, 0xEF, 0x00, 0xDC, 0x30, 0x2A, 0x30, 0x2A, 0x00, 0xDA, 0x30, 0x2B, ++ 0x30, 0x2B, 0x00, 0xE4, 0x30, 0x2C, 0x30, 0x2C, 0x00, 0xE8, 0x30, 0x2D, 0x30, 0x2D, 0x00, 0xDE, ++ 0x30, 0x2E, 0x30, 0x2F, 0x00, 0xE0, 0x30, 0x99, 0x30, 0x9A, 0x00, 0x08, 0xA8, 0x06, 0xA8, 0x06, ++ 0x00, 0x09, 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x1A, 0xFE, 0x20, 0xFE, 0x23, 0x00, 0xE6, 0x0A, 0x0D, ++ 0x0A, 0x0D, 0x00, 0xDC, 0x0A, 0x0F, 0x0A, 0x0F, 0x00, 0xE6, 0x0A, 0x38, 0x0A, 0x38, 0x00, 0xE6, ++ 0x0A, 0x39, 0x0A, 0x39, 0x00, 0x01, 0x0A, 0x3A, 0x0A, 0x3A, 0x00, 0xDC, 0x0A, 0x3F, 0x0A, 0x3F, ++ 0x00, 0x09, 0xD1, 0x65, 0xD1, 0x66, 0x00, 0xD8, 0xD1, 0x67, 0xD1, 0x69, 0x00, 0x01, 0xD1, 0x6D, ++ 0xD1, 0x6D, 0x00, 0xE2, 0xD1, 0x6E, 0xD1, 0x72, 0x00, 0xD8, 0xD1, 0x7B, 0xD1, 0x82, 0x00, 0xDC, ++ 0xD1, 0x85, 0xD1, 0x89, 0x00, 0xE6, 0xD1, 0x8A, 0xD1, 0x8B, 0x00, 0xDC, 0xD1, 0xAA, 0xD1, 0xAD, ++ 0x00, 0xE6, 0xD2, 0x42, 0xD2, 0x44, 0x00, 0xE6 + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/CanonShaping.h b/src/share/native/sun/font/layout/CanonShaping.h +--- jdk/src/share/native/sun/font/layout/CanonShaping.h ++++ jdk/src/share/native/sun/font/layout/CanonShaping.h +@@ -38,7 +38,7 @@ + + class LEGlyphStorage; + +-class CanonShaping /* not : public UObject because all members are static */ ++class U_LAYOUT_API CanonShaping /* not : public UObject because all members are static */ + { + public: + static const le_uint8 glyphSubstitutionTable[]; +diff --git a/src/share/native/sun/font/layout/ClassDefinitionTables.cpp b/src/share/native/sun/font/layout/ClassDefinitionTables.cpp +--- jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp ++++ jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp +@@ -93,7 +93,7 @@ + TTGlyphID firstGlyph = SWAPW(startGlyph); + TTGlyphID lastGlyph = firstGlyph + SWAPW(glyphCount); + +- if (ttGlyphID > firstGlyph && ttGlyphID < lastGlyph) { ++ if (ttGlyphID >= firstGlyph && ttGlyphID < lastGlyph) { + return SWAPW(classValueArray[ttGlyphID - firstGlyph]); + } + +diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp b/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp +--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp +@@ -52,18 +52,23 @@ + le_uint16 substCount, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, +- le_int32 position) ++ le_int32 position, ++ LEErrorCode& success) + { ++ if (LE_FAILURE(success)) { ++ return; ++ } ++ + GlyphIterator tempIterator(*glyphIterator); + +- for (le_int16 subst = 0; subst < substCount; subst += 1) { ++ for (le_int16 subst = 0; subst < substCount && LE_SUCCESS(success); subst += 1) { + le_uint16 sequenceIndex = SWAPW(substLookupRecordArray[subst].sequenceIndex); + le_uint16 lookupListIndex = SWAPW(substLookupRecordArray[subst].lookupListIndex); + + tempIterator.setCurrStreamPosition(position); + tempIterator.next(sequenceIndex); + +- lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance); ++ lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance, success); + } + } + +@@ -165,9 +170,15 @@ + return TRUE; + } + +-le_uint32 ContextualSubstitutionSubtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const ++le_uint32 ContextualSubstitutionSubtable::process(const LookupProcessor *lookupProcessor, ++ GlyphIterator *glyphIterator, ++ const LEFontInstance *fontInstance, ++ LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + switch(SWAPW(subtableFormat)) + { + case 0: +@@ -176,22 +187,19 @@ + case 1: + { + const ContextualSubstitutionFormat1Subtable *subtable = (const ContextualSubstitutionFormat1Subtable *) this; +- +- return subtable->process(lookupProcessor, glyphIterator, fontInstance); ++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + case 2: + { + const ContextualSubstitutionFormat2Subtable *subtable = (const ContextualSubstitutionFormat2Subtable *) this; +- +- return subtable->process(lookupProcessor, glyphIterator, fontInstance); ++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + case 3: + { + const ContextualSubstitutionFormat3Subtable *subtable = (const ContextualSubstitutionFormat3Subtable *) this; +- +- return subtable->process(lookupProcessor, glyphIterator, fontInstance); ++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + default: +@@ -199,9 +207,15 @@ + } + } + +-le_uint32 ContextualSubstitutionFormat1Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const ++le_uint32 ContextualSubstitutionFormat1Subtable::process(const LookupProcessor *lookupProcessor, ++ GlyphIterator *glyphIterator, ++ const LEFontInstance *fontInstance, ++ LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + +@@ -227,7 +241,7 @@ + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &subRuleTable->inputGlyphArray[matchCount]; + +- applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position); ++ applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); + + return matchCount + 1; + } +@@ -242,9 +256,15 @@ + return 0; + } + +-le_uint32 ContextualSubstitutionFormat2Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const ++le_uint32 ContextualSubstitutionFormat2Subtable::process(const LookupProcessor *lookupProcessor, ++ GlyphIterator *glyphIterator, ++ const LEFontInstance *fontInstance, ++ LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + +@@ -273,7 +293,7 @@ + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &subClassRuleTable->classArray[matchCount]; + +- applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position); ++ applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); + + return matchCount + 1; + } +@@ -288,9 +308,15 @@ + return 0; + } + +-le_uint32 ContextualSubstitutionFormat3Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance)const ++le_uint32 ContextualSubstitutionFormat3Subtable::process(const LookupProcessor *lookupProcessor, ++ GlyphIterator *glyphIterator, ++ const LEFontInstance *fontInstance, ++ LEErrorCode& success)const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + le_uint16 gCount = SWAPW(glyphCount); + le_uint16 subCount = SWAPW(substCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); +@@ -305,7 +331,7 @@ + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &coverageTableOffsetArray[gCount]; + +- ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, subCount, glyphIterator, fontInstance, position); ++ ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, subCount, glyphIterator, fontInstance, position, success); + + return gCount + 1; + } +@@ -315,9 +341,15 @@ + return 0; + } + +-le_uint32 ChainingContextualSubstitutionSubtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const ++le_uint32 ChainingContextualSubstitutionSubtable::process(const LookupProcessor *lookupProcessor, ++ GlyphIterator *glyphIterator, ++ const LEFontInstance *fontInstance, ++ LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + switch(SWAPW(subtableFormat)) + { + case 0: +@@ -326,22 +358,19 @@ + case 1: + { + const ChainingContextualSubstitutionFormat1Subtable *subtable = (const ChainingContextualSubstitutionFormat1Subtable *) this; +- +- return subtable->process(lookupProcessor, glyphIterator, fontInstance); ++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + case 2: + { + const ChainingContextualSubstitutionFormat2Subtable *subtable = (const ChainingContextualSubstitutionFormat2Subtable *) this; +- +- return subtable->process(lookupProcessor, glyphIterator, fontInstance); ++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + case 3: + { + const ChainingContextualSubstitutionFormat3Subtable *subtable = (const ChainingContextualSubstitutionFormat3Subtable *) this; +- +- return subtable->process(lookupProcessor, glyphIterator, fontInstance); ++ return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + default: +@@ -355,9 +384,15 @@ + // emptyFeatureList matches an le_uint32 or an le_uint16... + static const FeatureMask emptyFeatureList = 0x00000000UL; + +-le_uint32 ChainingContextualSubstitutionFormat1Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const ++le_uint32 ChainingContextualSubstitutionFormat1Subtable::process(const LookupProcessor *lookupProcessor, ++ GlyphIterator *glyphIterator, ++ const LEFontInstance *fontInstance, ++ LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + +@@ -405,7 +440,7 @@ + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &lookaheadGlyphArray[lookaheadGlyphCount + 1]; + +- applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position); ++ applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); + + return inputGlyphCount + 1; + } +@@ -420,9 +455,15 @@ + return 0; + } + +-le_uint32 ChainingContextualSubstitutionFormat2Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const ++le_uint32 ChainingContextualSubstitutionFormat2Subtable::process(const LookupProcessor *lookupProcessor, ++ GlyphIterator *glyphIterator, ++ const LEFontInstance *fontInstance, ++ LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + +@@ -479,7 +520,7 @@ + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &lookaheadClassArray[lookaheadGlyphCount + 1]; + +- applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position); ++ applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); + + return inputGlyphCount + 1; + } +@@ -494,9 +535,15 @@ + return 0; + } + +-le_uint32 ChainingContextualSubstitutionFormat3Subtable::process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const ++le_uint32 ChainingContextualSubstitutionFormat3Subtable::process(const LookupProcessor *lookupProcessor, ++ GlyphIterator *glyphIterator, ++ const LEFontInstance *fontInstance, ++ LEErrorCode & success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + le_uint16 backtrkGlyphCount = SWAPW(backtrackGlyphCount); + le_uint16 inputGlyphCount = (le_uint16) SWAPW(backtrackCoverageTableOffsetArray[backtrkGlyphCount]); + const Offset *inputCoverageTableOffsetArray = &backtrackCoverageTableOffsetArray[backtrkGlyphCount + 1]; +@@ -534,7 +581,7 @@ + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &lookaheadCoverageTableOffsetArray[lookaheadGlyphCount + 1]; + +- ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position); ++ ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); + + return inputGlyphCount; + } +diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.h b/src/share/native/sun/font/layout/ContextualSubstSubtables.h +--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h ++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h +@@ -72,12 +72,13 @@ + le_uint16 substCount, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, +- le_int32 position); ++ le_int32 position, ++ LEErrorCode& success); + }; + + struct ContextualSubstitutionSubtable : ContextualSubstitutionBase + { +- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; + + struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable +@@ -85,7 +86,7 @@ + le_uint16 subRuleSetCount; + Offset subRuleSetTableOffsetArray[ANY_NUMBER]; + +- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; + + struct SubRuleSetTable +@@ -110,7 +111,7 @@ + le_uint16 subClassSetCount; + Offset subClassSetTableOffsetArray[ANY_NUMBER]; + +- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; + + struct SubClassSetTable +@@ -140,12 +141,12 @@ + Offset coverageTableOffsetArray[ANY_NUMBER]; + //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER]; + +- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; + + struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase + { +- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; + + struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable +@@ -153,7 +154,7 @@ + le_uint16 chainSubRuleSetCount; + Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER]; + +- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; + + struct ChainSubRuleSetTable +@@ -184,7 +185,7 @@ + le_uint16 chainSubClassSetCount; + Offset chainSubClassSetTableOffsetArray[ANY_NUMBER]; + +- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; + + struct ChainSubClassSetTable +@@ -222,7 +223,7 @@ + //le_uint16 substCount; + //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER]; + +- le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/CoverageTables.cpp b/src/share/native/sun/font/layout/CoverageTables.cpp +--- jdk/src/share/native/sun/font/layout/CoverageTables.cpp ++++ jdk/src/share/native/sun/font/layout/CoverageTables.cpp +@@ -73,6 +73,10 @@ + le_uint16 probe = power; + le_uint16 index = 0; + ++ if (count == 0) { ++ return -1; ++ } ++ + if (SWAPW(glyphArray[extra]) <= ttGlyphID) { + index = extra; + } +diff --git a/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp b/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp +--- jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp +@@ -59,6 +59,8 @@ + + entryAnchorTable->getAnchor(glyphID, fontInstance, entryAnchor); + glyphIterator->setCursiveEntryPoint(entryAnchor); ++ } else { ++ //glyphIterator->clearCursiveEntryPoint(); + } + + if (exitOffset != 0) { +@@ -66,6 +68,8 @@ + + exitAnchorTable->getAnchor(glyphID, fontInstance, exitAnchor); + glyphIterator->setCursiveExitPoint(exitAnchor); ++ } else { ++ //glyphIterator->clearCursiveExitPoint(); + } + + return 1; +diff --git a/src/share/native/sun/font/layout/DeviceTables.cpp b/src/share/native/sun/font/layout/DeviceTables.cpp +--- jdk/src/share/native/sun/font/layout/DeviceTables.cpp ++++ jdk/src/share/native/sun/font/layout/DeviceTables.cpp +@@ -41,13 +41,15 @@ + const le_uint16 DeviceTable::fieldSignBits[] = {0x0002, 0x0008, 0x0080}; + const le_uint16 DeviceTable::fieldBits[] = { 2, 4, 8}; + ++#define FORMAT_COUNT LE_ARRAY_SIZE(fieldBits) ++ + le_int16 DeviceTable::getAdjustment(le_uint16 ppem) const + { + le_uint16 start = SWAPW(startSize); + le_uint16 format = SWAPW(deltaFormat) - 1; + le_int16 result = 0; + +- if (ppem >= start && ppem <= SWAPW(endSize)) { ++ if (ppem >= start && ppem <= SWAPW(endSize) && format < FORMAT_COUNT) { + le_uint16 sizeIndex = ppem - start; + le_uint16 bits = fieldBits[format]; + le_uint16 count = 16 / bits; +diff --git a/src/share/native/sun/font/layout/ExtensionSubtables.cpp b/src/share/native/sun/font/layout/ExtensionSubtables.cpp +--- jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp +@@ -40,18 +40,24 @@ + + U_NAMESPACE_BEGIN + ++// read a 32-bit value that might only be 16-bit-aligned in memory ++#define READ_LONG(code) (le_uint32)((SWAPW(*(le_uint16*)&code) << 16) + SWAPW(*(((le_uint16*)&code) + 1))) + + // FIXME: should look at the format too... maybe have a sub-class for it? + le_uint32 ExtensionSubtable::process(const LookupProcessor *lookupProcessor, le_uint16 lookupType, +- GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + le_uint16 elt = SWAPW(extensionLookupType); + + if (elt != lookupType) { +- le_uint32 extOffset = SWAPL(extensionOffset); ++ le_uint32 extOffset = READ_LONG(extensionOffset); + LookupSubtable *subtable = (LookupSubtable *) ((char *) this + extOffset); + +- return lookupProcessor->applySubtable(subtable, elt, glyphIterator, fontInstance); ++ return lookupProcessor->applySubtable(subtable, elt, glyphIterator, fontInstance, success); + } + + return 0; +diff --git a/src/share/native/sun/font/layout/ExtensionSubtables.h b/src/share/native/sun/font/layout/ExtensionSubtables.h +--- jdk/src/share/native/sun/font/layout/ExtensionSubtables.h ++++ jdk/src/share/native/sun/font/layout/ExtensionSubtables.h +@@ -53,7 +53,7 @@ + le_uint32 extensionOffset; + + le_uint32 process(const LookupProcessor *lookupProcessor, le_uint16 lookupType, +- GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/Features.cpp b/src/share/native/sun/font/layout/Features.cpp +--- jdk/src/share/native/sun/font/layout/Features.cpp ++++ jdk/src/share/native/sun/font/layout/Features.cpp +@@ -33,7 +33,7 @@ + #include "LETypes.h" + #include "OpenTypeUtilities.h" + #include "OpenTypeTables.h" +-#include "Features.h" ++#include "ICUFeatures.h" + #include "LESwaps.h" + + U_NAMESPACE_BEGIN +diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.cpp b/src/share/native/sun/font/layout/GXLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp +@@ -41,8 +41,8 @@ + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GXLayoutEngine) + +-GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable) +- : LayoutEngine(fontInstance, scriptCode, languageCode, 0), fMorphTable(morphTable) ++GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable, LEErrorCode &success) ++ : LayoutEngine(fontInstance, scriptCode, languageCode, 0, success), fMorphTable(morphTable) + { + // nothing else to do? + } +diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.h b/src/share/native/sun/font/layout/GXLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.h +@@ -67,13 +67,14 @@ + * @param scriptCode - the script + * @param langaugeCode - the language + * @param morphTable - the 'mort' table ++ * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ +- GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable); ++ GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. +diff --git a/src/share/native/sun/font/layout/GlyphIterator.cpp b/src/share/native/sun/font/layout/GlyphIterator.cpp +--- jdk/src/share/native/sun/font/layout/GlyphIterator.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphIterator.cpp +@@ -44,7 +44,7 @@ + FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader) + : direction(1), position(-1), nextLimit(-1), prevLimit(-1), + glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments), +- srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), ++ srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), glyphGroup(0), + glyphClassDefinitionTable(NULL), markAttachClassDefinitionTable(NULL) + + { +@@ -78,6 +78,7 @@ + destIndex = that.destIndex; + lookupFlags = that.lookupFlags; + featureMask = that.featureMask; ++ glyphGroup = that.glyphGroup; + glyphClassDefinitionTable = that.glyphClassDefinitionTable; + markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; + } +@@ -95,6 +96,7 @@ + destIndex = that.destIndex; + lookupFlags = that.lookupFlags; + featureMask = newFeatureMask; ++ glyphGroup = 0; + glyphClassDefinitionTable = that.glyphClassDefinitionTable; + markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; + } +@@ -112,6 +114,7 @@ + destIndex = that.destIndex; + lookupFlags = newLookupFlags; + featureMask = that.featureMask; ++ glyphGroup = that.glyphGroup; + glyphClassDefinitionTable = that.glyphClassDefinitionTable; + markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; + } +@@ -125,12 +128,13 @@ + { + position = prevLimit; + featureMask = newFeatureMask; ++ glyphGroup = 0; + lookupFlags = newLookupFlags; + } + +-LEGlyphID *GlyphIterator::insertGlyphs(le_int32 count) ++LEGlyphID *GlyphIterator::insertGlyphs(le_int32 count, LEErrorCode& success) + { +- return glyphStorage.insertGlyphs(position, count); ++ return glyphStorage.insertGlyphs(position, count, success); + } + + le_int32 GlyphIterator::applyInsertions() +@@ -299,6 +303,36 @@ + glyphPositionAdjustments->setYAdvance(position, yAdvanceAdjust); + } + ++void GlyphIterator::clearCursiveEntryPoint() ++{ ++ if (direction < 0) { ++ if (position <= nextLimit || position >= prevLimit) { ++ return; ++ } ++ } else { ++ if (position <= prevLimit || position >= nextLimit) { ++ return; ++ } ++ } ++ ++ glyphPositionAdjustments->clearEntryPoint(position); ++} ++ ++void GlyphIterator::clearCursiveExitPoint() ++{ ++ if (direction < 0) { ++ if (position <= nextLimit || position >= prevLimit) { ++ return; ++ } ++ } else { ++ if (position <= prevLimit || position >= nextLimit) { ++ return; ++ } ++ } ++ ++ glyphPositionAdjustments->clearExitPoint(position); ++} ++ + void GlyphIterator::setCursiveEntryPoint(LEPoint &entryPoint) + { + if (direction < 0) { +@@ -391,7 +425,7 @@ + } + } + +-le_bool GlyphIterator::hasFeatureTag() const ++le_bool GlyphIterator::hasFeatureTag(le_bool matchGroup) const + { + if (featureMask == 0) { + return TRUE; +@@ -400,14 +434,18 @@ + LEErrorCode success = LE_NO_ERROR; + FeatureMask fm = glyphStorage.getAuxData(position, success); + +- return (fm & featureMask) != 0; ++ return ((fm & featureMask) == featureMask) && (!matchGroup || (le_int32)(fm & LE_GLYPH_GROUP_MASK) == glyphGroup); + } + + le_bool GlyphIterator::findFeatureTag() + { ++ //glyphGroup = 0; ++ + while (nextInternal()) { +- if (hasFeatureTag()) { +- prevInternal(); ++ if (hasFeatureTag(FALSE)) { ++ LEErrorCode success = LE_NO_ERROR; ++ ++ glyphGroup = (glyphStorage.getAuxData(position, success) & LE_GLYPH_GROUP_MASK); + return TRUE; + } + } +@@ -435,7 +473,7 @@ + + le_bool GlyphIterator::next(le_uint32 delta) + { +- return nextInternal(delta) && hasFeatureTag(); ++ return nextInternal(delta) && hasFeatureTag(TRUE); + } + + le_bool GlyphIterator::prevInternal(le_uint32 delta) +@@ -457,7 +495,7 @@ + + le_bool GlyphIterator::prev(le_uint32 delta) + { +- return prevInternal(delta) && hasFeatureTag(); ++ return prevInternal(delta) && hasFeatureTag(TRUE); + } + + le_int32 GlyphIterator::getMarkComponent(le_int32 markPosition) const +diff --git a/src/share/native/sun/font/layout/GlyphIterator.h b/src/share/native/sun/font/layout/GlyphIterator.h +--- jdk/src/share/native/sun/font/layout/GlyphIterator.h ++++ jdk/src/share/native/sun/font/layout/GlyphIterator.h +@@ -88,16 +88,18 @@ + void setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, + float xAdvanceAdjust, float yAdvanceAdjust); + ++ void clearCursiveEntryPoint(); ++ void clearCursiveExitPoint(); + void setCursiveEntryPoint(LEPoint &entryPoint); + void setCursiveExitPoint(LEPoint &exitPoint); + void setCursiveGlyph(); + +- LEGlyphID *insertGlyphs(le_int32 count); ++ LEGlyphID *insertGlyphs(le_int32 count, LEErrorCode& success); + le_int32 applyInsertions(); + + private: + le_bool filterGlyph(le_uint32 index) const; +- le_bool hasFeatureTag() const; ++ le_bool hasFeatureTag(le_bool matchGroup) const; + le_bool nextInternal(le_uint32 delta = 1); + le_bool prevInternal(le_uint32 delta = 1); + +@@ -113,6 +115,7 @@ + le_int32 destIndex; + le_uint16 lookupFlags; + FeatureMask featureMask; ++ le_int32 glyphGroup; + + const GlyphClassDefinitionTable *glyphClassDefinitionTable; + const MarkAttachClassDefinitionTable *markAttachClassDefinitionTable; +diff --git a/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp b/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp +--- jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.cpp +@@ -71,6 +71,20 @@ + return fEntryExitPoints[index].getExitPoint(exitPoint); + } + ++void GlyphPositionAdjustments::clearEntryPoint(le_int32 index) ++{ ++ CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); ++ ++ fEntryExitPoints[index].clearEntryPoint(); ++} ++ ++void GlyphPositionAdjustments::clearExitPoint(le_int32 index) ++{ ++ CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); ++ ++ fEntryExitPoints[index].clearExitPoint(); ++} ++ + void GlyphPositionAdjustments::setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd) + { + CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); +@@ -152,7 +166,12 @@ + lastExitGlyphID = glyphID; + } else { + if (baselineIsLogicalEnd(i) && firstExitPoint >= 0 && lastExitPoint >= 0) { +- le_int32 limit = lastExitPoint + dir; ++ le_int32 limit = lastExitPoint /*+ dir*/; ++ LEPoint dummyAnchor; ++ ++ if (getEntryPoint(i, dummyAnchor) != NULL) { ++ limit += dir; ++ } + + for (le_int32 j = firstExitPoint; j != limit; j += dir) { + if (isCursiveGlyph(j)) { +diff --git a/src/share/native/sun/font/layout/GlyphPositionAdjustments.h b/src/share/native/sun/font/layout/GlyphPositionAdjustments.h +--- jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.h ++++ jdk/src/share/native/sun/font/layout/GlyphPositionAdjustments.h +@@ -97,6 +97,8 @@ + LEPoint *getEntryPoint(LEPoint &entryPoint) const; + LEPoint *getExitPoint(LEPoint &exitPoint) const; + ++ inline void clearEntryPoint(); ++ inline void clearExitPoint(); + inline void setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd); + inline void setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd); + inline void setCursiveGlyph(le_bool baselineIsLogicalEnd); +@@ -151,6 +153,8 @@ + inline void adjustXAdvance(le_int32 index, float xAdjustment); + inline void adjustYAdvance(le_int32 index, float yAdjustment); + ++ void clearEntryPoint(le_int32 index); ++ void clearExitPoint(le_int32 index); + void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd); + void setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd); + void setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd); +@@ -266,6 +270,16 @@ + return (fFlags & EEF_BASELINE_IS_LOGICAL_END) != 0; + } + ++inline void GlyphPositionAdjustments::EntryExitPoint::clearEntryPoint() ++{ ++ fFlags &= ~EEF_HAS_ENTRY_POINT; ++} ++ ++inline void GlyphPositionAdjustments::EntryExitPoint::clearExitPoint() ++{ ++ fFlags &= ~EEF_HAS_EXIT_POINT; ++} ++ + inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd) + { + if (baselineIsLogicalEnd) { +diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.cpp b/src/share/native/sun/font/layout/GlyphPositioningTables.cpp +--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp +@@ -43,12 +43,19 @@ + + void GlyphPositioningTableHeader::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft, + LETag scriptTag, LETag languageTag, +- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, ++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, LEErrorCode &success, + const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const + { +- GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureMap, featureMapCount, featureOrder); ++ if (LE_FAILURE(success)) { ++ return; ++ } + +- processor.process(glyphStorage, glyphPositionAdjustments, rightToLeft, glyphDefinitionTableHeader, fontInstance); ++ GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success); ++ if (LE_FAILURE(success)) { ++ return; ++ } ++ ++ processor.process(glyphStorage, glyphPositionAdjustments, rightToLeft, glyphDefinitionTableHeader, fontInstance, success); + + glyphPositionAdjustments->applyCursiveAdjustments(glyphStorage, rightToLeft, fontInstance); + } +diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.h b/src/share/native/sun/font/layout/GlyphPositioningTables.h +--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h ++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h +@@ -53,7 +53,7 @@ + { + void process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, + le_bool rightToLeft, LETag scriptTag, LETag languageTag, +- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, ++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, LEErrorCode &success, + const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const; + }; + +diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp b/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp +--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp +@@ -31,7 +31,7 @@ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" +-#include "Features.h" ++#include "ICUFeatures.h" + #include "Lookups.h" + #include "ScriptAndLanguage.h" + #include "GlyphDefinitionTables.h" +@@ -58,13 +58,24 @@ + + GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor( + const GlyphPositioningTableHeader *glyphPositioningTableHeader, +- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) ++ LETag scriptTag, ++ LETag languageTag, ++ const FeatureMap *featureMap, ++ le_int32 featureMapCount, ++ le_bool featureOrder, ++ LEErrorCode& success) + : LookupProcessor( + (char *) glyphPositioningTableHeader, + SWAPW(glyphPositioningTableHeader->scriptListOffset), + SWAPW(glyphPositioningTableHeader->featureListOffset), + SWAPW(glyphPositioningTableHeader->lookupListOffset), +- scriptTag, languageTag, featureMap, featureMapCount, featureOrder) ++ scriptTag, ++ languageTag, ++ featureMap, ++ featureMapCount, ++ featureOrder, ++ success ++ ) + { + // anything? + } +@@ -75,8 +86,13 @@ + + le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, + GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const ++ const LEFontInstance *fontInstance, ++ LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + le_uint32 delta = 0; + + switch(lookupType) +@@ -136,7 +152,7 @@ + { + const ContextualPositioningSubtable *subtable = (const ContextualPositioningSubtable *) lookupSubtable; + +- delta = subtable->process(this, glyphIterator, fontInstance); ++ delta = subtable->process(this, glyphIterator, fontInstance, success); + break; + } + +@@ -144,7 +160,7 @@ + { + const ChainingContextualPositioningSubtable *subtable = (const ChainingContextualPositioningSubtable *) lookupSubtable; + +- delta = subtable->process(this, glyphIterator, fontInstance); ++ delta = subtable->process(this, glyphIterator, fontInstance, success); + break; + } + +@@ -152,7 +168,7 @@ + { + const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable; + +- delta = subtable->process(this, lookupType, glyphIterator, fontInstance); ++ delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success); + break; + } + +diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.h b/src/share/native/sun/font/layout/GlyphPosnLookupProc.h +--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h ++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h +@@ -40,7 +40,7 @@ + #include "LEFontInstance.h" + #include "OpenTypeTables.h" + #include "Lookups.h" +-#include "Features.h" ++#include "ICUFeatures.h" + #include "GlyphDefinitionTables.h" + #include "GlyphPositioningTables.h" + #include "GlyphIterator.h" +@@ -52,12 +52,17 @@ + { + public: + GlyphPositioningLookupProcessor(const GlyphPositioningTableHeader *glyphPositioningTableHeader, +- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder); ++ LETag scriptTag, ++ LETag languageTag, ++ const FeatureMap *featureMap, ++ le_int32 featureMapCount, ++ le_bool featureOrder, ++ LEErrorCode& success); + + virtual ~GlyphPositioningLookupProcessor(); + + virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const; ++ const LEFontInstance *fontInstance, LEErrorCode& success) const; + + protected: + GlyphPositioningLookupProcessor(); +diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp b/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp +--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp +@@ -33,7 +33,7 @@ + #include "LEGlyphFilter.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" +-#include "Features.h" ++#include "ICUFeatures.h" + #include "Lookups.h" + #include "ScriptAndLanguage.h" + #include "GlyphDefinitionTables.h" +@@ -52,13 +52,19 @@ + + GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor( + const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader, +- LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) ++ LETag scriptTag, ++ LETag languageTag, ++ const LEGlyphFilter *filter, ++ const FeatureMap *featureMap, ++ le_int32 featureMapCount, ++ le_bool featureOrder, ++ LEErrorCode& success) + : LookupProcessor( + (char *) glyphSubstitutionTableHeader, + SWAPW(glyphSubstitutionTableHeader->scriptListOffset), + SWAPW(glyphSubstitutionTableHeader->featureListOffset), + SWAPW(glyphSubstitutionTableHeader->lookupListOffset), +- scriptTag, languageTag, featureMap, featureMapCount, featureOrder), fFilter(filter) ++ scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success), fFilter(filter) + { + // anything? + } +@@ -68,8 +74,12 @@ + } + + le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, +- GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + le_uint32 delta = 0; + + switch(lookupType) +@@ -89,7 +99,7 @@ + { + const MultipleSubstitutionSubtable *subtable = (const MultipleSubstitutionSubtable *) lookupSubtable; + +- delta = subtable->process(glyphIterator, fFilter); ++ delta = subtable->process(glyphIterator, success, fFilter); + break; + } + +@@ -113,7 +123,7 @@ + { + const ContextualSubstitutionSubtable *subtable = (const ContextualSubstitutionSubtable *) lookupSubtable; + +- delta = subtable->process(this, glyphIterator, fontInstance); ++ delta = subtable->process(this, glyphIterator, fontInstance, success); + break; + } + +@@ -121,7 +131,7 @@ + { + const ChainingContextualSubstitutionSubtable *subtable = (const ChainingContextualSubstitutionSubtable *) lookupSubtable; + +- delta = subtable->process(this, glyphIterator, fontInstance); ++ delta = subtable->process(this, glyphIterator, fontInstance, success); + break; + } + +@@ -129,7 +139,7 @@ + { + const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable; + +- delta = subtable->process(this, lookupType, glyphIterator, fontInstance); ++ delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success); + break; + } + +diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.h b/src/share/native/sun/font/layout/GlyphSubstLookupProc.h +--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h ++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h +@@ -41,7 +41,7 @@ + #include "LEFontInstance.h" + #include "OpenTypeTables.h" + #include "Lookups.h" +-#include "Features.h" ++#include "ICUFeatures.h" + #include "GlyphDefinitionTables.h" + #include "GlyphSubstitutionTables.h" + #include "GlyphIterator.h" +@@ -53,12 +53,18 @@ + { + public: + GlyphSubstitutionLookupProcessor(const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader, +- LETag scriptTag, LETag languageTag, const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder); ++ LETag scriptTag, ++ LETag languageTag, ++ const LEGlyphFilter *filter, ++ const FeatureMap *featureMap, ++ le_int32 featureMapCount, ++ le_bool featureOrder, ++ LEErrorCode& success); + + virtual ~GlyphSubstitutionLookupProcessor(); + + virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const; ++ const LEFontInstance *fontInstance, LEErrorCode& success) const; + + protected: + GlyphSubstitutionLookupProcessor(); +diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp b/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp +--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp +@@ -42,13 +42,23 @@ + + U_NAMESPACE_BEGIN + +-le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage, le_bool rightToLeft, LETag scriptTag, LETag languageTag, ++le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage, ++ le_bool rightToLeft, ++ LETag scriptTag, ++ LETag languageTag, + const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, +- const LEGlyphFilter *filter, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const ++ const LEGlyphFilter *filter, ++ const FeatureMap *featureMap, ++ le_int32 featureMapCount, ++ le_bool featureOrder, ++ LEErrorCode &success) const + { +- GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + +- return processor.process(glyphStorage, NULL, rightToLeft, glyphDefinitionTableHeader, NULL); ++ GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder, success); ++ return processor.process(glyphStorage, NULL, rightToLeft, glyphDefinitionTableHeader, NULL, success); + } + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.h b/src/share/native/sun/font/layout/GlyphSubstitutionTables.h +--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h ++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h +@@ -50,9 +50,16 @@ + + struct GlyphSubstitutionTableHeader : public GlyphLookupTableHeader + { +- le_int32 process(LEGlyphStorage &glyphStorage, le_bool rightToLeft, LETag scriptTag, LETag languageTag, +- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEGlyphFilter *filter, +- const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const; ++ le_int32 process(LEGlyphStorage &glyphStorage, ++ le_bool rightToLeft, ++ LETag scriptTag, ++ LETag languageTag, ++ const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, ++ const LEGlyphFilter *filter, ++ const FeatureMap *featureMap, ++ le_int32 featureMapCount, ++ le_bool featureOrder, ++ LEErrorCode &success) const; + }; + + enum GlyphSubstitutionSubtableTypes +diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.cpp b/src/share/native/sun/font/layout/HanLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp +@@ -26,7 +26,7 @@ + /* + * HanLayoutEngine.cpp: OpenType processing for Han fonts. + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved. ++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved. + */ + + #include "LETypes.h" +@@ -64,8 +64,8 @@ + #define features (loclFeatureMask) + + HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) +- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable) ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) + { + fFeatureMap = featureMap; + fFeatureMapCount = featureMapCount; +diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.h b/src/share/native/sun/font/layout/HanLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.h +@@ -27,7 +27,7 @@ + /* + * HanLayoutEngine.h: OpenType processing for Han fonts. + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved. ++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved. + */ + + #ifndef __HANLAYOUTENGINE_H +@@ -64,6 +64,7 @@ + * @param scriptCode - the script + * @param langaugeCode - the language + * @param gsubTable - the GSUB table ++ * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see OpenTypeLayoutEngine +@@ -72,7 +73,7 @@ + * @internal + */ + HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTablem, LEErrorCode &success); + + + /** +diff --git a/src/share/native/sun/font/layout/HangulLayoutEngine.cpp b/src/share/native/sun/font/layout/HangulLayoutEngine.cpp +new file mode 100644 +--- /dev/null ++++ jdk/src/share/native/sun/font/layout/HangulLayoutEngine.cpp +@@ -0,0 +1,363 @@ ++/* ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/* ++ * HangulLayoutEngine.cpp: OpenType processing for Han fonts. ++ * ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved. ++ */ ++ ++#include "LETypes.h" ++#include "LEScripts.h" ++#include "LELanguages.h" ++ ++#include "LayoutEngine.h" ++#include "OpenTypeLayoutEngine.h" ++#include "HangulLayoutEngine.h" ++#include "ScriptAndLanguageTags.h" ++#include "LEGlyphStorage.h" ++#include "OpenTypeTables.h" ++ ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HangulOpenTypeLayoutEngine) ++ ++ ++#define FEATURE_MAP(name) {name ## FeatureTag, name ## FeatureMask} ++ ++#define LJMO_FIRST 0x1100 ++#define LJMO_LAST 0x1159 ++#define LJMO_FILL 0x115F ++#define LJMO_COUNT 19 ++ ++#define VJMO_FIRST 0x1161 ++#define VJMO_LAST 0x11A2 ++#define VJMO_FILL 0x1160 ++#define VJMO_COUNT 21 ++ ++#define TJMO_FIRST 0x11A7 ++#define TJMO_LAST 0x11F9 ++#define TJMO_COUNT 28 ++ ++#define HSYL_FIRST 0xAC00 ++#define HSYL_COUNT 11172 ++#define HSYL_LVCNT (VJMO_COUNT * TJMO_COUNT) ++ ++// Character classes ++enum ++{ ++ CC_L = 0, ++ CC_V, ++ CC_T, ++ CC_LV, ++ CC_LVT, ++ CC_X, ++ CC_COUNT ++}; ++ ++// Action flags ++#define AF_L 1 ++#define AF_V 2 ++#define AF_T 4 ++ ++// Actions ++#define a_N 0 ++#define a_L (AF_L) ++#define a_V (AF_V) ++#define a_T (AF_T) ++#define a_VT (AF_V | AF_T) ++#define a_LV (AF_L | AF_V) ++#define a_LVT (AF_L | AF_V | AF_T) ++ ++typedef struct ++{ ++ le_int32 newState; ++ le_int32 actionFlags; ++} StateTransition; ++ ++static const StateTransition stateTable[][CC_COUNT] = ++{ ++// L V T LV LVT X ++ { {1, a_L}, {2, a_LV}, {3, a_LVT}, {2, a_LV}, {3, a_LVT}, {4, a_T}}, // 0 - start ++ { {1, a_L}, {2, a_V}, {3, a_VT}, {2, a_LV}, {3, a_LVT}, {-1, a_V}}, // 1 - L+ ++ {{-1, a_N}, {2, a_V}, {3, a_T}, {-1, a_N}, {-1, a_N}, {-1, a_N}}, // 2 - L+V+ ++ {{-1, a_N}, {-1, a_N}, {3, a_T}, {-1, a_N}, {-1, a_N}, {-1, a_N}}, // 3 - L+V+T* ++ {{-1, a_N}, {-1, a_N}, {-1, a_N}, {-1, a_N}, {-1, a_N}, {4, a_T}} // 4 - X+ ++}; ++ ++ ++#define ccmpFeatureTag LE_CCMP_FEATURE_TAG ++#define ljmoFeatureTag LE_LJMO_FEATURE_TAG ++#define vjmoFeatureTag LE_VJMO_FEATURE_TAG ++#define tjmoFeatureTag LE_TJMO_FEATURE_TAG ++ ++#define ccmpFeatureMask 0x80000000UL ++#define ljmoFeatureMask 0x40000000UL ++#define vjmoFeatureMask 0x20000000UL ++#define tjmoFeatureMask 0x10000000UL ++ ++static const FeatureMap featureMap[] = ++{ ++ {ccmpFeatureTag, ccmpFeatureMask}, ++ {ljmoFeatureTag, ljmoFeatureMask}, ++ {vjmoFeatureTag, vjmoFeatureMask}, ++ {tjmoFeatureTag, tjmoFeatureMask} ++}; ++ ++static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); ++ ++#define nullFeatures 0 ++#define ljmoFeatures (ccmpFeatureMask | ljmoFeatureMask) ++#define vjmoFeatures (ccmpFeatureMask | vjmoFeatureMask | ljmoFeatureMask | tjmoFeatureMask) ++#define tjmoFeatures (ccmpFeatureMask | tjmoFeatureMask | ljmoFeatureMask | vjmoFeatureMask) ++ ++static le_int32 compose(LEUnicode lead, LEUnicode vowel, LEUnicode trail, LEUnicode &syllable) ++{ ++ le_int32 lIndex = lead - LJMO_FIRST; ++ le_int32 vIndex = vowel - VJMO_FIRST; ++ le_int32 tIndex = trail - TJMO_FIRST; ++ le_int32 result = 3; ++ ++ if ((lIndex < 0 || lIndex >= LJMO_COUNT ) || (vIndex < 0 || vIndex >= VJMO_COUNT)) { ++ return 0; ++ } ++ ++ if (tIndex <= 0 || tIndex >= TJMO_COUNT) { ++ tIndex = 0; ++ result = 2; ++ } ++ ++ syllable = (LEUnicode) ((lIndex * VJMO_COUNT + vIndex) * TJMO_COUNT + tIndex + HSYL_FIRST); ++ ++ return result; ++} ++ ++static le_int32 decompose(LEUnicode syllable, LEUnicode &lead, LEUnicode &vowel, LEUnicode &trail) ++{ ++ le_int32 sIndex = syllable - HSYL_FIRST; ++ ++ if (sIndex < 0 || sIndex >= HSYL_COUNT) { ++ return 0; ++ } ++ ++ lead = LJMO_FIRST + (sIndex / HSYL_LVCNT); ++ vowel = VJMO_FIRST + (sIndex % HSYL_LVCNT) / TJMO_COUNT; ++ trail = TJMO_FIRST + (sIndex % TJMO_COUNT); ++ ++ if (trail == TJMO_FIRST) { ++ return 2; ++ } ++ ++ return 3; ++} ++ ++static le_int32 getCharClass(LEUnicode ch, LEUnicode &lead, LEUnicode &vowel, LEUnicode &trail) ++{ ++ lead = LJMO_FILL; ++ vowel = VJMO_FILL; ++ trail = TJMO_FIRST; ++ ++ if (ch >= LJMO_FIRST && ch <= LJMO_LAST) { ++ lead = ch; ++ return CC_L; ++ } ++ ++ if (ch >= VJMO_FIRST && ch <= VJMO_LAST) { ++ vowel = ch; ++ return CC_V; ++ } ++ ++ if (ch > TJMO_FIRST && ch <= TJMO_LAST) { ++ trail = ch; ++ return CC_T; ++ } ++ ++ le_int32 c = decompose(ch, lead, vowel, trail); ++ ++ if (c == 2) { ++ return CC_LV; ++ } ++ ++ if (c == 3) { ++ return CC_LVT; ++ } ++ ++ trail = ch; ++ return CC_X; ++} ++ ++HangulOpenTypeLayoutEngine::HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 /*languageCode*/, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, korLanguageCode, typoFlags, gsubTable, success) ++{ ++ fFeatureMap = featureMap; ++ fFeatureMapCount = featureMapCount; ++ fFeatureOrder = TRUE; ++} ++ ++HangulOpenTypeLayoutEngine::HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 /*languageCode*/, ++ le_int32 typoFlags, LEErrorCode &success) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, korLanguageCode, typoFlags, success) ++{ ++ fFeatureMap = featureMap; ++ fFeatureMapCount = featureMapCount; ++ fFeatureOrder = TRUE; ++} ++ ++HangulOpenTypeLayoutEngine::~HangulOpenTypeLayoutEngine() ++{ ++ // nothing to do ++} ++ ++le_int32 HangulOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) ++{ ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ ++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { ++ success = LE_ILLEGAL_ARGUMENT_ERROR; ++ return 0; ++ } ++ ++ le_int32 worstCase = count * 3; ++ ++ outChars = LE_NEW_ARRAY(LEUnicode, worstCase); ++ ++ if (outChars == NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return 0; ++ } ++ ++ glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); ++ glyphStorage.allocateAuxData(success); ++ ++ if (LE_FAILURE(success)) { ++ LE_DELETE_ARRAY(outChars); ++ return 0; ++ } ++ ++ le_int32 outCharCount = 0; ++ le_int32 limit = offset + count; ++ le_int32 i = offset; ++ ++ while (i < limit) { ++ le_int32 state = 0; ++ le_int32 inStart = i; ++ le_int32 outStart = outCharCount; ++ ++ while( i < limit) { ++ LEUnicode lead = 0; ++ LEUnicode vowel = 0; ++ LEUnicode trail = 0; ++ le_int32 chClass = getCharClass(chars[i], lead, vowel, trail); ++ const StateTransition transition = stateTable[state][chClass]; ++ ++ if (chClass == CC_X) { ++ /* Any character of type X will be stored as a trail jamo */ ++ if ((transition.actionFlags & AF_T) != 0) { ++ outChars[outCharCount] = trail; ++ glyphStorage.setCharIndex(outCharCount, i-offset, success); ++ glyphStorage.setAuxData(outCharCount++, nullFeatures, success); ++ } ++ } else { ++ /* Any Hangul will be fully decomposed. Output the decomposed characters. */ ++ if ((transition.actionFlags & AF_L) != 0) { ++ outChars[outCharCount] = lead; ++ glyphStorage.setCharIndex(outCharCount, i-offset, success); ++ glyphStorage.setAuxData(outCharCount++, ljmoFeatures, success); ++ } ++ ++ if ((transition.actionFlags & AF_V) != 0) { ++ outChars[outCharCount] = vowel; ++ glyphStorage.setCharIndex(outCharCount, i-offset, success); ++ glyphStorage.setAuxData(outCharCount++, vjmoFeatures, success); ++ } ++ ++ if ((transition.actionFlags & AF_T) != 0) { ++ outChars[outCharCount] = trail; ++ glyphStorage.setCharIndex(outCharCount, i-offset, success); ++ glyphStorage.setAuxData(outCharCount++, tjmoFeatures, success); ++ } ++ } ++ ++ state = transition.newState; ++ ++ /* Negative next state means stop. */ ++ if (state < 0) { ++ break; ++ } ++ ++ i += 1; ++ } ++ ++ le_int32 inLength = i - inStart; ++ le_int32 outLength = outCharCount - outStart; ++ ++ /* ++ * See if the syllable can be composed into a single character. There are 5 ++ * possible cases: ++ * ++ * Input Decomposed to Compose to ++ * LV L, V LV ++ * LVT L, V, T LVT ++ * L, V L, V LV, DEL ++ * LV, T L, V, T LVT, DEL ++ * L, V, T L, V, T LVT, DEL, DEL ++ */ ++ if ((inLength >= 1 && inLength <= 3) && (outLength == 2 || outLength == 3)) { ++ LEUnicode syllable = 0x0000; ++ LEUnicode lead = outChars[outStart]; ++ LEUnicode vowel = outChars[outStart + 1]; ++ LEUnicode trail = outLength == 3? outChars[outStart + 2] : TJMO_FIRST; ++ ++ /* ++ * If the composition consumes the whole decomposed syllable, ++ * we can use it. ++ */ ++ if (compose(lead, vowel, trail, syllable) == outLength) { ++ outCharCount = outStart; ++ outChars[outCharCount] = syllable; ++ glyphStorage.setCharIndex(outCharCount, inStart-offset, success); ++ glyphStorage.setAuxData(outCharCount++, nullFeatures, success); ++ ++ /* ++ * Replace the rest of the input characters with DEL. ++ */ ++ for(le_int32 d = inStart + 1; d < i; d += 1) { ++ outChars[outCharCount] = 0xFFFF; ++ glyphStorage.setCharIndex(outCharCount, d - offset, success); ++ glyphStorage.setAuxData(outCharCount++, nullFeatures, success); ++ } ++ } ++ } ++ } ++ ++ glyphStorage.adoptGlyphCount(outCharCount); ++ return outCharCount; ++} ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/HangulLayoutEngine.h b/src/share/native/sun/font/layout/HangulLayoutEngine.h +new file mode 100644 +--- /dev/null ++++ jdk/src/share/native/sun/font/layout/HangulLayoutEngine.h +@@ -0,0 +1,151 @@ ++/* ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/* ++ * ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved ++ * ++ */ ++ ++#ifndef __HANGULAYOUTENGINE_H ++#define __HANGULAYOUTENGINE_H ++ ++#include "LETypes.h" ++#include "LEFontInstance.h" ++#include "LEGlyphFilter.h" ++#include "LayoutEngine.h" ++#include "OpenTypeLayoutEngine.h" ++ ++#include "GlyphSubstitutionTables.h" ++#include "GlyphDefinitionTables.h" ++#include "GlyphPositioningTables.h" ++ ++U_NAMESPACE_BEGIN ++ ++class MPreFixups; ++class LEGlyphStorage; ++ ++/** ++ * This class implements OpenType layout for Old Hangul OpenType fonts, as ++ * specified by Microsoft in "Creating and Supporting OpenType Fonts for ++ * The Korean Hangul Script" (http://www.microsoft.com/typography/otfntdev/hangulot/default.htm) ++ * ++ * This class overrides the characterProcessing method to do Hangul character processing. ++ * (See the MS spec. for more details) ++ * ++ * @internal ++ */ ++class HangulOpenTypeLayoutEngine : public OpenTypeLayoutEngine ++{ ++public: ++ /** ++ * This is the main constructor. It constructs an instance of HangulOpenTypeLayoutEngine for ++ * a particular font, script and language. It takes the GSUB table as a parameter since ++ * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an ++ * Hangul OpenType font. ++ * ++ * @param fontInstance - the font ++ * @param scriptCode - the script ++ * @param langaugeCode - the language ++ * @param gsubTable - the GSUB table ++ * @param success - set to an error code if the operation fails ++ * ++ * @see LayoutEngine::layoutEngineFactory ++ * @see OpenTypeLayoutEngine ++ * @see ScriptAndLangaugeTags.h for script and language codes ++ * ++ * @internal ++ */ ++ HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); ++ ++ /** ++ * This constructor is used when the font requires a "canned" GSUB table which can't be known ++ * until after this constructor has been invoked. ++ * ++ * @param fontInstance - the font ++ * @param scriptCode - the script ++ * @param langaugeCode - the language ++ * @param success - set to an error code if the operation fails ++ * ++ * @see OpenTypeLayoutEngine ++ * @see ScriptAndLangaugeTags.h for script and language codes ++ * ++ * @internal ++ */ ++ HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, LEErrorCode &success); ++ ++ /** ++ * The destructor, virtual for correct polymorphic invocation. ++ * ++ * @internal ++ */ ++ virtual ~HangulOpenTypeLayoutEngine(); ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @stable ICU 2.8 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @stable ICU 2.8 ++ */ ++ static UClassID getStaticClassID(); ++ ++protected: ++ ++ /** ++ * This method does Hangul OpenType character processing. It assigns the OpenType feature ++ * tags to the characters, and may compose a character sequence into a modern Hangul syllable, ++ * or decompose a modern Hangul syllable if it forms part of an old Hangul syllable. ++ * ++ * Input parameters: ++ * @param chars - the input character context ++ * @param offset - the index of the first character to process ++ * @param count - the number of characters to process ++ * @param max - the number of characters in the input context ++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run ++ * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. ++ * the auxillary data array will be set to the feature tags. ++ * ++ * Output parameters: ++ * @param success - set to an error code if the operation fails ++ * ++ * @return the output character count ++ * ++ * @internal ++ */ ++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++}; ++ ++U_NAMESPACE_END ++#endif ++ +diff --git a/src/share/native/sun/font/layout/HebrewLigatureData.cpp b/src/share/native/sun/font/layout/HebrewLigatureData.cpp +deleted file mode 100644 +--- jdk/src/share/native/sun/font/layout/HebrewLigatureData.cpp ++++ /dev/null +@@ -1,80 +0,0 @@ +-/* +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. Oracle designates this +- * particular file as subject to the "Classpath" exception as provided +- * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- * +- */ +- +-/* +- * +- * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved +- * +- * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS +- * YOU REALLY KNOW WHAT YOU'RE DOING. +- * +- */ +- +-#include "LETypes.h" +-#include "HebrewShaping.h" +- +-const le_uint8 HebrewShaping::glyphSubstitutionTable[] = { +- 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1E, 0x00, 0x2C, 0x00, 0x01, 0x68, 0x65, 0x62, 0x72, +- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, +- 0x6C, 0x69, 0x67, 0x61, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, +- 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x62, 0x00, 0x16, 0x00, 0x32, +- 0x00, 0x4C, 0x00, 0x5E, 0x00, 0x68, 0x00, 0x72, 0x00, 0x7C, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA2, +- 0x00, 0xAC, 0x00, 0xB6, 0x00, 0xC8, 0x00, 0xD2, 0x00, 0xDC, 0x00, 0xE6, 0x00, 0xF0, 0x00, 0xFA, +- 0x01, 0x0C, 0x01, 0x16, 0x01, 0x20, 0x01, 0x2A, 0x01, 0x58, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, +- 0x00, 0x14, 0xFB, 0x2E, 0x00, 0x02, 0x05, 0xB7, 0xFB, 0x2F, 0x00, 0x02, 0x05, 0xB8, 0xFB, 0x30, +- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x31, 0x00, 0x02, 0x05, 0xBC, +- 0xFB, 0x4C, 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x32, 0x00, 0x02, 0x05, 0xBC, +- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x33, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x34, +- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x4B, 0x00, 0x02, 0x05, 0xB9, +- 0xFB, 0x35, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x36, 0x00, 0x02, 0x05, 0xBC, +- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x38, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x39, +- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x02, +- 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x3B, 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x4D, 0x00, 0x02, 0x05, 0xBF, +- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3C, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x3E, +- 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x40, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, +- 0x00, 0x04, 0xFB, 0x41, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x43, 0x00, 0x02, +- 0x05, 0xBC, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFB, 0x44, 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x4E, +- 0x00, 0x02, 0x05, 0xBF, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x46, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, +- 0x00, 0x04, 0xFB, 0x47, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x04, 0xFB, 0x48, 0x00, 0x02, +- 0x05, 0xBC, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0xFB, 0x2C, +- 0x00, 0x03, 0x05, 0xBC, 0x05, 0xC1, 0xFB, 0x2D, 0x00, 0x03, 0x05, 0xBC, 0x05, 0xC2, 0xFB, 0x49, +- 0x00, 0x02, 0x05, 0xBC, 0xFB, 0x2A, 0x00, 0x02, 0x05, 0xC1, 0xFB, 0x2B, 0x00, 0x02, 0x05, 0xC2, +- 0x00, 0x01, 0x00, 0x04, 0xFB, 0x4A, 0x00, 0x02, 0x05, 0xBC, 0x00, 0x01, 0x00, 0x16, 0x05, 0xD0, +- 0x05, 0xD1, 0x05, 0xD2, 0x05, 0xD3, 0x05, 0xD4, 0x05, 0xD5, 0x05, 0xD6, 0x05, 0xD8, 0x05, 0xD9, +- 0x05, 0xDA, 0x05, 0xDB, 0x05, 0xDC, 0x05, 0xDE, 0x05, 0xE0, 0x05, 0xE1, 0x05, 0xE3, 0x05, 0xE4, +- 0x05, 0xE6, 0x05, 0xE7, 0x05, 0xE8, 0x05, 0xE9, 0x05, 0xEA +-}; +- +-const le_uint8 HebrewShaping::glyphDefinitionTable[] = { +- 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x15, +- 0x05, 0x91, 0x05, 0xA1, 0x00, 0x03, 0x05, 0xA3, 0x05, 0xB9, 0x00, 0x03, 0x05, 0xBB, 0x05, 0xBD, +- 0x00, 0x03, 0x05, 0xBE, 0x05, 0xBE, 0x00, 0x01, 0x05, 0xBF, 0x05, 0xBF, 0x00, 0x03, 0x05, 0xC0, +- 0x05, 0xC0, 0x00, 0x01, 0x05, 0xC1, 0x05, 0xC2, 0x00, 0x03, 0x05, 0xC3, 0x05, 0xC3, 0x00, 0x01, +- 0x05, 0xC4, 0x05, 0xC4, 0x00, 0x03, 0x05, 0xD0, 0x05, 0xEA, 0x00, 0x01, 0x05, 0xF0, 0x05, 0xF2, +- 0x00, 0x02, 0x05, 0xF3, 0x05, 0xF4, 0x00, 0x01, 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x03, 0xFB, 0x1F, +- 0xFB, 0x1F, 0x00, 0x02, 0xFB, 0x20, 0xFB, 0x36, 0x00, 0x01, 0xFB, 0x38, 0xFB, 0x3C, 0x00, 0x01, +- 0xFB, 0x3E, 0xFB, 0x3E, 0x00, 0x01, 0xFB, 0x40, 0xFB, 0x41, 0x00, 0x01, 0xFB, 0x43, 0xFB, 0x44, +- 0x00, 0x01, 0xFB, 0x46, 0xFB, 0x4E, 0x00, 0x01, 0xFB, 0x4F, 0xFB, 0x4F, 0x00, 0x02 +-}; +diff --git a/src/share/native/sun/font/layout/HebrewShaping.cpp b/src/share/native/sun/font/layout/HebrewShaping.cpp +deleted file mode 100644 +--- jdk/src/share/native/sun/font/layout/HebrewShaping.cpp ++++ /dev/null +@@ -1,58 +0,0 @@ +-/* +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. Oracle designates this +- * particular file as subject to the "Classpath" exception as provided +- * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- * +- */ +- +-/* +- * +- * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved +- * +- */ +- +-#include "LETypes.h" +-#include "OpenTypeTables.h" +-#include "HebrewShaping.h" +- +-const LETag ligaFeatureTag = 0x6C696761; // 'liga' +-const LETag emptyTag = 0x00000000; // '' +- +-const LETag hebrewTags[] = +-{ +- ligaFeatureTag, emptyTag +-}; +- +-void HebrewShaping::shape(const LEUnicode * /*chars*/, le_int32 /*offset*/, le_int32 charCount, le_int32 /*charMax*/, +- le_bool rightToLeft, const LETag **tags) +-{ +- +- le_int32 count, out = 0, dir = 1; +- +- if (rightToLeft) { +- out = charCount - 1; +- dir = -1; +- } +- +- for (count = 0; count < charCount; count += 1, out += dir) { +- tags[out] = hebrewTags; +- } +-} +diff --git a/src/share/native/sun/font/layout/HebrewShaping.h b/src/share/native/sun/font/layout/HebrewShaping.h +deleted file mode 100644 +--- jdk/src/share/native/sun/font/layout/HebrewShaping.h ++++ /dev/null +@@ -1,52 +0,0 @@ +-/* +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. Oracle designates this +- * particular file as subject to the "Classpath" exception as provided +- * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- * +- */ +- +-/* +- * +- * (C) Copyright IBM Corp. 1998, 1999, 2000 - All Rights Reserved +- * +- */ +- +-#ifndef __HEBREWSHAPING_H +-#define __HEBREWSHAPING_H +- +-#include "LETypes.h" +-#include "OpenTypeTables.h" +- +-class HebrewShaping +-{ +-public: +- static void shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax, +- le_bool rightToLeft, const LETag **tags); +- +- static const le_uint8 glyphSubstitutionTable[]; +- static const le_uint8 glyphDefinitionTable[]; +- +-private: +- // forbid instantiation +- HebrewShaping(); +-}; +- +-#endif +diff --git a/src/share/native/sun/font/layout/ICUFeatures.h b/src/share/native/sun/font/layout/ICUFeatures.h +new file mode 100644 +--- /dev/null ++++ jdk/src/share/native/sun/font/layout/ICUFeatures.h +@@ -0,0 +1,69 @@ ++/* ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/* ++ * ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved ++ * ++ */ ++ ++#ifndef __ICUFEATURES_H ++#define __ICUFEATURES_H ++ ++/** ++ * \file ++ * \internal ++ */ ++ ++#include "LETypes.h" ++#include "OpenTypeTables.h" ++ ++U_NAMESPACE_BEGIN ++ ++struct FeatureRecord ++{ ++ ATag featureTag; ++ Offset featureTableOffset; ++}; ++ ++struct FeatureTable ++{ ++ Offset featureParamsOffset; ++ le_uint16 lookupCount; ++ le_uint16 lookupListIndexArray[ANY_NUMBER]; ++}; ++ ++struct FeatureListTable ++{ ++ le_uint16 featureCount; ++ FeatureRecord featureRecordArray[ANY_NUMBER]; ++ ++ const FeatureTable *getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const; ++ ++ const FeatureTable *getFeatureTable(LETag featureTag) const; ++}; ++ ++U_NAMESPACE_END ++#endif +diff --git a/src/share/native/sun/font/layout/IndicClassTables.cpp b/src/share/native/sun/font/layout/IndicClassTables.cpp +--- jdk/src/share/native/sun/font/layout/IndicClassTables.cpp ++++ jdk/src/share/native/sun/font/layout/IndicClassTables.cpp +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -73,6 +73,7 @@ + #define _m2 (CC_SPLIT_VOWEL_PIECE_2 | CF_LENGTH_MARK) + #define _m3 (CC_SPLIT_VOWEL_PIECE_3 | CF_LENGTH_MARK) + #define _vr (CC_VIRAMA) ++#define _al (CC_AL_LAKUNA) + + // split matras + #define _s1 (_dv | _x1) +@@ -90,6 +91,7 @@ + // special forms... (Bengali RA?) + #define _bb (_ct | CF_BELOW_BASE) + #define _pb (_ct | CF_POST_BASE) ++#define _fb (_ct | CF_PRE_BASE) + #define _vt (_bb | CF_VATTU) + #define _rv (_vt | CF_REPH) + #define _rp (_pb | CF_REPH) +@@ -119,7 +121,7 @@ + _dr, _db, _db, _db, _db, _xx, _xx, _l1, _dl, _xx, _xx, _s1, _s2, _vr, _xx, _xx, // 09C0 - 09CF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _cn, // 09D0 - 09DF + _iv, _iv, _dv, _dv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 09E0 - 09EF +- _ct, _ct, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 09F0 - 09FA ++ _rv, _ct, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 09F0 - 09FA + }; + + static const IndicClassTable::CharClass punjCharClasses[] = +@@ -142,9 +144,22 @@ + _rv, _xx, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _dr, _dl, // 0AB0 - 0ABF + _dr, _db, _db, _db, _db, _da, _xx, _da, _da, _dr, _xx, _dr, _dr, _vr, _xx, _xx, // 0AC0 - 0ACF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0AD0 - 0ADF +- _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0AE0 - 0AEF ++ _iv, _iv, _db, _db, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0AE0 - 0AEF + }; + ++#if 1 ++static const IndicClassTable::CharClass oryaCharClasses[] = ++{ ++ _xx, _ma, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, /* 0B00 - 0B0F */ ++ _iv, _xx, _xx, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _ct, _bb, /* 0B10 - 0B1F */ ++ _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _pb, /* 0B20 - 0B2F */ ++ _rb, _xx, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _nu, _xx, _dr, _da, /* 0B30 - 0B3F */ ++ _dr, _db, _db, _db, _xx, _xx, _xx, _dl, _s1, _xx, _xx, _s2, _s3, _vr, _xx, _xx, /* 0B40 - 0B4F */ ++ _xx, _xx, _xx, _xx, _xx, _xx, _da, _dr, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _pb, /* 0B50 - 0B5F */ ++ _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, /* 0B60 - 0B6F */ ++ _xx, _bb /* 0B70 - 0B71 */ ++}; ++#else + static const IndicClassTable::CharClass oryaCharClasses[] = + { + _xx, _ma, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, // 0B00 - 0B0F +@@ -156,13 +171,14 @@ + _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0B60 - 0B6F + _xx, _ct // 0B70 - 0B71 + }; ++#endif + + static const IndicClassTable::CharClass tamlCharClasses[] = + { +- _xx, _xx, _ma, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _iv, _iv, // 0B80 - 0B8F ++ _xx, _xx, _ma, _xx, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _iv, _iv, // 0B80 - 0B8F + _iv, _xx, _iv, _iv, _iv, _ct, _xx, _xx, _xx, _ct, _ct, _xx, _ct, _xx, _ct, _ct, // 0B90 - 0B9F + _xx, _xx, _xx, _ct, _ct, _xx, _xx, _xx, _ct, _ct, _ct, _xx, _xx, _xx, _ct, _ct, // 0BA0 - 0BAF +- _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0BB0 - 0BBF ++ _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0BB0 - 0BBF + _da, _dr, _dr, _xx, _xx, _xx, _l1, _l1, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0BC0 - 0BCF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0BD0 - 0BDF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0BE0 - 0BEF +@@ -175,7 +191,7 @@ + _xx, _mp, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0C00 - 0C0F + _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, // 0C10 - 0C1F + _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, // 0C20 - 0C2F +- _bb, _ct, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _da, _da, // 0C30 - 0C3F ++ _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _da, _da, // 0C30 - 0C3F + _da, _dr, _dr, _dr, _dr, _xx, _a1, _da, _s1, _xx, _da, _da, _da, _vr, _xx, _xx, // 0C40 - 0C4F + _xx, _xx, _xx, _xx, _xx, _da, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0C50 - 0C5F + _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0C60 - 0C6F +@@ -189,7 +205,7 @@ + // http://brahmi.sourceforge.net/docs/KannadaComputing.html + static const IndicClassTable::CharClass kndaCharClasses[] = + { +- _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, // 0C80 - 0C8F ++ _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0C80 - 0C8F + _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, // 0C90 - 0C9F + _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, // 0CA0 - 0CAF + _rb, _ct, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _dr, _da, // 0CB0 - 0CBF +@@ -203,9 +219,9 @@ + static const IndicClassTable::CharClass mlymCharClasses[] = + { + _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0D00 - 0D0F +- _iv, _xx, _iv, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _bb, // 0D10 - 0D1F +- _ct, _ct, _ct, _bb, _ct, _bb, _bb, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _pb, // 0D20 - 0D2F +- _pb, _cn, _bb, _ct, _ct, _pb, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0D30 - 0D3F ++ _iv, _xx, _iv, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0D10 - 0D1F ++ _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _pb, // 0D20 - 0D2F ++ _fb, _fb, _bb, _ct, _ct, _pb, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0D30 - 0D3F + _dr, _dr, _dr, _dr, _xx, _xx, _l1, _l1, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0D40 - 0D4F + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0D50 - 0D5F + _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0D60 - 0D6F +@@ -217,7 +233,7 @@ + _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _ct, _ct, _ct, _ct, _ct, _ct, // 0D90 - 0D9F + _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0DA0 - 0DAF + _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _xx, _xx, // 0DB0 - 0DBF +- _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _vr, _xx, _xx, _xx, _xx, _dr, // 0DC0 - 0DCF ++ _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _al, _xx, _xx, _xx, _xx, _dr, // 0DC0 - 0DCF + _dr, _dr, _da, _da, _db, _xx, _db, _xx, _dr, _dl, _s1, _dl, _s2, _s3, _s4, _dr, // 0DD0 - 0DDF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0DE0 - 0DEF + _xx, _xx, _dr, _dr, _xx // 0DF0 - 0DF4 +@@ -248,17 +264,18 @@ + + // FIXME: post 'GSUB' reordering of MATRA_PRE's for Malayalam and Tamil + // FIXME: reformed Malayalam needs to reorder VATTU to before base glyph... ++// FIXME: not sure passing ZWJ/ZWNJ is best way to render Malayalam Cillu... + // FIXME: eyelash RA only for Devanagari?? +-#define DEVA_SCRIPT_FLAGS (SF_EYELASH_RA | SF_NO_POST_BASE_LIMIT) +-#define BENG_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT) +-#define PUNJ_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT) +-#define GUJR_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT) +-#define ORYA_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT) +-#define TAML_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT) +-#define TELU_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | 3) +-#define KNDA_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | 3) +-#define MLYM_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT) +-#define SINH_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT) ++#define DEVA_SCRIPT_FLAGS (SF_EYELASH_RA | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) ++#define BENG_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) ++#define PUNJ_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) ++#define GUJR_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) ++#define ORYA_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) ++#define TAML_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) ++#define TELU_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | SF_FILTER_ZERO_WIDTH | 3) ++#define KNDA_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | SF_FILTER_ZERO_WIDTH | 3) ++#define MLYM_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT /*| SF_FILTER_ZERO_WIDTH*/) ++#define SINH_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT) + + // + // Indic Class Tables +@@ -286,7 +303,7 @@ + // + // IndicClassTable addresses + // +-static const IndicClassTable * const indicClassTables[] = { ++static const IndicClassTable * const indicClassTables[scriptCodeCount] = { + NULL, /* 'zyyy' (COMMON) */ + NULL, /* 'qaai' (INHERITED) */ + NULL, /* 'arab' (ARABIC) */ +@@ -348,7 +365,79 @@ + NULL, /* 'sylo' (SYLOTI_NAGRI) */ + NULL, /* 'talu' (NEW_TAI_LUE) */ + NULL, /* 'tfng' (TIFINAGH) */ +- NULL /* 'xpeo' (OLD_PERSIAN) */ ++ NULL, /* 'xpeo' (OLD_PERSIAN) */ ++ NULL, /* 'bali' (BALINESE) */ ++ NULL, /* 'batk' (BATK) */ ++ NULL, /* 'blis' (BLIS) */ ++ NULL, /* 'brah' (BRAH) */ ++ NULL, /* 'cham' (CHAM) */ ++ NULL, /* 'cirt' (CIRT) */ ++ NULL, /* 'cyrs' (CYRS) */ ++ NULL, /* 'egyd' (EGYD) */ ++ NULL, /* 'egyh' (EGYH) */ ++ NULL, /* 'egyp' (EGYP) */ ++ NULL, /* 'geok' (GEOK) */ ++ NULL, /* 'hans' (HANS) */ ++ NULL, /* 'hant' (HANT) */ ++ NULL, /* 'hmng' (HMNG) */ ++ NULL, /* 'hung' (HUNG) */ ++ NULL, /* 'inds' (INDS) */ ++ NULL, /* 'java' (JAVA) */ ++ NULL, /* 'kali' (KALI) */ ++ NULL, /* 'latf' (LATF) */ ++ NULL, /* 'latg' (LATG) */ ++ NULL, /* 'lepc' (LEPC) */ ++ NULL, /* 'lina' (LINA) */ ++ NULL, /* 'mand' (MAND) */ ++ NULL, /* 'maya' (MAYA) */ ++ NULL, /* 'mero' (MERO) */ ++ NULL, /* 'nko ' (NKO) */ ++ NULL, /* 'orkh' (ORKH) */ ++ NULL, /* 'perm' (PERM) */ ++ NULL, /* 'phag' (PHAGS_PA) */ ++ NULL, /* 'phnx' (PHOENICIAN) */ ++ NULL, /* 'plrd' (PLRD) */ ++ NULL, /* 'roro' (RORO) */ ++ NULL, /* 'sara' (SARA) */ ++ NULL, /* 'syre' (SYRE) */ ++ NULL, /* 'syrj' (SYRJ) */ ++ NULL, /* 'syrn' (SYRN) */ ++ NULL, /* 'teng' (TENG) */ ++ NULL, /* 'vai ' (VAII) */ ++ NULL, /* 'visp' (VISP) */ ++ NULL, /* 'xsux' (CUNEIFORM) */ ++ NULL, /* 'zxxx' (ZXXX) */ ++ NULL, /* 'zzzz' (UNKNOWN) */ ++ NULL, /* 'cari' (CARI) */ ++ NULL, /* 'jpan' (JPAN) */ ++ NULL, /* 'lana' (LANA) */ ++ NULL, /* 'lyci' (LYCI) */ ++ NULL, /* 'lydi' (LYDI) */ ++ NULL, /* 'olck' (OLCK) */ ++ NULL, /* 'rjng' (RJNG) */ ++ NULL, /* 'saur' (SAUR) */ ++ NULL, /* 'sgnw' (SGNW) */ ++ NULL, /* 'sund' (SUND) */ ++ NULL, /* 'moon' (MOON) */ ++ NULL, /* 'mtei' (MTEI) */ ++ NULL, /* 'armi' (ARMI) */ ++ NULL, /* 'avst' (AVST) */ ++ NULL, /* 'cakm' (CAKM) */ ++ NULL, /* 'kore' (KORE) */ ++ NULL, /* 'kthi' (KTHI) */ ++ NULL, /* 'mani' (MANI) */ ++ NULL, /* 'phli' (PHLI) */ ++ NULL, /* 'phlp' (PHLP) */ ++ NULL, /* 'phlv' (PHLV) */ ++ NULL, /* 'prti' (PRTI) */ ++ NULL, /* 'samr' (SAMR) */ ++ NULL, /* 'tavt' (TAVT) */ ++ NULL, /* 'zmth' (ZMTH) */ ++ NULL, /* 'zsym' (ZSYM) */ ++ NULL, /* 'bamu' (BAMUM) */ ++ NULL, /* 'lisu' (LISU) */ ++ NULL, /* 'nkgb' (NKGB) */ ++ NULL /* 'sarb' (OLD_SOUTH_ARABIAN) */ + }; + + IndicClassTable::CharClass IndicClassTable::getCharClass(LEUnicode ch) const +@@ -388,4 +477,15 @@ + return classTable->getWorstCaseExpansion(); + } + ++le_bool IndicReordering::getFilterZeroWidth(le_int32 scriptCode) ++{ ++ const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); ++ ++ if (classTable == NULL) { ++ return TRUE; ++ } ++ ++ return classTable->getFilterZeroWidth(); ++} ++ + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.cpp b/src/share/native/sun/font/layout/IndicLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp +@@ -26,7 +26,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved + * + */ + +@@ -44,24 +44,31 @@ + #include "LEGlyphStorage.h" + + #include "IndicReordering.h" +- ++#include <stdio.h> + U_NAMESPACE_BEGIN + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicOpenTypeLayoutEngine) + + IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) +- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable), fMPreFixups(NULL) ++ le_int32 typoFlags, le_bool version2, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success), fMPreFixups(NULL) ++{ ++ if ( version2 ) { ++ fFeatureMap = IndicReordering::getv2FeatureMap(fFeatureMapCount); ++ } else { ++ fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount); ++ } ++ fFeatureOrder = TRUE; ++ fVersion2 = version2; ++ fFilterZeroWidth = IndicReordering::getFilterZeroWidth(fScriptCode); ++} ++ ++IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fMPreFixups(NULL) + { + fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; +-} +- +-IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) +- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fMPreFixups(NULL) +-{ +- fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount); +- fFeatureOrder = TRUE; ++ fVersion2 = FALSE; + } + + IndicOpenTypeLayoutEngine::~IndicOpenTypeLayoutEngine() +@@ -89,8 +96,13 @@ + return 0; + } + +- IndicReordering::adjustMPres(fMPreFixups, glyphStorage); +- ++ if (fVersion2) { ++ IndicReordering::finalReordering(glyphStorage,retCount); ++ IndicReordering::applyPresentationForms(glyphStorage,retCount); ++ OpenTypeLayoutEngine::glyphSubstitution(count,max, rightToLeft, glyphStorage, success); ++ } else { ++ IndicReordering::adjustMPres(fMPreFixups, glyphStorage, success); ++ } + return retCount; + } + +@@ -128,7 +140,18 @@ + + // NOTE: assumes this allocates featureTags... + // (probably better than doing the worst case stuff here...) +- le_int32 outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups); ++ ++ le_int32 outCharCount; ++ if (fVersion2) { ++ outCharCount = IndicReordering::v2process(&chars[offset], count, fScriptCode, outChars, glyphStorage); ++ } else { ++ outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups, success); ++ } ++ ++ if (LE_FAILURE(success)) { ++ LE_DELETE_ARRAY(outChars); ++ return 0; ++ } + + glyphStorage.adoptGlyphCount(outCharCount); + return outCharCount; +diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.h b/src/share/native/sun/font/layout/IndicLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h +@@ -26,7 +26,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved + * + */ + +@@ -72,6 +72,7 @@ + * @param scriptCode - the script + * @param langaugeCode - the language + * @param gsubTable - the GSUB table ++ * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see OpenTypeLayoutEngine +@@ -80,7 +81,7 @@ + * @internal + */ + IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); ++ le_int32 typoFlags, le_bool version2, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +@@ -89,6 +90,7 @@ + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language ++ * @param success - set to an error code if the operation fails + * + * @see OpenTypeLayoutEngine + * @see ScriptAndLangaugeTags.h for script and language codes +@@ -96,7 +98,7 @@ + * @internal + */ + IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags); ++ le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -177,9 +179,12 @@ + virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + ++ le_bool fVersion2; ++ + private: + + MPreFixups *fMPreFixups; ++ + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/IndicReordering.cpp b/src/share/native/sun/font/layout/IndicReordering.cpp +--- jdk/src/share/native/sun/font/layout/IndicReordering.cpp ++++ jdk/src/share/native/sun/font/layout/IndicReordering.cpp +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved + * + */ + +@@ -38,10 +38,12 @@ + + U_NAMESPACE_BEGIN + ++#define loclFeatureTag LE_LOCL_FEATURE_TAG + #define initFeatureTag LE_INIT_FEATURE_TAG + #define nuktFeatureTag LE_NUKT_FEATURE_TAG + #define akhnFeatureTag LE_AKHN_FEATURE_TAG + #define rphfFeatureTag LE_RPHF_FEATURE_TAG ++#define rkrfFeatureTag LE_RKRF_FEATURE_TAG + #define blwfFeatureTag LE_BLWF_FEATURE_TAG + #define halfFeatureTag LE_HALF_FEATURE_TAG + #define pstfFeatureTag LE_PSTF_FEATURE_TAG +@@ -51,30 +53,69 @@ + #define abvsFeatureTag LE_ABVS_FEATURE_TAG + #define pstsFeatureTag LE_PSTS_FEATURE_TAG + #define halnFeatureTag LE_HALN_FEATURE_TAG +- ++#define cjctFeatureTag LE_CJCT_FEATURE_TAG + #define blwmFeatureTag LE_BLWM_FEATURE_TAG + #define abvmFeatureTag LE_ABVM_FEATURE_TAG + #define distFeatureTag LE_DIST_FEATURE_TAG ++#define caltFeatureTag LE_CALT_FEATURE_TAG ++#define kernFeatureTag LE_KERN_FEATURE_TAG + +-#define rphfFeatureMask 0x80000000UL +-#define blwfFeatureMask 0x40000000UL +-#define halfFeatureMask 0x20000000UL +-#define pstfFeatureMask 0x10000000UL +-#define nuktFeatureMask 0x08000000UL +-#define akhnFeatureMask 0x04000000UL +-#define vatuFeatureMask 0x02000000UL +-#define presFeatureMask 0x01000000UL +-#define blwsFeatureMask 0x00800000UL +-#define abvsFeatureMask 0x00400000UL +-#define pstsFeatureMask 0x00200000UL +-#define halnFeatureMask 0x00100000UL +-#define blwmFeatureMask 0x00080000UL +-#define abvmFeatureMask 0x00040000UL +-#define distFeatureMask 0x00020000UL +-#define initFeatureMask 0x00010000UL ++#define loclFeatureMask 0x80000000UL ++#define rphfFeatureMask 0x40000000UL ++#define blwfFeatureMask 0x20000000UL ++#define halfFeatureMask 0x10000000UL ++#define pstfFeatureMask 0x08000000UL ++#define nuktFeatureMask 0x04000000UL ++#define akhnFeatureMask 0x02000000UL ++#define vatuFeatureMask 0x01000000UL ++#define presFeatureMask 0x00800000UL ++#define blwsFeatureMask 0x00400000UL ++#define abvsFeatureMask 0x00200000UL ++#define pstsFeatureMask 0x00100000UL ++#define halnFeatureMask 0x00080000UL ++#define blwmFeatureMask 0x00040000UL ++#define abvmFeatureMask 0x00020000UL ++#define distFeatureMask 0x00010000UL ++#define initFeatureMask 0x00008000UL ++#define cjctFeatureMask 0x00004000UL ++#define rkrfFeatureMask 0x00002000UL ++#define caltFeatureMask 0x00001000UL ++#define kernFeatureMask 0x00000800UL + +-class ReorderingOutput : public UMemory { ++// Syllable structure bits ++#define baseConsonantMask 0x00000400UL ++#define consonantMask 0x00000200UL ++#define halfConsonantMask 0x00000100UL ++#define rephConsonantMask 0x00000080UL ++#define matraMask 0x00000040UL ++#define vowelModifierMask 0x00000020UL ++#define markPositionMask 0x00000018UL ++ ++#define postBasePosition 0x00000000UL ++#define preBasePosition 0x00000008UL ++#define aboveBasePosition 0x00000010UL ++#define belowBasePosition 0x00000018UL ++ ++#define repositionedGlyphMask 0x00000002UL ++ ++#define basicShapingFormsMask ( loclFeatureMask | nuktFeatureMask | akhnFeatureMask | rkrfFeatureMask | blwfFeatureMask | halfFeatureMask | vatuFeatureMask | cjctFeatureMask ) ++#define positioningFormsMask ( kernFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask ) ++#define presentationFormsMask ( presFeatureMask | abvsFeatureMask | blwsFeatureMask | pstsFeatureMask | halnFeatureMask | caltFeatureMask ) ++ ++ ++#define C_MALAYALAM_VOWEL_SIGN_U 0x0D41 ++#define C_DOTTED_CIRCLE 0x25CC ++#define NO_GLYPH 0xFFFF ++ ++// Some level of debate as to the proper value for MAX_CONSONANTS_PER_SYLLABLE. Ticket 5588 states that 4 ++// is the magic number according to ISCII, but 5 seems to be the more consistent with XP. ++#define MAX_CONSONANTS_PER_SYLLABLE 5 ++ ++#define INDIC_BLOCK_SIZE 0x7F ++ ++class IndicReorderingOutput : public UMemory { + private: ++ le_int32 fSyllableCount; + le_int32 fOutIndex; + LEUnicode *fOutChars; + +@@ -95,8 +136,8 @@ + LEUnicode fLengthMark; + le_int32 fLengthMarkIndex; + +- LEUnicode fVirama; +- le_int32 fViramaIndex; ++ LEUnicode fAlLakuna; ++ le_int32 fAlLakunaIndex; + + FeatureMask fMatraFeatures; + +@@ -113,15 +154,20 @@ + le_int32 fSMIndex; + FeatureMask fSMFeatures; + ++ LEUnicode fPreBaseConsonant; ++ LEUnicode fPreBaseVirama; ++ le_int32 fPBCIndex; ++ FeatureMask fPBCFeatures; ++ + void saveMatra(LEUnicode matra, le_int32 matraIndex, IndicClassTable::CharClass matraClass) + { + // FIXME: check if already set, or if not a matra... + if (IndicClassTable::isLengthMark(matraClass)) { + fLengthMark = matra; + fLengthMarkIndex = matraIndex; +- } else if (IndicClassTable::isVirama(matraClass)) { +- fVirama = matra; +- fViramaIndex = matraIndex; ++ } else if (IndicClassTable::isAlLakuna(matraClass)) { ++ fAlLakuna = matra; ++ fAlLakunaIndex = matraIndex; + } else { + switch (matraClass & CF_POS_MASK) { + case CF_POS_BEFORE: +@@ -152,29 +198,34 @@ + } + + public: +- ReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups) +- : fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage), ++ IndicReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups) ++ : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage), + fMpre(0), fMpreIndex(0), fMbelow(0), fMbelowIndex(0), fMabove(0), fMaboveIndex(0), +- fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0), fVirama(0), fViramaIndex(0), ++ fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0), fAlLakuna(0), fAlLakunaIndex(0), + fMatraFeatures(0), fMPreOutIndex(-1), fMPreFixups(mpreFixups), + fVMabove(0), fVMpost(0), fVMIndex(0), fVMFeatures(0), +- fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0) ++ fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0), ++ fPreBaseConsonant(0), fPreBaseVirama(0), fPBCIndex(0), fPBCFeatures(0) + { + // nothing else to do... + } + +- ~ReorderingOutput() ++ ~IndicReorderingOutput() + { + // nothing to do here... + } + + void reset() + { +- fMpre = fMbelow = fMabove = fMpost = fLengthMark = fVirama = 0; ++ fSyllableCount += 1; ++ ++ fMpre = fMbelow = fMabove = fMpost = fLengthMark = fAlLakuna = 0; + fMPreOutIndex = -1; + + fVMabove = fVMpost = 0; + fSMabove = fSMbelow = 0; ++ ++ fPreBaseConsonant = fPreBaseVirama = 0; + } + + void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures) +@@ -184,11 +235,113 @@ + fOutChars[fOutIndex] = ch; + + fGlyphStorage.setCharIndex(fOutIndex, charIndex, success); +- fGlyphStorage.setAuxData(fOutIndex, charFeatures, success); ++ fGlyphStorage.setAuxData(fOutIndex, charFeatures | (fSyllableCount & LE_GLYPH_GROUP_MASK), success); + + fOutIndex += 1; + } + ++ void setFeatures ( le_uint32 charIndex, FeatureMask charFeatures) ++ { ++ LEErrorCode success = LE_NO_ERROR; ++ ++ fGlyphStorage.setAuxData( charIndex, charFeatures, success ); ++ ++ } ++ ++ FeatureMask getFeatures ( le_uint32 charIndex ) ++ { ++ LEErrorCode success = LE_NO_ERROR; ++ return fGlyphStorage.getAuxData(charIndex,success); ++ } ++ ++ void decomposeReorderMatras ( const IndicClassTable *classTable, le_int32 beginSyllable, le_int32 nextSyllable, le_int32 inv_count ) { ++ le_int32 i; ++ LEErrorCode success = LE_NO_ERROR; ++ ++ for ( i = beginSyllable ; i < nextSyllable ; i++ ) { ++ if ( classTable->isMatra(fOutChars[i+inv_count])) { ++ IndicClassTable::CharClass matraClass = classTable->getCharClass(fOutChars[i+inv_count]); ++ if ( classTable->isSplitMatra(matraClass)) { ++ le_int32 saveIndex = fGlyphStorage.getCharIndex(i+inv_count,success); ++ le_uint32 saveAuxData = fGlyphStorage.getAuxData(i+inv_count,success); ++ const SplitMatra *splitMatra = classTable->getSplitMatra(matraClass); ++ int j; ++ for (j = 0 ; *(splitMatra)[j] != 0 ; j++) { ++ LEUnicode piece = (*splitMatra)[j]; ++ if ( j == 0 ) { ++ fOutChars[i+inv_count] = piece; ++ matraClass = classTable->getCharClass(piece); ++ } else { ++ insertCharacter(piece,i+1+inv_count,saveIndex,saveAuxData); ++ nextSyllable++; ++ } ++ } ++ } ++ ++ if ((matraClass & CF_POS_MASK) == CF_POS_BEFORE) { ++ moveCharacter(i+inv_count,beginSyllable+inv_count); ++ } ++ } ++ } ++ } ++ ++ void moveCharacter( le_int32 fromPosition, le_int32 toPosition ) { ++ le_int32 i,saveIndex; ++ le_uint32 saveAuxData; ++ LEUnicode saveChar = fOutChars[fromPosition]; ++ LEErrorCode success = LE_NO_ERROR; ++ LEErrorCode success2 = LE_NO_ERROR; ++ saveIndex = fGlyphStorage.getCharIndex(fromPosition,success); ++ saveAuxData = fGlyphStorage.getAuxData(fromPosition,success); ++ ++ if ( fromPosition > toPosition ) { ++ for ( i = fromPosition ; i > toPosition ; i-- ) { ++ fOutChars[i] = fOutChars[i-1]; ++ fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i-1,success2),success); ++ fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i-1,success2), success); ++ ++ } ++ } else { ++ for ( i = fromPosition ; i < toPosition ; i++ ) { ++ fOutChars[i] = fOutChars[i+1]; ++ fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i+1,success2),success); ++ fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i+1,success2), success); ++ } ++ ++ } ++ fOutChars[toPosition] = saveChar; ++ fGlyphStorage.setCharIndex(toPosition,saveIndex,success); ++ fGlyphStorage.setAuxData(toPosition,saveAuxData,success); ++ ++ } ++ void insertCharacter( LEUnicode ch, le_int32 toPosition, le_int32 charIndex, le_uint32 auxData ) { ++ LEErrorCode success = LE_NO_ERROR; ++ le_int32 i; ++ fOutIndex += 1; ++ ++ for ( i = fOutIndex ; i > toPosition ; i--) { ++ fOutChars[i] = fOutChars[i-1]; ++ fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i-1,success),success); ++ fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i-1,success), success); ++ } ++ ++ fOutChars[toPosition] = ch; ++ fGlyphStorage.setCharIndex(toPosition,charIndex,success); ++ fGlyphStorage.setAuxData(toPosition,auxData,success); ++ ++ } ++ void removeCharacter( le_int32 fromPosition ) { ++ LEErrorCode success = LE_NO_ERROR; ++ le_int32 i; ++ fOutIndex -= 1; ++ ++ for ( i = fromPosition ; i < fOutIndex ; i--) { ++ fOutChars[i] = fOutChars[i+1]; ++ fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i+1,success),success); ++ fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i+1,success), success); ++ } ++ } ++ + le_bool noteMatra(const IndicClassTable *classTable, LEUnicode matra, le_uint32 matraIndex, FeatureMask matraFeatures, le_bool wordStart) + { + IndicClassTable::CharClass matraClass = classTable->getCharClass(matra); +@@ -268,6 +421,14 @@ + } + } + ++ void notePreBaseConsonant(le_uint32 index,LEUnicode PBConsonant, LEUnicode PBVirama, FeatureMask features) ++ { ++ fPBCIndex = index; ++ fPreBaseConsonant = PBConsonant; ++ fPreBaseVirama = PBVirama; ++ fPBCFeatures = features; ++ } ++ + void noteBaseConsonant() + { + if (fMPreFixups != NULL && fMPreOutIndex >= 0) { +@@ -275,11 +436,11 @@ + } + } + +- // Handles virama in Sinhala split vowels. +- void writeVirama() ++ // Handles Al-Lakuna in Sinhala split vowels. ++ void writeAlLakuna() + { +- if (fVirama != 0) { +- writeChar(fVirama, fViramaIndex, fMatraFeatures); ++ if (fAlLakuna != 0) { ++ writeChar(fAlLakuna, fAlLakunaIndex, fMatraFeatures); + } + } + +@@ -347,26 +508,39 @@ + } + } + ++ void writePreBaseConsonant() ++ { ++ // The TDIL spec says that consonant + virama + RRA should produce a rakar in Malayalam. However, ++ // it seems that almost none of the fonts for Malayalam are set up to handle this. ++ // So, we're going to force the issue here by using the rakar as defined with RA in most fonts. ++ ++ if (fPreBaseConsonant == 0x0d31) { // RRA ++ fPreBaseConsonant = 0x0d30; // RA ++ } ++ ++ if (fPreBaseConsonant != 0) { ++ writeChar(fPreBaseConsonant, fPBCIndex, fPBCFeatures); ++ writeChar(fPreBaseVirama,fPBCIndex-1,fPBCFeatures); ++ } ++ } ++ + le_int32 getOutputIndex() + { + return fOutIndex; + } + }; + +-enum +-{ +- C_DOTTED_CIRCLE = 0x25CC +-}; ++ + + // TODO: Find better names for these! +-#define tagArray4 (nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask) ++#define tagArray4 (loclFeatureMask | nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask) + #define tagArray3 (pstfFeatureMask | tagArray4) + #define tagArray2 (halfFeatureMask | tagArray3) + #define tagArray1 (blwfFeatureMask | tagArray2) + #define tagArray0 (rphfFeatureMask | tagArray1) + +-static const FeatureMap featureMap[] = +-{ ++static const FeatureMap featureMap[] = { ++ {loclFeatureTag, loclFeatureMask}, + {initFeatureTag, initFeatureMask}, + {nuktFeatureTag, nuktFeatureMask}, + {akhnFeatureTag, akhnFeatureMask}, +@@ -387,21 +561,47 @@ + + static const le_int32 featureCount = LE_ARRAY_SIZE(featureMap); + ++static const FeatureMap v2FeatureMap[] = { ++ {loclFeatureTag, loclFeatureMask}, ++ {nuktFeatureTag, nuktFeatureMask}, ++ {akhnFeatureTag, akhnFeatureMask}, ++ {rphfFeatureTag, rphfFeatureMask}, ++ {rkrfFeatureTag, rkrfFeatureMask}, ++ {blwfFeatureTag, blwfFeatureMask}, ++ {halfFeatureTag, halfFeatureMask}, ++ {vatuFeatureTag, vatuFeatureMask}, ++ {cjctFeatureTag, cjctFeatureMask}, ++ {presFeatureTag, presFeatureMask}, ++ {abvsFeatureTag, abvsFeatureMask}, ++ {blwsFeatureTag, blwsFeatureMask}, ++ {pstsFeatureTag, pstsFeatureMask}, ++ {halnFeatureTag, halnFeatureMask}, ++ {caltFeatureTag, caltFeatureMask}, ++ {kernFeatureTag, kernFeatureMask}, ++ {distFeatureTag, distFeatureMask}, ++ {abvmFeatureTag, abvmFeatureMask}, ++ {blwmFeatureTag, blwmFeatureMask} ++}; ++ ++static const le_int32 v2FeatureMapCount = LE_ARRAY_SIZE(v2FeatureMap); ++ + static const le_int8 stateTable[][CC_COUNT] = + { +-// xx vm sm iv i2 i3 ct cn nu dv s1 s2 s3 vr zw +- { 1, 1, 1, 5, 8, 11, 3, 2, 1, 5, 9, 5, 1, 1, 1}, // 0 - ground state +- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 1 - exit state +- {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, -1}, // 2 - consonant with nukta +- {-1, 6, 1, -1, -1, -1, -1, -1, 2, 5, 9, 5, 5, 4, -1}, // 3 - consonant +- {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, 7}, // 4 - consonant virama +- {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 5 - dependent vowels +- {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 6 - vowel mark +- {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, -1}, // 7 - ZWJ, ZWNJ +- {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1}, // 8 - independent vowels that can take a virama +- {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 5, -1, -1}, // 9 - first part of split vowel +- {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1}, // 10 - second part of split vowel +- {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, -1} // 11 - independent vowels that can take an iv ++// xx vm sm iv i2 i3 ct cn nu dv s1 s2 s3 vr zw al ++ { 1, 6, 1, 5, 8, 11, 3, 2, 1, 5, 9, 5, 5, 1, 1, 1}, // 0 - ground state ++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 1 - exit state ++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, 12, -1}, // 2 - consonant with nukta ++ {-1, 6, 1, -1, -1, -1, -1, -1, 2, 5, 9, 5, 5, 4, 12, 13}, // 3 - consonant ++ {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, 7, -1}, // 4 - consonant virama ++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 5 - dependent vowels ++ {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 6 - vowel mark ++ {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, -1, -1}, // 7 - consonant virama ZWJ, consonant ZWJ virama ++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1}, // 8 - independent vowels that can take a virama ++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 5, -1, -1, -1}, // 9 - first part of split vowel ++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1, -1}, // 10 - second part of split vowel ++ {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, -1, -1}, // 11 - independent vowels that can take an iv ++ {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, 7}, // 12 - consonant ZWJ (TODO: Take everything else that can be after a consonant?) ++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1} // 13 - consonant al-lakuna ZWJ consonant + }; + + +@@ -412,14 +612,29 @@ + return featureMap; + } + ++const FeatureMap *IndicReordering::getv2FeatureMap(le_int32 &count) ++{ ++ count = v2FeatureMapCount; ++ ++ return v2FeatureMap; ++} ++ + le_int32 IndicReordering::findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount) + { + le_int32 cursor = prev; + le_int8 state = 0; ++ le_int8 consonant_count = 0; + + while (cursor < charCount) { + IndicClassTable::CharClass charClass = classTable->getCharClass(chars[cursor]); + ++ if ( IndicClassTable::isConsonant(charClass) ) { ++ consonant_count++; ++ if ( consonant_count > MAX_CONSONANTS_PER_SYLLABLE ) { ++ break; ++ } ++ } ++ + state = stateTable[state][charClass & CF_CLASS_MASK]; + + if (state < 0) { +@@ -434,16 +649,24 @@ + + le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode, + LEUnicode *outChars, LEGlyphStorage &glyphStorage, +- MPreFixups **outMPreFixups) ++ MPreFixups **outMPreFixups, LEErrorCode& success) + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + MPreFixups *mpreFixups = NULL; + const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); + + if (classTable->scriptFlags & SF_MPRE_FIXUP) { + mpreFixups = new MPreFixups(charCount); ++ if (mpreFixups == NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return 0; ++ } + } + +- ReorderingOutput output(outChars, glyphStorage, mpreFixups); ++ IndicReorderingOutput output(outChars, glyphStorage, mpreFixups); + le_int32 i, prev = 0; + le_bool lastInWord = FALSE; + +@@ -458,7 +681,7 @@ + output.noteStressMark(classTable, chars[markStart], markStart, tagArray1); + } + +- if (classTable->isVowelModifier(chars[markStart - 1])) { ++ if (markStart != prev && classTable->isVowelModifier(chars[markStart - 1])) { + markStart -= 1; + output.noteVowelModifier(classTable, chars[markStart], markStart, tagArray1); + } +@@ -484,9 +707,20 @@ + + break; + ++ case CC_AL_LAKUNA: + case CC_NUKTA: ++ output.writeChar(C_DOTTED_CIRCLE, prev, tagArray1); ++ output.writeChar(chars[prev], prev, tagArray1); ++ break; ++ + case CC_VIRAMA: ++ // A lone virama is illegal unless it follows a ++ // MALAYALAM_VOWEL_SIGN_U. Such a usage is called ++ // "samvruthokaram". ++ if (chars[prev - 1] != C_MALAYALAM_VOWEL_SIGN_U) { + output.writeChar(C_DOTTED_CIRCLE, prev, tagArray1); ++ } ++ + output.writeChar(chars[prev], prev, tagArray1); + break; + +@@ -518,7 +752,7 @@ + } + + output.writeLengthMark(); +- output.writeVirama(); ++ output.writeAlLakuna(); + + if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) { + output.writeVMabove(); +@@ -538,7 +772,7 @@ + le_int32 baseLimit = prev; + + // Check for REPH at front of syllable +- if (length > 2 && classTable->isReph(chars[prev]) && classTable->isVirama(chars[prev + 1])) { ++ if (length > 2 && classTable->isReph(chars[prev]) && classTable->isVirama(chars[prev + 1]) && chars[prev + 2] != C_SIGN_ZWNJ) { + baseLimit += 2; + + // Check for eyelash RA, if the script supports it +@@ -556,35 +790,59 @@ + lastConsonant -= 1; + } + ++ ++ IndicClassTable::CharClass charClass = CC_RESERVED; ++ IndicClassTable::CharClass nextClass = CC_RESERVED; + le_int32 baseConsonant = lastConsonant; + le_int32 postBase = lastConsonant + 1; + le_int32 postBaseLimit = classTable->scriptFlags & SF_POST_BASE_LIMIT_MASK; + le_bool seenVattu = FALSE; + le_bool seenBelowBaseForm = FALSE; ++ le_bool seenPreBaseForm = FALSE; ++ le_bool hasNukta = FALSE; ++ le_bool hasBelowBaseForm = FALSE; ++ le_bool hasPostBaseForm = FALSE; ++ le_bool hasPreBaseForm = FALSE; + + if (postBase < markStart && classTable->isNukta(chars[postBase])) { ++ charClass = CC_NUKTA; + postBase += 1; + } + + while (baseConsonant > baseLimit) { +- IndicClassTable::CharClass charClass = classTable->getCharClass(chars[baseConsonant]); ++ nextClass = charClass; ++ hasNukta = IndicClassTable::isNukta(nextClass); ++ charClass = classTable->getCharClass(chars[baseConsonant]); ++ ++ hasBelowBaseForm = IndicClassTable::hasBelowBaseForm(charClass) && !hasNukta; ++ hasPostBaseForm = IndicClassTable::hasPostBaseForm(charClass) && !hasNukta; ++ hasPreBaseForm = IndicClassTable::hasPreBaseForm(charClass) && !hasNukta; + + if (IndicClassTable::isConsonant(charClass)) { + if (postBaseLimit == 0 || seenVattu || + (baseConsonant > baseLimit && !classTable->isVirama(chars[baseConsonant - 1])) || +- !IndicClassTable::hasPostOrBelowBaseForm(charClass)) { ++ !(hasBelowBaseForm || hasPostBaseForm || hasPreBaseForm)) { + break; + } + +- seenVattu = IndicClassTable::isVattu(charClass); ++ // Note any pre-base consonants ++ if ( baseConsonant == lastConsonant && lastConsonant > 0 && ++ hasPreBaseForm && classTable->isVirama(chars[baseConsonant - 1])) { ++ output.notePreBaseConsonant(lastConsonant,chars[lastConsonant],chars[lastConsonant-1],tagArray2); ++ seenPreBaseForm = TRUE; + +- if (IndicClassTable::hasPostBaseForm(charClass)) { ++ } ++ // consonants with nuktas are never vattus ++ seenVattu = IndicClassTable::isVattu(charClass) && !hasNukta; ++ ++ // consonants with nuktas never have below- or post-base forms ++ if (hasPostBaseForm) { + if (seenBelowBaseForm) { + break; + } + + postBase = baseConsonant; +- } else if (IndicClassTable::hasBelowBaseForm(charClass)) { ++ } else if (hasBelowBaseForm) { + seenBelowBaseForm = TRUE; + } + +@@ -606,20 +864,25 @@ + } + + // write any pre-base consonants ++ output.writePreBaseConsonant(); ++ + le_bool supressVattu = TRUE; + + for (i = baseLimit; i < baseConsonant; i += 1) { + LEUnicode ch = chars[i]; +- // Don't put 'blwf' on first consonant. +- FeatureMask features = (i == baseLimit? tagArray2 : tagArray1); +- IndicClassTable::CharClass charClass = classTable->getCharClass(ch); ++ // Don't put 'pstf' or 'blwf' on anything before the base consonant. ++ FeatureMask features = tagArray1 & ~( pstfFeatureMask | blwfFeatureMask ); ++ ++ charClass = classTable->getCharClass(ch); ++ nextClass = classTable->getCharClass(chars[i + 1]); ++ hasNukta = IndicClassTable::isNukta(nextClass); + + if (IndicClassTable::isConsonant(charClass)) { +- if (IndicClassTable::isVattu(charClass) && supressVattu) { ++ if (IndicClassTable::isVattu(charClass) && !hasNukta && supressVattu) { + features = tagArray4; + } + +- supressVattu = IndicClassTable::isVattu(charClass); ++ supressVattu = IndicClassTable::isVattu(charClass) && !hasNukta; + } else if (IndicClassTable::isVirama(charClass) && chars[i + 1] == C_SIGN_ZWNJ) + { + features = tagArray4; +@@ -634,7 +897,8 @@ + bcSpan += 1; + } + +- if (baseConsonant == lastConsonant && bcSpan < markStart && classTable->isVirama(chars[bcSpan])) { ++ if (baseConsonant == lastConsonant && bcSpan < markStart && ++ (classTable->isVirama(chars[bcSpan]) || classTable->isAlLakuna(chars[bcSpan]))) { + bcSpan += 1; + + if (bcSpan < markStart && chars[bcSpan] == C_SIGN_ZWNJ) { +@@ -658,7 +922,7 @@ + } + + // write below-base consonants +- if (baseConsonant != lastConsonant) { ++ if (baseConsonant != lastConsonant && !seenPreBaseForm) { + for (i = bcSpan + 1; i < postBase; i += 1) { + output.writeChar(chars[i], i, tagArray1); + } +@@ -688,7 +952,7 @@ + + // write post-base consonants + // FIXME: does this put the right tags on post-base consonants? +- if (baseConsonant != lastConsonant) { ++ if (baseConsonant != lastConsonant && !seenPreBaseForm) { + if (postBase <= lastConsonant) { + for (i = postBase; i <= lastConsonant; i += 1) { + output.writeChar(chars[i], i, tagArray3); +@@ -710,7 +974,7 @@ + } + + output.writeLengthMark(); +- output.writeVirama(); ++ output.writeAlLakuna(); + + // write reph + if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) { +@@ -740,13 +1004,250 @@ + return output.getOutputIndex(); + } + +-void IndicReordering::adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage) ++void IndicReordering::adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage, LEErrorCode& success) + { + if (mpreFixups != NULL) { +- mpreFixups->apply(glyphStorage); ++ mpreFixups->apply(glyphStorage, success); + + delete mpreFixups; + } + } + ++void IndicReordering::applyPresentationForms(LEGlyphStorage &glyphStorage, le_int32 count) ++{ ++ LEErrorCode success = LE_NO_ERROR; ++ ++// This sets us up for 2nd pass of glyph substitution as well as setting the feature masks for the ++// GPOS table lookups ++ ++ for ( le_int32 i = 0 ; i < count ; i++ ) { ++ glyphStorage.setAuxData(i, ( presentationFormsMask | positioningFormsMask ), success); ++ } ++ ++} ++void IndicReordering::finalReordering(LEGlyphStorage &glyphStorage, le_int32 count) ++{ ++ LEErrorCode success = LE_NO_ERROR; ++ ++ // Reposition REPH as appropriate ++ ++ for ( le_int32 i = 0 ; i < count ; i++ ) { ++ ++ le_int32 tmpAuxData = glyphStorage.getAuxData(i,success); ++ LEGlyphID tmpGlyph = glyphStorage.getGlyphID(i,success); ++ ++ if ( ( tmpGlyph != NO_GLYPH ) && (tmpAuxData & rephConsonantMask) && !(tmpAuxData & repositionedGlyphMask)) { ++ ++ le_bool targetPositionFound = false; ++ le_int32 targetPosition = i+1; ++ le_int32 baseConsonantData; ++ ++ while (!targetPositionFound) { ++ tmpGlyph = glyphStorage.getGlyphID(targetPosition,success); ++ tmpAuxData = glyphStorage.getAuxData(targetPosition,success); ++ ++ if ( tmpAuxData & baseConsonantMask ) { ++ baseConsonantData = tmpAuxData; ++ targetPositionFound = true; ++ } else { ++ targetPosition++; ++ } ++ } ++ ++ // Make sure we are not putting the reph into an empty hole ++ ++ le_bool targetPositionHasGlyph = false; ++ while (!targetPositionHasGlyph) { ++ tmpGlyph = glyphStorage.getGlyphID(targetPosition,success); ++ if ( tmpGlyph != NO_GLYPH ) { ++ targetPositionHasGlyph = true; ++ } else { ++ targetPosition--; ++ } ++ } ++ ++ // Make sure that REPH is positioned after any above base or post base matras ++ // ++ le_bool checkMatraDone = false; ++ le_int32 checkMatraPosition = targetPosition+1; ++ while ( !checkMatraDone ) { ++ tmpAuxData = glyphStorage.getAuxData(checkMatraPosition,success); ++ if ( checkMatraPosition >= count || ( (tmpAuxData ^ baseConsonantData) & LE_GLYPH_GROUP_MASK)) { ++ checkMatraDone = true; ++ continue; ++ } ++ if ( (tmpAuxData & matraMask) && ++ (((tmpAuxData & markPositionMask) == aboveBasePosition) || ++ ((tmpAuxData & markPositionMask) == postBasePosition))) { ++ targetPosition = checkMatraPosition; ++ } ++ checkMatraPosition++; ++ } ++ ++ glyphStorage.moveGlyph(i,targetPosition,repositionedGlyphMask); ++ } ++ } ++} ++ ++ ++le_int32 IndicReordering::v2process(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode, ++ LEUnicode *outChars, LEGlyphStorage &glyphStorage) ++{ ++ const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); ++ ++ DynamicProperties dynProps[INDIC_BLOCK_SIZE]; ++ IndicReordering::getDynamicProperties(dynProps,classTable); ++ ++ IndicReorderingOutput output(outChars, glyphStorage, NULL); ++ le_int32 i, firstConsonant, baseConsonant, secondConsonant, inv_count = 0, beginSyllable = 0; ++ //le_bool lastInWord = FALSE; ++ ++ while (beginSyllable < charCount) { ++ le_int32 nextSyllable = findSyllable(classTable, chars, beginSyllable, charCount); ++ ++ output.reset(); ++ ++ // Find the First Consonant ++ for ( firstConsonant = beginSyllable ; firstConsonant < nextSyllable ; firstConsonant++ ) { ++ if ( classTable->isConsonant(chars[firstConsonant]) ) { ++ break; ++ } ++ } ++ ++ // Find the base consonant ++ ++ baseConsonant = nextSyllable - 1; ++ secondConsonant = firstConsonant; ++ ++ // TODO: Use Dynamic Properties for hasBelowBaseForm and hasPostBaseForm() ++ ++ while ( baseConsonant > firstConsonant ) { ++ if ( classTable->isConsonant(chars[baseConsonant]) && ++ !classTable->hasBelowBaseForm(chars[baseConsonant]) && ++ !classTable->hasPostBaseForm(chars[baseConsonant]) ) { ++ break; ++ } ++ else { ++ if ( classTable->isConsonant(chars[baseConsonant]) ) { ++ secondConsonant = baseConsonant; ++ } ++ baseConsonant--; ++ } ++ } ++ ++ // If the syllable starts with Ra + Halant ( in a script that has Reph ) and has more than one ++ // consonant, Ra is excluced from candidates for base consonants ++ ++ if ( classTable->isReph(chars[beginSyllable]) && ++ beginSyllable+1 < nextSyllable && classTable->isVirama(chars[beginSyllable+1]) && ++ secondConsonant != firstConsonant) { ++ baseConsonant = secondConsonant; ++ } ++ ++ // Populate the output ++ for ( i = beginSyllable ; i < nextSyllable ; i++ ) { ++ ++ // Handle invalid combinartions ++ ++ if ( classTable->isVirama(chars[beginSyllable]) || ++ classTable->isMatra(chars[beginSyllable]) || ++ classTable->isVowelModifier(chars[beginSyllable]) || ++ classTable->isNukta(chars[beginSyllable]) ) { ++ output.writeChar(C_DOTTED_CIRCLE,beginSyllable,basicShapingFormsMask); ++ inv_count++; ++ } ++ output.writeChar(chars[i],i, basicShapingFormsMask); ++ ++ } ++ ++ // Adjust features and set syllable structure bits ++ ++ for ( i = beginSyllable ; i < nextSyllable ; i++ ) { ++ ++ FeatureMask outMask = output.getFeatures(i+inv_count); ++ FeatureMask saveMask = outMask; ++ ++ // Since reph can only validly occur at the beginning of a syllable ++ // We only apply it to the first 2 characters in the syllable, to keep it from ++ // conflicting with other features ( i.e. rkrf ) ++ ++ // TODO : Use the dynamic property for determining isREPH ++ if ( i == beginSyllable && i < baseConsonant && classTable->isReph(chars[i]) && ++ i+1 < nextSyllable && classTable->isVirama(chars[i+1])) { ++ outMask |= rphfFeatureMask; ++ outMask |= rephConsonantMask; ++ output.setFeatures(i+1+inv_count,outMask); ++ ++ } ++ ++ if ( i == baseConsonant ) { ++ outMask |= baseConsonantMask; ++ } ++ ++ if ( classTable->isMatra(chars[i])) { ++ outMask |= matraMask; ++ if ( classTable->hasAboveBaseForm(chars[i])) { ++ outMask |= aboveBasePosition; ++ } else if ( classTable->hasBelowBaseForm(chars[i])) { ++ outMask |= belowBasePosition; ++ } ++ } ++ ++ // Don't apply half form to virama that stands alone at the end of a syllable ++ // to prevent half forms from forming when syllable ends with virama ++ ++ if ( classTable->isVirama(chars[i]) && (i+1 == nextSyllable) ) { ++ outMask ^= halfFeatureMask; ++ if ( classTable->isConsonant(chars[i-1]) ) { ++ FeatureMask tmp = output.getFeatures(i-1+inv_count); ++ tmp ^= halfFeatureMask; ++ output.setFeatures(i-1+inv_count,tmp); ++ } ++ } ++ ++ if ( outMask != saveMask ) { ++ output.setFeatures(i+inv_count,outMask); ++ } ++ } ++ ++ output.decomposeReorderMatras(classTable,beginSyllable,nextSyllable,inv_count); ++ ++ beginSyllable = nextSyllable; ++ } ++ ++ ++ return output.getOutputIndex(); ++} ++ ++ ++void IndicReordering::getDynamicProperties( DynamicProperties *, const IndicClassTable *classTable ) { ++ ++ ++ LEUnicode currentChar; ++ LEUnicode virama; ++ LEUnicode workChars[2]; ++ LEGlyphStorage workGlyphs; ++ ++ IndicReorderingOutput workOutput(workChars, workGlyphs, NULL); ++ ++ //le_int32 offset = 0; ++ ++ // First find the relevant virama for the script we are dealing with ++ ++ for ( currentChar = classTable->firstChar ; currentChar <= classTable->lastChar ; currentChar++ ) { ++ if ( classTable->isVirama(currentChar)) { ++ virama = currentChar; ++ break; ++ } ++ } ++ ++ for ( currentChar = classTable->firstChar ; currentChar <= classTable->lastChar ; currentChar++ ) { ++ if ( classTable->isConsonant(currentChar)) { ++ workOutput.reset(); ++ } ++ } ++ ++ ++} ++ + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/IndicReordering.h b/src/share/native/sun/font/layout/IndicReordering.h +--- jdk/src/share/native/sun/font/layout/IndicReordering.h ++++ jdk/src/share/native/sun/font/layout/IndicReordering.h +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved + * + */ + +@@ -62,7 +62,8 @@ + #define CC_SPLIT_VOWEL_PIECE_3 12U + #define CC_VIRAMA 13U + #define CC_ZERO_WIDTH_MARK 14U +-#define CC_COUNT 15U ++#define CC_AL_LAKUNA 15U ++#define CC_COUNT 16U + + // Character class flags + #define CF_CLASS_MASK 0x0000FFFFU +@@ -74,6 +75,7 @@ + #define CF_BELOW_BASE 0x10000000U + #define CF_POST_BASE 0x08000000U + #define CF_LENGTH_MARK 0x04000000U ++#define CF_PRE_BASE 0x02000000U + + #define CF_POS_BEFORE 0x00300000U + #define CF_POS_BELOW 0x00200000U +@@ -89,6 +91,7 @@ + #define SF_REPH_AFTER_BELOW 0x40000000U + #define SF_EYELASH_RA 0x20000000U + #define SF_MPRE_FIXUP 0x10000000U ++#define SF_FILTER_ZERO_WIDTH 0x08000000U + + #define SF_POST_BASE_LIMIT_MASK 0x0000FFFFU + #define SF_NO_POST_BASE_LIMIT 0x00007FFFU +@@ -98,6 +101,15 @@ + class MPreFixups; + class LEGlyphStorage; + ++// Dynamic Properties ( v2 fonts only ) ++typedef le_uint32 DynamicProperties; ++ ++#define DP_REPH 0x80000000U ++#define DP_HALF 0x40000000U ++#define DP_PREF 0x20000000U ++#define DP_BLWF 0x10000000U ++#define DP_PSTF 0x08000000U ++ + struct IndicClassTable + { + typedef le_uint32 CharClass; +@@ -111,6 +123,7 @@ + const SplitMatra *splitMatraTable; + + inline le_int32 getWorstCaseExpansion() const; ++ inline le_bool getFilterZeroWidth() const; + + CharClass getCharClass(LEUnicode ch) const; + +@@ -121,6 +134,7 @@ + inline le_bool isConsonant(LEUnicode ch) const; + inline le_bool isReph(LEUnicode ch) const; + inline le_bool isVirama(LEUnicode ch) const; ++ inline le_bool isAlLakuna(LEUnicode ch) const; + inline le_bool isNukta(LEUnicode ch) const; + inline le_bool isVattu(LEUnicode ch) const; + inline le_bool isMatra(LEUnicode ch) const; +@@ -129,12 +143,15 @@ + inline le_bool hasPostOrBelowBaseForm(LEUnicode ch) const; + inline le_bool hasPostBaseForm(LEUnicode ch) const; + inline le_bool hasBelowBaseForm(LEUnicode ch) const; ++ inline le_bool hasAboveBaseForm(LEUnicode ch) const; ++ inline le_bool hasPreBaseForm(LEUnicode ch) const; + + inline static le_bool isVowelModifier(CharClass charClass); + inline static le_bool isStressMark(CharClass charClass); + inline static le_bool isConsonant(CharClass charClass); + inline static le_bool isReph(CharClass charClass); + inline static le_bool isVirama(CharClass charClass); ++ inline static le_bool isAlLakuna(CharClass charClass); + inline static le_bool isNukta(CharClass charClass); + inline static le_bool isVattu(CharClass charClass); + inline static le_bool isMatra(CharClass charClass); +@@ -143,6 +160,8 @@ + inline static le_bool hasPostOrBelowBaseForm(CharClass charClass); + inline static le_bool hasPostBaseForm(CharClass charClass); + inline static le_bool hasBelowBaseForm(CharClass charClass); ++ inline static le_bool hasAboveBaseForm(CharClass charClass); ++ inline static le_bool hasPreBaseForm(CharClass charClass); + + static const IndicClassTable *getScriptClassTable(le_int32 scriptCode); + }; +@@ -151,14 +170,27 @@ + public: + static le_int32 getWorstCaseExpansion(le_int32 scriptCode); + ++ static le_bool getFilterZeroWidth(le_int32 scriptCode); ++ + static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, + LEUnicode *outChars, LEGlyphStorage &glyphStorage, +- MPreFixups **outMPreFixups); ++ MPreFixups **outMPreFixups, LEErrorCode& success); + +- static void adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage); ++ static void adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage, LEErrorCode& success); ++ ++ static le_int32 v2process(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, ++ LEUnicode *outChars, LEGlyphStorage &glyphStorage); + + static const FeatureMap *getFeatureMap(le_int32 &count); + ++ static const FeatureMap *getv2FeatureMap(le_int32 &count); ++ ++ static void applyPresentationForms(LEGlyphStorage &glyphStorage, le_int32 count); ++ ++ static void finalReordering(LEGlyphStorage &glyphStorage, le_int32 count); ++ ++ static void getDynamicProperties(DynamicProperties *dProps, const IndicClassTable *classTable); ++ + private: + // do not instantiate + IndicReordering(); +@@ -172,6 +204,11 @@ + return worstCaseExpansion; + } + ++inline le_bool IndicClassTable::getFilterZeroWidth() const ++{ ++ return (scriptFlags & SF_FILTER_ZERO_WIDTH) != 0; ++} ++ + inline const SplitMatra *IndicClassTable::getSplitMatra(CharClass charClass) const + { + le_int32 index = (charClass & CF_INDEX_MASK) >> CF_INDEX_SHIFT; +@@ -209,6 +246,11 @@ + return (charClass & CF_CLASS_MASK) == CC_VIRAMA; + } + ++inline le_bool IndicClassTable::isAlLakuna(CharClass charClass) ++{ ++ return (charClass & CF_CLASS_MASK) == CC_AL_LAKUNA; ++} ++ + inline le_bool IndicClassTable::isVattu(CharClass charClass) + { + return (charClass & CF_VATTU) != 0; +@@ -241,11 +283,21 @@ + return (charClass & CF_POST_BASE) != 0; + } + ++inline le_bool IndicClassTable::hasPreBaseForm(CharClass charClass) ++{ ++ return (charClass & CF_PRE_BASE) != 0; ++} ++ + inline le_bool IndicClassTable::hasBelowBaseForm(CharClass charClass) + { + return (charClass & CF_BELOW_BASE) != 0; + } + ++inline le_bool IndicClassTable::hasAboveBaseForm(CharClass charClass) ++{ ++ return ((charClass & CF_POS_MASK) == CF_POS_ABOVE); ++} ++ + inline le_bool IndicClassTable::isVowelModifier(LEUnicode ch) const + { + return isVowelModifier(getCharClass(ch)); +@@ -271,6 +323,11 @@ + return isVirama(getCharClass(ch)); + } + ++inline le_bool IndicClassTable::isAlLakuna(LEUnicode ch) const ++{ ++ return isAlLakuna(getCharClass(ch)); ++} ++ + inline le_bool IndicClassTable::isNukta(LEUnicode ch) const + { + return isNukta(getCharClass(ch)); +@@ -311,5 +368,14 @@ + return hasBelowBaseForm(getCharClass(ch)); + } + ++inline le_bool IndicClassTable::hasPreBaseForm(LEUnicode ch) const ++{ ++ return hasPreBaseForm(getCharClass(ch)); ++} ++ ++inline le_bool IndicClassTable::hasAboveBaseForm(LEUnicode ch) const ++{ ++ return hasAboveBaseForm(getCharClass(ch)); ++} + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/KernTable.cpp b/src/share/native/sun/font/layout/KernTable.cpp +--- jdk/src/share/native/sun/font/layout/KernTable.cpp ++++ jdk/src/share/native/sun/font/layout/KernTable.cpp +@@ -26,7 +26,7 @@ + /* + * + * +- * (C) Copyright IBM Corp. 2004-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 2004-2010 - All Rights Reserved + * + */ + +@@ -35,6 +35,7 @@ + #include "LEGlyphStorage.h" + + #include "LESwaps.h" ++#include "OpenTypeUtilities.h" + + #include <stdio.h> + +@@ -91,8 +92,8 @@ + * TODO: support multiple subtables + * TODO: respect header flags + */ +-KernTable::KernTable(const LEFontInstance* font, const void* tableData) +- : pairs(0), font(font) ++KernTable::KernTable(const LEFontInstance* font_, const void* tableData) ++ : pairs(0), font(font_) + { + const KernTableHeader* header = (const KernTableHeader*)tableData; + if (header == 0) { +@@ -120,10 +121,18 @@ + coverage = SWAPW(subhead->coverage); + if (coverage & COVERAGE_HORIZONTAL) { // only handle horizontal kerning + const Subtable_0* table = (const Subtable_0*)((char*)subhead + KERN_SUBTABLE_HEADER_SIZE); +- nPairs = SWAPW(table->nPairs); +- searchRange = SWAPW(table->searchRange) / KERN_PAIRINFO_SIZE ; ++ ++ nPairs = SWAPW(table->nPairs); ++ ++#if 0 // some old fonts have bad values here... ++ searchRange = SWAPW(table->searchRange); + entrySelector = SWAPW(table->entrySelector); +- rangeShift = SWAPW(table->rangeShift) / KERN_PAIRINFO_SIZE; ++ rangeShift = SWAPW(table->rangeShift); ++#else ++ entrySelector = OpenTypeUtilities::highBit(nPairs); ++ searchRange = (1 << entrySelector) * KERN_PAIRINFO_SIZE; ++ rangeShift = (nPairs * KERN_PAIRINFO_SIZE) - searchRange; ++#endif + + pairs = (PairInfo*)font->getKernPairs(); + if (pairs == NULL) { +diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp b/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp +@@ -25,7 +25,7 @@ + + + /* +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + * This file is a modification of the ICU file IndicLayoutEngine.cpp + * by Jens Herden and Javier Sola for Khmer language +@@ -43,16 +43,16 @@ + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(KhmerOpenTypeLayoutEngine) + + KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) +- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable) ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) + { + fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; + } + + KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags) +- : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags) ++ le_int32 typoFlags, LEErrorCode &success) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) + { + fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; +diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.h b/src/share/native/sun/font/layout/KhmerLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h +@@ -26,7 +26,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + * This file is a modification of the ICU file IndicLayoutEngine.h + * by Jens Herden and Javier Sola for Khmer language +@@ -72,8 +72,9 @@ + * + * @param fontInstance - the font + * @param scriptCode - the script +- * @param languageCode - the language ++ * @param langaugeCode - the language + * @param gsubTable - the GSUB table ++ * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see OpenTypeLayoutEngine +@@ -82,7 +83,7 @@ + * @internal + */ + KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +@@ -91,6 +92,7 @@ + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language ++ * @param success - set to an error code if the operation fails + * + * @see OpenTypeLayoutEngine + * @see ScriptAndLangaugeTags.h for script and language codes +@@ -98,7 +100,7 @@ + * @internal + */ + KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags); ++ le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. +diff --git a/src/share/native/sun/font/layout/KhmerReordering.cpp b/src/share/native/sun/font/layout/KhmerReordering.cpp +--- jdk/src/share/native/sun/font/layout/KhmerReordering.cpp ++++ jdk/src/share/native/sun/font/layout/KhmerReordering.cpp +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved + * + * This file is a modification of the ICU file IndicReordering.cpp + * by Jens Herden and Javier Sola for Khmer language +@@ -149,8 +149,9 @@ + + + +-class ReorderingOutput : public UMemory { ++class KhmerReorderingOutput : public UMemory { + private: ++ le_int32 fSyllableCount; + le_int32 fOutIndex; + LEUnicode *fOutChars; + +@@ -158,17 +159,22 @@ + + + public: +- ReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage) +- : fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage) ++ KhmerReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage) ++ : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage) + { + // nothing else to do... + } + +- ~ReorderingOutput() ++ ~KhmerReorderingOutput() + { + // nothing to do here... + } + ++ void reset() ++ { ++ fSyllableCount += 1; ++ } ++ + void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures) + { + LEErrorCode success = LE_NO_ERROR; +@@ -176,7 +182,7 @@ + fOutChars[fOutIndex] = ch; + + fGlyphStorage.setCharIndex(fOutIndex, charIndex, success); +- fGlyphStorage.setAuxData(fOutIndex, charFeatures, success); ++ fGlyphStorage.setAuxData(fOutIndex, charFeatures | (fSyllableCount & LE_GLYPH_GROUP_MASK), success); + + fOutIndex += 1; + } +@@ -328,12 +334,12 @@ + {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, // 9 - First consonant or type 3 after ceong + {-1, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1}, // 10 - Second Coeng (no register shifter before) + {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 11 - Second coeng consonant (or ind. vowel) no register shifter before +- {-1, -1, 1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, // 12 - Second ZWNJ before a register shifter ++ {-1, -1, -1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, // 12 - Second ZWNJ before a register shifter + {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 13 - Second register shifter + {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, // 14 - ZWJ before vowel + {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, // 15 - ZWNJ before vowel + {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 1, 18}, // 16 - dependent vowel +- {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 18}, // 17 - sign above ++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 18}, // 17 - sign above + {-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1}, // 18 - ZWJ after vowel + {-1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1}, // 19 - Third coeng + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, // 20 - dependent vowel after a Robat +@@ -380,7 +386,7 @@ + { + const KhmerClassTable *classTable = KhmerClassTable::getKhmerClassTable(); + +- ReorderingOutput output(outChars, glyphStorage); ++ KhmerReorderingOutput output(outChars, glyphStorage); + KhmerClassTable::CharClass charClass; + le_int32 i, prev = 0, coengRo; + +@@ -390,6 +396,8 @@ + while (prev < charCount) { + le_int32 syllable = findSyllable(classTable, chars, prev, charCount); + ++ output.reset(); ++ + // write a pre vowel or the pre part of a split vowel first + // and look out for coeng + ro. RO is the only vowel of type 2, and + // therefore the only one that requires saving space before the base. +diff --git a/src/share/native/sun/font/layout/LEFontInstance.cpp b/src/share/native/sun/font/layout/LEFontInstance.cpp +--- jdk/src/share/native/sun/font/layout/LEFontInstance.cpp ++++ jdk/src/share/native/sun/font/layout/LEFontInstance.cpp +@@ -26,7 +26,7 @@ + /* + ******************************************************************************* + * +- * Copyright (C) 1999-2005, International Business Machines ++ * Copyright (C) 1999-2007, International Business Machines + * Corporation and others. All Rights Reserved. + * + ******************************************************************************* +@@ -45,6 +45,16 @@ + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEFontInstance) + ++LECharMapper::~LECharMapper() ++{ ++ // nothing to do. ++} ++ ++LEFontInstance::~LEFontInstance() ++{ ++ // nothing to do ++} ++ + const LEFontInstance *LEFontInstance::getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, + le_int32 script, LEErrorCode &success) const + { +@@ -62,7 +72,7 @@ + } + + void LEFontInstance::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, +- le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const ++ le_bool reverse, const LECharMapper *mapper, le_bool filterZeroWidth, LEGlyphStorage &glyphStorage) const + { + le_int32 i, out = 0, dir = 1; + +@@ -83,7 +93,7 @@ + } + } + +- glyphStorage[out] = mapCharToGlyph(code, mapper); ++ glyphStorage[out] = mapCharToGlyph(code, mapper, filterZeroWidth); + + if (code >= 0x10000) { + i += 1; +@@ -94,14 +104,71 @@ + + LEGlyphID LEFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const + { ++ return mapCharToGlyph(ch, mapper, TRUE); ++} ++ ++LEGlyphID LEFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const ++{ + LEUnicode32 mappedChar = mapper->mapChar(ch); + +- if (mappedChar == 0xFFFE || mappedChar == 0xFFFF || +- mappedChar == 0x200C || mappedChar == 0x200D) { ++ if (mappedChar == 0xFFFE || mappedChar == 0xFFFF) { + return 0xFFFF; + } + ++ if (filterZeroWidth && (mappedChar == 0x200C || mappedChar == 0x200D)) { ++ return canDisplay(mappedChar)? 0x0001 : 0xFFFF; ++ } ++ + return mapCharToGlyph(mappedChar); + } ++ ++le_bool LEFontInstance::canDisplay(LEUnicode32 ch) const ++{ ++ return LE_GET_GLYPH(mapCharToGlyph(ch)) != 0; ++} ++ ++float LEFontInstance::xUnitsToPoints(float xUnits) const ++{ ++ return (xUnits * getXPixelsPerEm()) / (float) getUnitsPerEM(); ++} ++ ++float LEFontInstance::yUnitsToPoints(float yUnits) const ++{ ++ return (yUnits * getYPixelsPerEm()) / (float) getUnitsPerEM(); ++} ++ ++void LEFontInstance::unitsToPoints(LEPoint &units, LEPoint &points) const ++{ ++ points.fX = xUnitsToPoints(units.fX); ++ points.fY = yUnitsToPoints(units.fY); ++} ++ ++float LEFontInstance::xPixelsToUnits(float xPixels) const ++{ ++ return (xPixels * getUnitsPerEM()) / (float) getXPixelsPerEm(); ++} ++ ++float LEFontInstance::yPixelsToUnits(float yPixels) const ++{ ++ return (yPixels * getUnitsPerEM()) / (float) getYPixelsPerEm(); ++} ++ ++void LEFontInstance::pixelsToUnits(LEPoint &pixels, LEPoint &units) const ++{ ++ units.fX = xPixelsToUnits(pixels.fX); ++ units.fY = yPixelsToUnits(pixels.fY); ++} ++ ++void LEFontInstance::transformFunits(float xFunits, float yFunits, LEPoint &pixels) const ++{ ++ pixels.fX = xUnitsToPoints(xFunits) * getScaleFactorX(); ++ pixels.fY = yUnitsToPoints(yFunits) * getScaleFactorY(); ++} ++ ++le_int32 LEFontInstance::getLineHeight() const ++{ ++ return getAscent() + getDescent() + getLeading(); ++} ++ + U_NAMESPACE_END + +diff --git a/src/share/native/sun/font/layout/LEFontInstance.h b/src/share/native/sun/font/layout/LEFontInstance.h +--- jdk/src/share/native/sun/font/layout/LEFontInstance.h ++++ jdk/src/share/native/sun/font/layout/LEFontInstance.h +@@ -26,7 +26,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved + * + */ + +@@ -57,7 +57,7 @@ + * Destructor. + * @stable ICU 3.2 + */ +- virtual inline ~LECharMapper() {}; ++ virtual ~LECharMapper(); + + /** + * This method does the adjustments. +@@ -75,7 +75,7 @@ + * This is a forward reference to the class which holds the per-glyph + * storage. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + class LEGlyphStorage; + +@@ -101,7 +101,7 @@ + * methods with some default behavior such as returning constant values, or using the + * values from the first subfont. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + class U_LAYOUT_API LEFontInstance : public UObject + { +@@ -113,7 +113,7 @@ + * + * @stable ICU 2.8 + */ +- virtual inline ~LEFontInstance() {}; ++ virtual ~LEFontInstance(); + + /** + * Get a physical font which can render the given text. For composite fonts, +@@ -209,7 +209,7 @@ + * + * @stable ICU 3.2 + */ +- virtual inline le_bool canDisplay(LEUnicode32 ch) const; ++ virtual le_bool canDisplay(LEUnicode32 ch) const; + + /** + * This method returns the number of design units in +@@ -237,13 +237,31 @@ + * @param count - the number of characters + * @param reverse - if <code>TRUE</code>, store the glyph indices in reverse order. + * @param mapper - the character mapper. ++ * @param filterZeroWidth - <code>TRUE</code> if ZWJ / ZWNJ characters should map to a glyph w/ no contours. + * @param glyphStorage - the object which contains the output glyph array + * + * @see LECharMapper + * +- * @draft ICU 3.0 ++ * @stable ICU 3.6 + */ +- virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, LEGlyphStorage &glyphStorage) const; ++ virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, le_bool filterZeroWidth, LEGlyphStorage &glyphStorage) const; ++ ++ /** ++ * This method maps a single character to a glyph index, using the ++ * font's character to glyph map. The default implementation of this ++ * method calls the mapper, and then calls <code>mapCharToGlyph(mappedCh)</code>. ++ * ++ * @param ch - the character ++ * @param mapper - the character mapper ++ * @param filterZeroWidth - <code>TRUE</code> if ZWJ / ZWNJ characters should map to a glyph w/ no contours. ++ * ++ * @return the glyph index ++ * ++ * @see LECharMapper ++ * ++ * @stable ICU 3.6 ++ */ ++ virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const; + + /** + * This method maps a single character to a glyph index, using the +@@ -335,7 +353,7 @@ + * + * @stable ICU 3.2 + */ +- virtual inline float xUnitsToPoints(float xUnits) const; ++ virtual float xUnitsToPoints(float xUnits) const; + + /** + * This method converts font design units in the +@@ -347,7 +365,7 @@ + * + * @stable ICU 3.2 + */ +- virtual inline float yUnitsToPoints(float yUnits) const; ++ virtual float yUnitsToPoints(float yUnits) const; + + /** + * This method converts font design units to points. +@@ -357,7 +375,7 @@ + * + * @stable ICU 3.2 + */ +- virtual inline void unitsToPoints(LEPoint &units, LEPoint &points) const; ++ virtual void unitsToPoints(LEPoint &units, LEPoint &points) const; + + /** + * This method converts pixels in the +@@ -369,7 +387,7 @@ + * + * @stable ICU 3.2 + */ +- virtual inline float xPixelsToUnits(float xPixels) const; ++ virtual float xPixelsToUnits(float xPixels) const; + + /** + * This method converts pixels in the +@@ -381,7 +399,7 @@ + * + * @stable ICU 3.2 + */ +- virtual inline float yPixelsToUnits(float yPixels) const; ++ virtual float yPixelsToUnits(float yPixels) const; + + /** + * This method converts pixels to font design units. +@@ -391,7 +409,7 @@ + * + * @stable ICU 3.2 + */ +- virtual inline void pixelsToUnits(LEPoint &pixels, LEPoint &units) const; ++ virtual void pixelsToUnits(LEPoint &pixels, LEPoint &units) const; + + /** + * Get the X scale factor from the font's transform. The default +@@ -433,7 +451,7 @@ + * + * @stable ICU 3.2 + */ +- virtual inline void transformFunits(float xFunits, float yFunits, LEPoint &pixels) const; ++ virtual void transformFunits(float xFunits, float yFunits, LEPoint &pixels) const; + + /** + * This is a convenience method used to convert +@@ -523,49 +541,6 @@ + + }; + +-inline le_bool LEFontInstance::canDisplay(LEUnicode32 ch) const +-{ +- return LE_GET_GLYPH(mapCharToGlyph(ch)) != 0; +-} +- +-inline float LEFontInstance::xUnitsToPoints(float xUnits) const +-{ +- return (xUnits * getXPixelsPerEm()) / (float) getUnitsPerEM(); +-} +- +-inline float LEFontInstance::yUnitsToPoints(float yUnits) const +-{ +- return (yUnits * getYPixelsPerEm()) / (float) getUnitsPerEM(); +-} +- +-inline void LEFontInstance::unitsToPoints(LEPoint &units, LEPoint &points) const +-{ +- points.fX = xUnitsToPoints(units.fX); +- points.fY = yUnitsToPoints(units.fY); +-} +- +-inline float LEFontInstance::xPixelsToUnits(float xPixels) const +-{ +- return (xPixels * getUnitsPerEM()) / (float) getXPixelsPerEm(); +-} +- +-inline float LEFontInstance::yPixelsToUnits(float yPixels) const +-{ +- return (yPixels * getUnitsPerEM()) / (float) getYPixelsPerEm(); +-} +- +-inline void LEFontInstance::pixelsToUnits(LEPoint &pixels, LEPoint &units) const +-{ +- units.fX = xPixelsToUnits(pixels.fX); +- units.fY = yPixelsToUnits(pixels.fY); +-} +- +-inline void LEFontInstance::transformFunits(float xFunits, float yFunits, LEPoint &pixels) const +-{ +- pixels.fX = xUnitsToPoints(xFunits) * getScaleFactorX(); +- pixels.fY = yUnitsToPoints(yFunits) * getScaleFactorY(); +-} +- + inline float LEFontInstance::fixedToFloat(le_int32 fixed) + { + return (float) (fixed / 65536.0); +@@ -576,11 +551,6 @@ + return (le_int32) (theFloat * 65536.0); + } + +-inline le_int32 LEFontInstance::getLineHeight() const +-{ +- return getAscent() + getDescent() + getLeading(); +-} +- + U_NAMESPACE_END + #endif + +diff --git a/src/share/native/sun/font/layout/LEGlyphStorage.cpp b/src/share/native/sun/font/layout/LEGlyphStorage.cpp +--- jdk/src/share/native/sun/font/layout/LEGlyphStorage.cpp ++++ jdk/src/share/native/sun/font/layout/LEGlyphStorage.cpp +@@ -25,7 +25,7 @@ + + /* + ********************************************************************** +- * Copyright (C) 1998-2005, International Business Machines ++ * Copyright (C) 1998-2009, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ +@@ -38,6 +38,11 @@ + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEGlyphStorage) + ++LEInsertionCallback::~LEInsertionCallback() ++{ ++ // nothing to do... ++} ++ + LEGlyphStorage::LEGlyphStorage() + : fGlyphCount(0), fGlyphs(NULL), fCharIndices(NULL), fPositions(NULL), + fAuxData(NULL), fInsertionList(NULL), fSrcIndex(0), fDestIndex(0) +@@ -129,8 +134,18 @@ + if (fInsertionList == NULL) { + // FIXME: check this for failure? + fInsertionList = new LEInsertionList(rightToLeft); ++ if (fInsertionList == NULL) { ++ LE_DELETE_ARRAY(fCharIndices); ++ fCharIndices = NULL; ++ ++ LE_DELETE_ARRAY(fGlyphs); ++ fGlyphs = NULL; ++ ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return; + } + } ++} + + // FIXME: do we want to initialize the positions to [0, 0]? + le_int32 LEGlyphStorage::allocatePositions(LEErrorCode &success) +@@ -139,6 +154,11 @@ + return -1; + } + ++ if (fPositions != NULL) { ++ success = LE_INTERNAL_ERROR; ++ return -1; ++ } ++ + fPositions = LE_NEW_ARRAY(float, 2 * (fGlyphCount + 1)); + + if (fPositions == NULL) { +@@ -156,6 +176,11 @@ + return -1; + } + ++ if (fAuxData != NULL) { ++ success = LE_INTERNAL_ERROR; ++ return -1; ++ } ++ + fAuxData = LE_NEW_ARRAY(le_uint32, fGlyphCount); + + if (fAuxData == NULL) { +@@ -510,10 +535,49 @@ + fGlyphCount = newGlyphCount; + } + +-// FIXME: add error checking? ++// Move a glyph to a different position in the LEGlyphStorage ( used for Indic v2 processing ) ++ ++void LEGlyphStorage::moveGlyph(le_int32 fromPosition, le_int32 toPosition, le_uint32 marker ) ++{ ++ ++ LEErrorCode success = LE_NO_ERROR; ++ ++ LEGlyphID holdGlyph = getGlyphID(fromPosition,success); ++ le_int32 holdCharIndex = getCharIndex(fromPosition,success); ++ le_uint32 holdAuxData = getAuxData(fromPosition,success); ++ ++ if ( fromPosition < toPosition ) { ++ for ( le_int32 i = fromPosition ; i < toPosition ; i++ ) { ++ setGlyphID(i,getGlyphID(i+1,success),success); ++ setCharIndex(i,getCharIndex(i+1,success),success); ++ setAuxData(i,getAuxData(i+1,success),success); ++ } ++ } else { ++ for ( le_int32 i = toPosition ; i > fromPosition ; i-- ) { ++ setGlyphID(i,getGlyphID(i-1,success),success); ++ setCharIndex(i,getCharIndex(i-1,success),success); ++ setAuxData(i,getAuxData(i-1,success),success); ++ ++ } ++ } ++ ++ setGlyphID(toPosition,holdGlyph,success); ++ setCharIndex(toPosition,holdCharIndex,success); ++ setAuxData(toPosition,holdAuxData | marker,success); ++ ++} ++ ++// Glue code for existing stable API + LEGlyphID *LEGlyphStorage::insertGlyphs(le_int32 atIndex, le_int32 insertCount) + { +- return fInsertionList->insert(atIndex, insertCount); ++ LEErrorCode ignored = LE_NO_LAYOUT_ERROR; ++ return insertGlyphs(atIndex, insertCount, ignored); ++} ++ ++// FIXME: add error checking? ++LEGlyphID *LEGlyphStorage::insertGlyphs(le_int32 atIndex, le_int32 insertCount, LEErrorCode& success) ++{ ++ return fInsertionList->insert(atIndex, insertCount, success); + } + + le_int32 LEGlyphStorage::applyInsertions() +@@ -526,11 +590,27 @@ + + le_int32 newGlyphCount = fGlyphCount + growAmount; + +- fGlyphs = (LEGlyphID *) LE_GROW_ARRAY(fGlyphs, newGlyphCount); +- fCharIndices = (le_int32 *) LE_GROW_ARRAY(fCharIndices, newGlyphCount); ++ LEGlyphID *newGlyphs = (LEGlyphID *) LE_GROW_ARRAY(fGlyphs, newGlyphCount); ++ if (newGlyphs == NULL) { ++ // Could not grow the glyph array ++ return fGlyphCount; ++ } ++ fGlyphs = newGlyphs; ++ ++ le_int32 *newCharIndices = (le_int32 *) LE_GROW_ARRAY(fCharIndices, newGlyphCount); ++ if (newCharIndices == NULL) { ++ // Could not grow the glyph array ++ return fGlyphCount; ++ } ++ fCharIndices = newCharIndices; + + if (fAuxData != NULL) { +- fAuxData = (le_uint32 *) LE_GROW_ARRAY(fAuxData, newGlyphCount); ++ le_uint32 *newAuxData = (le_uint32 *) LE_GROW_ARRAY(fAuxData, newGlyphCount); ++ if (newAuxData == NULL) { ++ // could not grow the aux data array ++ return fGlyphCount; ++ } ++ fAuxData = (le_uint32 *)newAuxData; + } + + fSrcIndex = fGlyphCount - 1; +diff --git a/src/share/native/sun/font/layout/LEGlyphStorage.h b/src/share/native/sun/font/layout/LEGlyphStorage.h +--- jdk/src/share/native/sun/font/layout/LEGlyphStorage.h ++++ jdk/src/share/native/sun/font/layout/LEGlyphStorage.h +@@ -25,7 +25,7 @@ + + /* + ********************************************************************** +- * Copyright (C) 1998-2005, International Business Machines ++ * Copyright (C) 1998-2010, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ +@@ -54,7 +54,7 @@ + * + * @see LEInsertionList.h + * +- * @draft ICU 3.6 ++ * @stable ICU 3.6 + */ + class U_LAYOUT_API LEGlyphStorage : public UObject, protected LEInsertionCallback + { +@@ -130,7 +130,7 @@ + * + * @see LEInsertionList.h + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]); + +@@ -141,14 +141,14 @@ + * <code>allocateGlyphArray, allocatePositions and allocateAuxData</code> + * to allocate the data. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + LEGlyphStorage(); + + /** + * The destructor. This will deallocate all of the arrays. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + ~LEGlyphStorage(); + +@@ -157,7 +157,7 @@ + * + * @return the number of glyphs in the glyph array + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + inline le_int32 getGlyphCount() const; + +@@ -169,7 +169,7 @@ + * @param glyphs - the destiniation glyph array + * @param success - set to an error code if the operation fails + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const; + +@@ -183,7 +183,7 @@ + * @param extraBits - this value will be ORed with each glyph index + * @param success - set to an error code if the operation fails + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const; + +@@ -195,7 +195,7 @@ + * @param charIndices - the destiniation character index array + * @param success - set to an error code if the operation fails + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const; + +@@ -208,7 +208,7 @@ + * @param indexBase - an offset which will be added to each index + * @param success - set to an error code if the operation fails + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const; + +@@ -221,7 +221,7 @@ + * @param positions - the destiniation position array + * @param success - set to an error code if the operation fails + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void getGlyphPositions(float positions[], LEErrorCode &success) const; + +@@ -237,7 +237,7 @@ + * @param y - the glyph's Y position + * @param success - set to an error code if the operation fails + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const; + +@@ -251,7 +251,7 @@ + * @param success set to an error code if the storage cannot be allocated of if the initial + * glyph count is not positive. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, LEErrorCode &success); + +@@ -263,7 +263,7 @@ + * + * @return the number of X, Y position pairs allocated. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + le_int32 allocatePositions(LEErrorCode &success); + +@@ -274,7 +274,7 @@ + * + * @return the size of the auxillary data array. + * +- * @draft ICU 3.6 ++ * @stable ICU 3.6 + */ + le_int32 allocateAuxData(LEErrorCode &success); + +@@ -284,7 +284,7 @@ + * @param auxData the auxillary data array will be copied to this address + * @param success set to an error code if the data cannot be copied + * +- * @draft ICU 3.6 ++ * @stable ICU 3.6 + */ + void getAuxData(le_uint32 auxData[], LEErrorCode &success) const; + +@@ -296,7 +296,7 @@ + * + * @return the glyph ID + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + LEGlyphID getGlyphID(le_int32 glyphIndex, LEErrorCode &success) const; + +@@ -308,7 +308,7 @@ + * + * @return the character index + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + le_int32 getCharIndex(le_int32 glyphIndex, LEErrorCode &success) const; + +@@ -321,7 +321,7 @@ + * + * @return the auxillary data + * +- * @draft ICU 3.6 ++ * @stable ICU 3.6 + */ + le_uint32 getAuxData(le_int32 glyphIndex, LEErrorCode &success) const; + +@@ -333,7 +333,7 @@ + * + * @return a reference to the given location in the glyph array + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + inline LEGlyphID &operator[](le_int32 glyphIndex) const; + +@@ -346,16 +346,52 @@ + * + * @param atIndex the index of the glyph to be replaced + * @param insertCount the number of glyphs to replace it with ++ * @param success set to an error code if the auxillary data cannot be retrieved. + * + * @return the address at which to store the replacement glyphs. + * +- * @see LEInsetionList.h ++ * @see LEInsertionList.h + * +- * @draft ICU 3.0 ++ * @stable ICU 4.2 ++ */ ++ LEGlyphID *insertGlyphs(le_int32 atIndex, le_int32 insertCount, LEErrorCode& success); ++ ++ /** ++ * Call this method to replace a single glyph in the glyph array ++ * with multiple glyphs. This method uses the <code>LEInsertionList</code> ++ * to do the insertion. It returns the address of storage where the new ++ * glyph IDs can be stored. They will not actually be inserted into the ++ * glyph array until <code>applyInsertions</code> is called. ++ * ++ * Note: Don't use this version, use the other version of this function which has an error code. ++ * ++ * @param atIndex the index of the glyph to be replaced ++ * @param insertCount the number of glyphs to replace it with ++ * ++ * @return the address at which to store the replacement glyphs. ++ * ++ * @see LEInsertionList.h ++ * ++ * @stable ICU 3.0 + */ + LEGlyphID *insertGlyphs(le_int32 atIndex, le_int32 insertCount); + + /** ++ * This method is used to reposition glyphs during Indic v2 processing. It moves ++ * all of the relevant glyph information ( glyph, indices, positions, and auxData ), ++ * from the source position to the target position, and also allows for a marker bit ++ * to be set in the target glyph's auxData so that it won't be reprocessed later in the ++ * cycle. ++ * ++ * @param fromPosition - position of the glyph to be moved ++ * @param toPosition - target position of the glyph ++ * @param marker marker bit ++ * ++ * @stable ICU 4.2 ++ */ ++ void moveGlyph(le_int32 fromPosition, le_int32 toPosition, le_uint32 marker); ++ ++ /** + * This method causes all of the glyph insertions recorded by + * <code>insertGlyphs</code> to be applied to the glyph array. The + * new slots in the char indices and the auxillary data arrays +@@ -365,7 +401,7 @@ + * + * @see LEInsertionList.h + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + le_int32 applyInsertions(); + +@@ -376,7 +412,7 @@ + * @param glyphID the new glyph ID + * @param success will be set to an error code if the glyph ID cannot be set. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, LEErrorCode &success); + +@@ -387,7 +423,7 @@ + * @param charIndex the new char index + * @param success will be set to an error code if the char index cannot be set. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void setCharIndex(le_int32 glyphIndex, le_int32 charIndex, LEErrorCode &success); + +@@ -399,7 +435,7 @@ + * @param y the new Y position + * @param success will be set to an error code if the position cannot be set. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void setPosition(le_int32 glyphIndex, float x, float y, LEErrorCode &success); + +@@ -411,7 +447,7 @@ + * @param yAdjust the adjustment to the glyph's Y position + * @param success will be set to an error code if the glyph's position cannot be adjusted. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success); + +@@ -422,7 +458,7 @@ + * @param auxData the new auxillary data + * @param success will be set to an error code if the auxillary data cannot be set. + * +- * @draft ICU 3.6 ++ * @stable ICU 3.6 + */ + void setAuxData(le_int32 glyphIndex, le_uint32 auxData, LEErrorCode &success); + +@@ -434,7 +470,7 @@ + * @param from the <code>LEGlyphStorage</code> object from which + * to get the new glyph array. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void adoptGlyphArray(LEGlyphStorage &from); + +@@ -446,7 +482,7 @@ + * @param from the <code>LEGlyphStorage</code> object from which + * to get the new char indices array. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void adoptCharIndicesArray(LEGlyphStorage &from); + +@@ -458,7 +494,7 @@ + * @param from the <code>LEGlyphStorage</code> object from which + * to get the new position array. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void adoptPositionArray(LEGlyphStorage &from); + +@@ -470,7 +506,7 @@ + * @param from the <code>LEGlyphStorage</code> object from which + * to get the new auxillary data array. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void adoptAuxDataArray(LEGlyphStorage &from); + +@@ -481,7 +517,7 @@ + * @param from the <code>LEGlyphStorage</code> object from which + * to get the new glyph count. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void adoptGlyphCount(LEGlyphStorage &from); + +@@ -490,7 +526,7 @@ + * + * @param newGlyphCount the new glyph count. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void adoptGlyphCount(le_int32 newGlyphCount); + +@@ -500,21 +536,21 @@ + * to layout a different characer array. (This method is also called + * by the destructor) + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + void reset(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * +- * @draft ICU 3.0 ++ * @stable ICU 3.0 + */ + static UClassID getStaticClassID(); + }; +diff --git a/src/share/native/sun/font/layout/LEInsertionList.cpp b/src/share/native/sun/font/layout/LEInsertionList.cpp +--- jdk/src/share/native/sun/font/layout/LEInsertionList.cpp ++++ jdk/src/share/native/sun/font/layout/LEInsertionList.cpp +@@ -25,7 +25,7 @@ + + /* + ********************************************************************** +- * Copyright (C) 1998-2004, International Business Machines ++ * Copyright (C) 1998-2008, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ +@@ -76,9 +76,17 @@ + return growAmount; + } + +-LEGlyphID *LEInsertionList::insert(le_int32 position, le_int32 count) ++LEGlyphID *LEInsertionList::insert(le_int32 position, le_int32 count, LEErrorCode &success) + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + InsertionRecord *insertion = (InsertionRecord *) LE_NEW_ARRAY(char, sizeof(InsertionRecord) + (count - ANY_NUMBER) * sizeof (LEGlyphID)); ++ if (insertion == NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return 0; ++ } + + insertion->position = position; + insertion->count = count; +diff --git a/src/share/native/sun/font/layout/LEInsertionList.h b/src/share/native/sun/font/layout/LEInsertionList.h +--- jdk/src/share/native/sun/font/layout/LEInsertionList.h ++++ jdk/src/share/native/sun/font/layout/LEInsertionList.h +@@ -25,7 +25,7 @@ + + /* + ********************************************************************** +- * Copyright (C) 1998-2004, International Business Machines ++ * Copyright (C) 1998-2008, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ +@@ -45,7 +45,7 @@ + * + * @internal + */ +-class LEInsertionCallback ++class U_LAYOUT_API LEInsertionCallback + { + public: + /** +@@ -62,6 +62,11 @@ + * @internal + */ + virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]) = 0; ++ ++ /** ++ * The destructor ++ */ ++ virtual ~LEInsertionCallback(); + }; + + /** +@@ -103,13 +108,14 @@ + * @param position the glyph at this position in the array will be + * replaced by the new glyphs. + * @param count the number of new glyphs ++ * @param success set to an error code if the auxillary data cannot be retrieved. + * + * @return the address of an array in which to store the new glyphs. This will + * <em>not</em> be in the glyph array. + * + * @internal + */ +- LEGlyphID *insert(le_int32 position, le_int32 count); ++ LEGlyphID *insert(le_int32 position, le_int32 count, LEErrorCode &success); + + /** + * Return the number of new glyphs that have been inserted. +diff --git a/src/share/native/sun/font/layout/LELanguages.h b/src/share/native/sun/font/layout/LELanguages.h +--- jdk/src/share/native/sun/font/layout/LELanguages.h ++++ jdk/src/share/native/sun/font/layout/LELanguages.h +@@ -25,12 +25,12 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved. ++ * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. + * +- * Generated on: 07/19/2005 01:01:08 PM PDT ++ * Generated on: 10/26/2010 02:53:33 PM PDT + */ + + #ifndef __LELANGUAGES_H +@@ -50,7 +50,7 @@ + * this is just a list of languages which the LayoutEngine + * supports. + * +- * @draft ICU 3.4 ++ * @stable ICU 2.6 + */ + + enum LanguageCodes { +@@ -85,7 +85,51 @@ + zhsLanguageCode = 28, + zhtLanguageCode = 29, + +- languageCodeCount = 30 ++ /** New language codes added 03/13/2008 @stable ICU 4.0 */ ++ afkLanguageCode = 30, ++ belLanguageCode = 31, ++ bgrLanguageCode = 32, ++ catLanguageCode = 33, ++ cheLanguageCode = 34, ++ copLanguageCode = 35, ++ csyLanguageCode = 36, ++ danLanguageCode = 37, ++ deuLanguageCode = 38, ++ dznLanguageCode = 39, ++ ellLanguageCode = 40, ++ engLanguageCode = 41, ++ espLanguageCode = 42, ++ etiLanguageCode = 43, ++ euqLanguageCode = 44, ++ finLanguageCode = 45, ++ fraLanguageCode = 46, ++ gaeLanguageCode = 47, ++ hauLanguageCode = 48, ++ hrvLanguageCode = 49, ++ hunLanguageCode = 50, ++ hyeLanguageCode = 51, ++ indLanguageCode = 52, ++ itaLanguageCode = 53, ++ khmLanguageCode = 54, ++ mngLanguageCode = 55, ++ mtsLanguageCode = 56, ++ nepLanguageCode = 57, ++ nldLanguageCode = 58, ++ pasLanguageCode = 59, ++ plkLanguageCode = 60, ++ ptgLanguageCode = 61, ++ romLanguageCode = 62, ++ rusLanguageCode = 63, ++ skyLanguageCode = 64, ++ slvLanguageCode = 65, ++ sqiLanguageCode = 66, ++ srbLanguageCode = 67, ++ sveLanguageCode = 68, ++ tibLanguageCode = 69, ++ trkLanguageCode = 70, ++ welLanguageCode = 71, ++ ++ languageCodeCount = 72 + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/LEScripts.h b/src/share/native/sun/font/layout/LEScripts.h +--- jdk/src/share/native/sun/font/layout/LEScripts.h ++++ jdk/src/share/native/sun/font/layout/LEScripts.h +@@ -25,40 +25,43 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved. ++ * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. ++ * ++ * Generated on: 10/26/2010 02:53:33 PM PDT + */ + + #ifndef __LESCRIPTS_H + #define __LESCRIPTS_H + + #include "LETypes.h" ++ + /** + * \file + * \brief C++ API: Constants for Unicode script values + */ + +- + U_NAMESPACE_BEGIN + + /** + * Constants for Unicode script values, generated using + * ICU4J's <code>UScript</code> class. + * +- * @draft ICU 3.0 ++ * @stable ICU 2.2 + */ + + enum ScriptCodes { + zyyyScriptCode = 0, +- qaaiScriptCode = 1, ++ zinhScriptCode = 1, ++ qaaiScriptCode = zinhScriptCode, /* manually added alias, for API stability */ + arabScriptCode = 2, + armnScriptCode = 3, + bengScriptCode = 4, + bopoScriptCode = 5, + cherScriptCode = 6, +- qaacScriptCode = 7, ++ coptScriptCode = 7, + cyrlScriptCode = 8, + dsrtScriptCode = 9, + devaScriptCode = 10, +@@ -91,12 +94,24 @@ + thaaScriptCode = 37, + thaiScriptCode = 38, + tibtScriptCode = 39, ++/** ++ * @stable ICU 2.6 ++ */ ++ + cansScriptCode = 40, ++/** ++ * @stable ICU 2.2 ++ */ ++ + yiiiScriptCode = 41, + tglgScriptCode = 42, + hanoScriptCode = 43, + buhdScriptCode = 44, + tagbScriptCode = 45, ++/** ++ * @stable ICU 2.6 ++ */ ++ + braiScriptCode = 46, + cprtScriptCode = 47, + limbScriptCode = 48, +@@ -105,9 +120,129 @@ + shawScriptCode = 51, + taleScriptCode = 52, + ugarScriptCode = 53, ++/** ++ * @stable ICU 3.0 ++ */ ++ + hrktScriptCode = 54, ++/** ++ * @stable ICU 3.4 ++ */ + +- scriptCodeCount = 55 ++ bugiScriptCode = 55, ++ glagScriptCode = 56, ++ kharScriptCode = 57, ++ syloScriptCode = 58, ++ taluScriptCode = 59, ++ tfngScriptCode = 60, ++ xpeoScriptCode = 61, ++/** ++ * @stable ICU 3.6 ++ */ ++ ++ baliScriptCode = 62, ++ batkScriptCode = 63, ++ blisScriptCode = 64, ++ brahScriptCode = 65, ++ chamScriptCode = 66, ++ cirtScriptCode = 67, ++ cyrsScriptCode = 68, ++ egydScriptCode = 69, ++ egyhScriptCode = 70, ++ egypScriptCode = 71, ++ geokScriptCode = 72, ++ hansScriptCode = 73, ++ hantScriptCode = 74, ++ hmngScriptCode = 75, ++ hungScriptCode = 76, ++ indsScriptCode = 77, ++ javaScriptCode = 78, ++ kaliScriptCode = 79, ++ latfScriptCode = 80, ++ latgScriptCode = 81, ++ lepcScriptCode = 82, ++ linaScriptCode = 83, ++ mandScriptCode = 84, ++ mayaScriptCode = 85, ++ meroScriptCode = 86, ++ nkooScriptCode = 87, ++ orkhScriptCode = 88, ++ permScriptCode = 89, ++ phagScriptCode = 90, ++ phnxScriptCode = 91, ++ plrdScriptCode = 92, ++ roroScriptCode = 93, ++ saraScriptCode = 94, ++ syreScriptCode = 95, ++ syrjScriptCode = 96, ++ syrnScriptCode = 97, ++ tengScriptCode = 98, ++ vaiiScriptCode = 99, ++ vispScriptCode = 100, ++ xsuxScriptCode = 101, ++ zxxxScriptCode = 102, ++ zzzzScriptCode = 103, ++/** ++ * @stable ICU 3.8 ++ */ ++ ++ cariScriptCode = 104, ++ jpanScriptCode = 105, ++ lanaScriptCode = 106, ++ lyciScriptCode = 107, ++ lydiScriptCode = 108, ++ olckScriptCode = 109, ++ rjngScriptCode = 110, ++ saurScriptCode = 111, ++ sgnwScriptCode = 112, ++ sundScriptCode = 113, ++ moonScriptCode = 114, ++ mteiScriptCode = 115, ++/** ++ * @stable ICU 4.0 ++ */ ++ ++ armiScriptCode = 116, ++ avstScriptCode = 117, ++ cakmScriptCode = 118, ++ koreScriptCode = 119, ++ kthiScriptCode = 120, ++ maniScriptCode = 121, ++ phliScriptCode = 122, ++ phlpScriptCode = 123, ++ phlvScriptCode = 124, ++ prtiScriptCode = 125, ++ samrScriptCode = 126, ++ tavtScriptCode = 127, ++ zmthScriptCode = 128, ++ zsymScriptCode = 129, ++/** ++ * @stable ICU 4.4 ++ */ ++ ++ bamuScriptCode = 130, ++ lisuScriptCode = 131, ++ nkgbScriptCode = 132, ++ sarbScriptCode = 133, ++/** ++ * @stable ICU 4.6 ++ */ ++ ++ bassScriptCode = 134, ++ duplScriptCode = 135, ++ elbaScriptCode = 136, ++ granScriptCode = 137, ++ kpelScriptCode = 138, ++ lomaScriptCode = 139, ++ mendScriptCode = 140, ++ mercScriptCode = 141, ++ narbScriptCode = 142, ++ nbatScriptCode = 143, ++ palmScriptCode = 144, ++ sindScriptCode = 145, ++ waraScriptCode = 146, ++ ++ scriptCodeCount = 147 + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/LEStandalone.h b/src/share/native/sun/font/layout/LEStandalone.h +--- jdk/src/share/native/sun/font/layout/LEStandalone.h ++++ jdk/src/share/native/sun/font/layout/LEStandalone.h +@@ -26,6 +26,15 @@ + #ifndef __LESTANDALONE + #define __LESTANDALONE + ++#ifndef U_COPYRIGHT_STRING ++#define U_COPYRIGHT_STRING " (C) Copyright IBM Corp and Others. 1998-2010 - All Rights Reserved" ++#endif ++ ++/* ICU Version number */ ++#ifndef U_ICU_VERSION ++#define U_ICU_VERSION "4.6" ++#endif ++ + /* Definitions to make Layout Engine work away from ICU. */ + #ifndef U_NAMESPACE_BEGIN + #define U_NAMESPACE_BEGIN +diff --git a/src/share/native/sun/font/layout/LESwaps.h b/src/share/native/sun/font/layout/LESwaps.h +--- jdk/src/share/native/sun/font/layout/LESwaps.h ++++ jdk/src/share/native/sun/font/layout/LESwaps.h +@@ -26,7 +26,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +diff --git a/src/share/native/sun/font/layout/LETypes.h b/src/share/native/sun/font/layout/LETypes.h +--- jdk/src/share/native/sun/font/layout/LETypes.h ++++ jdk/src/share/native/sun/font/layout/LETypes.h +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -500,6 +500,7 @@ + LE_CALT_FEATURE_TAG = 0x63616C74UL, /**< 'calt' */ + LE_CASE_FEATURE_TAG = 0x63617365UL, /**< 'case' */ + LE_CCMP_FEATURE_TAG = 0x63636D70UL, /**< 'ccmp' */ ++ LE_CJCT_FEATURE_TAG = 0x636A6374UL, /**< 'cjct' */ + LE_CLIG_FEATURE_TAG = 0x636C6967UL, /**< 'clig' */ + LE_CPSP_FEATURE_TAG = 0x63707370UL, /**< 'cpsp' */ + LE_CSWH_FEATURE_TAG = 0x63737768UL, /**< 'cswh' */ +@@ -563,6 +564,7 @@ + LE_RAND_FEATURE_TAG = 0x72616E64UL, /**< 'rand' */ + LE_RLIG_FEATURE_TAG = 0x726C6967UL, /**< 'rlig' */ + LE_RPHF_FEATURE_TAG = 0x72706866UL, /**< 'rphf' */ ++ LE_RKRF_FEATURE_TAG = 0x726B7266UL, /**< 'rkrf' */ + LE_RTBD_FEATURE_TAG = 0x72746264UL, /**< 'rtbd' */ + LE_RTLA_FEATURE_TAG = 0x72746C61UL, /**< 'rtla' */ + LE_RUBY_FEATURE_TAG = 0x72756279UL, /**< 'ruby' */ +diff --git a/src/share/native/sun/font/layout/LayoutEngine.cpp b/src/share/native/sun/font/layout/LayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/LayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/LayoutEngine.cpp +@@ -39,10 +39,11 @@ + #include "ArabicLayoutEngine.h" + #include "CanonShaping.h" + #include "HanLayoutEngine.h" ++#include "HangulLayoutEngine.h" + #include "IndicLayoutEngine.h" + #include "KhmerLayoutEngine.h" + #include "ThaiLayoutEngine.h" +-//#include "TibetanLayoutEngine.h" ++#include "TibetanLayoutEngine.h" + #include "GXLayoutEngine.h" + #include "ScriptAndLanguageTags.h" + #include "CharSubstitutionFilter.h" +@@ -60,6 +61,9 @@ + + U_NAMESPACE_BEGIN + ++/* Leave this copyright notice here! It needs to go somewhere in this library. */ ++static const char copyright[] = U_COPYRIGHT_STRING; ++ + const LEUnicode32 DefaultCharMapper::controlChars[] = { + 0x0009, 0x000A, 0x000D, + /*0x200C, 0x200D,*/ 0x200E, 0x200F, +@@ -97,9 +101,8 @@ + } + + if (fFilterControls) { +- le_int32 index = OpenTypeUtilities::search((le_uint32)ch, +- (le_uint32 *)controlChars, +- controlCharsCount); ++ le_int32 index = OpenTypeUtilities::search((le_uint32)ch, (le_uint32 *)controlChars, controlCharsCount); ++ + if (controlChars[index] == ch) { + return 0xFFFF; + } +@@ -135,56 +138,7 @@ + // nothing to do + } + +- +-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LayoutEngine) +- +-#define ccmpFeatureTag LE_CCMP_FEATURE_TAG +- +-#define ccmpFeatureMask 0x80000000UL +- +-#define canonFeatures (ccmpFeatureMask) +- +-static const FeatureMap canonFeatureMap[] = +-{ +- {ccmpFeatureTag, ccmpFeatureMask} +-}; +- +-static const le_int32 canonFeatureMapCount = LE_ARRAY_SIZE(canonFeatureMap); +- +-LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) +- : fGlyphStorage(NULL), fFontInstance(fontInstance), fScriptCode(scriptCode), fLanguageCode(languageCode), +- fTypoFlags(typoFlags) +-{ +- fGlyphStorage = new LEGlyphStorage(); +-} +- +-le_int32 LayoutEngine::getGlyphCount() const +-{ +- return fGlyphStorage->getGlyphCount(); +-} +- +-void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const +-{ +- fGlyphStorage->getCharIndices(charIndices, indexBase, success); +-} +- +-void LayoutEngine::getCharIndices(le_int32 charIndices[], LEErrorCode &success) const +-{ +- fGlyphStorage->getCharIndices(charIndices, success); +-} +- +-// Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits +-void LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const +-{ +- fGlyphStorage->getGlyphs(glyphs, extraBits, success); +-} +- +-void LayoutEngine::getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const +-{ +- fGlyphStorage->getGlyphs(glyphs, success); +-} +- +-class CanonMarkFilter : public LEGlyphFilter ++class CanonMarkFilter : public UMemory, public LEGlyphFilter + { + private: + const GlyphClassDefinitionTable *classDefTable; +@@ -216,6 +170,66 @@ + return glyphClass != 0; + } + ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LayoutEngine) ++ ++#define ccmpFeatureTag LE_CCMP_FEATURE_TAG ++ ++#define ccmpFeatureMask 0x80000000UL ++ ++#define canonFeatures (ccmpFeatureMask) ++ ++static const FeatureMap canonFeatureMap[] = ++{ ++ {ccmpFeatureTag, ccmpFeatureMask} ++}; ++ ++static const le_int32 canonFeatureMapCount = LE_ARRAY_SIZE(canonFeatureMap); ++ ++LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, ++ le_int32 scriptCode, ++ le_int32 languageCode, ++ le_int32 typoFlags, ++ LEErrorCode &success) ++ : fGlyphStorage(NULL), fFontInstance(fontInstance), fScriptCode(scriptCode), fLanguageCode(languageCode), ++ fTypoFlags(typoFlags), fFilterZeroWidth(TRUE) ++{ ++ if (LE_FAILURE(success)) { ++ return; ++ } ++ ++ fGlyphStorage = new LEGlyphStorage(); ++ if (fGlyphStorage == NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++} ++} ++ ++le_int32 LayoutEngine::getGlyphCount() const ++{ ++ return fGlyphStorage->getGlyphCount(); ++} ++ ++void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const ++{ ++ fGlyphStorage->getCharIndices(charIndices, indexBase, success); ++} ++ ++void LayoutEngine::getCharIndices(le_int32 charIndices[], LEErrorCode &success) const ++{ ++ fGlyphStorage->getCharIndices(charIndices, success); ++} ++ ++// Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits ++void LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const ++{ ++ fGlyphStorage->getGlyphs(glyphs, extraBits, success); ++} ++ ++void LayoutEngine::getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const ++{ ++ fGlyphStorage->getGlyphs(glyphs, success); ++} ++ ++ + void LayoutEngine::getGlyphPositions(float positions[], LEErrorCode &success) const + { + fGlyphStorage->getGlyphPositions(positions, success); +@@ -245,8 +259,21 @@ + + if (canonGSUBTable->coversScript(scriptTag)) { + CharSubstitutionFilter *substitutionFilter = new CharSubstitutionFilter(fFontInstance); ++ if (substitutionFilter == NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return 0; ++ } ++ + const LEUnicode *inChars = &chars[offset]; + LEUnicode *reordered = NULL; ++ LEGlyphStorage fakeGlyphStorage; ++ ++ fakeGlyphStorage.allocateGlyphArray(count, rightToLeft, success); ++ ++ if (LE_FAILURE(success)) { ++ delete substitutionFilter; ++ return 0; ++ } + + // This is the cheapest way to get mark reordering only for Hebrew. + // We could just do the mark reordering for all scripts, but most +@@ -255,18 +282,19 @@ + reordered = LE_NEW_ARRAY(LEUnicode, count); + + if (reordered == NULL) { ++ delete substitutionFilter; + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + +- CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, glyphStorage); ++ CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, fakeGlyphStorage); + inChars = reordered; + } + +- glyphStorage.allocateGlyphArray(count, rightToLeft, success); +- glyphStorage.allocateAuxData(success); ++ fakeGlyphStorage.allocateAuxData(success); + + if (LE_FAILURE(success)) { ++ delete substitutionFilter; + return 0; + } + +@@ -276,21 +304,41 @@ + } + + for (i = 0; i < count; i += 1, out += dir) { +- glyphStorage[out] = (LEGlyphID) inChars[i]; +- glyphStorage.setAuxData(out, canonFeatures, success); ++ fakeGlyphStorage[out] = (LEGlyphID) inChars[i]; ++ fakeGlyphStorage.setAuxData(out, canonFeatures, success); + } + + if (reordered != NULL) { + LE_DELETE_ARRAY(reordered); + } + +- outCharCount = canonGSUBTable->process(glyphStorage, rightToLeft, scriptTag, langSysTag, NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE); ++ outCharCount = canonGSUBTable->process(fakeGlyphStorage, rightToLeft, scriptTag, langSysTag, NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE, success); ++ ++ if (LE_FAILURE(success)) { ++ delete substitutionFilter; ++ return 0; ++ } + + out = (rightToLeft? outCharCount - 1 : 0); + ++ /* ++ * The char indices array in fakeGlyphStorage has the correct mapping ++ * back to the original input characters. Save it in glyphStorage. The ++ * subsequent call to glyphStoratge.allocateGlyphArray will keep this ++ * array rather than allocating and initializing a new one. ++ */ ++ glyphStorage.adoptCharIndicesArray(fakeGlyphStorage); ++ + outChars = LE_NEW_ARRAY(LEUnicode, outCharCount); ++ ++ if (outChars == NULL) { ++ delete substitutionFilter; ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return 0; ++ } ++ + for (i = 0; i < outCharCount; i += 1, out += dir) { +- outChars[out] = (LEUnicode) LE_GET_GLYPH(glyphStorage[i]); ++ outChars[out] = (LEUnicode) LE_GET_GLYPH(fakeGlyphStorage[i]); + } + + delete substitutionFilter; +@@ -475,7 +523,7 @@ + + DefaultCharMapper charMapper(TRUE, mirror); + +- fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse, &charMapper, glyphStorage); ++ fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse, &charMapper, fFilterZeroWidth, glyphStorage); + } + + // Input: characters, font? +@@ -495,6 +543,10 @@ + + le_int32 glyphCount; + ++ if (fGlyphStorage->getGlyphCount() > 0) { ++ fGlyphStorage->reset(); ++ } ++ + glyphCount = computeGlyphs(chars, offset, count, max, rightToLeft, *fGlyphStorage, success); + positionGlyphs(*fGlyphStorage, x, y, success); + adjustGlyphPositions(chars, offset, count, rightToLeft, *fGlyphStorage, success); +@@ -526,8 +578,15 @@ + LayoutEngine *result = NULL; + LETag scriptTag = 0x00000000; + LETag languageTag = 0x00000000; ++ LETag v2ScriptTag = OpenTypeLayoutEngine::getV2ScriptTag(scriptCode); + +- if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) { ++ // Right now, only invoke V2 processing for Devanagari. TODO: Allow more V2 scripts as they are ++ // properly tested. ++ ++ if ( v2ScriptTag == dev2ScriptTag && gsubTable != NULL && gsubTable->coversScript( v2ScriptTag )) { ++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, TRUE, gsubTable, success); ++ } ++ else if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) { + switch (scriptCode) { + case bengScriptCode: + case devaScriptCode: +@@ -539,11 +598,15 @@ + case tamlScriptCode: + case teluScriptCode: + case sinhScriptCode: +- result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); ++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, FALSE, gsubTable, success); + break; + + case arabScriptCode: +- result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); ++ result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); ++ break; ++ ++ case hangScriptCode: ++ result = new HangulOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + + case haniScriptCode: +@@ -555,36 +618,35 @@ + case zhtLanguageCode: + case zhsLanguageCode: + if (gsubTable->coversScriptAndLanguage(scriptTag, languageTag, TRUE)) { +- result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); ++ result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + } + + // note: falling through to default case. + default: +- result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); ++ result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + } + + break; +-#if 0 ++ + case tibtScriptCode: +- result = new TibetanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); ++ result = new TibetanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; +-#endif + + case khmrScriptCode: +- result = new KhmerOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); ++ result = new KhmerOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + + default: +- result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable); ++ result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + } + } else { + const MorphTableHeader *morphTable = (MorphTableHeader *) fontInstance->getFontTable(mortTableTag); + + if (morphTable != NULL && SWAPL(morphTable->version)==0x00010000) { +- result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable); ++ result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable, success); + } else { + switch (scriptCode) { + case bengScriptCode: +@@ -598,29 +660,38 @@ + case teluScriptCode: + case sinhScriptCode: + { +- result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); ++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); + break; + } + + case arabScriptCode: + //case hebrScriptCode: +- result = new UnicodeArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); ++ result = new UnicodeArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); + break; + + //case hebrScriptCode: + // return new HebrewOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); + + case thaiScriptCode: +- result = new ThaiLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); ++ result = new ThaiLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); ++ break; ++ ++ case hangScriptCode: ++ result = new HangulOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); + break; + + default: +- result = new LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); ++ result = new LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); + break; + } + } + } + ++ if (result && LE_FAILURE(success)) { ++ delete result; ++ result = NULL; ++ } ++ + if (result == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + } +diff --git a/src/share/native/sun/font/layout/LayoutEngine.h b/src/share/native/sun/font/layout/LayoutEngine.h +--- jdk/src/share/native/sun/font/layout/LayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/LayoutEngine.h +@@ -26,7 +26,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +@@ -133,6 +133,14 @@ + le_int32 fTypoFlags; + + /** ++ * <code>TRUE</code> if <code>mapCharsToGlyphs</code> should replace ZWJ / ZWNJ with a glyph ++ * with no contours. ++ * ++ * @internal ++ */ ++ le_bool fFilterZeroWidth; ++ ++ /** + * This constructs an instance for a given font, script and language. Subclass constructors + * must call this constructor. + * +@@ -141,13 +149,18 @@ + * @param languageCode - the language for the text + * @param typoFlags - the typographic control flags for the text. Set bit 1 if kerning + * is desired, set bit 2 if ligature formation is desired. Others are reserved. ++ * @param success - set to an error code if the operation fails + * + * @see LEFontInstance + * @see ScriptAndLanguageTags.h + * + * @internal + */ +- LayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags); ++ LayoutEngine(const LEFontInstance *fontInstance, ++ le_int32 scriptCode, ++ le_int32 languageCode, ++ le_int32 typoFlags, ++ LEErrorCode &success); + + /** + * This overrides the default no argument constructor to make it +@@ -338,7 +351,7 @@ + + /** + * This method will invoke the layout steps in their correct order by calling +- * the computeGlyphs, positionGlyphs and adjustGlyphPosition methods.. It will ++ * the computeGlyphs, positionGlyphs and adjustGlyphPosition methods. It will + * compute the glyph, character index and position arrays. + * + * @param chars - the input character context +@@ -352,8 +365,12 @@ + * + * @return the number of glyphs in the glyph array + * +- * Note; the glyph, character index and position array can be accessed +- * using the getter method below. ++ * Note: The glyph, character index and position array can be accessed ++ * using the getter methods below. ++ * ++ * Note: If you call this method more than once, you must call the reset() ++ * method first to free the glyph, character index and position arrays ++ * allocated by the previous call. + * + * @stable ICU 2.8 + */ +@@ -479,7 +496,7 @@ + + /** + * Override of existing call that provides flags to control typography. +- * @draft ICU 3.4 ++ * @stable ICU 3.4 + */ + static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typo_flags, LEErrorCode &success); + +diff --git a/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp b/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp +--- jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp +@@ -26,7 +26,7 @@ + /* + * + * +- * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2006 - All Rights Reserved + * + */ + +@@ -58,10 +58,6 @@ + TTGlyphID ligGlyph = SWAPW(ligTable->ligGlyph); + le_uint16 comp; + +- if (filter != NULL && ! filter->accept(LE_SET_GLYPH(glyph, ligGlyph))) { +- continue; +- } +- + for (comp = 0; comp < compCount; comp += 1) { + if (! glyphIterator->next()) { + break; +@@ -72,7 +68,7 @@ + } + } + +- if (comp == compCount) { ++ if (comp == compCount && (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, ligGlyph)))) { + GlyphIterator tempIterator(*glyphIterator); + TTGlyphID deletedGlyph = tempIterator.ignoresMarks()? 0xFFFE : 0xFFFF; + +diff --git a/src/share/native/sun/font/layout/LookupProcessor.cpp b/src/share/native/sun/font/layout/LookupProcessor.cpp +--- jdk/src/share/native/sun/font/layout/LookupProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/LookupProcessor.cpp +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -33,7 +33,7 @@ + #include "OpenTypeUtilities.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" +-#include "Features.h" ++#include "ICUFeatures.h" + #include "Lookups.h" + #include "ScriptAndLanguage.h" + #include "GlyphDefinitionTables.h" +@@ -45,8 +45,12 @@ + U_NAMESPACE_BEGIN + + le_uint32 LookupProcessor::applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const ++ const LEFontInstance *fontInstance, LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + le_uint16 lookupType = SWAPW(lookupTable->lookupType); + le_uint16 subtableCount = SWAPW(lookupTable->subTableCount); + le_int32 startPosition = glyphIterator->getCurrStreamPosition(); +@@ -55,9 +59,9 @@ + for (le_uint16 subtable = 0; subtable < subtableCount; subtable += 1) { + const LookupSubtable *lookupSubtable = lookupTable->getLookupSubtable(subtable); + +- delta = applySubtable(lookupSubtable, lookupType, glyphIterator, fontInstance); ++ delta = applySubtable(lookupSubtable, lookupType, glyphIterator, fontInstance, success); + +- if (delta > 0) { ++ if (delta > 0 && LE_FAILURE(success)) { + return 1; + } + +@@ -69,8 +73,12 @@ + + le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, + le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, +- const LEFontInstance *fontInstance) const ++ const LEFontInstance *fontInstance, LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + le_int32 glyphCount = glyphStorage.getGlyphCount(); + + if (lookupSelectArray == NULL) { +@@ -96,10 +104,9 @@ + glyphIterator.reset(lookupFlags, selectMask); + + while (glyphIterator.findFeatureTag()) { +- le_uint32 delta = 1; +- +- while (glyphIterator.next(delta)) { +- delta = applyLookupTable(lookupTable, &glyphIterator, fontInstance); ++ applyLookupTable(lookupTable, &glyphIterator, fontInstance, success); ++ if (LE_FAILURE(success)) { ++ return 0; + } + } + +@@ -111,12 +118,16 @@ + } + + le_uint32 LookupProcessor::applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, +- const LEFontInstance *fontInstance) const ++ const LEFontInstance *fontInstance, LEErrorCode& success) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + const LookupTable *lookupTable = lookupListTable->getLookupTable(lookupTableIndex); + le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags); + GlyphIterator tempIterator(*glyphIterator, lookupFlags); +- le_uint32 delta = applyLookupTable(lookupTable, &tempIterator, fontInstance); ++ le_uint32 delta = applyLookupTable(lookupTable, &tempIterator, fontInstance, success); + + return delta; + } +@@ -141,7 +152,8 @@ + + LookupProcessor::LookupProcessor(const char *baseAddress, + Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset, +- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures) ++ LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures, ++ LEErrorCode& success) + : lookupListTable(NULL), featureListTable(NULL), lookupSelectArray(NULL), lookupSelectCount(0), + lookupOrderArray(NULL), lookupOrderCount(0) + { +@@ -151,6 +163,10 @@ + le_uint16 lookupListCount = 0; + le_uint16 requiredFeatureIndex; + ++ if (LE_FAILURE(success)) { ++ return; ++ } ++ + if (scriptListOffset != 0) { + scriptListTable = (const ScriptListTable *) (baseAddress + scriptListOffset); + langSysTable = scriptListTable->findLanguage(scriptTag, languageTag); +@@ -177,6 +193,10 @@ + requiredFeatureIndex = SWAPW(langSysTable->reqFeatureIndex); + + lookupSelectArray = LE_NEW_ARRAY(FeatureMask, lookupListCount); ++ if (lookupSelectArray == NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return; ++ } + + for (int i = 0; i < lookupListCount; i += 1) { + lookupSelectArray[i] = 0; +@@ -213,6 +233,10 @@ + } + + lookupOrderArray = LE_NEW_ARRAY(le_uint16, featureReferences); ++ if (lookupOrderArray == NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return; ++ } + + for (le_int32 f = 0; f < featureMapCount; f += 1) { + FeatureMap fm = featureMap[f]; +@@ -302,6 +326,8 @@ + + LookupProcessor::LookupProcessor() + { ++ lookupOrderArray = NULL; ++ lookupSelectArray = NULL; + } + + LookupProcessor::~LookupProcessor() +diff --git a/src/share/native/sun/font/layout/LookupProcessor.h b/src/share/native/sun/font/layout/LookupProcessor.h +--- jdk/src/share/native/sun/font/layout/LookupProcessor.h ++++ jdk/src/share/native/sun/font/layout/LookupProcessor.h +@@ -26,7 +26,7 @@ + /* + * + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +@@ -59,21 +59,28 @@ + class LookupProcessor : public UMemory { + public: + le_int32 process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, +- le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance) const; ++ le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance, LEErrorCode& success) const; + +- le_uint32 applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + +- le_uint32 applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + + virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 subtableType, +- GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const = 0; ++ GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const = 0; + + virtual ~LookupProcessor(); + + protected: + LookupProcessor(const char *baseAddress, +- Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset, +- LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures); ++ Offset scriptListOffset, ++ Offset featureListOffset, ++ Offset lookupListOffset, ++ LETag scriptTag, ++ LETag languageTag, ++ const FeatureMap *featureMap, ++ le_int32 featureMapCount, ++ le_bool orderFeatures, ++ LEErrorCode& success); + + LookupProcessor(); + +diff --git a/src/share/native/sun/font/layout/MPreFixups.cpp b/src/share/native/sun/font/layout/MPreFixups.cpp +--- jdk/src/share/native/sun/font/layout/MPreFixups.cpp ++++ jdk/src/share/native/sun/font/layout/MPreFixups.cpp +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 2002-2004 - All Rights Reserved ++ * (C) Copyright IBM Corp. 2002-2008 - All Rights Reserved + * + */ + +@@ -65,8 +65,12 @@ + } + } + +-void MPreFixups::apply(LEGlyphStorage &glyphStorage) ++void MPreFixups::apply(LEGlyphStorage &glyphStorage, LEErrorCode& success) + { ++ if (LE_FAILURE(success)) { ++ return; ++ } ++ + for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) { + le_int32 baseIndex = fFixupData[fixup].fBaseIndex; + le_int32 mpreIndex = fFixupData[fixup].fMPreIndex; +@@ -90,6 +94,14 @@ + le_int32 mpreDest = baseIndex - mpreCount; + LEGlyphID *mpreSave = LE_NEW_ARRAY(LEGlyphID, mpreCount); + le_int32 *indexSave = LE_NEW_ARRAY(le_int32, mpreCount); ++ ++ if (mpreSave == NULL || indexSave == NULL) { ++ LE_DELETE_ARRAY(mpreSave); ++ LE_DELETE_ARRAY(indexSave); ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return; ++ } ++ + le_int32 i; + + for (i = 0; i < mpreCount; i += 1) { +diff --git a/src/share/native/sun/font/layout/MPreFixups.h b/src/share/native/sun/font/layout/MPreFixups.h +--- jdk/src/share/native/sun/font/layout/MPreFixups.h ++++ jdk/src/share/native/sun/font/layout/MPreFixups.h +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 2002-2004 - All Rights Reserved ++ * (C) Copyright IBM Corp. 2002-2008 - All Rights Reserved + * + */ + +@@ -54,7 +54,7 @@ + + void add(le_int32 baseIndex, le_int32 mpreIndex); + +- void apply(LEGlyphStorage &glyphStorage); ++ void apply(LEGlyphStorage &glyphStorage, LEErrorCode& success); + + private: + FixupData *fFixupData; +diff --git a/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp +--- jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -108,11 +108,27 @@ + glyphIterator->setCurrGlyphBaseOffset(baseIterator.getCurrStreamPosition()); + + if (glyphIterator->isRightToLeft()) { ++ // FIXME: need similar patch to below; also in MarkToLigature and MarkToMark ++ // (is there a better way to approach this for all the cases?) + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); + } else { + LEPoint baseAdvance; + + fontInstance->getGlyphAdvance(baseGlyph, pixels); ++ ++ //JK: adjustment needs to account for non-zero advance of any marks between base glyph and current mark ++ GlyphIterator gi(baseIterator, (le_uint16)0); // copy of baseIterator that won't ignore marks ++ gi.next(); // point beyond the base glyph ++ while (gi.getCurrStreamPosition() < glyphIterator->getCurrStreamPosition()) { // for all intervening glyphs (marks)... ++ LEGlyphID otherMark = gi.getCurrGlyphID(); ++ LEPoint px; ++ fontInstance->getGlyphAdvance(otherMark, px); // get advance, in case it's non-zero ++ pixels.fX += px.fX; // and add that to the base glyph's advance ++ pixels.fY += px.fY; ++ gi.next(); ++ } ++ // end of JK patch ++ + fontInstance->pixelsToUnits(pixels, baseAdvance); + + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - baseAdvance.fX, anchorDiffY - baseAdvance.fY, -markAdvance.fX, -markAdvance.fY); +diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp b/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp +--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +@@ -39,8 +39,12 @@ + + U_NAMESPACE_BEGIN + +-le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const ++le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter) const + { ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + + // If there's a filter, we only want to do the +@@ -87,7 +91,11 @@ + } + } + +- LEGlyphID *newGlyphs = glyphIterator->insertGlyphs(glyphCount); ++ LEGlyphID *newGlyphs = glyphIterator->insertGlyphs(glyphCount, success); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + le_int32 insert = 0, direction = 1; + + if (glyphIterator->isRightToLeft()) { +diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.h b/src/share/native/sun/font/layout/MultipleSubstSubtables.h +--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h ++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +@@ -56,7 +56,7 @@ + le_uint16 sequenceCount; + Offset sequenceTableOffsetArray[ANY_NUMBER]; + +- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; ++ le_uint32 process(GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter = NULL) const; + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp +@@ -26,7 +26,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -35,8 +35,10 @@ + #include "LELanguages.h" + + #include "LayoutEngine.h" ++#include "CanonShaping.h" + #include "OpenTypeLayoutEngine.h" + #include "ScriptAndLanguageTags.h" ++#include "CharSubstitutionFilter.h" + + #include "GlyphSubstitutionTables.h" + #include "GlyphDefinitionTables.h" +@@ -47,6 +49,8 @@ + + #include "GDEFMarkFilter.h" + ++#include "KernTable.h" ++ + U_NAMESPACE_BEGIN + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(OpenTypeLayoutEngine) +@@ -57,6 +61,8 @@ + #define kernFeatureTag LE_KERN_FEATURE_TAG + #define markFeatureTag LE_MARK_FEATURE_TAG + #define mkmkFeatureTag LE_MKMK_FEATURE_TAG ++#define loclFeatureTag LE_LOCL_FEATURE_TAG ++#define caltFeatureTag LE_CALT_FEATURE_TAG + + // 'dlig' not used at the moment + #define dligFeatureTag 0x646C6967 +@@ -71,8 +77,10 @@ + #define paltFeatureMask 0x08000000UL + #define markFeatureMask 0x04000000UL + #define mkmkFeatureMask 0x02000000UL ++#define loclFeatureMask 0x01000000UL ++#define caltFeatureMask 0x00800000UL + +-#define minimalFeatures (ccmpFeatureMask | markFeatureMask | mkmkFeatureMask) ++#define minimalFeatures (ccmpFeatureMask | markFeatureMask | mkmkFeatureMask | loclFeatureMask | caltFeatureMask) + #define ligaFeatures (ligaFeatureMask | cligFeatureMask | minimalFeatures) + #define kernFeatures (kernFeatureMask | paltFeatureMask | minimalFeatures) + #define kernAndLigaFeatures (ligaFeatures | kernFeatures) +@@ -85,14 +93,16 @@ + {kernFeatureTag, kernFeatureMask}, + {paltFeatureTag, paltFeatureMask}, + {markFeatureTag, markFeatureMask}, +- {mkmkFeatureTag, mkmkFeatureMask} ++ {mkmkFeatureTag, mkmkFeatureMask}, ++ {loclFeatureTag, loclFeatureMask}, ++ {caltFeatureTag, caltFeatureMask} + }; + + static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); + + OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) +- : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fFeatureMask(minimalFeatures), ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureMask(minimalFeatures), + fFeatureMap(featureMap), fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE), + fGSUBTable(gsubTable), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL) + { +@@ -102,6 +112,15 @@ + + applyTypoFlags(); + ++ setScriptAndLanguageTags(); ++ ++ fGDEFTable = (const GlyphDefinitionTableHeader *) getFontTable(gdefTableTag); ++ ++// JK patch, 2008-05-30 - see Sinhala bug report and LKLUG font ++// if (gposTable != NULL && gposTable->coversScriptAndLanguage(fScriptTag, fLangSysTag)) { ++ if (gposTable != NULL && gposTable->coversScript(fScriptTag)) { ++ fGPOSTable = gposTable; ++ } + } + + void OpenTypeLayoutEngine::applyTypoFlags() { +@@ -109,7 +128,7 @@ + const LEFontInstance *fontInstance = fFontInstance; + + // todo: switch to more flags and bitfield rather than list of feature tags? +- switch (typoFlags) { ++ switch (typoFlags & ~0x80000000L) { + case 0: break; // default + case 1: fFeatureMask = kernFeatures; break; + case 2: fFeatureMask = ligaFeatures; break; +@@ -117,6 +136,10 @@ + default: break; + } + ++ if (typoFlags & LE_CHAR_FILTER_FEATURE_FLAG) { ++ fSubstitutionFilter = new CharSubstitutionFilter(fontInstance); ++ } ++ + } + + void OpenTypeLayoutEngine::reset() +@@ -129,8 +152,8 @@ + } + + OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags) +- : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags), fFeatureOrder(FALSE), ++ le_int32 typoFlags, LEErrorCode &success) ++ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureOrder(FALSE), + fGSUBTable(NULL), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL) + { + applyTypoFlags(); +@@ -151,8 +174,23 @@ + if (scriptCode < 0 || scriptCode >= scriptCodeCount) { + return 0xFFFFFFFF; + } ++ return scriptTags[scriptCode]; ++} + +- return scriptTags[scriptCode]; ++LETag OpenTypeLayoutEngine::getV2ScriptTag(le_int32 scriptCode) ++{ ++ switch (scriptCode) { ++ case bengScriptCode : return bng2ScriptTag; ++ case devaScriptCode : return dev2ScriptTag; ++ case gujrScriptCode : return gjr2ScriptTag; ++ case guruScriptCode : return gur2ScriptTag; ++ case kndaScriptCode : return knd2ScriptTag; ++ case mlymScriptCode : return mlm2ScriptTag; ++ case oryaScriptCode : return ory2ScriptTag; ++ case tamlScriptCode : return tml2ScriptTag; ++ case teluScriptCode : return tel2ScriptTag; ++ default: return nullScriptTag; ++ } + } + + LETag OpenTypeLayoutEngine::getLangSysTag(le_int32 languageCode) +@@ -167,6 +205,7 @@ + void OpenTypeLayoutEngine::setScriptAndLanguageTags() + { + fScriptTag = getScriptTag(fScriptCode); ++ fScriptTagV2 = getV2ScriptTag(fScriptCode); + fLangSysTag = getLangSysTag(fLanguageCode); + } + +@@ -182,20 +221,39 @@ + return 0; + } + +- le_int32 outCharCount = LayoutEngine::characterProcessing(chars, offset, count, max, rightToLeft, outChars, glyphStorage, success); ++ // This is the cheapest way to get mark reordering only for Hebrew. ++ // We could just do the mark reordering for all scripts, but most ++ // of them probably don't need it... Another option would be to ++ // add a HebrewOpenTypeLayoutEngine subclass, but the only thing it ++ // would need to do is mark reordering, so that seems like overkill. ++ if (fScriptCode == hebrScriptCode) { ++ outChars = LE_NEW_ARRAY(LEUnicode, count); ++ ++ if (outChars == NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return 0; ++ } ++ ++ if (LE_FAILURE(success)) { ++ LE_DELETE_ARRAY(outChars); ++ return 0; ++ } ++ ++ CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, outChars, glyphStorage); ++ } + + if (LE_FAILURE(success)) { + return 0; + } + +- glyphStorage.allocateGlyphArray(outCharCount, rightToLeft, success); ++ glyphStorage.allocateGlyphArray(count, rightToLeft, success); + glyphStorage.allocateAuxData(success); + +- for (le_int32 i = 0; i < outCharCount; i += 1) { ++ for (le_int32 i = 0; i < count; i += 1) { + glyphStorage.setAuxData(i, fFeatureMask, success); + } + +- return outCharCount; ++ return count; + } + + // Input: characters, tags +@@ -219,13 +277,45 @@ + } + + if (fGSUBTable != NULL) { ++ if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) { ++ count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter, ++ fFeatureMap, fFeatureMapCount, fFeatureOrder, success); ++ ++ } else { + count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, +- fFeatureMap, fFeatureMapCount, fFeatureOrder); ++ fFeatureMap, fFeatureMapCount, fFeatureOrder, success); ++ } + } + + return count; + } ++// Input: characters, tags ++// Output: glyphs, char indices ++le_int32 OpenTypeLayoutEngine::glyphSubstitution(le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success) ++{ ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + ++ if ( count < 0 || max < 0 ) { ++ success = LE_ILLEGAL_ARGUMENT_ERROR; ++ return 0; ++ } ++ ++ if (fGSUBTable != NULL) { ++ if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) { ++ count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter, ++ fFeatureMap, fFeatureMapCount, fFeatureOrder, success); ++ ++ } else { ++ count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, ++ fFeatureMap, fFeatureMapCount, fFeatureOrder, success); ++ } ++ } ++ ++ return count; ++} + le_int32 OpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { +@@ -257,6 +347,10 @@ + + outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, fakeGlyphStorage, success); + ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + if (outChars != NULL) { + fakeGlyphCount = glyphProcessing(outChars, 0, outCharCount, outCharCount, rightToLeft, fakeGlyphStorage, success); + LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work... +@@ -266,6 +360,10 @@ + //adjustGlyphs(chars, offset, count, rightToLeft, fakeGlyphs, fakeGlyphCount); + } + ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ + outGlyphCount = glyphPostProcessing(fakeGlyphStorage, glyphStorage, success); + + return outGlyphCount; +@@ -285,8 +383,11 @@ + } + + le_int32 glyphCount = glyphStorage.getGlyphCount(); ++ if (glyphCount == 0) { ++ return; ++ } + +- if (glyphCount > 0 && fGPOSTable != NULL) { ++ if (fGPOSTable != NULL) { + GlyphPositionAdjustments *adjustments = new GlyphPositionAdjustments(glyphCount); + le_int32 i; + +@@ -309,9 +410,21 @@ + } + #endif + +- fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, fGDEFTable, fFontInstance, ++ if (fGPOSTable != NULL) { ++ if (fScriptTagV2 != nullScriptTag && fGPOSTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) { ++ fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTagV2, fLangSysTag, fGDEFTable, success, fFontInstance, + fFeatureMap, fFeatureMapCount, fFeatureOrder); + ++ } else { ++ fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, fGDEFTable, success, fFontInstance, ++ fFeatureMap, fFeatureMapCount, fFeatureOrder); ++ } ++ } else if ( fTypoFlags & 0x1 ) { ++ static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG; ++ KernTable kt(fFontInstance, getFontTable(kernTableTag)); ++ kt.process(glyphStorage); ++ } ++ + float xAdjust = 0, yAdjust = 0; + + for (i = 0; i < glyphCount; i += 1) { +@@ -344,6 +457,21 @@ + glyphStorage.adjustPosition(glyphCount, xAdjust, -yAdjust, success); + + delete adjustments; ++ } else { ++ // if there was no GPOS table, maybe there's non-OpenType kerning we can use ++ LayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphStorage, success); ++ } ++ ++ LEGlyphID zwnj = fFontInstance->mapCharToGlyph(0x200C); ++ ++ if (zwnj != 0x0000) { ++ for (le_int32 g = 0; g < glyphCount; g += 1) { ++ LEGlyphID glyph = glyphStorage[g]; ++ ++ if (glyph == zwnj) { ++ glyphStorage[g] = LE_SET_GLYPH(glyph, 0xFFFF); ++ } ++ } + } + + #if 0 +diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h +@@ -24,7 +24,7 @@ + */ + + /* +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -67,7 +67,7 @@ + * + * @internal + */ +-class OpenTypeLayoutEngine : public LayoutEngine ++class U_LAYOUT_API OpenTypeLayoutEngine : public LayoutEngine + { + public: + /** +@@ -80,6 +80,7 @@ + * @param scriptCode - the script + * @param langaugeCode - the language + * @param gsubTable - the GSUB table ++ * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see ScriptAndLangaugeTags.h for script and language codes +@@ -87,7 +88,7 @@ + * @internal + */ + OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable); ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +@@ -96,11 +97,12 @@ + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language ++ * @param success - set to an error code if the operation fails + * + * @internal + */ + OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags); ++ le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -112,6 +114,8 @@ + /** + * A convenience method used to convert the script code into + * the four byte script tag required by OpenType. ++ * For Indic languages where multiple script tags exist, ++ * the version 1 (old style) tag is returned. + * + * @param scriptCode - the script code + * +@@ -120,6 +124,19 @@ + * @internal + */ + static LETag getScriptTag(le_int32 scriptCode); ++ /** ++ * A convenience method used to convert the script code into ++ * the four byte script tag required by OpenType. ++ * For Indic languages where multiple script tags exist, ++ * the version 2 tag is returned. ++ * ++ * @param scriptCode - the script code ++ * ++ * @return the four byte script tag ++ * ++ * @internal ++ */ ++ static LETag getV2ScriptTag(le_int32 scriptCode); + + /** + * A convenience method used to convert the langauge code into +@@ -147,6 +164,13 @@ + */ + static UClassID getStaticClassID(); + ++ /** ++ * The array of language tags, indexed by language code. ++ * ++ * @internal ++ */ ++ static const LETag languageTags[]; ++ + private: + + /** +@@ -161,11 +185,6 @@ + static const LETag scriptTags[]; + + /** +- * The array of language tags, indexed by language code. +- */ +- static const LETag languageTags[]; +- +- /** + * apply the typoflags. Only called by the c'tors. + */ + void applyTypoFlags(); +@@ -243,6 +262,13 @@ + LETag fScriptTag; + + /** ++ * The four byte script tag for V2 fonts. ++ * ++ * @internal ++ */ ++ LETag fScriptTagV2; ++ ++ /** + * The four byte language tag + * + * @internal +@@ -309,6 +335,8 @@ + virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + ++ virtual le_int32 glyphSubstitution(le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ + /** + * This method does any processing necessary to convert "fake" + * glyph indices used by the glyphProcessing method into "real" glyph +diff --git a/src/share/native/sun/font/layout/OpenTypeTables.h b/src/share/native/sun/font/layout/OpenTypeTables.h +--- jdk/src/share/native/sun/font/layout/OpenTypeTables.h ++++ jdk/src/share/native/sun/font/layout/OpenTypeTables.h +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -46,6 +46,8 @@ + typedef le_uint16 Offset; + typedef le_uint8 ATag[4]; + typedef le_uint32 fixed32; ++ ++#define LE_GLYPH_GROUP_MASK 0x00000001UL + typedef le_uint32 FeatureMask; + + #define SWAPT(atag) ((LETag) ((atag[0] << 24) + (atag[1] << 16) + (atag[2] << 8) + atag[3])) +diff --git a/src/share/native/sun/font/layout/OpenTypeUtilities.cpp b/src/share/native/sun/font/layout/OpenTypeUtilities.cpp +--- jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp ++++ jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -111,6 +111,10 @@ + le_int32 probe = power; + le_int32 range = 0; + ++ if (recordCount == 0) { ++ return -1; ++ } ++ + if (SWAPW(records[extra].firstGlyph) <= glyphID) { + range = extra; + } +diff --git a/src/share/native/sun/font/layout/PairPositioningSubtables.cpp b/src/share/native/sun/font/layout/PairPositioningSubtables.cpp +--- jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp +@@ -101,7 +101,10 @@ + valueRecord2->adjustPosition(SWAPW(valueFormat2), (char *) this, *glyphIterator, fontInstance); + } + +- return 2; ++ // back up glyphIterator so second glyph can be ++ // first glyph in the next pair ++ glyphIterator->prev(); ++ return 1; + } + + return 0; +@@ -137,7 +140,10 @@ + valueRecord2->adjustPosition(SWAPW(valueFormat2), (const char *) this, *glyphIterator, fontInstance); + } + +- return 2; ++ // back up glyphIterator so second glyph can be ++ // first glyph in the next pair ++ glyphIterator->prev(); ++ return 1; + } + + return 0; +@@ -145,6 +151,20 @@ + + const PairValueRecord *PairPositioningFormat1Subtable::findPairValueRecord(TTGlyphID glyphID, const PairValueRecord *records, le_uint16 recordCount, le_uint16 recordSize) const + { ++#if 1 ++ // The OpenType spec. says that the ValueRecord table is ++ // sorted by secondGlyph. Unfortunately, there are fonts ++ // around that have an unsorted ValueRecord table. ++ const PairValueRecord *record = records; ++ ++ for(le_int32 r = 0; r < recordCount; r += 1) { ++ if (SWAPW(record->secondGlyph) == glyphID) { ++ return record; ++ } ++ ++ record = (const PairValueRecord *) ((char *) record + recordSize); ++ } ++#else + le_uint8 bit = OpenTypeUtilities::highBit(recordCount); + le_uint16 power = 1 << bit; + le_uint16 extra = (recordCount - power) * recordSize; +@@ -168,6 +188,7 @@ + if (SWAPW(record->secondGlyph) == glyphID) { + return record; + } ++#endif + + return NULL; + } +diff --git a/src/share/native/sun/font/layout/ScriptAndLanguage.cpp b/src/share/native/sun/font/layout/ScriptAndLanguage.cpp +--- jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp ++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp +@@ -26,7 +26,7 @@ + /* + * + * +- * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -56,20 +56,45 @@ + return (const LangSysTable *) ((char *)this + langSysTableOffset); + } + +- return 0; ++ return NULL; + } + + const ScriptTable *ScriptListTable::findScript(LETag scriptTag) const + { ++ /* ++ * There are some fonts that have a large, bogus value for scriptCount. To try ++ * and protect against this, we use the offset in the first scriptRecord, ++ * which we know has to be past the end of the scriptRecordArray, to compute ++ * a value which is greater than or equal to the actual script count. ++ * ++ * Note: normally, the first offset will point to just after the scriptRecordArray, ++ * but there's no guarantee of this, only that it's *after* the scriptRecordArray. ++ * Because of this, a binary serach isn't safe, because the new count may include ++ * data that's not actually in the scriptRecordArray and hence the array will appear ++ * to be unsorted. ++ */ + le_uint16 count = SWAPW(scriptCount); +- Offset scriptTableOffset = +- OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArray, count); ++ le_uint16 limit = ((SWAPW(scriptRecordArray[0].offset) - sizeof(ScriptListTable)) / sizeof(scriptRecordArray)) + ANY_NUMBER; ++ Offset scriptTableOffset = 0; ++ ++ if (count > limit) { ++ // the scriptCount value is bogus; do a linear search ++ // because limit may still be too large. ++ for(le_int32 s = 0; s < limit; s += 1) { ++ if (SWAPT(scriptRecordArray[s].tag) == scriptTag) { ++ scriptTableOffset = SWAPW(scriptRecordArray[s].offset); ++ break; ++ } ++ } ++ } else { ++ scriptTableOffset = OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArray, count); ++ } + + if (scriptTableOffset != 0) { + return (const ScriptTable *) ((char *)this + scriptTableOffset); + } + +- return 0; ++ return NULL; + } + + const LangSysTable *ScriptListTable::findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch) const +@@ -77,7 +102,7 @@ + const ScriptTable *scriptTable = findScript(scriptTag); + + if (scriptTable == 0) { +- return 0; ++ return NULL; + } + + return scriptTable->findLanguage(languageTag, exactMatch); +diff --git a/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp b/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp +--- jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp ++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.cpp +@@ -25,10 +25,12 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved. ++ * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. ++ * ++ * Generated on: 10/26/2010 02:53:33 PM PDT + */ + + #include "LETypes.h" +@@ -39,13 +41,13 @@ + + const LETag OpenTypeLayoutEngine::scriptTags[] = { + zyyyScriptTag, /* 'zyyy' (COMMON) */ +- qaaiScriptTag, /* 'qaai' (INHERITED) */ ++ zinhScriptTag, /* 'zinh' (INHERITED) */ + arabScriptTag, /* 'arab' (ARABIC) */ + armnScriptTag, /* 'armn' (ARMENIAN) */ + bengScriptTag, /* 'beng' (BENGALI) */ + bopoScriptTag, /* 'bopo' (BOPOMOFO) */ + cherScriptTag, /* 'cher' (CHEROKEE) */ +- qaacScriptTag, /* 'qaac' (COPTIC) */ ++ coptScriptTag, /* 'copt' (COPTIC) */ + cyrlScriptTag, /* 'cyrl' (CYRILLIC) */ + dsrtScriptTag, /* 'dsrt' (DESERET) */ + devaScriptTag, /* 'deva' (DEVANAGARI) */ +@@ -62,7 +64,7 @@ + kndaScriptTag, /* 'knda' (KANNADA) */ + kanaScriptTag, /* 'kana' (KATAKANA) */ + khmrScriptTag, /* 'khmr' (KHMER) */ +- laooScriptTag, /* 'laoo' (LAO) */ ++ laooScriptTag, /* 'lao ' (LAO) */ + latnScriptTag, /* 'latn' (LATIN) */ + mlymScriptTag, /* 'mlym' (MALAYALAM) */ + mongScriptTag, /* 'mong' (MONGOLIAN) */ +@@ -79,7 +81,7 @@ + thaiScriptTag, /* 'thai' (THAI) */ + tibtScriptTag, /* 'tibt' (TIBETAN) */ + cansScriptTag, /* 'cans' (CANADIAN_ABORIGINAL) */ +- yiiiScriptTag, /* 'yiii' (YI) */ ++ yiiiScriptTag, /* 'yi ' (YI) */ + tglgScriptTag, /* 'tglg' (TAGALOG) */ + hanoScriptTag, /* 'hano' (HANUNOO) */ + buhdScriptTag, /* 'buhd' (BUHID) */ +@@ -92,7 +94,99 @@ + shawScriptTag, /* 'shaw' (SHAVIAN) */ + taleScriptTag, /* 'tale' (TAI_LE) */ + ugarScriptTag, /* 'ugar' (UGARITIC) */ +- hrktScriptTag /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ ++ hrktScriptTag, /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ ++ bugiScriptTag, /* 'bugi' (BUGINESE) */ ++ glagScriptTag, /* 'glag' (GLAGOLITIC) */ ++ kharScriptTag, /* 'khar' (KHAROSHTHI) */ ++ syloScriptTag, /* 'sylo' (SYLOTI_NAGRI) */ ++ taluScriptTag, /* 'talu' (NEW_TAI_LUE) */ ++ tfngScriptTag, /* 'tfng' (TIFINAGH) */ ++ xpeoScriptTag, /* 'xpeo' (OLD_PERSIAN) */ ++ baliScriptTag, /* 'bali' (BALINESE) */ ++ batkScriptTag, /* 'batk' (BATAK) */ ++ blisScriptTag, /* 'blis' (BLIS) */ ++ brahScriptTag, /* 'brah' (BRAHMI) */ ++ chamScriptTag, /* 'cham' (CHAM) */ ++ cirtScriptTag, /* 'cirt' (CIRT) */ ++ cyrsScriptTag, /* 'cyrs' (CYRS) */ ++ egydScriptTag, /* 'egyd' (EGYD) */ ++ egyhScriptTag, /* 'egyh' (EGYH) */ ++ egypScriptTag, /* 'egyp' (EGYPTIAN_HIEROGLYPHS) */ ++ geokScriptTag, /* 'geok' (GEOK) */ ++ hansScriptTag, /* 'hans' (HANS) */ ++ hantScriptTag, /* 'hant' (HANT) */ ++ hmngScriptTag, /* 'hmng' (HMNG) */ ++ hungScriptTag, /* 'hung' (HUNG) */ ++ indsScriptTag, /* 'inds' (INDS) */ ++ javaScriptTag, /* 'java' (JAVANESE) */ ++ kaliScriptTag, /* 'kali' (KAYAH_LI) */ ++ latfScriptTag, /* 'latf' (LATF) */ ++ latgScriptTag, /* 'latg' (LATG) */ ++ lepcScriptTag, /* 'lepc' (LEPCHA) */ ++ linaScriptTag, /* 'lina' (LINA) */ ++ mandScriptTag, /* 'mand' (MANDAIC) */ ++ mayaScriptTag, /* 'maya' (MAYA) */ ++ meroScriptTag, /* 'mero' (MERO) */ ++ nkooScriptTag, /* 'nko ' (NKO) */ ++ orkhScriptTag, /* 'orkh' (OLD_TURKIC) */ ++ permScriptTag, /* 'perm' (PERM) */ ++ phagScriptTag, /* 'phag' (PHAGS_PA) */ ++ phnxScriptTag, /* 'phnx' (PHOENICIAN) */ ++ plrdScriptTag, /* 'plrd' (PLRD) */ ++ roroScriptTag, /* 'roro' (RORO) */ ++ saraScriptTag, /* 'sara' (SARA) */ ++ syreScriptTag, /* 'syre' (SYRE) */ ++ syrjScriptTag, /* 'syrj' (SYRJ) */ ++ syrnScriptTag, /* 'syrn' (SYRN) */ ++ tengScriptTag, /* 'teng' (TENG) */ ++ vaiiScriptTag, /* 'vai ' (VAI) */ ++ vispScriptTag, /* 'visp' (VISP) */ ++ xsuxScriptTag, /* 'xsux' (CUNEIFORM) */ ++ zxxxScriptTag, /* 'zxxx' (ZXXX) */ ++ zzzzScriptTag, /* 'zzzz' (UNKNOWN) */ ++ cariScriptTag, /* 'cari' (CARIAN) */ ++ jpanScriptTag, /* 'jpan' (JPAN) */ ++ lanaScriptTag, /* 'lana' (TAI_THAM) */ ++ lyciScriptTag, /* 'lyci' (LYCIAN) */ ++ lydiScriptTag, /* 'lydi' (LYDIAN) */ ++ olckScriptTag, /* 'olck' (OL_CHIKI) */ ++ rjngScriptTag, /* 'rjng' (REJANG) */ ++ saurScriptTag, /* 'saur' (SAURASHTRA) */ ++ sgnwScriptTag, /* 'sgnw' (SGNW) */ ++ sundScriptTag, /* 'sund' (SUNDANESE) */ ++ moonScriptTag, /* 'moon' (MOON) */ ++ mteiScriptTag, /* 'mtei' (MEETEI_MAYEK) */ ++ armiScriptTag, /* 'armi' (IMPERIAL_ARAMAIC) */ ++ avstScriptTag, /* 'avst' (AVESTAN) */ ++ cakmScriptTag, /* 'cakm' (CAKM) */ ++ koreScriptTag, /* 'kore' (KORE) */ ++ kthiScriptTag, /* 'kthi' (KAITHI) */ ++ maniScriptTag, /* 'mani' (MANI) */ ++ phliScriptTag, /* 'phli' (INSCRIPTIONAL_PAHLAVI) */ ++ phlpScriptTag, /* 'phlp' (PHLP) */ ++ phlvScriptTag, /* 'phlv' (PHLV) */ ++ prtiScriptTag, /* 'prti' (INSCRIPTIONAL_PARTHIAN) */ ++ samrScriptTag, /* 'samr' (SAMARITAN) */ ++ tavtScriptTag, /* 'tavt' (TAI_VIET) */ ++ zmthScriptTag, /* 'zmth' (ZMTH) */ ++ zsymScriptTag, /* 'zsym' (ZSYM) */ ++ bamuScriptTag, /* 'bamu' (BAMUM) */ ++ lisuScriptTag, /* 'lisu' (LISU) */ ++ nkgbScriptTag, /* 'nkgb' (NKGB) */ ++ sarbScriptTag, /* 'sarb' (OLD_SOUTH_ARABIAN) */ ++ bassScriptTag, /* 'bass' (BASS) */ ++ duplScriptTag, /* 'dupl' (DUPL) */ ++ elbaScriptTag, /* 'elba' (ELBA) */ ++ granScriptTag, /* 'gran' (GRAN) */ ++ kpelScriptTag, /* 'kpel' (KPEL) */ ++ lomaScriptTag, /* 'loma' (LOMA) */ ++ mendScriptTag, /* 'mend' (MEND) */ ++ mercScriptTag, /* 'merc' (MERC) */ ++ narbScriptTag, /* 'narb' (NARB) */ ++ nbatScriptTag, /* 'nbat' (NBAT) */ ++ palmScriptTag, /* 'palm' (PALM) */ ++ sindScriptTag, /* 'sind' (SIND) */ ++ waraScriptTag /* 'wara' (WARA) */ + }; + + const LETag OpenTypeLayoutEngine::languageTags[] = { +@@ -125,7 +219,49 @@ + urdLanguageTag, /* 'URD' (Urdu) */ + zhpLanguageTag, /* 'ZHP' (Chinese (Phonetic)) */ + zhsLanguageTag, /* 'ZHS' (Chinese (Simplified)) */ +- zhtLanguageTag /* 'ZHT' (Chinese (Traditional)) */ ++ zhtLanguageTag, /* 'ZHT' (Chinese (Traditional)) */ ++ afkLanguageTag, /* 'AFK' (Afrikaans) */ ++ belLanguageTag, /* 'BEL' (Belarussian) */ ++ bgrLanguageTag, /* 'BGR' (Bulgarian) */ ++ catLanguageTag, /* 'CAT' (Catalan) */ ++ cheLanguageTag, /* 'CHE' (Chechen) */ ++ copLanguageTag, /* 'COP' (Coptic) */ ++ csyLanguageTag, /* 'CSY' (Czech) */ ++ danLanguageTag, /* 'DAN' (Danish) */ ++ deuLanguageTag, /* 'DEU' (German) */ ++ dznLanguageTag, /* 'DZN' (Dzongkha) */ ++ ellLanguageTag, /* 'ELL' (Greek) */ ++ engLanguageTag, /* 'ENG' (English) */ ++ espLanguageTag, /* 'ESP' (Spanish) */ ++ etiLanguageTag, /* 'ETI' (Estonian) */ ++ euqLanguageTag, /* 'EUQ' (Basque) */ ++ finLanguageTag, /* 'FIN' (Finnish) */ ++ fraLanguageTag, /* 'FRA' (French) */ ++ gaeLanguageTag, /* 'GAE' (Gaelic) */ ++ hauLanguageTag, /* 'HAU' (Hausa) */ ++ hrvLanguageTag, /* 'HRV' (Croation) */ ++ hunLanguageTag, /* 'HUN' (Hungarian) */ ++ hyeLanguageTag, /* 'HYE' (Armenian) */ ++ indLanguageTag, /* 'IND' (Indonesian) */ ++ itaLanguageTag, /* 'ITA' (Italian) */ ++ khmLanguageTag, /* 'KHM' (Khmer) */ ++ mngLanguageTag, /* 'MNG' (Mongolian) */ ++ mtsLanguageTag, /* 'MTS' (Maltese) */ ++ nepLanguageTag, /* 'NEP' (Nepali) */ ++ nldLanguageTag, /* 'NLD' (Dutch) */ ++ pasLanguageTag, /* 'PAS' (Pashto) */ ++ plkLanguageTag, /* 'PLK' (Polish) */ ++ ptgLanguageTag, /* 'PTG' (Portuguese) */ ++ romLanguageTag, /* 'ROM' (Romanian) */ ++ rusLanguageTag, /* 'RUS' (Russian) */ ++ skyLanguageTag, /* 'SKY' (Slovak) */ ++ slvLanguageTag, /* 'SLV' (Slovenian) */ ++ sqiLanguageTag, /* 'SQI' (Albanian) */ ++ srbLanguageTag, /* 'SRB' (Serbian) */ ++ sveLanguageTag, /* 'SVE' (Swedish) */ ++ tibLanguageTag, /* 'TIB' (Tibetan) */ ++ trkLanguageTag, /* 'TRK' (Turkish) */ ++ welLanguageTag /* 'WEL' (Welsh) */ + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ScriptAndLanguageTags.h b/src/share/native/sun/font/layout/ScriptAndLanguageTags.h +--- jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.h ++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguageTags.h +@@ -25,10 +25,12 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004. All Rights Reserved. ++ * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. ++ * ++ * Generated on: 10/26/2010 02:53:33 PM PDT + */ + + #ifndef __SCRIPTANDLANGUAGES_H +@@ -36,55 +38,64 @@ + + #include "LETypes.h" + +-U_NAMESPACE_BEGIN +- + /** + * \file + * \internal + */ + ++U_NAMESPACE_BEGIN ++ + const LETag zyyyScriptTag = 0x7A797979; /* 'zyyy' (COMMON) */ +-const LETag qaaiScriptTag = 0x71616169; /* 'qaai' (INHERITED) */ ++const LETag zinhScriptTag = 0x7A696E68; /* 'zinh' (INHERITED) */ + const LETag arabScriptTag = 0x61726162; /* 'arab' (ARABIC) */ + const LETag armnScriptTag = 0x61726D6E; /* 'armn' (ARMENIAN) */ + const LETag bengScriptTag = 0x62656E67; /* 'beng' (BENGALI) */ ++const LETag bng2ScriptTag = 0x626E6732; /* 'bng2' (BENGALI v.2) (manually added) */ + const LETag bopoScriptTag = 0x626F706F; /* 'bopo' (BOPOMOFO) */ + const LETag cherScriptTag = 0x63686572; /* 'cher' (CHEROKEE) */ +-const LETag qaacScriptTag = 0x71616163; /* 'qaac' (COPTIC) */ ++const LETag coptScriptTag = 0x636F7074; /* 'copt' (COPTIC) */ + const LETag cyrlScriptTag = 0x6379726C; /* 'cyrl' (CYRILLIC) */ + const LETag dsrtScriptTag = 0x64737274; /* 'dsrt' (DESERET) */ + const LETag devaScriptTag = 0x64657661; /* 'deva' (DEVANAGARI) */ ++const LETag dev2ScriptTag = 0x64657632; /* 'dev2' (DEVANAGARI v.2) (manually added) */ + const LETag ethiScriptTag = 0x65746869; /* 'ethi' (ETHIOPIC) */ + const LETag georScriptTag = 0x67656F72; /* 'geor' (GEORGIAN) */ + const LETag gothScriptTag = 0x676F7468; /* 'goth' (GOTHIC) */ + const LETag grekScriptTag = 0x6772656B; /* 'grek' (GREEK) */ + const LETag gujrScriptTag = 0x67756A72; /* 'gujr' (GUJARATI) */ ++const LETag gjr2ScriptTag = 0x676A7232; /* 'gjr2' (GUJARATI v.2) (manually added) */ + const LETag guruScriptTag = 0x67757275; /* 'guru' (GURMUKHI) */ ++const LETag gur2ScriptTag = 0x67757232; /* 'gur2' (GURMUKHI v.2) (manually added) */ + const LETag haniScriptTag = 0x68616E69; /* 'hani' (HAN) */ + const LETag hangScriptTag = 0x68616E67; /* 'hang' (HANGUL) */ + const LETag hebrScriptTag = 0x68656272; /* 'hebr' (HEBREW) */ + const LETag hiraScriptTag = 0x68697261; /* 'hira' (HIRAGANA) */ + const LETag kndaScriptTag = 0x6B6E6461; /* 'knda' (KANNADA) */ ++const LETag knd2ScriptTag = 0x6B6E6432; /* 'knd2' (KANNADA v.2) (manually added) */ + const LETag kanaScriptTag = 0x6B616E61; /* 'kana' (KATAKANA) */ + const LETag khmrScriptTag = 0x6B686D72; /* 'khmr' (KHMER) */ +-const LETag laooScriptTag = 0x6C616F6F; /* 'laoo' (LAO) */ ++const LETag laooScriptTag = 0x6C616F20; /* 'lao ' (LAO) */ + const LETag latnScriptTag = 0x6C61746E; /* 'latn' (LATIN) */ + const LETag mlymScriptTag = 0x6D6C796D; /* 'mlym' (MALAYALAM) */ ++const LETag mlm2ScriptTag = 0x6D6C6D32; /* 'mlm2' (MALAYALAM v.2) (manually added) */ + const LETag mongScriptTag = 0x6D6F6E67; /* 'mong' (MONGOLIAN) */ + const LETag mymrScriptTag = 0x6D796D72; /* 'mymr' (MYANMAR) */ + const LETag ogamScriptTag = 0x6F67616D; /* 'ogam' (OGHAM) */ + const LETag italScriptTag = 0x6974616C; /* 'ital' (OLD_ITALIC) */ + const LETag oryaScriptTag = 0x6F727961; /* 'orya' (ORIYA) */ ++const LETag ory2ScriptTag = 0x6F727932; /* 'ory2' (ORIYA v.2) (manually added) */ + const LETag runrScriptTag = 0x72756E72; /* 'runr' (RUNIC) */ + const LETag sinhScriptTag = 0x73696E68; /* 'sinh' (SINHALA) */ + const LETag syrcScriptTag = 0x73797263; /* 'syrc' (SYRIAC) */ + const LETag tamlScriptTag = 0x74616D6C; /* 'taml' (TAMIL) */ ++const LETag tml2ScriptTag = 0x746D6C32; /* 'tml2' (TAMIL v.2) (manually added) */ + const LETag teluScriptTag = 0x74656C75; /* 'telu' (TELUGU) */ ++const LETag tel2ScriptTag = 0x74656C32; /* 'tel2' (TELUGU v.2) (manually added) */ + const LETag thaaScriptTag = 0x74686161; /* 'thaa' (THAANA) */ + const LETag thaiScriptTag = 0x74686169; /* 'thai' (THAI) */ + const LETag tibtScriptTag = 0x74696274; /* 'tibt' (TIBETAN) */ + const LETag cansScriptTag = 0x63616E73; /* 'cans' (CANADIAN_ABORIGINAL) */ +-const LETag yiiiScriptTag = 0x79696969; /* 'yiii' (YI) */ ++const LETag yiiiScriptTag = 0x79692020; /* 'yi ' (YI) */ + const LETag tglgScriptTag = 0x74676C67; /* 'tglg' (TAGALOG) */ + const LETag hanoScriptTag = 0x68616E6F; /* 'hano' (HANUNOO) */ + const LETag buhdScriptTag = 0x62756864; /* 'buhd' (BUHID) */ +@@ -98,6 +109,98 @@ + const LETag taleScriptTag = 0x74616C65; /* 'tale' (TAI_LE) */ + const LETag ugarScriptTag = 0x75676172; /* 'ugar' (UGARITIC) */ + const LETag hrktScriptTag = 0x68726B74; /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ ++const LETag bugiScriptTag = 0x62756769; /* 'bugi' (BUGINESE) */ ++const LETag glagScriptTag = 0x676C6167; /* 'glag' (GLAGOLITIC) */ ++const LETag kharScriptTag = 0x6B686172; /* 'khar' (KHAROSHTHI) */ ++const LETag syloScriptTag = 0x73796C6F; /* 'sylo' (SYLOTI_NAGRI) */ ++const LETag taluScriptTag = 0x74616C75; /* 'talu' (NEW_TAI_LUE) */ ++const LETag tfngScriptTag = 0x74666E67; /* 'tfng' (TIFINAGH) */ ++const LETag xpeoScriptTag = 0x7870656F; /* 'xpeo' (OLD_PERSIAN) */ ++const LETag baliScriptTag = 0x62616C69; /* 'bali' (BALINESE) */ ++const LETag batkScriptTag = 0x6261746B; /* 'batk' (BATAK) */ ++const LETag blisScriptTag = 0x626C6973; /* 'blis' (BLIS) */ ++const LETag brahScriptTag = 0x62726168; /* 'brah' (BRAHMI) */ ++const LETag chamScriptTag = 0x6368616D; /* 'cham' (CHAM) */ ++const LETag cirtScriptTag = 0x63697274; /* 'cirt' (CIRT) */ ++const LETag cyrsScriptTag = 0x63797273; /* 'cyrs' (CYRS) */ ++const LETag egydScriptTag = 0x65677964; /* 'egyd' (EGYD) */ ++const LETag egyhScriptTag = 0x65677968; /* 'egyh' (EGYH) */ ++const LETag egypScriptTag = 0x65677970; /* 'egyp' (EGYPTIAN_HIEROGLYPHS) */ ++const LETag geokScriptTag = 0x67656F6B; /* 'geok' (GEOK) */ ++const LETag hansScriptTag = 0x68616E73; /* 'hans' (HANS) */ ++const LETag hantScriptTag = 0x68616E74; /* 'hant' (HANT) */ ++const LETag hmngScriptTag = 0x686D6E67; /* 'hmng' (HMNG) */ ++const LETag hungScriptTag = 0x68756E67; /* 'hung' (HUNG) */ ++const LETag indsScriptTag = 0x696E6473; /* 'inds' (INDS) */ ++const LETag javaScriptTag = 0x6A617661; /* 'java' (JAVANESE) */ ++const LETag kaliScriptTag = 0x6B616C69; /* 'kali' (KAYAH_LI) */ ++const LETag latfScriptTag = 0x6C617466; /* 'latf' (LATF) */ ++const LETag latgScriptTag = 0x6C617467; /* 'latg' (LATG) */ ++const LETag lepcScriptTag = 0x6C657063; /* 'lepc' (LEPCHA) */ ++const LETag linaScriptTag = 0x6C696E61; /* 'lina' (LINA) */ ++const LETag mandScriptTag = 0x6D616E64; /* 'mand' (MANDAIC) */ ++const LETag mayaScriptTag = 0x6D617961; /* 'maya' (MAYA) */ ++const LETag meroScriptTag = 0x6D65726F; /* 'mero' (MERO) */ ++const LETag nkooScriptTag = 0x6E6B6F20; /* 'nko ' (NKO) */ ++const LETag orkhScriptTag = 0x6F726B68; /* 'orkh' (OLD_TURKIC) */ ++const LETag permScriptTag = 0x7065726D; /* 'perm' (PERM) */ ++const LETag phagScriptTag = 0x70686167; /* 'phag' (PHAGS_PA) */ ++const LETag phnxScriptTag = 0x70686E78; /* 'phnx' (PHOENICIAN) */ ++const LETag plrdScriptTag = 0x706C7264; /* 'plrd' (PLRD) */ ++const LETag roroScriptTag = 0x726F726F; /* 'roro' (RORO) */ ++const LETag saraScriptTag = 0x73617261; /* 'sara' (SARA) */ ++const LETag syreScriptTag = 0x73797265; /* 'syre' (SYRE) */ ++const LETag syrjScriptTag = 0x7379726A; /* 'syrj' (SYRJ) */ ++const LETag syrnScriptTag = 0x7379726E; /* 'syrn' (SYRN) */ ++const LETag tengScriptTag = 0x74656E67; /* 'teng' (TENG) */ ++const LETag vaiiScriptTag = 0x76616920; /* 'vai ' (VAI) */ ++const LETag vispScriptTag = 0x76697370; /* 'visp' (VISP) */ ++const LETag xsuxScriptTag = 0x78737578; /* 'xsux' (CUNEIFORM) */ ++const LETag zxxxScriptTag = 0x7A787878; /* 'zxxx' (ZXXX) */ ++const LETag zzzzScriptTag = 0x7A7A7A7A; /* 'zzzz' (UNKNOWN) */ ++const LETag cariScriptTag = 0x63617269; /* 'cari' (CARIAN) */ ++const LETag jpanScriptTag = 0x6A70616E; /* 'jpan' (JPAN) */ ++const LETag lanaScriptTag = 0x6C616E61; /* 'lana' (TAI_THAM) */ ++const LETag lyciScriptTag = 0x6C796369; /* 'lyci' (LYCIAN) */ ++const LETag lydiScriptTag = 0x6C796469; /* 'lydi' (LYDIAN) */ ++const LETag olckScriptTag = 0x6F6C636B; /* 'olck' (OL_CHIKI) */ ++const LETag rjngScriptTag = 0x726A6E67; /* 'rjng' (REJANG) */ ++const LETag saurScriptTag = 0x73617572; /* 'saur' (SAURASHTRA) */ ++const LETag sgnwScriptTag = 0x73676E77; /* 'sgnw' (SGNW) */ ++const LETag sundScriptTag = 0x73756E64; /* 'sund' (SUNDANESE) */ ++const LETag moonScriptTag = 0x6D6F6F6E; /* 'moon' (MOON) */ ++const LETag mteiScriptTag = 0x6D746569; /* 'mtei' (MEETEI_MAYEK) */ ++const LETag armiScriptTag = 0x61726D69; /* 'armi' (IMPERIAL_ARAMAIC) */ ++const LETag avstScriptTag = 0x61767374; /* 'avst' (AVESTAN) */ ++const LETag cakmScriptTag = 0x63616B6D; /* 'cakm' (CAKM) */ ++const LETag koreScriptTag = 0x6B6F7265; /* 'kore' (KORE) */ ++const LETag kthiScriptTag = 0x6B746869; /* 'kthi' (KAITHI) */ ++const LETag maniScriptTag = 0x6D616E69; /* 'mani' (MANI) */ ++const LETag phliScriptTag = 0x70686C69; /* 'phli' (INSCRIPTIONAL_PAHLAVI) */ ++const LETag phlpScriptTag = 0x70686C70; /* 'phlp' (PHLP) */ ++const LETag phlvScriptTag = 0x70686C76; /* 'phlv' (PHLV) */ ++const LETag prtiScriptTag = 0x70727469; /* 'prti' (INSCRIPTIONAL_PARTHIAN) */ ++const LETag samrScriptTag = 0x73616D72; /* 'samr' (SAMARITAN) */ ++const LETag tavtScriptTag = 0x74617674; /* 'tavt' (TAI_VIET) */ ++const LETag zmthScriptTag = 0x7A6D7468; /* 'zmth' (ZMTH) */ ++const LETag zsymScriptTag = 0x7A73796D; /* 'zsym' (ZSYM) */ ++const LETag bamuScriptTag = 0x62616D75; /* 'bamu' (BAMUM) */ ++const LETag lisuScriptTag = 0x6C697375; /* 'lisu' (LISU) */ ++const LETag nkgbScriptTag = 0x6E6B6762; /* 'nkgb' (NKGB) */ ++const LETag sarbScriptTag = 0x73617262; /* 'sarb' (OLD_SOUTH_ARABIAN) */ ++const LETag bassScriptTag = 0x62617373; /* 'bass' (BASS) */ ++const LETag duplScriptTag = 0x6475706C; /* 'dupl' (DUPL) */ ++const LETag elbaScriptTag = 0x656C6261; /* 'elba' (ELBA) */ ++const LETag granScriptTag = 0x6772616E; /* 'gran' (GRAN) */ ++const LETag kpelScriptTag = 0x6B70656C; /* 'kpel' (KPEL) */ ++const LETag lomaScriptTag = 0x6C6F6D61; /* 'loma' (LOMA) */ ++const LETag mendScriptTag = 0x6D656E64; /* 'mend' (MEND) */ ++const LETag mercScriptTag = 0x6D657263; /* 'merc' (MERC) */ ++const LETag narbScriptTag = 0x6E617262; /* 'narb' (NARB) */ ++const LETag nbatScriptTag = 0x6E626174; /* 'nbat' (NBAT) */ ++const LETag palmScriptTag = 0x70616C6D; /* 'palm' (PALM) */ ++const LETag sindScriptTag = 0x73696E64; /* 'sind' (SIND) */ ++const LETag waraScriptTag = 0x77617261; /* 'wara' (WARA) */ + + const LETag nullScriptTag = 0x00000000; /* '' (NULL) */ + +@@ -132,6 +235,48 @@ + const LETag zhpLanguageTag = 0x5A485020; /* 'ZHP' (Chinese (Phonetic)) */ + const LETag zhsLanguageTag = 0x5A485320; /* 'ZHS' (Chinese (Simplified)) */ + const LETag zhtLanguageTag = 0x5A485420; /* 'ZHT' (Chinese (Traditional)) */ ++const LETag afkLanguageTag = 0x41464B20; /* 'AFK' (Afrikaans) */ ++const LETag belLanguageTag = 0x42454C20; /* 'BEL' (Belarussian) */ ++const LETag bgrLanguageTag = 0x42475220; /* 'BGR' (Bulgarian) */ ++const LETag catLanguageTag = 0x43415420; /* 'CAT' (Catalan) */ ++const LETag cheLanguageTag = 0x43484520; /* 'CHE' (Chechen) */ ++const LETag copLanguageTag = 0x434F5020; /* 'COP' (Coptic) */ ++const LETag csyLanguageTag = 0x43535920; /* 'CSY' (Czech) */ ++const LETag danLanguageTag = 0x44414E20; /* 'DAN' (Danish) */ ++const LETag deuLanguageTag = 0x44455520; /* 'DEU' (German) */ ++const LETag dznLanguageTag = 0x445A4E20; /* 'DZN' (Dzongkha) */ ++const LETag ellLanguageTag = 0x454C4C20; /* 'ELL' (Greek) */ ++const LETag engLanguageTag = 0x454E4720; /* 'ENG' (English) */ ++const LETag espLanguageTag = 0x45535020; /* 'ESP' (Spanish) */ ++const LETag etiLanguageTag = 0x45544920; /* 'ETI' (Estonian) */ ++const LETag euqLanguageTag = 0x45555120; /* 'EUQ' (Basque) */ ++const LETag finLanguageTag = 0x46494E20; /* 'FIN' (Finnish) */ ++const LETag fraLanguageTag = 0x46524120; /* 'FRA' (French) */ ++const LETag gaeLanguageTag = 0x47414520; /* 'GAE' (Gaelic) */ ++const LETag hauLanguageTag = 0x48415520; /* 'HAU' (Hausa) */ ++const LETag hrvLanguageTag = 0x48525620; /* 'HRV' (Croation) */ ++const LETag hunLanguageTag = 0x48554E20; /* 'HUN' (Hungarian) */ ++const LETag hyeLanguageTag = 0x48594520; /* 'HYE' (Armenian) */ ++const LETag indLanguageTag = 0x494E4420; /* 'IND' (Indonesian) */ ++const LETag itaLanguageTag = 0x49544120; /* 'ITA' (Italian) */ ++const LETag khmLanguageTag = 0x4B484D20; /* 'KHM' (Khmer) */ ++const LETag mngLanguageTag = 0x4D4E4720; /* 'MNG' (Mongolian) */ ++const LETag mtsLanguageTag = 0x4D545320; /* 'MTS' (Maltese) */ ++const LETag nepLanguageTag = 0x4E455020; /* 'NEP' (Nepali) */ ++const LETag nldLanguageTag = 0x4E4C4420; /* 'NLD' (Dutch) */ ++const LETag pasLanguageTag = 0x50415320; /* 'PAS' (Pashto) */ ++const LETag plkLanguageTag = 0x504C4B20; /* 'PLK' (Polish) */ ++const LETag ptgLanguageTag = 0x50544720; /* 'PTG' (Portuguese) */ ++const LETag romLanguageTag = 0x524F4D20; /* 'ROM' (Romanian) */ ++const LETag rusLanguageTag = 0x52555320; /* 'RUS' (Russian) */ ++const LETag skyLanguageTag = 0x534B5920; /* 'SKY' (Slovak) */ ++const LETag slvLanguageTag = 0x534C5620; /* 'SLV' (Slovenian) */ ++const LETag sqiLanguageTag = 0x53514920; /* 'SQI' (Albanian) */ ++const LETag srbLanguageTag = 0x53524220; /* 'SRB' (Serbian) */ ++const LETag sveLanguageTag = 0x53564520; /* 'SVE' (Swedish) */ ++const LETag tibLanguageTag = 0x54494220; /* 'TIB' (Tibetan) */ ++const LETag trkLanguageTag = 0x54524B20; /* 'TRK' (Turkish) */ ++const LETag welLanguageTag = 0x57454C20; /* 'WEL' (Welsh) */ + + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp b/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp +--- jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp +@@ -74,7 +74,7 @@ + + if (offset != 0) { + TTGlyphID *glyphArray = (TTGlyphID *) ((char *) subtableHeader + offset); +- TTGlyphID newGlyph = (TTGlyphID)SWAPW(glyphArray[LE_GET_GLYPH(thisGlyph) - firstGlyph]); ++ TTGlyphID newGlyph = SWAPW(glyphArray[LE_GET_GLYPH(thisGlyph) - firstGlyph]); + + glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); + } +diff --git a/src/share/native/sun/font/layout/ShapingTypeData.cpp b/src/share/native/sun/font/layout/ShapingTypeData.cpp +--- jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp ++++ jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved. ++ * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. +@@ -39,72 +39,87 @@ + U_NAMESPACE_BEGIN + + const le_uint8 ArabicShaping::shapingTypeTable[] = { +- 0x00, 0x02, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0x05, 0x03, 0x00, 0x03, 0x6F, 0x00, 0x05, +- 0x04, 0x83, 0x04, 0x86, 0x00, 0x05, 0x04, 0x88, 0x04, 0x89, 0x00, 0x05, 0x05, 0x91, 0x05, 0xB9, +- 0x00, 0x05, 0x05, 0xBB, 0x05, 0xBD, 0x00, 0x05, 0x05, 0xBF, 0x05, 0xBF, 0x00, 0x05, 0x05, 0xC1, +- 0x05, 0xC2, 0x00, 0x05, 0x05, 0xC4, 0x05, 0xC5, 0x00, 0x05, 0x05, 0xC7, 0x05, 0xC7, 0x00, 0x05, +- 0x06, 0x10, 0x06, 0x15, 0x00, 0x05, 0x06, 0x22, 0x06, 0x25, 0x00, 0x04, 0x06, 0x26, 0x06, 0x26, +- 0x00, 0x02, 0x06, 0x27, 0x06, 0x27, 0x00, 0x04, 0x06, 0x28, 0x06, 0x28, 0x00, 0x02, 0x06, 0x29, +- 0x06, 0x29, 0x00, 0x04, 0x06, 0x2A, 0x06, 0x2E, 0x00, 0x02, 0x06, 0x2F, 0x06, 0x32, 0x00, 0x04, +- 0x06, 0x33, 0x06, 0x3A, 0x00, 0x02, 0x06, 0x40, 0x06, 0x40, 0x00, 0x01, 0x06, 0x41, 0x06, 0x47, +- 0x00, 0x02, 0x06, 0x48, 0x06, 0x48, 0x00, 0x04, 0x06, 0x49, 0x06, 0x4A, 0x00, 0x02, 0x06, 0x4B, +- 0x06, 0x5E, 0x00, 0x05, 0x06, 0x6E, 0x06, 0x6F, 0x00, 0x02, 0x06, 0x70, 0x06, 0x70, 0x00, 0x05, +- 0x06, 0x71, 0x06, 0x73, 0x00, 0x04, 0x06, 0x75, 0x06, 0x77, 0x00, 0x04, 0x06, 0x78, 0x06, 0x87, +- 0x00, 0x02, 0x06, 0x88, 0x06, 0x99, 0x00, 0x04, 0x06, 0x9A, 0x06, 0xBF, 0x00, 0x02, 0x06, 0xC0, +- 0x06, 0xC0, 0x00, 0x04, 0x06, 0xC1, 0x06, 0xC2, 0x00, 0x02, 0x06, 0xC3, 0x06, 0xCB, 0x00, 0x04, +- 0x06, 0xCC, 0x06, 0xCC, 0x00, 0x02, 0x06, 0xCD, 0x06, 0xCD, 0x00, 0x04, 0x06, 0xCE, 0x06, 0xCE, +- 0x00, 0x02, 0x06, 0xCF, 0x06, 0xCF, 0x00, 0x04, 0x06, 0xD0, 0x06, 0xD1, 0x00, 0x02, 0x06, 0xD2, +- 0x06, 0xD3, 0x00, 0x04, 0x06, 0xD5, 0x06, 0xD5, 0x00, 0x04, 0x06, 0xD6, 0x06, 0xDC, 0x00, 0x05, +- 0x06, 0xDE, 0x06, 0xE4, 0x00, 0x05, 0x06, 0xE7, 0x06, 0xE8, 0x00, 0x05, 0x06, 0xEA, 0x06, 0xED, +- 0x00, 0x05, 0x06, 0xEE, 0x06, 0xEF, 0x00, 0x04, 0x06, 0xFA, 0x06, 0xFC, 0x00, 0x02, 0x06, 0xFF, +- 0x06, 0xFF, 0x00, 0x02, 0x07, 0x0F, 0x07, 0x0F, 0x00, 0x05, 0x07, 0x10, 0x07, 0x10, 0x00, 0x04, +- 0x07, 0x11, 0x07, 0x11, 0x00, 0x05, 0x07, 0x12, 0x07, 0x14, 0x00, 0x02, 0x07, 0x15, 0x07, 0x19, +- 0x00, 0x04, 0x07, 0x1A, 0x07, 0x1D, 0x00, 0x02, 0x07, 0x1E, 0x07, 0x1E, 0x00, 0x04, 0x07, 0x1F, +- 0x07, 0x27, 0x00, 0x02, 0x07, 0x28, 0x07, 0x28, 0x00, 0x04, 0x07, 0x29, 0x07, 0x29, 0x00, 0x02, +- 0x07, 0x2A, 0x07, 0x2A, 0x00, 0x04, 0x07, 0x2B, 0x07, 0x2B, 0x00, 0x02, 0x07, 0x2C, 0x07, 0x2C, +- 0x00, 0x04, 0x07, 0x2D, 0x07, 0x2E, 0x00, 0x02, 0x07, 0x2F, 0x07, 0x2F, 0x00, 0x04, 0x07, 0x30, +- 0x07, 0x4A, 0x00, 0x05, 0x07, 0x4D, 0x07, 0x4D, 0x00, 0x04, 0x07, 0x4E, 0x07, 0x58, 0x00, 0x02, +- 0x07, 0x59, 0x07, 0x5B, 0x00, 0x04, 0x07, 0x5C, 0x07, 0x6A, 0x00, 0x02, 0x07, 0x6B, 0x07, 0x6C, +- 0x00, 0x04, 0x07, 0x6D, 0x07, 0x6D, 0x00, 0x02, 0x07, 0xA6, 0x07, 0xB0, 0x00, 0x05, 0x09, 0x01, +- 0x09, 0x02, 0x00, 0x05, 0x09, 0x3C, 0x09, 0x3C, 0x00, 0x05, 0x09, 0x41, 0x09, 0x48, 0x00, 0x05, +- 0x09, 0x4D, 0x09, 0x4D, 0x00, 0x05, 0x09, 0x51, 0x09, 0x54, 0x00, 0x05, 0x09, 0x62, 0x09, 0x63, +- 0x00, 0x05, 0x09, 0x81, 0x09, 0x81, 0x00, 0x05, 0x09, 0xBC, 0x09, 0xBC, 0x00, 0x05, 0x09, 0xC1, +- 0x09, 0xC4, 0x00, 0x05, 0x09, 0xCD, 0x09, 0xCD, 0x00, 0x05, 0x09, 0xE2, 0x09, 0xE3, 0x00, 0x05, +- 0x0A, 0x01, 0x0A, 0x02, 0x00, 0x05, 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x05, 0x0A, 0x41, 0x0A, 0x42, +- 0x00, 0x05, 0x0A, 0x47, 0x0A, 0x48, 0x00, 0x05, 0x0A, 0x4B, 0x0A, 0x4D, 0x00, 0x05, 0x0A, 0x70, +- 0x0A, 0x71, 0x00, 0x05, 0x0A, 0x81, 0x0A, 0x82, 0x00, 0x05, 0x0A, 0xBC, 0x0A, 0xBC, 0x00, 0x05, +- 0x0A, 0xC1, 0x0A, 0xC5, 0x00, 0x05, 0x0A, 0xC7, 0x0A, 0xC8, 0x00, 0x05, 0x0A, 0xCD, 0x0A, 0xCD, +- 0x00, 0x05, 0x0A, 0xE2, 0x0A, 0xE3, 0x00, 0x05, 0x0B, 0x01, 0x0B, 0x01, 0x00, 0x05, 0x0B, 0x3C, +- 0x0B, 0x3C, 0x00, 0x05, 0x0B, 0x3F, 0x0B, 0x3F, 0x00, 0x05, 0x0B, 0x41, 0x0B, 0x43, 0x00, 0x05, +- 0x0B, 0x4D, 0x0B, 0x4D, 0x00, 0x05, 0x0B, 0x56, 0x0B, 0x56, 0x00, 0x05, 0x0B, 0x82, 0x0B, 0x82, +- 0x00, 0x05, 0x0B, 0xC0, 0x0B, 0xC0, 0x00, 0x05, 0x0B, 0xCD, 0x0B, 0xCD, 0x00, 0x05, 0x0C, 0x3E, +- 0x0C, 0x40, 0x00, 0x05, 0x0C, 0x46, 0x0C, 0x48, 0x00, 0x05, 0x0C, 0x4A, 0x0C, 0x4D, 0x00, 0x05, +- 0x0C, 0x55, 0x0C, 0x56, 0x00, 0x05, 0x0C, 0xBC, 0x0C, 0xBC, 0x00, 0x05, 0x0C, 0xBF, 0x0C, 0xBF, +- 0x00, 0x05, 0x0C, 0xC6, 0x0C, 0xC6, 0x00, 0x05, 0x0C, 0xCC, 0x0C, 0xCD, 0x00, 0x05, 0x0D, 0x41, +- 0x0D, 0x43, 0x00, 0x05, 0x0D, 0x4D, 0x0D, 0x4D, 0x00, 0x05, 0x0D, 0xCA, 0x0D, 0xCA, 0x00, 0x05, +- 0x0D, 0xD2, 0x0D, 0xD4, 0x00, 0x05, 0x0D, 0xD6, 0x0D, 0xD6, 0x00, 0x05, 0x0E, 0x31, 0x0E, 0x31, +- 0x00, 0x05, 0x0E, 0x34, 0x0E, 0x3A, 0x00, 0x05, 0x0E, 0x47, 0x0E, 0x4E, 0x00, 0x05, 0x0E, 0xB1, +- 0x0E, 0xB1, 0x00, 0x05, 0x0E, 0xB4, 0x0E, 0xB9, 0x00, 0x05, 0x0E, 0xBB, 0x0E, 0xBC, 0x00, 0x05, +- 0x0E, 0xC8, 0x0E, 0xCD, 0x00, 0x05, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0x05, 0x0F, 0x35, 0x0F, 0x35, +- 0x00, 0x05, 0x0F, 0x37, 0x0F, 0x37, 0x00, 0x05, 0x0F, 0x39, 0x0F, 0x39, 0x00, 0x05, 0x0F, 0x71, +- 0x0F, 0x7E, 0x00, 0x05, 0x0F, 0x80, 0x0F, 0x84, 0x00, 0x05, 0x0F, 0x86, 0x0F, 0x87, 0x00, 0x05, +- 0x0F, 0x90, 0x0F, 0x97, 0x00, 0x05, 0x0F, 0x99, 0x0F, 0xBC, 0x00, 0x05, 0x0F, 0xC6, 0x0F, 0xC6, +- 0x00, 0x05, 0x10, 0x2D, 0x10, 0x30, 0x00, 0x05, 0x10, 0x32, 0x10, 0x32, 0x00, 0x05, 0x10, 0x36, +- 0x10, 0x37, 0x00, 0x05, 0x10, 0x39, 0x10, 0x39, 0x00, 0x05, 0x10, 0x58, 0x10, 0x59, 0x00, 0x05, +- 0x13, 0x5F, 0x13, 0x5F, 0x00, 0x05, 0x17, 0x12, 0x17, 0x14, 0x00, 0x05, 0x17, 0x32, 0x17, 0x34, +- 0x00, 0x05, 0x17, 0x52, 0x17, 0x53, 0x00, 0x05, 0x17, 0x72, 0x17, 0x73, 0x00, 0x05, 0x17, 0xB4, +- 0x17, 0xB5, 0x00, 0x05, 0x17, 0xB7, 0x17, 0xBD, 0x00, 0x05, 0x17, 0xC6, 0x17, 0xC6, 0x00, 0x05, +- 0x17, 0xC9, 0x17, 0xD3, 0x00, 0x05, 0x17, 0xDD, 0x17, 0xDD, 0x00, 0x05, 0x18, 0x0B, 0x18, 0x0D, +- 0x00, 0x05, 0x18, 0xA9, 0x18, 0xA9, 0x00, 0x05, 0x19, 0x20, 0x19, 0x22, 0x00, 0x05, 0x19, 0x27, +- 0x19, 0x28, 0x00, 0x05, 0x19, 0x32, 0x19, 0x32, 0x00, 0x05, 0x19, 0x39, 0x19, 0x3B, 0x00, 0x05, +- 0x1A, 0x17, 0x1A, 0x18, 0x00, 0x05, 0x1D, 0xC0, 0x1D, 0xC3, 0x00, 0x05, 0x20, 0x0B, 0x20, 0x0B, +- 0x00, 0x05, 0x20, 0x0D, 0x20, 0x0D, 0x00, 0x01, 0x20, 0x0E, 0x20, 0x0F, 0x00, 0x05, 0x20, 0x2A, +- 0x20, 0x2E, 0x00, 0x05, 0x20, 0x60, 0x20, 0x63, 0x00, 0x05, 0x20, 0x6A, 0x20, 0x6F, 0x00, 0x05, +- 0x20, 0xD0, 0x20, 0xEB, 0x00, 0x05, 0x30, 0x2A, 0x30, 0x2F, 0x00, 0x05, 0x30, 0x99, 0x30, 0x9A, +- 0x00, 0x05, 0xA8, 0x06, 0xA8, 0x06, 0x00, 0x05, 0xA8, 0x0B, 0xA8, 0x0B, 0x00, 0x05, 0xA8, 0x25, +- 0xA8, 0x26, 0x00, 0x05, 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x05, 0xFE, 0x00, 0xFE, 0x0F, 0x00, 0x05, +- 0xFE, 0x20, 0xFE, 0x23, 0x00, 0x05, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x05, 0xFF, 0xF9, 0xFF, 0xFB, +- 0x00, 0x05 ++ 0x00, 0x02, 0x00, 0xD7, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0x05, 0x03, 0x00, 0x03, 0x6F, 0x00, 0x05, ++ 0x04, 0x83, 0x04, 0x89, 0x00, 0x05, 0x05, 0x91, 0x05, 0xBD, 0x00, 0x05, 0x05, 0xBF, 0x05, 0xBF, ++ 0x00, 0x05, 0x05, 0xC1, 0x05, 0xC2, 0x00, 0x05, 0x05, 0xC4, 0x05, 0xC5, 0x00, 0x05, 0x05, 0xC7, ++ 0x05, 0xC7, 0x00, 0x05, 0x06, 0x10, 0x06, 0x1A, 0x00, 0x05, 0x06, 0x22, 0x06, 0x25, 0x00, 0x04, ++ 0x06, 0x26, 0x06, 0x26, 0x00, 0x02, 0x06, 0x27, 0x06, 0x27, 0x00, 0x04, 0x06, 0x28, 0x06, 0x28, ++ 0x00, 0x02, 0x06, 0x29, 0x06, 0x29, 0x00, 0x04, 0x06, 0x2A, 0x06, 0x2E, 0x00, 0x02, 0x06, 0x2F, ++ 0x06, 0x32, 0x00, 0x04, 0x06, 0x33, 0x06, 0x3F, 0x00, 0x02, 0x06, 0x40, 0x06, 0x40, 0x00, 0x01, ++ 0x06, 0x41, 0x06, 0x47, 0x00, 0x02, 0x06, 0x48, 0x06, 0x48, 0x00, 0x04, 0x06, 0x49, 0x06, 0x4A, ++ 0x00, 0x02, 0x06, 0x4B, 0x06, 0x5E, 0x00, 0x05, 0x06, 0x6E, 0x06, 0x6F, 0x00, 0x02, 0x06, 0x70, ++ 0x06, 0x70, 0x00, 0x05, 0x06, 0x71, 0x06, 0x73, 0x00, 0x04, 0x06, 0x75, 0x06, 0x77, 0x00, 0x04, ++ 0x06, 0x78, 0x06, 0x87, 0x00, 0x02, 0x06, 0x88, 0x06, 0x99, 0x00, 0x04, 0x06, 0x9A, 0x06, 0xBF, ++ 0x00, 0x02, 0x06, 0xC0, 0x06, 0xC0, 0x00, 0x04, 0x06, 0xC1, 0x06, 0xC2, 0x00, 0x02, 0x06, 0xC3, ++ 0x06, 0xCB, 0x00, 0x04, 0x06, 0xCC, 0x06, 0xCC, 0x00, 0x02, 0x06, 0xCD, 0x06, 0xCD, 0x00, 0x04, ++ 0x06, 0xCE, 0x06, 0xCE, 0x00, 0x02, 0x06, 0xCF, 0x06, 0xCF, 0x00, 0x04, 0x06, 0xD0, 0x06, 0xD1, ++ 0x00, 0x02, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04, 0x06, 0xD5, 0x06, 0xD5, 0x00, 0x04, 0x06, 0xD6, ++ 0x06, 0xDC, 0x00, 0x05, 0x06, 0xDE, 0x06, 0xE4, 0x00, 0x05, 0x06, 0xE7, 0x06, 0xE8, 0x00, 0x05, ++ 0x06, 0xEA, 0x06, 0xED, 0x00, 0x05, 0x06, 0xEE, 0x06, 0xEF, 0x00, 0x04, 0x06, 0xFA, 0x06, 0xFC, ++ 0x00, 0x02, 0x06, 0xFF, 0x06, 0xFF, 0x00, 0x02, 0x07, 0x0F, 0x07, 0x0F, 0x00, 0x05, 0x07, 0x10, ++ 0x07, 0x10, 0x00, 0x04, 0x07, 0x11, 0x07, 0x11, 0x00, 0x05, 0x07, 0x12, 0x07, 0x14, 0x00, 0x02, ++ 0x07, 0x15, 0x07, 0x19, 0x00, 0x04, 0x07, 0x1A, 0x07, 0x1D, 0x00, 0x02, 0x07, 0x1E, 0x07, 0x1E, ++ 0x00, 0x04, 0x07, 0x1F, 0x07, 0x27, 0x00, 0x02, 0x07, 0x28, 0x07, 0x28, 0x00, 0x04, 0x07, 0x29, ++ 0x07, 0x29, 0x00, 0x02, 0x07, 0x2A, 0x07, 0x2A, 0x00, 0x04, 0x07, 0x2B, 0x07, 0x2B, 0x00, 0x02, ++ 0x07, 0x2C, 0x07, 0x2C, 0x00, 0x04, 0x07, 0x2D, 0x07, 0x2E, 0x00, 0x02, 0x07, 0x2F, 0x07, 0x2F, ++ 0x00, 0x04, 0x07, 0x30, 0x07, 0x4A, 0x00, 0x05, 0x07, 0x4D, 0x07, 0x4D, 0x00, 0x04, 0x07, 0x4E, ++ 0x07, 0x58, 0x00, 0x02, 0x07, 0x59, 0x07, 0x5B, 0x00, 0x04, 0x07, 0x5C, 0x07, 0x6A, 0x00, 0x02, ++ 0x07, 0x6B, 0x07, 0x6C, 0x00, 0x04, 0x07, 0x6D, 0x07, 0x70, 0x00, 0x02, 0x07, 0x71, 0x07, 0x71, ++ 0x00, 0x04, 0x07, 0x72, 0x07, 0x72, 0x00, 0x02, 0x07, 0x73, 0x07, 0x74, 0x00, 0x04, 0x07, 0x75, ++ 0x07, 0x77, 0x00, 0x02, 0x07, 0x78, 0x07, 0x79, 0x00, 0x04, 0x07, 0x7A, 0x07, 0x7F, 0x00, 0x02, ++ 0x07, 0xA6, 0x07, 0xB0, 0x00, 0x05, 0x07, 0xCA, 0x07, 0xEA, 0x00, 0x02, 0x07, 0xEB, 0x07, 0xF3, ++ 0x00, 0x05, 0x07, 0xFA, 0x07, 0xFA, 0x00, 0x01, 0x09, 0x01, 0x09, 0x02, 0x00, 0x05, 0x09, 0x3C, ++ 0x09, 0x3C, 0x00, 0x05, 0x09, 0x41, 0x09, 0x48, 0x00, 0x05, 0x09, 0x4D, 0x09, 0x4D, 0x00, 0x05, ++ 0x09, 0x51, 0x09, 0x54, 0x00, 0x05, 0x09, 0x62, 0x09, 0x63, 0x00, 0x05, 0x09, 0x81, 0x09, 0x81, ++ 0x00, 0x05, 0x09, 0xBC, 0x09, 0xBC, 0x00, 0x05, 0x09, 0xC1, 0x09, 0xC4, 0x00, 0x05, 0x09, 0xCD, ++ 0x09, 0xCD, 0x00, 0x05, 0x09, 0xE2, 0x09, 0xE3, 0x00, 0x05, 0x0A, 0x01, 0x0A, 0x02, 0x00, 0x05, ++ 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x05, 0x0A, 0x41, 0x0A, 0x42, 0x00, 0x05, 0x0A, 0x47, 0x0A, 0x48, ++ 0x00, 0x05, 0x0A, 0x4B, 0x0A, 0x4D, 0x00, 0x05, 0x0A, 0x51, 0x0A, 0x51, 0x00, 0x05, 0x0A, 0x70, ++ 0x0A, 0x71, 0x00, 0x05, 0x0A, 0x75, 0x0A, 0x75, 0x00, 0x05, 0x0A, 0x81, 0x0A, 0x82, 0x00, 0x05, ++ 0x0A, 0xBC, 0x0A, 0xBC, 0x00, 0x05, 0x0A, 0xC1, 0x0A, 0xC5, 0x00, 0x05, 0x0A, 0xC7, 0x0A, 0xC8, ++ 0x00, 0x05, 0x0A, 0xCD, 0x0A, 0xCD, 0x00, 0x05, 0x0A, 0xE2, 0x0A, 0xE3, 0x00, 0x05, 0x0B, 0x01, ++ 0x0B, 0x01, 0x00, 0x05, 0x0B, 0x3C, 0x0B, 0x3C, 0x00, 0x05, 0x0B, 0x3F, 0x0B, 0x3F, 0x00, 0x05, ++ 0x0B, 0x41, 0x0B, 0x44, 0x00, 0x05, 0x0B, 0x4D, 0x0B, 0x4D, 0x00, 0x05, 0x0B, 0x56, 0x0B, 0x56, ++ 0x00, 0x05, 0x0B, 0x62, 0x0B, 0x63, 0x00, 0x05, 0x0B, 0x82, 0x0B, 0x82, 0x00, 0x05, 0x0B, 0xC0, ++ 0x0B, 0xC0, 0x00, 0x05, 0x0B, 0xCD, 0x0B, 0xCD, 0x00, 0x05, 0x0C, 0x3E, 0x0C, 0x40, 0x00, 0x05, ++ 0x0C, 0x46, 0x0C, 0x48, 0x00, 0x05, 0x0C, 0x4A, 0x0C, 0x4D, 0x00, 0x05, 0x0C, 0x55, 0x0C, 0x56, ++ 0x00, 0x05, 0x0C, 0x62, 0x0C, 0x63, 0x00, 0x05, 0x0C, 0xBC, 0x0C, 0xBC, 0x00, 0x05, 0x0C, 0xBF, ++ 0x0C, 0xBF, 0x00, 0x05, 0x0C, 0xC6, 0x0C, 0xC6, 0x00, 0x05, 0x0C, 0xCC, 0x0C, 0xCD, 0x00, 0x05, ++ 0x0C, 0xE2, 0x0C, 0xE3, 0x00, 0x05, 0x0D, 0x41, 0x0D, 0x44, 0x00, 0x05, 0x0D, 0x4D, 0x0D, 0x4D, ++ 0x00, 0x05, 0x0D, 0x62, 0x0D, 0x63, 0x00, 0x05, 0x0D, 0xCA, 0x0D, 0xCA, 0x00, 0x05, 0x0D, 0xD2, ++ 0x0D, 0xD4, 0x00, 0x05, 0x0D, 0xD6, 0x0D, 0xD6, 0x00, 0x05, 0x0E, 0x31, 0x0E, 0x31, 0x00, 0x05, ++ 0x0E, 0x34, 0x0E, 0x3A, 0x00, 0x05, 0x0E, 0x47, 0x0E, 0x4E, 0x00, 0x05, 0x0E, 0xB1, 0x0E, 0xB1, ++ 0x00, 0x05, 0x0E, 0xB4, 0x0E, 0xB9, 0x00, 0x05, 0x0E, 0xBB, 0x0E, 0xBC, 0x00, 0x05, 0x0E, 0xC8, ++ 0x0E, 0xCD, 0x00, 0x05, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0x05, 0x0F, 0x35, 0x0F, 0x35, 0x00, 0x05, ++ 0x0F, 0x37, 0x0F, 0x37, 0x00, 0x05, 0x0F, 0x39, 0x0F, 0x39, 0x00, 0x05, 0x0F, 0x71, 0x0F, 0x7E, ++ 0x00, 0x05, 0x0F, 0x80, 0x0F, 0x84, 0x00, 0x05, 0x0F, 0x86, 0x0F, 0x87, 0x00, 0x05, 0x0F, 0x90, ++ 0x0F, 0x97, 0x00, 0x05, 0x0F, 0x99, 0x0F, 0xBC, 0x00, 0x05, 0x0F, 0xC6, 0x0F, 0xC6, 0x00, 0x05, ++ 0x10, 0x2D, 0x10, 0x30, 0x00, 0x05, 0x10, 0x32, 0x10, 0x37, 0x00, 0x05, 0x10, 0x39, 0x10, 0x3A, ++ 0x00, 0x05, 0x10, 0x3D, 0x10, 0x3E, 0x00, 0x05, 0x10, 0x58, 0x10, 0x59, 0x00, 0x05, 0x10, 0x5E, ++ 0x10, 0x60, 0x00, 0x05, 0x10, 0x71, 0x10, 0x74, 0x00, 0x05, 0x10, 0x82, 0x10, 0x82, 0x00, 0x05, ++ 0x10, 0x85, 0x10, 0x86, 0x00, 0x05, 0x10, 0x8D, 0x10, 0x8D, 0x00, 0x05, 0x13, 0x5F, 0x13, 0x5F, ++ 0x00, 0x05, 0x17, 0x12, 0x17, 0x14, 0x00, 0x05, 0x17, 0x32, 0x17, 0x34, 0x00, 0x05, 0x17, 0x52, ++ 0x17, 0x53, 0x00, 0x05, 0x17, 0x72, 0x17, 0x73, 0x00, 0x05, 0x17, 0xB4, 0x17, 0xB5, 0x00, 0x05, ++ 0x17, 0xB7, 0x17, 0xBD, 0x00, 0x05, 0x17, 0xC6, 0x17, 0xC6, 0x00, 0x05, 0x17, 0xC9, 0x17, 0xD3, ++ 0x00, 0x05, 0x17, 0xDD, 0x17, 0xDD, 0x00, 0x05, 0x18, 0x0B, 0x18, 0x0D, 0x00, 0x05, 0x18, 0xA9, ++ 0x18, 0xA9, 0x00, 0x05, 0x19, 0x20, 0x19, 0x22, 0x00, 0x05, 0x19, 0x27, 0x19, 0x28, 0x00, 0x05, ++ 0x19, 0x32, 0x19, 0x32, 0x00, 0x05, 0x19, 0x39, 0x19, 0x3B, 0x00, 0x05, 0x1A, 0x17, 0x1A, 0x18, ++ 0x00, 0x05, 0x1B, 0x00, 0x1B, 0x03, 0x00, 0x05, 0x1B, 0x34, 0x1B, 0x34, 0x00, 0x05, 0x1B, 0x36, ++ 0x1B, 0x3A, 0x00, 0x05, 0x1B, 0x3C, 0x1B, 0x3C, 0x00, 0x05, 0x1B, 0x42, 0x1B, 0x42, 0x00, 0x05, ++ 0x1B, 0x6B, 0x1B, 0x73, 0x00, 0x05, 0x1B, 0x80, 0x1B, 0x81, 0x00, 0x05, 0x1B, 0xA2, 0x1B, 0xA5, ++ 0x00, 0x05, 0x1B, 0xA8, 0x1B, 0xA9, 0x00, 0x05, 0x1C, 0x2C, 0x1C, 0x33, 0x00, 0x05, 0x1C, 0x36, ++ 0x1C, 0x37, 0x00, 0x05, 0x1D, 0xC0, 0x1D, 0xE6, 0x00, 0x05, 0x1D, 0xFE, 0x1D, 0xFF, 0x00, 0x05, ++ 0x20, 0x0B, 0x20, 0x0B, 0x00, 0x05, 0x20, 0x0D, 0x20, 0x0D, 0x00, 0x01, 0x20, 0x0E, 0x20, 0x0F, ++ 0x00, 0x05, 0x20, 0x2A, 0x20, 0x2E, 0x00, 0x05, 0x20, 0x60, 0x20, 0x64, 0x00, 0x05, 0x20, 0x6A, ++ 0x20, 0x6F, 0x00, 0x05, 0x20, 0xD0, 0x20, 0xF0, 0x00, 0x05, 0x2D, 0xE0, 0x2D, 0xFF, 0x00, 0x05, ++ 0x30, 0x2A, 0x30, 0x2F, 0x00, 0x05, 0x30, 0x99, 0x30, 0x9A, 0x00, 0x05, 0xA6, 0x6F, 0xA6, 0x72, ++ 0x00, 0x05, 0xA6, 0x7C, 0xA6, 0x7D, 0x00, 0x05, 0xA8, 0x02, 0xA8, 0x02, 0x00, 0x05, 0xA8, 0x06, ++ 0xA8, 0x06, 0x00, 0x05, 0xA8, 0x0B, 0xA8, 0x0B, 0x00, 0x05, 0xA8, 0x25, 0xA8, 0x26, 0x00, 0x05, ++ 0xA8, 0xC4, 0xA8, 0xC4, 0x00, 0x05, 0xA9, 0x26, 0xA9, 0x2D, 0x00, 0x05, 0xA9, 0x47, 0xA9, 0x51, ++ 0x00, 0x05, 0xAA, 0x29, 0xAA, 0x2E, 0x00, 0x05, 0xAA, 0x31, 0xAA, 0x32, 0x00, 0x05, 0xAA, 0x35, ++ 0xAA, 0x36, 0x00, 0x05, 0xAA, 0x43, 0xAA, 0x43, 0x00, 0x05, 0xAA, 0x4C, 0xAA, 0x4C, 0x00, 0x05, ++ 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x05, 0xFE, 0x00, 0xFE, 0x0F, 0x00, 0x05, 0xFE, 0x20, 0xFE, 0x26, ++ 0x00, 0x05, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x05, 0xFF, 0xF9, 0xFF, 0xFB, 0x00, 0x05 + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SubstitutionLookups.cpp b/src/share/native/sun/font/layout/SubstitutionLookups.cpp +--- jdk/src/share/native/sun/font/layout/SubstitutionLookups.cpp ++++ jdk/src/share/native/sun/font/layout/SubstitutionLookups.cpp +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -53,18 +53,23 @@ + le_uint16 substCount, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, +- le_int32 position) ++ le_int32 position, ++ LEErrorCode& success) + { ++ if (LE_FAILURE(success)) { ++ return; ++ } ++ + GlyphIterator tempIterator(*glyphIterator); + +- for (le_uint16 subst = 0; subst < substCount; subst += 1) { ++ for (le_uint16 subst = 0; subst < substCount && LE_SUCCESS(success); subst += 1) { + le_uint16 sequenceIndex = SWAPW(substLookupRecordArray[subst].sequenceIndex); + le_uint16 lookupListIndex = SWAPW(substLookupRecordArray[subst].lookupListIndex); + + tempIterator.setCurrStreamPosition(position); + tempIterator.next(sequenceIndex); + +- lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance); ++ lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance, success); + } + } + +diff --git a/src/share/native/sun/font/layout/SubstitutionLookups.h b/src/share/native/sun/font/layout/SubstitutionLookups.h +--- jdk/src/share/native/sun/font/layout/SubstitutionLookups.h ++++ jdk/src/share/native/sun/font/layout/SubstitutionLookups.h +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -60,7 +60,8 @@ + le_uint16 substCount, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, +- le_int32 position); ++ le_int32 position, ++ LEErrorCode& success); + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp b/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp +@@ -26,7 +26,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -36,19 +36,24 @@ + #include "ScriptAndLanguageTags.h" + #include "LEGlyphStorage.h" + ++#include "KernTable.h" ++ + #include "ThaiShaping.h" + + U_NAMESPACE_BEGIN + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ThaiLayoutEngine) + +-ThaiLayoutEngine::ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) +- : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags) ++ThaiLayoutEngine::ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) ++ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) + { + fErrorChar = 0x25CC; + + // Figure out which presentation forms the font uses +- if (fontInstance->canDisplay(0x0E64)) { ++ if (! fontInstance->canDisplay(0x0E01)) { ++ // No Thai in font; don't use presentation forms. ++ fGlyphSet = 3; ++ } else if (fontInstance->canDisplay(0x0E64)) { + // WorldType uses reserved space in Thai block + fGlyphSet = 0; + } else if (fontInstance->canDisplay(0xF701)) { +@@ -116,4 +121,28 @@ + return glyphCount; + } + ++// This is the same as LayoutEngline::adjustGlyphPositions() except that it doesn't call adjustMarkGlyphs ++void ThaiLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success) ++{ ++ if (LE_FAILURE(success)) { ++ return; ++ } ++ ++ if (chars == NULL || offset < 0 || count < 0) { ++ success = LE_ILLEGAL_ARGUMENT_ERROR; ++ return; ++ } ++ ++ if (fTypoFlags & 0x1) { /* kerning enabled */ ++ static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG; ++ ++ KernTable kt(fFontInstance, getFontTable(kernTableTag)); ++ kt.process(glyphStorage); ++ } ++ ++ // default is no adjustments ++ return; ++} ++ + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ThaiLayoutEngine.h b/src/share/native/sun/font/layout/ThaiLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.h +@@ -26,7 +26,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +@@ -62,13 +62,14 @@ + * @param fontInstance - the font + * @param scriptCode - the script + * @param languageCode - the language ++ * @param success - set to an error code if the operation fails + * + * @see LEFontInstance + * @see ScriptAndLanguageTags.h for script and language codes + * + * @internal + */ +- ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags); ++ ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -139,6 +140,28 @@ + virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + ++ /** ++ * This method does positioning adjustments like accent positioning and ++ * kerning. The default implementation does nothing. Subclasses needing ++ * position adjustments must override this method. ++ * ++ * Note that this method has both characters and glyphs as input so that ++ * it can use the character codes to determine glyph types if that information ++ * isn't directly available. (e.g. Some Arabic OpenType fonts don't have a GDEF ++ * table) ++ * ++ * @param chars - the input character context ++ * @param offset - the offset of the first character to process ++ * @param count - the number of characters to process ++ * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered ++ * @param glyphStorage - the object which holds the per-glyph storage. The glyph positions will be ++ * adjusted as needed. ++ * @param success - output parameter set to an error code if the operation fails ++ * ++ * @internal ++ */ ++ virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp b/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp +new file mode 100644 +--- /dev/null ++++ jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp +@@ -0,0 +1,112 @@ ++/* ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/* ++ * ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved ++ * ++ * Developed at DIT - Government of Bhutan ++ * ++ * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> ++ * ++ * This file is a modification of the ICU file KhmerReordering.cpp ++ * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan ++ * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. ++ * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola ++ * ++ */ ++ ++ ++#include "OpenTypeLayoutEngine.h" ++#include "TibetanLayoutEngine.h" ++#include "LEGlyphStorage.h" ++#include "TibetanReordering.h" ++ ++U_NAMESPACE_BEGIN ++ ++UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TibetanOpenTypeLayoutEngine) ++ ++TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) ++{ ++ fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount); ++ fFeatureOrder = TRUE; ++} ++ ++TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, LEErrorCode &success) ++ : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) ++{ ++ fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount); ++ fFeatureOrder = TRUE; ++} ++ ++TibetanOpenTypeLayoutEngine::~TibetanOpenTypeLayoutEngine() ++{ ++ // nothing to do ++} ++ ++// Input: characters ++// Output: characters, char indices, tags ++// Returns: output character count ++le_int32 TibetanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) ++{ ++ if (LE_FAILURE(success)) { ++ return 0; ++ } ++ ++ if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { ++ success = LE_ILLEGAL_ARGUMENT_ERROR; ++ return 0; ++ } ++ ++ le_int32 worstCase = count * 3; // worst case is 3 for Khmer TODO check if 2 is enough ++ ++ outChars = LE_NEW_ARRAY(LEUnicode, worstCase); ++ ++ if (outChars == NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return 0; ++ } ++ ++ glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); ++ glyphStorage.allocateAuxData(success); ++ ++ if (LE_FAILURE(success)) { ++ LE_DELETE_ARRAY(outChars); ++ return 0; ++ } ++ ++ // NOTE: assumes this allocates featureTags... ++ // (probably better than doing the worst case stuff here...) ++ le_int32 outCharCount = TibetanReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage); ++ ++ glyphStorage.adoptGlyphCount(outCharCount); ++ return outCharCount; ++} ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/TibetanLayoutEngine.h b/src/share/native/sun/font/layout/TibetanLayoutEngine.h +new file mode 100644 +--- /dev/null ++++ jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.h +@@ -0,0 +1,156 @@ ++/* ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/* ++ * ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved ++ * ++ * Developed at DIT - Government of Bhutan ++ * ++ * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> ++ * ++ * This file is a modification of the ICU file KhmerReordering.cpp ++ * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan ++ * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. ++ * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola ++ * ++ */ ++ ++#ifndef __TIBETANLAYOUTENGINE_H ++#define __TIBETANLAYOUTENGINE_H ++ ++// #include "LETypes.h" ++// #include "LEFontInstance.h" ++// #include "LEGlyphFilter.h" ++// #include "LayoutEngine.h" ++// #include "OpenTypeLayoutEngine.h" ++ ++// #include "GlyphSubstitutionTables.h" ++// #include "GlyphDefinitionTables.h" ++// #include "GlyphPositioningTables.h" ++ ++U_NAMESPACE_BEGIN ++ ++// class MPreFixups; ++// class LEGlyphStorage; ++ ++/** ++ * This class implements OpenType layout for Dzongkha and Tibetan OpenType fonts ++ * ++ * @internal ++ */ ++class TibetanOpenTypeLayoutEngine : public OpenTypeLayoutEngine ++{ ++public: ++ /** ++ * This is the main constructor. It constructs an instance of TibetanOpenTypeLayoutEngine for ++ * a particular font, script and language. It takes the GSUB table as a parameter since ++ * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an ++ * Tibetan OpenType font. ++ * ++ * @param fontInstance - the font ++ * @param scriptCode - the script ++ * @param langaugeCode - the language ++ * @param gsubTable - the GSUB table ++ * @param success - set to an error code if the operation fails ++ * ++ * @see LayoutEngine::layoutEngineFactory ++ * @see OpenTypeLayoutEngine ++ * @see ScriptAndLangaugeTags.h for script and language codes ++ * ++ * @internal ++ */ ++ TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); ++ ++ /** ++ * This constructor is used when the font requires a "canned" GSUB table which can't be known ++ * until after this constructor has been invoked. ++ * ++ * @param fontInstance - the font ++ * @param scriptCode - the script ++ * @param langaugeCode - the language ++ * @param success - set to an error code if the operation fails ++ * ++ * @see OpenTypeLayoutEngine ++ * @see ScriptAndLangaugeTags.h for script and language codes ++ * ++ * @internal ++ */ ++ TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ le_int32 typoFlags, LEErrorCode &success); ++ ++ /** ++ * The destructor, virtual for correct polymorphic invocation. ++ * ++ * @internal ++ */ ++ virtual ~TibetanOpenTypeLayoutEngine(); ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for the actual class. ++ * ++ * @internal ICU 3.6 ++ */ ++ virtual UClassID getDynamicClassID() const; ++ ++ /** ++ * ICU "poor man's RTTI", returns a UClassID for this class. ++ * ++ * @internal ICU 3.6 ++ */ ++ static UClassID getStaticClassID(); ++ ++protected: ++ ++ /** ++ * This method does Tibetan OpenType character processing. It assigns the OpenType feature ++ * tags to the characters, and may generate output characters which have been reordered. ++ * It may also split some vowels, resulting in more output characters than input characters. ++ * ++ * Input parameters: ++ * @param chars - the input character context ++ * @param offset - the index of the first character to process ++ * @param count - the number of characters to process ++ * @param max - the number of characters in the input context ++ * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run ++ * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. ++ * the auxillary data array will be set to the feature tags. ++ * ++ * Output parameters: ++ * @param success - set to an error code if the operation fails ++ * ++ * @return the output character count ++ * ++ * @internal ++ */ ++ virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, ++ LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); ++ ++}; ++ ++U_NAMESPACE_END ++#endif ++ +diff --git a/src/share/native/sun/font/layout/TibetanReordering.cpp b/src/share/native/sun/font/layout/TibetanReordering.cpp +new file mode 100644 +--- /dev/null ++++ jdk/src/share/native/sun/font/layout/TibetanReordering.cpp +@@ -0,0 +1,414 @@ ++/* ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/* ++ * ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved ++ * ++ * Developed at DIT - Government of Bhutan ++ * ++ * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> ++ * ++ * This file is a modification of the ICU file KhmerReordering.cpp ++ * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan ++ * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. ++ * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola ++ * ++ */ ++ ++//#include <stdio.h> ++#include "LETypes.h" ++#include "OpenTypeTables.h" ++#include "TibetanReordering.h" ++#include "LEGlyphStorage.h" ++ ++ ++U_NAMESPACE_BEGIN ++ ++// Characters that get refered to by name... ++enum ++{ ++ C_DOTTED_CIRCLE = 0x25CC, ++ C_PRE_NUMBER_MARK = 0x0F3F ++ }; ++ ++ ++enum ++{ ++ // simple classes, they are used in the statetable (in this file) to control the length of a syllable ++ // they are also used to know where a character should be placed (location in reference to the base character) ++ // and also to know if a character, when independtly displayed, should be displayed with a dotted-circle to ++ // indicate error in syllable construction ++ _xx = TibetanClassTable::CC_RESERVED, ++ _ba = TibetanClassTable::CC_BASE, ++ _sj = TibetanClassTable::CC_SUBJOINED | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, ++ _tp = TibetanClassTable::CC_TSA_PHRU | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, ++ _ac = TibetanClassTable::CC_A_CHUNG | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, ++ _cs = TibetanClassTable::CC_COMP_SANSKRIT | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, ++ _ha = TibetanClassTable::CC_HALANTA | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, ++ _bv = TibetanClassTable::CC_BELOW_VOWEL | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, ++ _av = TibetanClassTable::CC_ABOVE_VOWEL | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, ++ _an = TibetanClassTable::CC_ANUSVARA | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, ++ _cb = TibetanClassTable::CC_CANDRABINDU | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, ++ _vs = TibetanClassTable::CC_VISARGA | TibetanClassTable::CF_DOTTED_CIRCLE| TibetanClassTable::CF_POS_AFTER, ++ _as = TibetanClassTable::CC_ABOVE_S_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, ++ _bs = TibetanClassTable::CC_BELOW_S_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, ++ _di = TibetanClassTable::CC_DIGIT | TibetanClassTable::CF_DIGIT, ++ _pd = TibetanClassTable::CC_PRE_DIGIT_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_PREDIGIT | TibetanClassTable::CF_POS_BEFORE , ++ _bd = TibetanClassTable::CC_POST_BELOW_DIGIT_M | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_AFTER ++}; ++ ++ ++// Character class tables ++//_xx Non Combining characters ++//_ba Base Consonants ++//_sj Subjoined consonants ++//_tp Tsa - phru ++//_ac A-chung, Vowel Lengthening mark ++//_cs Precomposed Sanskrit vowel + subjoined consonants ++//_ha Halanta/Virama ++//_bv Below vowel ++//_av above vowel ++//_an Anusvara ++//_cb Candrabindu ++//_vs Visaraga/Post mark ++//_as Upper Stress marks ++//_bs Lower Stress marks ++//_di Digit ++//_pd Number pre combining, Needs reordering ++//_bd Other number combining marks ++ ++static const TibetanClassTable::CharClass tibetanCharClasses[] = ++{ ++ // 0 1 2 3 4 5 6 7 8 9 a b c d e f ++ _xx, _ba, _xx, _xx, _ba, _ba, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0F00 - 0F0F 0 ++ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _bd, _bd, _xx, _xx, _xx, _xx, _xx, _xx, // 0F10 - 0F1F 1 ++ _di, _di, _di, _di, _di, _di, _di, _di, _di, _di, _xx, _xx, _xx, _xx, _xx, _xx, // 0F20 - 0F2F 2 ++ _xx, _xx, _xx, _xx, _xx, _bs, _xx, _bs, _xx, _tp, _xx, _xx, _xx, _xx, _bd, _pd, // 0F30 - 0F3F 3 ++ _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _xx, _ba, _ba, _ba, _ba, _ba, _ba, _ba, // 0F40 - 0F4F 4 ++ _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, // 0F50 - 0F5F 5 ++ _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _xx, _xx, _xx, _xx, _xx, // 0F60 - 0F6F 6 ++ _xx, _ac, _av, _cs, _bv, _bv, _cs, _cs, _cs, _cs, _av, _av, _av, _av, _an, _vs, // 0F70 - 0F7F 7 ++ _av, _cs, _cb, _cb, _ha, _xx, _as, _as, _ba, _ba, _ba, _ba, _xx, _xx, _xx, _xx, // 0F80 - 0F8F 8 ++ _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _xx, _sj, _sj, _sj, _sj, _sj, _sj, _sj, // 0F90 - 0F9F 9 ++ _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, // 0FA0 - 0FAF a ++ _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _xx, _sj, _sj, // 0FB0 - 0FBF b ++ _xx, _xx, _xx, _xx, _xx, _xx, _bs, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FC0 - 0FCF c ++ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx,// 0FD0 - 0FDF d ++ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FE0 - 0FEF e ++ _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FF0 - 0FFF f ++}; ++ ++ ++// ++// Tibetan Class Tables ++// ++ ++// ++// The range of characters defined in the above table is defined here. For Tibetan 0F00 to 0FFF ++// Even if the Tibetan range is bigger, most of the characters are not combinable, and therefore treated ++// as _xx ++static const TibetanClassTable tibetanClassTable = {0x0F00, 0x0FFF, tibetanCharClasses}; ++ ++ ++// Below we define how a character in the input string is either in the tibetanCharClasses table ++// (in which case we get its type back), or an unknown object in which case we get _xx (CC_RESERVED) back ++TibetanClassTable::CharClass TibetanClassTable::getCharClass(LEUnicode ch) const ++{ ++ if (ch < firstChar || ch > lastChar) { ++ return CC_RESERVED; ++ } ++ ++ return classTable[ch - firstChar]; ++} ++ ++const TibetanClassTable *TibetanClassTable::getTibetanClassTable() ++{ ++ return &tibetanClassTable; ++} ++ ++ ++ ++class TibetanReorderingOutput : public UMemory { ++private: ++ le_int32 fSyllableCount; ++ le_int32 fOutIndex; ++ LEUnicode *fOutChars; ++ ++ LEGlyphStorage &fGlyphStorage; ++ ++ ++public: ++ TibetanReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage) ++ : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage) ++ { ++ // nothing else to do... ++ } ++ ++ ~TibetanReorderingOutput() ++ { ++ // nothing to do here... ++ } ++ ++ void reset() ++ { ++ fSyllableCount += 1; ++ } ++ ++ void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask featureMask) ++ { ++ LEErrorCode success = LE_NO_ERROR; ++ ++ fOutChars[fOutIndex] = ch; ++ ++ fGlyphStorage.setCharIndex(fOutIndex, charIndex, success); ++ fGlyphStorage.setAuxData(fOutIndex, featureMask, success); ++ ++ fOutIndex += 1; ++ } ++ ++ le_int32 getOutputIndex() ++ { ++ return fOutIndex; ++ } ++}; ++ ++ ++//TODO remove unused flags ++#define ccmpFeatureTag LE_CCMP_FEATURE_TAG ++#define blwfFeatureTag LE_BLWF_FEATURE_TAG ++#define pstfFeatureTag LE_PSTF_FEATURE_TAG ++#define presFeatureTag LE_PRES_FEATURE_TAG ++#define blwsFeatureTag LE_BLWS_FEATURE_TAG ++#define abvsFeatureTag LE_ABVS_FEATURE_TAG ++#define pstsFeatureTag LE_PSTS_FEATURE_TAG ++ ++#define blwmFeatureTag LE_BLWM_FEATURE_TAG ++#define abvmFeatureTag LE_ABVM_FEATURE_TAG ++#define distFeatureTag LE_DIST_FEATURE_TAG ++ ++#define prefFeatureTag LE_PREF_FEATURE_TAG ++#define abvfFeatureTag LE_ABVF_FEATURE_TAG ++#define cligFeatureTag LE_CLIG_FEATURE_TAG ++#define mkmkFeatureTag LE_MKMK_FEATURE_TAG ++ ++// Shaping features ++#define prefFeatureMask 0x80000000UL ++#define blwfFeatureMask 0x40000000UL ++#define abvfFeatureMask 0x20000000UL ++#define pstfFeatureMask 0x10000000UL ++#define presFeatureMask 0x08000000UL ++#define blwsFeatureMask 0x04000000UL ++#define abvsFeatureMask 0x02000000UL ++#define pstsFeatureMask 0x01000000UL ++#define cligFeatureMask 0x00800000UL ++#define ccmpFeatureMask 0x00040000UL ++ ++// Positioning features ++#define distFeatureMask 0x00400000UL ++#define blwmFeatureMask 0x00200000UL ++#define abvmFeatureMask 0x00100000UL ++#define mkmkFeatureMask 0x00080000UL ++ ++#define tagPref (ccmpFeatureMask | prefFeatureMask | presFeatureMask | cligFeatureMask | distFeatureMask) ++#define tagAbvf (ccmpFeatureMask | abvfFeatureMask | abvsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | mkmkFeatureMask) ++#define tagPstf (ccmpFeatureMask | blwfFeatureMask | blwsFeatureMask | prefFeatureMask | presFeatureMask | pstfFeatureMask | pstsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask) ++#define tagBlwf (ccmpFeatureMask | blwfFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask | mkmkFeatureMask) ++#define tagDefault (ccmpFeatureMask | prefFeatureMask | blwfFeatureMask | presFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask | mkmkFeatureMask) ++ ++ ++ ++// These are in the order in which the features need to be applied ++// for correct processing ++static const FeatureMap featureMap[] = ++{ ++ // Shaping features ++ {ccmpFeatureTag, ccmpFeatureMask}, ++ {prefFeatureTag, prefFeatureMask}, ++ {blwfFeatureTag, blwfFeatureMask}, ++ {abvfFeatureTag, abvfFeatureMask}, ++ {pstfFeatureTag, pstfFeatureMask}, ++ {presFeatureTag, presFeatureMask}, ++ {blwsFeatureTag, blwsFeatureMask}, ++ {abvsFeatureTag, abvsFeatureMask}, ++ {pstsFeatureTag, pstsFeatureMask}, ++ {cligFeatureTag, cligFeatureMask}, ++ ++ // Positioning features ++ {distFeatureTag, distFeatureMask}, ++ {blwmFeatureTag, blwmFeatureMask}, ++ {abvmFeatureTag, abvmFeatureMask}, ++ {mkmkFeatureTag, mkmkFeatureMask}, ++}; ++ ++static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); ++ ++// The stateTable is used to calculate the end (the length) of a well ++// formed Tibetan Syllable. ++// ++// Each horizontal line is ordered exactly the same way as the values in TibetanClassTable ++// CharClassValues in TibetanReordering.h This coincidence of values allows the ++// follow up of the table. ++// ++// Each line corresponds to a state, which does not necessarily need to be a type ++// of component... for example, state 2 is a base, with is always a first character ++// in the syllable, but the state could be produced a consonant of any type when ++// it is the first character that is analysed (in ground state). ++// ++static const le_int8 tibetanStateTable[][TibetanClassTable::CC_COUNT] = ++{ ++ ++ ++ //Dzongkha state table ++ //xx ba sj tp ac cs ha bv av an cb vs as bs di pd bd ++ { 1, 2, 4, 3, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, 20, 21, 21,}, // 0 - ground state ++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 1 - exit state (or sign to the right of the syllable) ++ {-1, -1, 4, 3, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 2 - Base consonant ++ {-1, -1, 5, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 3 - Tsa phru after base ++ {-1, -1, 4, 6, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 4 - Subjoined consonant after base ++ {-1, -1, 5, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 5 - Subjoined consonant after tsa phru ++ {-1, -1, -1, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 6 - Tsa phru after subjoined consonant ++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 19, -1, -1, -1,}, // 7 - Pre Composed Sanskrit ++ {-1, -1, -1, -1, -1, -1, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 8 - A-chung ++ {-1, -1, -1, -1, -1, -1, -1, -1, 14, 13, 17, -1, 19, 19, -1, -1, -1,}, // 9 - Halanta ++ {-1, -1, -1, -1, -1, -1, -1, 11, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 10 - below vowel 1 ++ {-1, -1, -1, -1, -1, -1, -1, 12, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 11 - below vowel 2 ++ {-1, -1, -1, -1, -1, -1, -1, -1, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 12 - below vowel 3 ++ {-1, -1, -1, -1, -1, -1, -1, -1, 14, 17, 17, 18, 19, 19, -1, -1, -1,}, // 13 - Anusvara before vowel ++ {-1, -1, -1, -1, -1, -1, -1, -1, 15, 17, 17, 18, 19, 19, -1, -1, -1,}, // 14 - above vowel 1 ++ {-1, -1, -1, -1, -1, -1, -1, -1, 16, 17, 17, 18, 19, 19, -1, -1, -1,}, // 15 - above vowel 2 ++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 17, 18, 19, 19, -1, -1, -1,}, // 16 - above vowel 3 ++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, 19, -1, -1, -1,}, // 17 - Anusvara or Candrabindu after vowel ++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 19, -1, -1, -1,}, // 18 - Visarga ++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 19 - strss mark ++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, 21,}, // 20 - digit ++ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 21 - digit mark ++ ++ ++}; ++ ++ ++const FeatureMap *TibetanReordering::getFeatureMap(le_int32 &count) ++{ ++ count = featureMapCount; ++ ++ return featureMap; ++} ++ ++ ++// Given an input string of characters and a location in which to start looking ++// calculate, using the state table, which one is the last character of the syllable ++// that starts in the starting position. ++le_int32 TibetanReordering::findSyllable(const TibetanClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount) ++{ ++ le_int32 cursor = prev; ++ le_int8 state = 0; ++ ++ while (cursor < charCount) { ++ TibetanClassTable::CharClass charClass = (classTable->getCharClass(chars[cursor]) & TibetanClassTable::CF_CLASS_MASK); ++ ++ state = tibetanStateTable[state][charClass]; ++ ++ if (state < 0) { ++ break; ++ } ++ ++ cursor += 1; ++ } ++ ++ return cursor; ++} ++ ++ ++// This is the real reordering function as applied to the Tibetan language ++ ++le_int32 TibetanReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32, ++ LEUnicode *outChars, LEGlyphStorage &glyphStorage) ++{ ++ const TibetanClassTable *classTable = TibetanClassTable::getTibetanClassTable(); ++ ++ TibetanReorderingOutput output(outChars, glyphStorage); ++ TibetanClassTable::CharClass charClass; ++ le_int32 i, prev = 0; ++ ++ // This loop only exits when we reach the end of a run, which may contain ++ // several syllables. ++ while (prev < charCount) { ++ le_int32 syllable = findSyllable(classTable, chars, prev, charCount); ++ ++ output.reset(); ++ ++ // shall we add a dotted circle? ++ // If in the position in which the base should be (first char in the string) there is ++ // a character that has the Dotted circle flag (a character that cannot be a base) ++ // then write a dotted circle ++ if (classTable->getCharClass(chars[prev]) & TibetanClassTable::CF_DOTTED_CIRCLE) { ++ output.writeChar(C_DOTTED_CIRCLE, prev, tagDefault); ++ } ++ ++ // copy the rest to output, inverting the pre-number mark if present after a digit. ++ for (i = prev; i < syllable; i += 1) { ++ charClass = classTable->getCharClass(chars[i]); ++ ++ if ((TibetanClassTable::CF_DIGIT & charClass) ++ && ( classTable->getCharClass(chars[i+1]) & TibetanClassTable::CF_PREDIGIT)) ++ { ++ output.writeChar(C_PRE_NUMBER_MARK, i, tagPref); ++ output.writeChar(chars[i], i+1 , tagPref); ++ i += 1; ++ } else { ++ switch (charClass & TibetanClassTable::CF_POS_MASK) { ++ ++ // If the present character is a number, and the next character is a pre-number combining mark ++ // then the two characters are reordered ++ ++ case TibetanClassTable::CF_POS_ABOVE : ++ output.writeChar(chars[i], i, tagAbvf); ++ break; ++ ++ case TibetanClassTable::CF_POS_AFTER : ++ output.writeChar(chars[i], i, tagPstf); ++ break; ++ ++ case TibetanClassTable::CF_POS_BELOW : ++ output.writeChar(chars[i], i, tagBlwf); ++ break; ++ ++ default: ++ // default - any other characters ++ output.writeChar(chars[i], i, tagDefault); ++ break; ++ } // switch ++ } // if ++ } // for ++ ++ prev = syllable; // move the pointer to the start of next syllable ++ } ++ ++ return output.getOutputIndex(); ++} ++ ++ ++U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/TibetanReordering.h b/src/share/native/sun/font/layout/TibetanReordering.h +new file mode 100644 +--- /dev/null ++++ jdk/src/share/native/sun/font/layout/TibetanReordering.h +@@ -0,0 +1,176 @@ ++/* ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/* ++ * ++ * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved ++ * ++ * Developed at DIT - Government of Bhutan ++ * ++ * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> ++ * ++ * This file is a modification of the ICU file KhmerReordering.h ++ * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan ++ * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. ++ * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola ++ * ++ */ ++ ++#ifndef __TIBETANREORDERING_H ++#define __TIBETANORDERING_H ++ ++/** ++ * \file ++ * \internal ++ */ ++ ++// #include "LETypes.h" ++// #include "OpenTypeTables.h" ++ ++U_NAMESPACE_BEGIN ++ ++class LEGlyphStorage; ++ ++// Vocabulary ++// Base -> A consonant in its full (not subscript) form. It is the ++// center of the syllable, it can be souranded by subjoined consonants, vowels, ++// signs... but there is only one base in a stack, it has to be coded as ++// the first character of the syllable.Included here are also groups of base + subjoined ++// which are represented by one single code point in unicode (e.g. 0F43) Also other characters that might take ++// subjoined consonants or other combining characters. ++// Subjoined -> Subjoined consonants and groups of subjoined consonants which have a single code-point ++// to repersent the group (even if each subjoined consonant is represented independently ++// by anothe code-point ++// Tsa Phru --> Tsa Phru character, Bhutanese people will always place it right after the base, but sometimes, due to ++// "normalization" ++// is placed after all the subjoined consonants, and it is also permitted there. ++// A Chung Vowel lengthening mark --> . 0F71 It is placed after the base and any subjoined consonants but before any vowels ++// Precomposed Sanskrit vowels --> The are combinations of subjoined consonants + vowels that have been assigned ++// a given code-point (in spite of each single part of them having also a code-point ++// They are avoided, and users are encouraged to use the combination of code-points that ++// represents the same sound instead of using this combined characters. This is included here ++// for compatibility with possible texts that use them (they are not in the Dzongkha keyboard). ++// Halanta -> The Halanta or Virama character 0F84 indicates that a consonant should not use its inheernt vowel, ++// in spite of not having other vowels present. It is usually placed immediatly after a base consonant, ++// but in some special cases it can also be placed after a subjoined consonant, so this is also ++// permitted in this algorithm. (Halanta is always displayed in Tibetan not used as a connecting char) ++// ++// Subjoined vowels -> Dependent vowels (matras) placed below the base and below all subjoined consonants. There ++// might be as much as three subjoined vowels in a given stack (only one in general text, but up ++// to three for abreviations, they have to be permitted). ++// Superscript vowels -> There are three superscript vowels, and they can be repeated or combined (up to three ++// times. They can combine with subjoined vowels, and are always coded after these. ++// Anusvara --> Nasalisation sign. Traditioinally placed in absence of vowels, but also after vowels. In some ++// special cases it can be placed before a vowel, so this is also permitted ++// Candrabindu -> Forms of the Anusvara with different glyphs (and different in identity) which can be placed ++// without vowel or after the vowel, but never before. Cannot combine with Anusvara. ++// Stress marks -> Marks placed above or below a syllable, affecting the whole syllable. They are combining ++// marks, so they have to be attached to a specific stack. The are using to emphasise a syllable. ++// ++// Digits -> Digits are not considered as non-combining characters because there are a few characters which ++// combine with them, so they have to be considered independently. ++// Digit combining marks -> dependent marks that combine with digits. ++// ++// TODO ++// There are a number of characters in the CJK block that are used in Tibetan script, two of these are symbols ++// are used as bases for combining glyphs, and have not been encoded in Tibetan. As these characters are outside ++// of the tibetan block, they have not been treated in this program. ++ ++ ++struct TibetanClassTable // This list must include all types of components that can be used inside a syllable ++{ ++ enum CharClassValues // order is important here! This order must be the same that is found in each horizontal ++ // line in the statetable for Tibetan (file TibetanReordering.cpp). It assigns one number ++ // to each type of character that has to be considered when analysing the order in which ++ // characters can be placed ++ { ++ CC_RESERVED = 0, //Non Combining Characters ++ CC_BASE = 1, // Base Consonants, Base Consonants with Subjoined attached in code point, Sanskrit base marks ++ CC_SUBJOINED = 2, // Subjoined Consonats, combination of more than Subjoined Consonants in the code point ++ CC_TSA_PHRU = 3, // Tsa-Phru character 0F39 ++ CC_A_CHUNG = 4, // Vowel Lenthening a-chung mark 0F71 ++ CC_COMP_SANSKRIT = 5, // Precomposed Sanskrit vowels including Subjoined characters and vowels ++ CC_HALANTA = 6, // Halanta Character 0F84 ++ CC_BELOW_VOWEL = 7, // Subjoined vowels ++ CC_ABOVE_VOWEL = 8, // Superscript vowels ++ CC_ANUSVARA = 9, // Tibetan sign Rjes Su Nga Ro 0F7E ++ CC_CANDRABINDU = 10, // Tibetan sign Sna Ldan and Nyi Zla Naa Da 0F82, 0F83 ++ CC_VISARGA = 11, // Tibetan sign Rnam Bcad (0F7F) ++ CC_ABOVE_S_MARK = 12, // Stress Marks placed above the text ++ CC_BELOW_S_MARK = 13, // Stress Marks placed below the text ++ CC_DIGIT = 14, // Dzongkha Digits ++ CC_PRE_DIGIT_MARK = 15, // Mark placed before the digit ++ CC_POST_BELOW_DIGIT_M = 16, // Mark placed below or after the digit ++ CC_COUNT = 17 // This is the number of character classes ++ }; ++ ++ enum CharClassFlags ++ { ++ CF_CLASS_MASK = 0x0000FFFF, ++ ++ CF_DOTTED_CIRCLE = 0x04000000, // add a dotted circle if a character with this flag is the first in a syllable ++ CF_DIGIT = 0x01000000, // flag to speed up comparaisson ++ CF_PREDIGIT = 0x02000000, // flag to detect pre-digit marks for reordering ++ ++ // position flags ++ CF_POS_BEFORE = 0x00080000, ++ CF_POS_BELOW = 0x00040000, ++ CF_POS_ABOVE = 0x00020000, ++ CF_POS_AFTER = 0x00010000, ++ CF_POS_MASK = 0x000f0000 ++ }; ++ ++ typedef le_uint32 CharClass; ++ ++ typedef le_int32 ScriptFlags; ++ ++ LEUnicode firstChar; // for Tibetan this will become xOF00 ++ LEUnicode lastChar; // and this x0FFF ++ const CharClass *classTable; ++ ++ CharClass getCharClass(LEUnicode ch) const; ++ ++ static const TibetanClassTable *getTibetanClassTable(); ++}; ++ ++ ++class TibetanReordering /* not : public UObject because all methods are static */ { ++public: ++ static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, ++ LEUnicode *outChars, LEGlyphStorage &glyphStorage); ++ ++ static const FeatureMap *getFeatureMap(le_int32 &count); ++ ++private: ++ // do not instantiate ++ TibetanReordering(); ++ ++ static le_int32 findSyllable(const TibetanClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount); ++ ++}; ++ ++ ++U_NAMESPACE_END ++#endif +diff --git a/test/java/awt/font/TextLayout/TestOldHangul.java b/test/java/awt/font/TextLayout/TestOldHangul.java +new file mode 100644 +--- /dev/null ++++ jdk/test/java/awt/font/TextLayout/TestOldHangul.java +@@ -0,0 +1,83 @@ ++/* ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/* @test @(#)TestOldHangul.java ++ * @summary Verify Old Hangul display ++ * @bug 6886358 ++ * @ignore Requires a special font installed. ++ */ ++ ++import javax.swing.*; ++import javax.swing.border.LineBorder; ++import java.awt.*; ++import java.awt.event.ActionEvent; ++ ++public class TestOldHangul { ++ public static void main(String[] args) { ++ SwingUtilities.invokeLater(new Runnable() { ++ public void run() { ++ new TestOldHangul().run(); ++ } ++ }); ++ } ++ public static boolean AUTOMATIC_TEST=true; // true; run test automatically, else manually at button push ++ ++ private void run() { ++ Font ourFont = null; ++ final String fontName = "UnBatangOdal.ttf"; // download from http://chem.skku.ac.kr/~wkpark/project/font/GSUB/UnbatangOdal/ and place in {user.home}/fonts/ ++ try { ++ ourFont = Font.createFont(Font.TRUETYPE_FONT, new java.io.File(new java.io.File(System.getProperty("user.home"),"fonts"), fontName)); ++ ourFont = ourFont.deriveFont((float)48.0); ++ } catch(Throwable t) { ++ t.printStackTrace(); ++ System.err.println("Fail: " + t); ++ return; ++ } ++ JFrame frame = new JFrame(System.getProperty("java.version")); ++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ++ JPanel panel = new JPanel(); ++ final JTextArea label = new JTextArea("(empty)"); ++ label.setSize(400, 300); ++ label.setBorder(new LineBorder(Color.black)); ++ label.setFont(ourFont); ++ final String str = "\u110A\u119E\u11B7\u0020\u1112\u119E\u11AB\uAE00\u0020\u1100\u119E\u11F9\u0020\u112B\u119E\u11BC\n"; ++ ++ if(AUTOMATIC_TEST) { /* run the test automatically (else, manually) */ ++ label.setText(str); ++ } else { ++ JButton button = new JButton("Old Hangul"); ++ button.addActionListener(new AbstractAction() { ++ public void actionPerformed(ActionEvent actionEvent) { ++ label.setText(str); ++ } ++ }); ++ panel.add(button); ++ } ++ panel.add(label); ++ ++ frame.getContentPane().add(panel); ++ frame.pack(); ++ frame.setVisible(true); ++ } ++} ++ +diff --git a/test/java/awt/font/TextLayout/TestTibetan.java b/test/java/awt/font/TextLayout/TestTibetan.java +new file mode 100644 +--- /dev/null ++++ jdk/test/java/awt/font/TextLayout/TestTibetan.java +@@ -0,0 +1,87 @@ ++/* ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/* @test @(#)TestTibetan.java ++ * @summary verify tibetan output ++ * @bug 6886358 ++ * @ignore Requires a special font installed ++ */ ++ ++import javax.swing.*; ++import javax.swing.border.LineBorder; ++import java.awt.*; ++import java.awt.event.ActionEvent; ++ ++public class TestTibetan { ++ public static void main(String[] args) { ++ SwingUtilities.invokeLater(new Runnable() { ++ public void run() { ++ new TestTibetan().run(); ++ } ++ }); ++ } ++ public static boolean AUTOMATIC_TEST=true; // true; run test automatically, else manually at button push ++ ++ private void run() { ++ Font ourFont = null; ++ try { ++ //For best results: Font from: http://download.savannah.gnu.org/releases/free-tibetan/jomolhari/ ++ // place in $(user.home)/fonts/ ++ ourFont = Font.createFont(Font.TRUETYPE_FONT, new java.io.File(new java.io.File(System.getProperty("user.home"),"fonts"), "Jomolhari-alpha3c-0605331.ttf")); ++ ++ //ourFont = new Font("serif",Font.PLAIN, 24); ++ ourFont = ourFont.deriveFont((float)24.0); ++ } catch(Throwable t) { ++ t.printStackTrace(); ++ System.err.println("Fail: " + t); ++ return; ++ } ++ JFrame frame = new JFrame(System.getProperty("java.version")); ++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ++ JPanel panel = new JPanel(); ++ final JTextArea label = new JTextArea("(empty)"); ++ label.setSize(400, 300); ++ label.setBorder(new LineBorder(Color.black)); ++ label.setFont(ourFont); ++ ++ final String str = "\u0F04\u0F05\u0F0D\u0F0D\u0020\u0F4F\u0F72\u0F53\u0F0B\u0F4F\u0F72\u0F53\u0F0B\u0F42\u0FB1\u0F72\u0F0B\u0F51\u0F54\u0F60\u0F0B\u0F62\u0FA9\u0F63"; // TinTin. ++ ++ if(AUTOMATIC_TEST) { /* run the test automatically (else, manually) */ ++ label.setText(str); ++ } else { ++ JButton button = new JButton("Set Char x0DDD"); ++ button.addActionListener(new AbstractAction() { ++ public void actionPerformed(ActionEvent actionEvent) { ++ label.setText(str); ++ } ++ }); ++ panel.add(button); ++ } ++ panel.add(label); ++ ++ frame.getContentPane().add(panel); ++ frame.pack(); ++ frame.setVisible(true); ++ } ++} ++ diff --git a/java/openjdk6/files/icedtea/openjdk/6963811-deadlock_fix.patch b/java/openjdk6/files/icedtea/openjdk/6963811-deadlock_fix.patch new file mode 100644 index 000000000000..50e4c6d7d67a --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/6963811-deadlock_fix.patch @@ -0,0 +1,42 @@ +# HG changeset patch +# User andrew +# Date 1365711839 -3600 +# Node ID df591e0dfd349dc5986cc17949939c588d5a9690 +# Parent 06255d9f82761abc74c30f31fda00968ffef4bc3 +6963811: Deadlock-prone locking changes in Introspector +Reviewed-by: peterz, rupashka + +diff --git a/src/share/classes/java/beans/Introspector.java b/src/share/classes/java/beans/Introspector.java +--- jdk/src/share/classes/java/beans/Introspector.java ++++ jdk/src/share/classes/java/beans/Introspector.java +@@ -170,21 +170,24 @@ + if (!ReflectUtil.isPackageAccessible(beanClass)) { + return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); + } ++ WeakCache<Class<?>, BeanInfo> beanInfoCache; ++ BeanInfo beanInfo; + synchronized (BEANINFO_CACHE) { +- WeakCache<Class<?>, BeanInfo> beanInfoCache = +- (WeakCache<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE); ++ beanInfoCache = (WeakCache<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE); + + if (beanInfoCache == null) { + beanInfoCache = new WeakCache<Class<?>, BeanInfo>(); + AppContext.getAppContext().put(BEANINFO_CACHE, beanInfoCache); + } +- BeanInfo beanInfo = beanInfoCache.get(beanClass); +- if (beanInfo == null) { +- beanInfo = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); ++ beanInfo = beanInfoCache.get(beanClass); ++ } ++ if (beanInfo == null) { ++ beanInfo = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); ++ synchronized (BEANINFO_CACHE) { + beanInfoCache.put(beanClass, beanInfo); + } +- return beanInfo; + } ++ return beanInfo; + } + + /** diff --git a/java/openjdk6/files/icedtea/openjdk/7017324-kerning_crash.patch b/java/openjdk6/files/icedtea/openjdk/7017324-kerning_crash.patch new file mode 100644 index 000000000000..1794154c83e3 --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/7017324-kerning_crash.patch @@ -0,0 +1,101 @@ +# HG changeset patch +# User andrew +# Date 1365745184 -3600 +# Node ID 5ed9acc1f6be298713f10ad71c33564d48f46555 +# Parent d79bfc0c6371d1174209585a8d2bf08e3f3625f9 +7017324: Kerning crash in JDK 7 since ICU layout update +Reviewed-by: igor, prr + +diff --git a/src/share/native/sun/font/layout/KernTable.cpp b/src/share/native/sun/font/layout/KernTable.cpp +--- jdk/src/share/native/sun/font/layout/KernTable.cpp ++++ jdk/src/share/native/sun/font/layout/KernTable.cpp +@@ -217,7 +217,7 @@ + // all the elements ahead of time and store them in the font + + const PairInfo* p = pairsSwapped; +- const PairInfo* tp = (const PairInfo*)(p + rangeShift); ++ const PairInfo* tp = (const PairInfo*)(p + (rangeShift/KERN_PAIRINFO_SIZE)); /* rangeshift is in original table bytes */ + if (key > tp->key) { + p = tp; + } +@@ -229,7 +229,7 @@ + le_uint32 probe = searchRange; + while (probe > 1) { + probe >>= 1; +- tp = (const PairInfo*)(p + probe); ++ tp = (const PairInfo*)(p + (probe/KERN_PAIRINFO_SIZE)); + le_uint32 tkey = tp->key; + #if DEBUG + fprintf(stdout, " %.3d (%0.8x)\n", (tp - pairsSwapped), tkey); +diff --git a/test/java/awt/font/TextLayout/KernCrash.java b/test/java/awt/font/TextLayout/KernCrash.java +new file mode 100644 +--- /dev/null ++++ jdk/test/java/awt/font/TextLayout/KernCrash.java +@@ -0,0 +1,67 @@ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.io.*; ++import java.awt.*; ++import java.awt.font.*; ++import java.util.*; ++ ++/** ++ * Shows (top) with kerning, (middle) without, (bottom) also without. ++ * ++ * @bug 7017324 ++ */ ++public class KernCrash extends Frame { ++ private static Font font0; ++ private static Font font1; ++ private static Font font2; ++ ++ public static void main(String[] args) throws Exception { ++ HashMap attrs = new HashMap(); ++ font0 = Font.createFont(Font.TRUETYPE_FONT, new File("Vera.ttf")); ++ System.out.println("using " + font0); ++ attrs.put(TextAttribute.SIZE, new Float(58f)); ++ font1 = font0.deriveFont(attrs); ++ attrs.put(TextAttribute.KERNING, TextAttribute.KERNING_ON); ++ font2 = font0.deriveFont(attrs); ++ ++ KernCrash f = new KernCrash(); ++ f.setTitle("Kerning Crash"); ++ f.setSize(600, 300); ++ f.setForeground(Color.black); ++ f.show(); ++ } ++ ++ public void paint(Graphics g) { ++ Graphics2D g2 = (Graphics2D)g; ++ FontRenderContext frc = g2.getFontRenderContext(); ++ TextLayout layout = new TextLayout("text", font2, frc); ++ layout.draw(g2, 10, 150); ++ ++ String s = "WAVATastic"; ++ TextLayout layout2 = new TextLayout(s, font1, frc); ++ layout2.draw(g2, 10, 200); ++ TextLayout layout3 = new TextLayout(s, font2, frc); ++ layout3.draw(g2, 10, 100); ++ } ++} diff --git a/java/openjdk6/files/icedtea/7032388-work_without_cmov_instruction.patch b/java/openjdk6/files/icedtea/openjdk/7032388-work_without_cmov_instruction.patch index 532ad68b9565..532ad68b9565 100644 --- a/java/openjdk6/files/icedtea/7032388-work_without_cmov_instruction.patch +++ b/java/openjdk6/files/icedtea/openjdk/7032388-work_without_cmov_instruction.patch diff --git a/java/openjdk6/files/icedtea/openjdk/7036559-concurrenthashmap_improvements.patch b/java/openjdk6/files/icedtea/openjdk/7036559-concurrenthashmap_improvements.patch new file mode 100644 index 000000000000..f710737912ef --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/7036559-concurrenthashmap_improvements.patch @@ -0,0 +1,1436 @@ +# HG changeset patch +# User dl +# Date 1303139440 -3600 +# Node ID 005c0c85b0decf18a90ff6c9601d1b9a2c0a3fa4 +# Parent 603e70836e74e5c18fc32279f7e4df5b4c63e0b6 +7036559: ConcurrentHashMap footprint and contention improvements +Reviewed-by: chegar + +diff --git a/src/share/classes/java/util/concurrent/ConcurrentHashMap.java b/src/share/classes/java/util/concurrent/ConcurrentHashMap.java +--- jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java ++++ jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java +@@ -105,7 +105,25 @@ + + /* + * The basic strategy is to subdivide the table among Segments, +- * each of which itself is a concurrently readable hash table. ++ * each of which itself is a concurrently readable hash table. To ++ * reduce footprint, all but one segments are constructed only ++ * when first needed (see ensureSegment). To maintain visibility ++ * in the presence of lazy construction, accesses to segments as ++ * well as elements of segment's table must use volatile access, ++ * which is done via Unsafe within methods segmentAt etc ++ * below. These provide the functionality of AtomicReferenceArrays ++ * but reduce the levels of indirection. Additionally, ++ * volatile-writes of table elements and entry "next" fields ++ * within locked operations use the cheaper "lazySet" forms of ++ * writes (via putOrderedObject) because these writes are always ++ * followed by lock releases that maintain sequential consistency ++ * of table updates. ++ * ++ * Historical note: The previous version of this class relied ++ * heavily on "final" fields, which avoided some volatile reads at ++ * the expense of a large initial footprint. Some remnants of ++ * that design (including forced construction of segment 0) exist ++ * to ensure serialization compatibility. + */ + + /* ---------------- Constants -------------- */ +@@ -137,8 +155,15 @@ + static final int MAXIMUM_CAPACITY = 1 << 30; + + /** ++ * The minimum capacity for per-segment tables. Must be a power ++ * of two, at least two to avoid immediate resizing on next use ++ * after lazy construction. ++ */ ++ static final int MIN_SEGMENT_TABLE_CAPACITY = 2; ++ ++ /** + * The maximum number of segments to allow; used to bound +- * constructor arguments. ++ * constructor arguments. Must be power of two less than 1 << 24. + */ + static final int MAX_SEGMENTS = 1 << 16; // slightly conservative + +@@ -164,7 +189,7 @@ + final int segmentShift; + + /** +- * The segments, each of which is a specialized hash table ++ * The segments, each of which is a specialized hash table. + */ + final Segment<K,V>[] segments; + +@@ -172,7 +197,65 @@ + transient Set<Map.Entry<K,V>> entrySet; + transient Collection<V> values; + +- /* ---------------- Small Utilities -------------- */ ++ /** ++ * ConcurrentHashMap list entry. Note that this is never exported ++ * out as a user-visible Map.Entry. ++ */ ++ static final class HashEntry<K,V> { ++ final int hash; ++ final K key; ++ volatile V value; ++ volatile HashEntry<K,V> next; ++ ++ HashEntry(int hash, K key, V value, HashEntry<K,V> next) { ++ this.hash = hash; ++ this.key = key; ++ this.value = value; ++ this.next = next; ++ } ++ ++ /** ++ * Sets next field with volatile write semantics. (See above ++ * about use of putOrderedObject.) ++ */ ++ final void setNext(HashEntry<K,V> n) { ++ UNSAFE.putOrderedObject(this, nextOffset, n); ++ } ++ ++ // Unsafe mechanics ++ static final sun.misc.Unsafe UNSAFE; ++ static final long nextOffset; ++ static { ++ try { ++ UNSAFE = sun.misc.Unsafe.getUnsafe(); ++ Class k = HashEntry.class; ++ nextOffset = UNSAFE.objectFieldOffset ++ (k.getDeclaredField("next")); ++ } catch (Exception e) { ++ throw new Error(e); ++ } ++ } ++ } ++ ++ /** ++ * Gets the ith element of given table (if nonnull) with volatile ++ * read semantics. ++ */ ++ @SuppressWarnings("unchecked") ++ static final <K,V> HashEntry<K,V> entryAt(HashEntry<K,V>[] tab, int i) { ++ return (tab == null) ? null : ++ (HashEntry<K,V>) UNSAFE.getObjectVolatile ++ (tab, ((long)i << TSHIFT) + TBASE); ++ } ++ ++ /** ++ * Sets the ith element of given table, with volatile write ++ * semantics. (See above about use of putOrderedObject.) ++ */ ++ static final <K,V> void setEntryAt(HashEntry<K,V>[] tab, int i, ++ HashEntry<K,V> e) { ++ UNSAFE.putOrderedObject(tab, ((long)i << TSHIFT) + TBASE, e); ++ } + + /** + * Applies a supplemental hash function to a given hashCode, which +@@ -193,104 +276,67 @@ + } + + /** +- * Returns the segment that should be used for key with given hash +- * @param hash the hash code for the key +- * @return the segment +- */ +- final Segment<K,V> segmentFor(int hash) { +- return segments[(hash >>> segmentShift) & segmentMask]; +- } +- +- /* ---------------- Inner Classes -------------- */ +- +- /** +- * ConcurrentHashMap list entry. Note that this is never exported +- * out as a user-visible Map.Entry. +- * +- * Because the value field is volatile, not final, it is legal wrt +- * the Java Memory Model for an unsynchronized reader to see null +- * instead of initial value when read via a data race. Although a +- * reordering leading to this is not likely to ever actually +- * occur, the Segment.readValueUnderLock method is used as a +- * backup in case a null (pre-initialized) value is ever seen in +- * an unsynchronized access method. +- */ +- static final class HashEntry<K,V> { +- final K key; +- final int hash; +- volatile V value; +- final HashEntry<K,V> next; +- +- HashEntry(K key, int hash, HashEntry<K,V> next, V value) { +- this.key = key; +- this.hash = hash; +- this.next = next; +- this.value = value; +- } +- +- @SuppressWarnings("unchecked") +- static final <K,V> HashEntry<K,V>[] newArray(int i) { +- return new HashEntry[i]; +- } +- } +- +- /** + * Segments are specialized versions of hash tables. This + * subclasses from ReentrantLock opportunistically, just to + * simplify some locking and avoid separate construction. + */ + static final class Segment<K,V> extends ReentrantLock implements Serializable { + /* +- * Segments maintain a table of entry lists that are ALWAYS +- * kept in a consistent state, so can be read without locking. +- * Next fields of nodes are immutable (final). All list +- * additions are performed at the front of each bin. This +- * makes it easy to check changes, and also fast to traverse. +- * When nodes would otherwise be changed, new nodes are +- * created to replace them. This works well for hash tables +- * since the bin lists tend to be short. (The average length +- * is less than two for the default load factor threshold.) ++ * Segments maintain a table of entry lists that are always ++ * kept in a consistent state, so can be read (via volatile ++ * reads of segments and tables) without locking. This ++ * requires replicating nodes when necessary during table ++ * resizing, so the old lists can be traversed by readers ++ * still using old version of table. + * +- * Read operations can thus proceed without locking, but rely +- * on selected uses of volatiles to ensure that completed +- * write operations performed by other threads are +- * noticed. For most purposes, the "count" field, tracking the +- * number of elements, serves as that volatile variable +- * ensuring visibility. This is convenient because this field +- * needs to be read in many read operations anyway: +- * +- * - All (unsynchronized) read operations must first read the +- * "count" field, and should not look at table entries if +- * it is 0. +- * +- * - All (synchronized) write operations should write to +- * the "count" field after structurally changing any bin. +- * The operations must not take any action that could even +- * momentarily cause a concurrent read operation to see +- * inconsistent data. This is made easier by the nature of +- * the read operations in Map. For example, no operation +- * can reveal that the table has grown but the threshold +- * has not yet been updated, so there are no atomicity +- * requirements for this with respect to reads. +- * +- * As a guide, all critical volatile reads and writes to the +- * count field are marked in code comments. ++ * This class defines only mutative methods requiring locking. ++ * Except as noted, the methods of this class perform the ++ * per-segment versions of ConcurrentHashMap methods. (Other ++ * methods are integrated directly into ConcurrentHashMap ++ * methods.) These mutative methods use a form of controlled ++ * spinning on contention via methods scanAndLock and ++ * scanAndLockForPut. These intersperse tryLocks with ++ * traversals to locate nodes. The main benefit is to absorb ++ * cache misses (which are very common for hash tables) while ++ * obtaining locks so that traversal is faster once ++ * acquired. We do not actually use the found nodes since they ++ * must be re-acquired under lock anyway to ensure sequential ++ * consistency of updates (and in any case may be undetectably ++ * stale), but they will normally be much faster to re-locate. ++ * Also, scanAndLockForPut speculatively creates a fresh node ++ * to use in put if no node is found. + */ + + private static final long serialVersionUID = 2249069246763182397L; + + /** +- * The number of elements in this segment's region. ++ * The maximum number of times to tryLock in a prescan before ++ * possibly blocking on acquire in preparation for a locked ++ * segment operation. On multiprocessors, using a bounded ++ * number of retries maintains cache acquired while locating ++ * nodes. + */ +- transient volatile int count; ++ static final int MAX_SCAN_RETRIES = ++ Runtime.getRuntime().availableProcessors() > 1 ? 64 : 1; + + /** +- * Number of updates that alter the size of the table. This is +- * used during bulk-read methods to make sure they see a +- * consistent snapshot: If modCounts change during a traversal +- * of segments computing size or checking containsValue, then +- * we might have an inconsistent view of state so (usually) +- * must retry. ++ * The per-segment table. Elements are accessed via ++ * entryAt/setEntryAt providing volatile semantics. ++ */ ++ transient volatile HashEntry<K,V>[] table; ++ ++ /** ++ * The number of elements. Accessed only either within locks ++ * or among other volatile reads that maintain visibility. ++ */ ++ transient int count; ++ ++ /** ++ * The total number of mutative operations in this segment. ++ * Even though this may overflows 32 bits, it provides ++ * sufficient accuracy for stability checks in CHM isEmpty() ++ * and size() methods. Accessed only either within locks or ++ * among other volatile reads that maintain visibility. + */ + transient int modCount; + +@@ -302,11 +348,6 @@ + transient int threshold; + + /** +- * The per-segment table. +- */ +- transient volatile HashEntry<K,V>[] table; +- +- /** + * The load factor for the hash table. Even though this value + * is same for all segments, it is replicated to avoid needing + * links to outer object. +@@ -314,202 +355,94 @@ + */ + final float loadFactor; + +- Segment(int initialCapacity, float lf) { +- loadFactor = lf; +- setTable(HashEntry.<K,V>newArray(initialCapacity)); ++ Segment(float lf, int threshold, HashEntry<K,V>[] tab) { ++ this.loadFactor = lf; ++ this.threshold = threshold; ++ this.table = tab; + } + +- @SuppressWarnings("unchecked") +- static final <K,V> Segment<K,V>[] newArray(int i) { +- return new Segment[i]; ++ final V put(K key, int hash, V value, boolean onlyIfAbsent) { ++ HashEntry<K,V> node = tryLock() ? null : ++ scanAndLockForPut(key, hash, value); ++ V oldValue; ++ try { ++ HashEntry<K,V>[] tab = table; ++ int index = (tab.length - 1) & hash; ++ HashEntry<K,V> first = entryAt(tab, index); ++ for (HashEntry<K,V> e = first;;) { ++ if (e != null) { ++ K k; ++ if ((k = e.key) == key || ++ (e.hash == hash && key.equals(k))) { ++ oldValue = e.value; ++ if (!onlyIfAbsent) { ++ e.value = value; ++ ++modCount; ++ } ++ break; ++ } ++ e = e.next; ++ } ++ else { ++ if (node != null) ++ node.setNext(first); ++ else ++ node = new HashEntry<K,V>(hash, key, value, first); ++ int c = count + 1; ++ if (c > threshold && first != null && ++ tab.length < MAXIMUM_CAPACITY) ++ rehash(node); ++ else ++ setEntryAt(tab, index, node); ++ ++modCount; ++ count = c; ++ oldValue = null; ++ break; ++ } ++ } ++ } finally { ++ unlock(); ++ } ++ return oldValue; + } + + /** +- * Sets table to new HashEntry array. +- * Call only while holding lock or in constructor. ++ * Doubles size of table and repacks entries, also adding the ++ * given node to new table + */ +- void setTable(HashEntry<K,V>[] newTable) { +- threshold = (int)(newTable.length * loadFactor); +- table = newTable; +- } +- +- /** +- * Returns properly casted first entry of bin for given hash. +- */ +- HashEntry<K,V> getFirst(int hash) { +- HashEntry<K,V>[] tab = table; +- return tab[hash & (tab.length - 1)]; +- } +- +- /** +- * Reads value field of an entry under lock. Called if value +- * field ever appears to be null. This is possible only if a +- * compiler happens to reorder a HashEntry initialization with +- * its table assignment, which is legal under memory model +- * but is not known to ever occur. +- */ +- V readValueUnderLock(HashEntry<K,V> e) { +- lock(); +- try { +- return e.value; +- } finally { +- unlock(); +- } +- } +- +- /* Specialized implementations of map methods */ +- +- V get(Object key, int hash) { +- if (count != 0) { // read-volatile +- HashEntry<K,V> e = getFirst(hash); +- while (e != null) { +- if (e.hash == hash && key.equals(e.key)) { +- V v = e.value; +- if (v != null) +- return v; +- return readValueUnderLock(e); // recheck +- } +- e = e.next; +- } +- } +- return null; +- } +- +- boolean containsKey(Object key, int hash) { +- if (count != 0) { // read-volatile +- HashEntry<K,V> e = getFirst(hash); +- while (e != null) { +- if (e.hash == hash && key.equals(e.key)) +- return true; +- e = e.next; +- } +- } +- return false; +- } +- +- boolean containsValue(Object value) { +- if (count != 0) { // read-volatile +- HashEntry<K,V>[] tab = table; +- int len = tab.length; +- for (int i = 0 ; i < len; i++) { +- for (HashEntry<K,V> e = tab[i]; e != null; e = e.next) { +- V v = e.value; +- if (v == null) // recheck +- v = readValueUnderLock(e); +- if (value.equals(v)) +- return true; +- } +- } +- } +- return false; +- } +- +- boolean replace(K key, int hash, V oldValue, V newValue) { +- lock(); +- try { +- HashEntry<K,V> e = getFirst(hash); +- while (e != null && (e.hash != hash || !key.equals(e.key))) +- e = e.next; +- +- boolean replaced = false; +- if (e != null && oldValue.equals(e.value)) { +- replaced = true; +- e.value = newValue; +- } +- return replaced; +- } finally { +- unlock(); +- } +- } +- +- V replace(K key, int hash, V newValue) { +- lock(); +- try { +- HashEntry<K,V> e = getFirst(hash); +- while (e != null && (e.hash != hash || !key.equals(e.key))) +- e = e.next; +- +- V oldValue = null; +- if (e != null) { +- oldValue = e.value; +- e.value = newValue; +- } +- return oldValue; +- } finally { +- unlock(); +- } +- } +- +- +- V put(K key, int hash, V value, boolean onlyIfAbsent) { +- lock(); +- try { +- int c = count; +- if (c++ > threshold) // ensure capacity +- rehash(); +- HashEntry<K,V>[] tab = table; +- int index = hash & (tab.length - 1); +- HashEntry<K,V> first = tab[index]; +- HashEntry<K,V> e = first; +- while (e != null && (e.hash != hash || !key.equals(e.key))) +- e = e.next; +- +- V oldValue; +- if (e != null) { +- oldValue = e.value; +- if (!onlyIfAbsent) +- e.value = value; +- } +- else { +- oldValue = null; +- ++modCount; +- tab[index] = new HashEntry<K,V>(key, hash, first, value); +- count = c; // write-volatile +- } +- return oldValue; +- } finally { +- unlock(); +- } +- } +- +- void rehash() { ++ @SuppressWarnings("unchecked") ++ private void rehash(HashEntry<K,V> node) { ++ /* ++ * Reclassify nodes in each list to new table. Because we ++ * are using power-of-two expansion, the elements from ++ * each bin must either stay at same index, or move with a ++ * power of two offset. We eliminate unnecessary node ++ * creation by catching cases where old nodes can be ++ * reused because their next fields won't change. ++ * Statistically, at the default threshold, only about ++ * one-sixth of them need cloning when a table ++ * doubles. The nodes they replace will be garbage ++ * collectable as soon as they are no longer referenced by ++ * any reader thread that may be in the midst of ++ * concurrently traversing table. Entry accesses use plain ++ * array indexing because they are followed by volatile ++ * table write. ++ */ + HashEntry<K,V>[] oldTable = table; + int oldCapacity = oldTable.length; +- if (oldCapacity >= MAXIMUM_CAPACITY) +- return; +- +- /* +- * Reclassify nodes in each list to new Map. Because we are +- * using power-of-two expansion, the elements from each bin +- * must either stay at same index, or move with a power of two +- * offset. We eliminate unnecessary node creation by catching +- * cases where old nodes can be reused because their next +- * fields won't change. Statistically, at the default +- * threshold, only about one-sixth of them need cloning when +- * a table doubles. The nodes they replace will be garbage +- * collectable as soon as they are no longer referenced by any +- * reader thread that may be in the midst of traversing table +- * right now. +- */ +- +- HashEntry<K,V>[] newTable = HashEntry.newArray(oldCapacity<<1); +- threshold = (int)(newTable.length * loadFactor); +- int sizeMask = newTable.length - 1; ++ int newCapacity = oldCapacity << 1; ++ threshold = (int)(newCapacity * loadFactor); ++ HashEntry<K,V>[] newTable = ++ (HashEntry<K,V>[]) new HashEntry[newCapacity]; ++ int sizeMask = newCapacity - 1; + for (int i = 0; i < oldCapacity ; i++) { +- // We need to guarantee that any existing reads of old Map can +- // proceed. So we cannot yet null out each bin. + HashEntry<K,V> e = oldTable[i]; +- + if (e != null) { + HashEntry<K,V> next = e.next; + int idx = e.hash & sizeMask; +- +- // Single node on list +- if (next == null) ++ if (next == null) // Single node on list + newTable[idx] = e; +- +- else { +- // Reuse trailing consecutive sequence at same slot ++ else { // Reuse consecutive sequence at same slot + HashEntry<K,V> lastRun = e; + int lastIdx = idx; + for (HashEntry<K,V> last = next; +@@ -522,74 +455,259 @@ + } + } + newTable[lastIdx] = lastRun; +- +- // Clone all remaining nodes ++ // Clone remaining nodes + for (HashEntry<K,V> p = e; p != lastRun; p = p.next) { +- int k = p.hash & sizeMask; ++ V v = p.value; ++ int h = p.hash; ++ int k = h & sizeMask; + HashEntry<K,V> n = newTable[k]; +- newTable[k] = new HashEntry<K,V>(p.key, p.hash, +- n, p.value); ++ newTable[k] = new HashEntry<K,V>(h, p.key, v, n); + } + } + } + } ++ int nodeIndex = node.hash & sizeMask; // add the new node ++ node.setNext(newTable[nodeIndex]); ++ newTable[nodeIndex] = node; + table = newTable; + } + + /** ++ * Scans for a node containing given key while trying to ++ * acquire lock, creating and returning one if not found. Upon ++ * return, guarantees that lock is held. UNlike in most ++ * methods, calls to method equals are not screened: Since ++ * traversal speed doesn't matter, we might as well help warm ++ * up the associated code and accesses as well. ++ * ++ * @return a new node if key not found, else null ++ */ ++ private HashEntry<K,V> scanAndLockForPut(K key, int hash, V value) { ++ HashEntry<K,V> first = entryForHash(this, hash); ++ HashEntry<K,V> e = first; ++ HashEntry<K,V> node = null; ++ int retries = -1; // negative while locating node ++ while (!tryLock()) { ++ HashEntry<K,V> f; // to recheck first below ++ if (retries < 0) { ++ if (e == null) { ++ if (node == null) // speculatively create node ++ node = new HashEntry<K,V>(hash, key, value, null); ++ retries = 0; ++ } ++ else if (key.equals(e.key)) ++ retries = 0; ++ else ++ e = e.next; ++ } ++ else if (++retries > MAX_SCAN_RETRIES) { ++ lock(); ++ break; ++ } ++ else if ((retries & 1) == 0 && ++ (f = entryForHash(this, hash)) != first) { ++ e = first = f; // re-traverse if entry changed ++ retries = -1; ++ } ++ } ++ return node; ++ } ++ ++ /** ++ * Scans for a node containing the given key while trying to ++ * acquire lock for a remove or replace operation. Upon ++ * return, guarantees that lock is held. Note that we must ++ * lock even if the key is not found, to ensure sequential ++ * consistency of updates. ++ */ ++ private void scanAndLock(Object key, int hash) { ++ // similar to but simpler than scanAndLockForPut ++ HashEntry<K,V> first = entryForHash(this, hash); ++ HashEntry<K,V> e = first; ++ int retries = -1; ++ while (!tryLock()) { ++ HashEntry<K,V> f; ++ if (retries < 0) { ++ if (e == null || key.equals(e.key)) ++ retries = 0; ++ else ++ e = e.next; ++ } ++ else if (++retries > MAX_SCAN_RETRIES) { ++ lock(); ++ break; ++ } ++ else if ((retries & 1) == 0 && ++ (f = entryForHash(this, hash)) != first) { ++ e = first = f; ++ retries = -1; ++ } ++ } ++ } ++ ++ /** + * Remove; match on key only if value null, else match both. + */ +- V remove(Object key, int hash, Object value) { ++ final V remove(Object key, int hash, Object value) { ++ if (!tryLock()) ++ scanAndLock(key, hash); ++ V oldValue = null; ++ try { ++ HashEntry<K,V>[] tab = table; ++ int index = (tab.length - 1) & hash; ++ HashEntry<K,V> e = entryAt(tab, index); ++ HashEntry<K,V> pred = null; ++ while (e != null) { ++ K k; ++ HashEntry<K,V> next = e.next; ++ if ((k = e.key) == key || ++ (e.hash == hash && key.equals(k))) { ++ V v = e.value; ++ if (value == null || value == v || value.equals(v)) { ++ if (pred == null) ++ setEntryAt(tab, index, next); ++ else ++ pred.setNext(next); ++ ++modCount; ++ --count; ++ oldValue = v; ++ } ++ break; ++ } ++ pred = e; ++ e = next; ++ } ++ } finally { ++ unlock(); ++ } ++ return oldValue; ++ } ++ ++ final boolean replace(K key, int hash, V oldValue, V newValue) { ++ if (!tryLock()) ++ scanAndLock(key, hash); ++ boolean replaced = false; ++ try { ++ HashEntry<K,V> e; ++ for (e = entryForHash(this, hash); e != null; e = e.next) { ++ K k; ++ if ((k = e.key) == key || ++ (e.hash == hash && key.equals(k))) { ++ if (oldValue.equals(e.value)) { ++ e.value = newValue; ++ ++modCount; ++ replaced = true; ++ } ++ break; ++ } ++ } ++ } finally { ++ unlock(); ++ } ++ return replaced; ++ } ++ ++ final V replace(K key, int hash, V value) { ++ if (!tryLock()) ++ scanAndLock(key, hash); ++ V oldValue = null; ++ try { ++ HashEntry<K,V> e; ++ for (e = entryForHash(this, hash); e != null; e = e.next) { ++ K k; ++ if ((k = e.key) == key || ++ (e.hash == hash && key.equals(k))) { ++ oldValue = e.value; ++ e.value = value; ++ ++modCount; ++ break; ++ } ++ } ++ } finally { ++ unlock(); ++ } ++ return oldValue; ++ } ++ ++ final void clear() { + lock(); + try { +- int c = count - 1; + HashEntry<K,V>[] tab = table; +- int index = hash & (tab.length - 1); +- HashEntry<K,V> first = tab[index]; +- HashEntry<K,V> e = first; +- while (e != null && (e.hash != hash || !key.equals(e.key))) +- e = e.next; +- +- V oldValue = null; +- if (e != null) { +- V v = e.value; +- if (value == null || value.equals(v)) { +- oldValue = v; +- // All entries following removed node can stay +- // in list, but all preceding ones need to be +- // cloned. +- ++modCount; +- HashEntry<K,V> newFirst = e.next; +- for (HashEntry<K,V> p = first; p != e; p = p.next) +- newFirst = new HashEntry<K,V>(p.key, p.hash, +- newFirst, p.value); +- tab[index] = newFirst; +- count = c; // write-volatile +- } +- } +- return oldValue; ++ for (int i = 0; i < tab.length ; i++) ++ setEntryAt(tab, i, null); ++ ++modCount; ++ count = 0; + } finally { + unlock(); + } + } ++ } + +- void clear() { +- if (count != 0) { +- lock(); +- try { +- HashEntry<K,V>[] tab = table; +- for (int i = 0; i < tab.length ; i++) +- tab[i] = null; +- ++modCount; +- count = 0; // write-volatile +- } finally { +- unlock(); ++ // Accessing segments ++ ++ /** ++ * Gets the jth element of given segment array (if nonnull) with ++ * volatile element access semantics via Unsafe. ++ */ ++ @SuppressWarnings("unchecked") ++ static final <K,V> Segment<K,V> segmentAt(Segment<K,V>[] ss, int j) { ++ long u = (j << SSHIFT) + SBASE; ++ return ss == null ? null : ++ (Segment<K,V>) UNSAFE.getObjectVolatile(ss, u); ++ } ++ ++ /** ++ * Returns the segment for the given index, creating it and ++ * recording in segment table (via CAS) if not already present. ++ * ++ * @param k the index ++ * @return the segment ++ */ ++ @SuppressWarnings("unchecked") ++ private Segment<K,V> ensureSegment(int k) { ++ final Segment<K,V>[] ss = this.segments; ++ long u = (k << SSHIFT) + SBASE; // raw offset ++ Segment<K,V> seg; ++ if ((seg = (Segment<K,V>)UNSAFE.getObjectVolatile(ss, u)) == null) { ++ Segment<K,V> proto = ss[0]; // use segment 0 as prototype ++ int cap = proto.table.length; ++ float lf = proto.loadFactor; ++ int threshold = (int)(cap * lf); ++ HashEntry<K,V>[] tab = (HashEntry<K,V>[])new HashEntry[cap]; ++ if ((seg = (Segment<K,V>)UNSAFE.getObjectVolatile(ss, u)) ++ == null) { // recheck ++ Segment<K,V> s = new Segment<K,V>(lf, threshold, tab); ++ while ((seg = (Segment<K,V>)UNSAFE.getObjectVolatile(ss, u)) ++ == null) { ++ if (UNSAFE.compareAndSwapObject(ss, u, null, seg = s)) ++ break; + } + } + } ++ return seg; + } + ++ // Hash-based segment and entry accesses + ++ /** ++ * Get the segment for the given hash ++ */ ++ @SuppressWarnings("unchecked") ++ private Segment<K,V> segmentForHash(int h) { ++ long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE; ++ return (Segment<K,V>) UNSAFE.getObjectVolatile(segments, u); ++ } ++ ++ /** ++ * Gets the table entry for the given segment and hash ++ */ ++ @SuppressWarnings("unchecked") ++ static final <K,V> HashEntry<K,V> entryForHash(Segment<K,V> seg, int h) { ++ HashEntry<K,V>[] tab; ++ return (seg == null || (tab = seg.table) == null) ? null : ++ (HashEntry<K,V>) UNSAFE.getObjectVolatile ++ (tab, ((long)(((tab.length - 1) & h)) << TSHIFT) + TBASE); ++ } + + /* ---------------- Public operations -------------- */ + +@@ -609,14 +727,13 @@ + * negative or the load factor or concurrencyLevel are + * nonpositive. + */ ++ @SuppressWarnings("unchecked") + public ConcurrentHashMap(int initialCapacity, + float loadFactor, int concurrencyLevel) { + if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0) + throw new IllegalArgumentException(); +- + if (concurrencyLevel > MAX_SEGMENTS) + concurrencyLevel = MAX_SEGMENTS; +- + // Find power-of-two sizes best matching arguments + int sshift = 0; + int ssize = 1; +@@ -624,21 +741,23 @@ + ++sshift; + ssize <<= 1; + } +- segmentShift = 32 - sshift; +- segmentMask = ssize - 1; +- this.segments = Segment.newArray(ssize); +- ++ this.segmentShift = 32 - sshift; ++ this.segmentMask = ssize - 1; + if (initialCapacity > MAXIMUM_CAPACITY) + initialCapacity = MAXIMUM_CAPACITY; + int c = initialCapacity / ssize; + if (c * ssize < initialCapacity) + ++c; +- int cap = 1; ++ int cap = MIN_SEGMENT_TABLE_CAPACITY; + while (cap < c) + cap <<= 1; +- +- for (int i = 0; i < this.segments.length; ++i) +- this.segments[i] = new Segment<K,V>(cap, loadFactor); ++ // create segments and segments[0] ++ Segment<K,V> s0 = ++ new Segment<K,V>(loadFactor, (int)(cap * loadFactor), ++ (HashEntry<K,V>[])new HashEntry[cap]); ++ Segment<K,V>[] ss = (Segment<K,V>[])new Segment[ssize]; ++ UNSAFE.putOrderedObject(ss, SBASE, s0); // ordered write of segments[0] ++ this.segments = ss; + } + + /** +@@ -701,33 +820,36 @@ + * @return <tt>true</tt> if this map contains no key-value mappings + */ + public boolean isEmpty() { ++ /* ++ * Sum per-segment modCounts to avoid mis-reporting when ++ * elements are concurrently added and removed in one segment ++ * while checking another, in which case the table was never ++ * actually empty at any point. (The sum ensures accuracy up ++ * through at least 1<<31 per-segment modifications before ++ * recheck.) Methods size() and containsValue() use similar ++ * constructions for stability checks. ++ */ ++ long sum = 0L; + final Segment<K,V>[] segments = this.segments; +- /* +- * We keep track of per-segment modCounts to avoid ABA +- * problems in which an element in one segment was added and +- * in another removed during traversal, in which case the +- * table was never actually empty at any point. Note the +- * similar use of modCounts in the size() and containsValue() +- * methods, which are the only other methods also susceptible +- * to ABA problems. +- */ +- int[] mc = new int[segments.length]; +- int mcsum = 0; +- for (int i = 0; i < segments.length; ++i) { +- if (segments[i].count != 0) ++ for (int j = 0; j < segments.length; ++j) { ++ Segment<K,V> seg = segmentAt(segments, j); ++ if (seg != null) { ++ if (seg.count != 0) ++ return false; ++ sum += seg.modCount; ++ } ++ } ++ if (sum != 0L) { // recheck unless no modifications ++ for (int j = 0; j < segments.length; ++j) { ++ Segment<K,V> seg = segmentAt(segments, j); ++ if (seg != null) { ++ if (seg.count != 0) ++ return false; ++ sum -= seg.modCount; ++ } ++ } ++ if (sum != 0L) + return false; +- else +- mcsum += mc[i] = segments[i].modCount; +- } +- // If mcsum happens to be zero, then we know we got a snapshot +- // before any modifications at all were made. This is +- // probably common enough to bother tracking. +- if (mcsum != 0) { +- for (int i = 0; i < segments.length; ++i) { +- if (segments[i].count != 0 || +- mc[i] != segments[i].modCount) +- return false; +- } + } + return true; + } +@@ -740,45 +862,43 @@ + * @return the number of key-value mappings in this map + */ + public int size() { +- final Segment<K,V>[] segments = this.segments; +- long sum = 0; +- long check = 0; +- int[] mc = new int[segments.length]; + // Try a few times to get accurate count. On failure due to + // continuous async changes in table, resort to locking. +- for (int k = 0; k < RETRIES_BEFORE_LOCK; ++k) { +- check = 0; +- sum = 0; +- int mcsum = 0; +- for (int i = 0; i < segments.length; ++i) { +- sum += segments[i].count; +- mcsum += mc[i] = segments[i].modCount; +- } +- if (mcsum != 0) { +- for (int i = 0; i < segments.length; ++i) { +- check += segments[i].count; +- if (mc[i] != segments[i].modCount) { +- check = -1; // force retry +- break; ++ final Segment<K,V>[] segments = this.segments; ++ int size; ++ boolean overflow; // true if size overflows 32 bits ++ long sum; // sum of modCounts ++ long last = 0L; // previous sum ++ int retries = -1; // first iteration isn't retry ++ try { ++ for (;;) { ++ if (retries++ == RETRIES_BEFORE_LOCK) { ++ for (int j = 0; j < segments.length; ++j) ++ ensureSegment(j).lock(); // force creation ++ } ++ sum = 0L; ++ size = 0; ++ overflow = false; ++ for (int j = 0; j < segments.length; ++j) { ++ Segment<K,V> seg = segmentAt(segments, j); ++ if (seg != null) { ++ sum += seg.modCount; ++ int c = seg.count; ++ if (c < 0 || (size += c) < 0) ++ overflow = true; + } + } ++ if (sum == last) ++ break; ++ last = sum; + } +- if (check == sum) +- break; ++ } finally { ++ if (retries > RETRIES_BEFORE_LOCK) { ++ for (int j = 0; j < segments.length; ++j) ++ segmentAt(segments, j).unlock(); ++ } + } +- if (check != sum) { // Resort to locking all segments +- sum = 0; +- for (int i = 0; i < segments.length; ++i) +- segments[i].lock(); +- for (int i = 0; i < segments.length; ++i) +- sum += segments[i].count; +- for (int i = 0; i < segments.length; ++i) +- segments[i].unlock(); +- } +- if (sum > Integer.MAX_VALUE) +- return Integer.MAX_VALUE; +- else +- return (int)sum; ++ return overflow ? Integer.MAX_VALUE : size; + } + + /** +@@ -794,7 +914,13 @@ + */ + public V get(Object key) { + int hash = hash(key.hashCode()); +- return segmentFor(hash).get(key, hash); ++ for (HashEntry<K,V> e = entryForHash(segmentForHash(hash), hash); ++ e != null; e = e.next) { ++ K k; ++ if ((k = e.key) == key || (e.hash == hash && key.equals(k))) ++ return e.value; ++ } ++ return null; + } + + /** +@@ -808,7 +934,13 @@ + */ + public boolean containsKey(Object key) { + int hash = hash(key.hashCode()); +- return segmentFor(hash).containsKey(key, hash); ++ for (HashEntry<K,V> e = entryForHash(segmentForHash(hash), hash); ++ e != null; e = e.next) { ++ K k; ++ if ((k = e.key) == key || (e.hash == hash && key.equals(k))) ++ return true; ++ } ++ return false; + } + + /** +@@ -823,51 +955,47 @@ + * @throws NullPointerException if the specified value is null + */ + public boolean containsValue(Object value) { ++ // Same idea as size() + if (value == null) + throw new NullPointerException(); +- +- // See explanation of modCount use above +- + final Segment<K,V>[] segments = this.segments; +- int[] mc = new int[segments.length]; +- +- // Try a few times without locking +- for (int k = 0; k < RETRIES_BEFORE_LOCK; ++k) { +- int sum = 0; +- int mcsum = 0; +- for (int i = 0; i < segments.length; ++i) { +- int c = segments[i].count; +- mcsum += mc[i] = segments[i].modCount; +- if (segments[i].containsValue(value)) +- return true; +- } +- boolean cleanSweep = true; +- if (mcsum != 0) { +- for (int i = 0; i < segments.length; ++i) { +- int c = segments[i].count; +- if (mc[i] != segments[i].modCount) { +- cleanSweep = false; +- break; ++ boolean found = false; ++ long last = 0; ++ int retries = -1; ++ try { ++ outer: for (;;) { ++ if (retries++ == RETRIES_BEFORE_LOCK) { ++ for (int j = 0; j < segments.length; ++j) ++ ensureSegment(j).lock(); // force creation ++ } ++ long hashSum = 0L; ++ int sum = 0; ++ for (int j = 0; j < segments.length; ++j) { ++ HashEntry<K,V>[] tab; ++ Segment<K,V> seg = segmentAt(segments, j); ++ if (seg != null && (tab = seg.table) != null) { ++ for (int i = 0 ; i < tab.length; i++) { ++ HashEntry<K,V> e; ++ for (e = entryAt(tab, i); e != null; e = e.next) { ++ V v = e.value; ++ if (v != null && value.equals(v)) { ++ found = true; ++ break outer; ++ } ++ } ++ } ++ sum += seg.modCount; + } + } +- } +- if (cleanSweep) +- return false; +- } +- // Resort to locking all segments +- for (int i = 0; i < segments.length; ++i) +- segments[i].lock(); +- boolean found = false; +- try { +- for (int i = 0; i < segments.length; ++i) { +- if (segments[i].containsValue(value)) { +- found = true; ++ if (retries > 0 && sum == last) + break; +- } ++ last = sum; + } + } finally { +- for (int i = 0; i < segments.length; ++i) +- segments[i].unlock(); ++ if (retries > RETRIES_BEFORE_LOCK) { ++ for (int j = 0; j < segments.length; ++j) ++ segmentAt(segments, j).unlock(); ++ } + } + return found; + } +@@ -908,7 +1036,11 @@ + if (value == null) + throw new NullPointerException(); + int hash = hash(key.hashCode()); +- return segmentFor(hash).put(key, hash, value, false); ++ int j = (hash >>> segmentShift) & segmentMask; ++ Segment<K,V> s = segmentAt(segments, j); ++ if (s == null) ++ s = ensureSegment(j); ++ return s.put(key, hash, value, false); + } + + /** +@@ -922,7 +1054,11 @@ + if (value == null) + throw new NullPointerException(); + int hash = hash(key.hashCode()); +- return segmentFor(hash).put(key, hash, value, true); ++ int j = (hash >>> segmentShift) & segmentMask; ++ Segment<K,V> s = segmentAt(segments, j); ++ if (s == null) ++ s = ensureSegment(j); ++ return s.put(key, hash, value, true); + } + + /** +@@ -948,7 +1084,8 @@ + */ + public V remove(Object key) { + int hash = hash(key.hashCode()); +- return segmentFor(hash).remove(key, hash, null); ++ Segment<K,V> s = segmentForHash(hash); ++ return s == null ? null : s.remove(key, hash, null); + } + + /** +@@ -958,9 +1095,9 @@ + */ + public boolean remove(Object key, Object value) { + int hash = hash(key.hashCode()); +- if (value == null) +- return false; +- return segmentFor(hash).remove(key, hash, value) != null; ++ Segment<K,V> s; ++ return value != null && (s = segmentForHash(hash)) != null && ++ s.remove(key, hash, value) != null; + } + + /** +@@ -969,10 +1106,11 @@ + * @throws NullPointerException if any of the arguments are null + */ + public boolean replace(K key, V oldValue, V newValue) { ++ int hash = hash(key.hashCode()); + if (oldValue == null || newValue == null) + throw new NullPointerException(); +- int hash = hash(key.hashCode()); +- return segmentFor(hash).replace(key, hash, oldValue, newValue); ++ Segment<K,V> s = segmentForHash(hash); ++ return s != null && s.replace(key, hash, oldValue, newValue); + } + + /** +@@ -983,18 +1121,23 @@ + * @throws NullPointerException if the specified key or value is null + */ + public V replace(K key, V value) { ++ int hash = hash(key.hashCode()); + if (value == null) + throw new NullPointerException(); +- int hash = hash(key.hashCode()); +- return segmentFor(hash).replace(key, hash, value); ++ Segment<K,V> s = segmentForHash(hash); ++ return s == null ? null : s.replace(key, hash, value); + } + + /** + * Removes all of the mappings from this map. + */ + public void clear() { +- for (int i = 0; i < segments.length; ++i) +- segments[i].clear(); ++ final Segment<K,V>[] segments = this.segments; ++ for (int j = 0; j < segments.length; ++j) { ++ Segment<K,V> s = segmentAt(segments, j); ++ if (s != null) ++ s.clear(); ++ } + } + + /** +@@ -1095,42 +1238,41 @@ + advance(); + } + +- public boolean hasMoreElements() { return hasNext(); } +- ++ /** ++ * Set nextEntry to first node of next non-empty table ++ * (in backwards order, to simplify checks). ++ */ + final void advance() { +- if (nextEntry != null && (nextEntry = nextEntry.next) != null) +- return; +- +- while (nextTableIndex >= 0) { +- if ( (nextEntry = currentTable[nextTableIndex--]) != null) +- return; +- } +- +- while (nextSegmentIndex >= 0) { +- Segment<K,V> seg = segments[nextSegmentIndex--]; +- if (seg.count != 0) { +- currentTable = seg.table; +- for (int j = currentTable.length - 1; j >= 0; --j) { +- if ( (nextEntry = currentTable[j]) != null) { +- nextTableIndex = j - 1; +- return; +- } +- } ++ for (;;) { ++ if (nextTableIndex >= 0) { ++ if ((nextEntry = entryAt(currentTable, ++ nextTableIndex--)) != null) ++ break; + } ++ else if (nextSegmentIndex >= 0) { ++ Segment<K,V> seg = segmentAt(segments, nextSegmentIndex--); ++ if (seg != null && (currentTable = seg.table) != null) ++ nextTableIndex = currentTable.length - 1; ++ } ++ else ++ break; + } + } + +- public boolean hasNext() { return nextEntry != null; } +- +- HashEntry<K,V> nextEntry() { +- if (nextEntry == null) ++ final HashEntry<K,V> nextEntry() { ++ HashEntry<K,V> e = nextEntry; ++ if (e == null) + throw new NoSuchElementException(); +- lastReturned = nextEntry; +- advance(); +- return lastReturned; ++ lastReturned = e; // cannot assign until after null check ++ if ((nextEntry = e.next) == null) ++ advance(); ++ return e; + } + +- public void remove() { ++ public final boolean hasNext() { return nextEntry != null; } ++ public final boolean hasMoreElements() { return nextEntry != null; } ++ ++ public final void remove() { + if (lastReturned == null) + throw new IllegalStateException(); + ConcurrentHashMap.this.remove(lastReturned.key); +@@ -1142,16 +1284,16 @@ + extends HashIterator + implements Iterator<K>, Enumeration<K> + { +- public K next() { return super.nextEntry().key; } +- public K nextElement() { return super.nextEntry().key; } ++ public final K next() { return super.nextEntry().key; } ++ public final K nextElement() { return super.nextEntry().key; } + } + + final class ValueIterator + extends HashIterator + implements Iterator<V>, Enumeration<V> + { +- public V next() { return super.nextEntry().value; } +- public V nextElement() { return super.nextEntry().value; } ++ public final V next() { return super.nextEntry().value; } ++ public final V nextElement() { return super.nextEntry().value; } + } + + /** +@@ -1271,15 +1413,20 @@ + * The key-value mappings are emitted in no particular order. + */ + private void writeObject(java.io.ObjectOutputStream s) throws IOException { ++ // force all segments for serialization compatibility ++ for (int k = 0; k < segments.length; ++k) ++ ensureSegment(k); + s.defaultWriteObject(); + ++ final Segment<K,V>[] segments = this.segments; + for (int k = 0; k < segments.length; ++k) { +- Segment<K,V> seg = segments[k]; ++ Segment<K,V> seg = segmentAt(segments, k); + seg.lock(); + try { + HashEntry<K,V>[] tab = seg.table; + for (int i = 0; i < tab.length; ++i) { +- for (HashEntry<K,V> e = tab[i]; e != null; e = e.next) { ++ HashEntry<K,V> e; ++ for (e = entryAt(tab, i); e != null; e = e.next) { + s.writeObject(e.key); + s.writeObject(e.value); + } +@@ -1297,13 +1444,20 @@ + * stream (i.e., deserialize it). + * @param s the stream + */ ++ @SuppressWarnings("unchecked") + private void readObject(java.io.ObjectInputStream s) + throws IOException, ClassNotFoundException { + s.defaultReadObject(); + +- // Initialize each segment to be minimally sized, and let grow. +- for (int i = 0; i < segments.length; ++i) { +- segments[i].setTable(new HashEntry[1]); ++ // Re-initialize segments to be minimally sized, and let grow. ++ int cap = MIN_SEGMENT_TABLE_CAPACITY; ++ final Segment<K,V>[] segments = this.segments; ++ for (int k = 0; k < segments.length; ++k) { ++ Segment<K,V> seg = segments[k]; ++ if (seg != null) { ++ seg.threshold = (int)(cap * seg.loadFactor); ++ seg.table = (HashEntry<K,V>[]) new HashEntry[cap]; ++ } + } + + // Read the keys and values, and put the mappings in the table +@@ -1315,4 +1469,31 @@ + put(key, value); + } + } ++ ++ // Unsafe mechanics ++ private static final sun.misc.Unsafe UNSAFE; ++ private static final long SBASE; ++ private static final int SSHIFT; ++ private static final long TBASE; ++ private static final int TSHIFT; ++ ++ static { ++ int ss, ts; ++ try { ++ UNSAFE = sun.misc.Unsafe.getUnsafe(); ++ Class tc = HashEntry[].class; ++ Class sc = Segment[].class; ++ TBASE = UNSAFE.arrayBaseOffset(tc); ++ SBASE = UNSAFE.arrayBaseOffset(sc); ++ ts = UNSAFE.arrayIndexScale(tc); ++ ss = UNSAFE.arrayIndexScale(sc); ++ } catch (Exception e) { ++ throw new Error(e); ++ } ++ if ((ss & (ss-1)) != 0 || (ts & (ts-1)) != 0) ++ throw new Error("data type scale not a power of two"); ++ SSHIFT = 31 - Integer.numberOfLeadingZeros(ss); ++ TSHIFT = 31 - Integer.numberOfLeadingZeros(ts); ++ } ++ + } diff --git a/java/openjdk6/files/icedtea/openjdk/7064279-fixup.patch b/java/openjdk6/files/icedtea/openjdk/7064279-fixup.patch new file mode 100644 index 000000000000..9c90bae5ed0b --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/7064279-fixup.patch @@ -0,0 +1,71 @@ +diff -Nru openjdk.orig/jdk/src/share/classes/java/beans/Introspector.java openjdk/jdk/src/share/classes/java/beans/Introspector.java +--- jdk/src/share/classes/java/beans/Introspector.java 2013-04-16 14:35:31.707279166 +0100 ++++ jdk/src/share/classes/java/beans/Introspector.java 2013-04-16 14:39:23.715018865 +0100 +@@ -102,7 +102,7 @@ + public final static int IGNORE_ALL_BEANINFO = 3; + + // Static Caches to speed up introspection. +- private static final WeakCache<Class<?>, Method[]> declaredMethodCache = new WeakCache<>(); ++ private static final WeakCache<Class<?>, Method[]> declaredMethodCache = new WeakCache<Class<?>, Method[]>(); + + private Class beanClass; + private BeanInfo explicitBeanInfo; +diff -Nru openjdk.orig/jdk/src/share/classes/java/beans/ThreadGroupContext.java openjdk/jdk/src/share/classes/java/beans/ThreadGroupContext.java +--- jdk/src/share/classes/java/beans/ThreadGroupContext.java 2013-04-16 14:35:31.707279166 +0100 ++++ jdk/src/share/classes/java/beans/ThreadGroupContext.java 2013-04-16 14:40:01.243623831 +0100 +@@ -25,9 +25,6 @@ + + package java.beans; + +-import com.sun.beans.finder.BeanInfoFinder; +-import com.sun.beans.finder.PropertyEditorFinder; +- + import java.awt.GraphicsEnvironment; + import java.util.HashMap; + import java.util.Map; +@@ -42,7 +39,7 @@ + */ + final class ThreadGroupContext { + +- private static final Map<ThreadGroup, ThreadGroupContext> contexts = new WeakHashMap<>(); ++ private static final Map<ThreadGroup, ThreadGroupContext> contexts = new WeakHashMap<ThreadGroup, ThreadGroupContext>(); + + /** + * Returns the appropriate {@code AppContext} for the caller, +@@ -66,8 +63,6 @@ + private volatile Boolean isGuiAvailable; + + private Map<Class<?>, BeanInfo> beanInfoCache; +- private BeanInfoFinder beanInfoFinder; +- private PropertyEditorFinder propertyEditorFinder; + + + boolean isDesignTime() { +@@ -99,7 +94,7 @@ + + BeanInfo putBeanInfo(Class<?> type, BeanInfo info) { + if (this.beanInfoCache == null) { +- this.beanInfoCache = new WeakHashMap<>(); ++ this.beanInfoCache = new WeakHashMap<Class<?>, BeanInfo>(); + } + return this.beanInfoCache.put(type, info); + } +@@ -116,18 +111,4 @@ + } + } + +- +- synchronized BeanInfoFinder getBeanInfoFinder() { +- if (this.beanInfoFinder == null) { +- this.beanInfoFinder = new BeanInfoFinder(); +- } +- return this.beanInfoFinder; +- } +- +- synchronized PropertyEditorFinder getPropertyEditorFinder() { +- if (this.propertyEditorFinder == null) { +- this.propertyEditorFinder = new PropertyEditorFinder(); +- } +- return this.propertyEditorFinder; +- } + } diff --git a/java/openjdk6/files/icedtea/openjdk/7064279-resource_release.patch b/java/openjdk6/files/icedtea/openjdk/7064279-resource_release.patch new file mode 100644 index 000000000000..22d0e2caecd4 --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/7064279-resource_release.patch @@ -0,0 +1,436 @@ +# HG changeset patch +# User andrew +# Date 1365712268 -3600 +# Node ID 4d66f7ebcf99c1b322f47ff0aa6adadcd995f8f4 +# Parent df591e0dfd349dc5986cc17949939c588d5a9690 +7064279: Introspector.getBeanInfo() should release some resources in timely manner +Reviewed-by: art, alexp + +diff --git a/src/share/classes/java/beans/Beans.java b/src/share/classes/java/beans/Beans.java +--- jdk/src/share/classes/java/beans/Beans.java ++++ jdk/src/share/classes/java/beans/Beans.java +@@ -32,7 +32,6 @@ + import java.applet.AppletStub; + import java.applet.AudioClip; + +-import java.awt.GraphicsEnvironment; + import java.awt.Image; + + import java.beans.beancontext.BeanContext; +@@ -53,15 +52,11 @@ + import java.util.Iterator; + import java.util.Vector; + +-import sun.awt.AppContext; +- + /** + * This class provides some general purpose beans control methods. + */ + + public class Beans { +- private static final Object DESIGN_TIME = new Object(); +- private static final Object GUI_AVAILABLE = new Object(); + + /** + * <p> +@@ -395,8 +390,7 @@ + * @see DesignMode + */ + public static boolean isDesignTime() { +- Object value = AppContext.getAppContext().get(DESIGN_TIME); +- return (value instanceof Boolean) && (Boolean) value; ++ return ThreadGroupContext.getContext().isDesignTime(); + } + + /** +@@ -413,8 +407,7 @@ + * + */ + public static boolean isGuiAvailable() { +- Object value = AppContext.getAppContext().get(GUI_AVAILABLE); +- return (value instanceof Boolean) ? (Boolean) value : !GraphicsEnvironment.isHeadless(); ++ return ThreadGroupContext.getContext().isGuiAvailable(); + } + + /** +@@ -440,7 +433,7 @@ + if (sm != null) { + sm.checkPropertiesAccess(); + } +- AppContext.getAppContext().put(DESIGN_TIME, Boolean.valueOf(isDesignTime)); ++ ThreadGroupContext.getContext().setDesignTime(isDesignTime); + } + + /** +@@ -466,7 +459,7 @@ + if (sm != null) { + sm.checkPropertiesAccess(); + } +- AppContext.getAppContext().put(GUI_AVAILABLE, Boolean.valueOf(isGuiAvailable)); ++ ThreadGroupContext.getContext().setGuiAvailable(isGuiAvailable); + } + } + +diff --git a/src/share/classes/java/beans/Introspector.java b/src/share/classes/java/beans/Introspector.java +--- jdk/src/share/classes/java/beans/Introspector.java ++++ jdk/src/share/classes/java/beans/Introspector.java +@@ -38,7 +38,6 @@ + import java.util.EventListener; + import java.util.List; + import java.util.TreeMap; +-import sun.awt.AppContext; + import sun.reflect.misc.ReflectUtil; + + /** +@@ -103,10 +102,7 @@ + public final static int IGNORE_ALL_BEANINFO = 3; + + // Static Caches to speed up introspection. +- private static WeakCache<Class<?>, Method[]> declaredMethodCache = +- new WeakCache<Class<?>, Method[]>(); +- +- private static final Object BEANINFO_CACHE = new Object(); ++ private static final WeakCache<Class<?>, Method[]> declaredMethodCache = new WeakCache<>(); + + private Class beanClass; + private BeanInfo explicitBeanInfo; +@@ -170,21 +166,15 @@ + if (!ReflectUtil.isPackageAccessible(beanClass)) { + return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); + } +- WeakCache<Class<?>, BeanInfo> beanInfoCache; ++ ThreadGroupContext context = ThreadGroupContext.getContext(); + BeanInfo beanInfo; +- synchronized (BEANINFO_CACHE) { +- beanInfoCache = (WeakCache<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE); +- +- if (beanInfoCache == null) { +- beanInfoCache = new WeakCache<Class<?>, BeanInfo>(); +- AppContext.getAppContext().put(BEANINFO_CACHE, beanInfoCache); +- } +- beanInfo = beanInfoCache.get(beanClass); ++ synchronized (declaredMethodCache) { ++ beanInfo = context.getBeanInfo(beanClass); + } + if (beanInfo == null) { + beanInfo = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); +- synchronized (BEANINFO_CACHE) { +- beanInfoCache.put(beanClass, beanInfo); ++ synchronized (declaredMethodCache) { ++ context.putBeanInfo(beanClass, beanInfo); + } + } + return beanInfo; +@@ -334,11 +324,8 @@ + */ + + public static void flushCaches() { +- synchronized (BEANINFO_CACHE) { +- WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE); +- if (beanInfoCache != null) { +- beanInfoCache.clear(); +- } ++ synchronized (declaredMethodCache) { ++ ThreadGroupContext.getContext().clearBeanInfoCache(); + declaredMethodCache.clear(); + } + } +@@ -362,11 +349,8 @@ + if (clz == null) { + throw new NullPointerException(); + } +- synchronized (BEANINFO_CACHE) { +- WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE); +- if (beanInfoCache != null) { +- beanInfoCache.put(clz, null); +- } ++ synchronized (declaredMethodCache) { ++ ThreadGroupContext.getContext().removeBeanInfo(clz); + declaredMethodCache.put(clz, null); + } + } +@@ -1313,7 +1297,7 @@ + if (!ReflectUtil.isPackageAccessible(clz)) { + return new Method[0]; + } +- synchronized (BEANINFO_CACHE) { ++ synchronized (declaredMethodCache) { + Method[] result = declaredMethodCache.get(clz); + if (result == null) { + result = clz.getMethods(); +diff --git a/src/share/classes/java/beans/ThreadGroupContext.java b/src/share/classes/java/beans/ThreadGroupContext.java +new file mode 100644 +--- /dev/null ++++ jdk/src/share/classes/java/beans/ThreadGroupContext.java +@@ -0,0 +1,133 @@ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package java.beans; ++ ++import com.sun.beans.finder.BeanInfoFinder; ++import com.sun.beans.finder.PropertyEditorFinder; ++ ++import java.awt.GraphicsEnvironment; ++import java.util.HashMap; ++import java.util.Map; ++import java.util.WeakHashMap; ++ ++/** ++ * The {@code ThreadGroupContext} is an application-dependent ++ * context referenced by the specific {@link ThreadGroup}. ++ * This is a replacement for the {@link sun.awt.AppContext}. ++ * ++ * @author Sergey Malenkov ++ */ ++final class ThreadGroupContext { ++ ++ private static final Map<ThreadGroup, ThreadGroupContext> contexts = new WeakHashMap<>(); ++ ++ /** ++ * Returns the appropriate {@code AppContext} for the caller, ++ * as determined by its {@code ThreadGroup}. ++ * ++ * @return the application-dependent context ++ */ ++ static ThreadGroupContext getContext() { ++ ThreadGroup group = Thread.currentThread().getThreadGroup(); ++ synchronized (contexts) { ++ ThreadGroupContext context = contexts.get(group); ++ if (context == null) { ++ context = new ThreadGroupContext(); ++ contexts.put(group, context); ++ } ++ return context; ++ } ++ } ++ ++ private volatile boolean isDesignTime; ++ private volatile Boolean isGuiAvailable; ++ ++ private Map<Class<?>, BeanInfo> beanInfoCache; ++ private BeanInfoFinder beanInfoFinder; ++ private PropertyEditorFinder propertyEditorFinder; ++ ++ ++ boolean isDesignTime() { ++ return this.isDesignTime; ++ } ++ ++ void setDesignTime(boolean isDesignTime) { ++ this.isDesignTime = isDesignTime; ++ } ++ ++ ++ boolean isGuiAvailable() { ++ Boolean isGuiAvailable = this.isGuiAvailable; ++ return (isGuiAvailable != null) ++ ? isGuiAvailable.booleanValue() ++ : !GraphicsEnvironment.isHeadless(); ++ } ++ ++ void setGuiAvailable(boolean isGuiAvailable) { ++ this.isGuiAvailable = Boolean.valueOf(isGuiAvailable); ++ } ++ ++ ++ BeanInfo getBeanInfo(Class<?> type) { ++ return (this.beanInfoCache != null) ++ ? this.beanInfoCache.get(type) ++ : null; ++ } ++ ++ BeanInfo putBeanInfo(Class<?> type, BeanInfo info) { ++ if (this.beanInfoCache == null) { ++ this.beanInfoCache = new WeakHashMap<>(); ++ } ++ return this.beanInfoCache.put(type, info); ++ } ++ ++ void removeBeanInfo(Class<?> type) { ++ if (this.beanInfoCache != null) { ++ this.beanInfoCache.remove(type); ++ } ++ } ++ ++ void clearBeanInfoCache() { ++ if (this.beanInfoCache != null) { ++ this.beanInfoCache.clear(); ++ } ++ } ++ ++ ++ synchronized BeanInfoFinder getBeanInfoFinder() { ++ if (this.beanInfoFinder == null) { ++ this.beanInfoFinder = new BeanInfoFinder(); ++ } ++ return this.beanInfoFinder; ++ } ++ ++ synchronized PropertyEditorFinder getPropertyEditorFinder() { ++ if (this.propertyEditorFinder == null) { ++ this.propertyEditorFinder = new PropertyEditorFinder(); ++ } ++ return this.propertyEditorFinder; ++ } ++} +diff --git a/test/java/beans/Beans/6669869/TestDesignTime.java b/test/java/beans/Beans/6669869/TestDesignTime.java +--- jdk/test/java/beans/Beans/6669869/TestDesignTime.java ++++ jdk/test/java/beans/Beans/6669869/TestDesignTime.java +@@ -29,7 +29,6 @@ + */ + + import java.beans.Beans; +-import sun.awt.SunToolkit; + + public class TestDesignTime implements Runnable { + public static void main(String[] args) throws InterruptedException { +@@ -44,7 +43,6 @@ + } + + public void run() { +- SunToolkit.createNewAppContext(); + if (Beans.isDesignTime()) { + throw new Error("shared DesignTime property"); + } +diff --git a/test/java/beans/Beans/6669869/TestGuiAvailable.java b/test/java/beans/Beans/6669869/TestGuiAvailable.java +--- jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java ++++ jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java +@@ -30,7 +30,6 @@ + + import java.awt.GraphicsEnvironment; + import java.beans.Beans; +-import sun.awt.SunToolkit; + + public class TestGuiAvailable implements Runnable { + public static void main(String[] args) throws InterruptedException { +@@ -45,7 +44,6 @@ + } + + public void run() { +- SunToolkit.createNewAppContext(); + if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) { + throw new Error("shared GuiAvailable property"); + } +diff --git a/test/java/beans/Introspector/7064279/Test7064279.java b/test/java/beans/Introspector/7064279/Test7064279.java +new file mode 100644 +--- /dev/null ++++ jdk/test/java/beans/Introspector/7064279/Test7064279.java +@@ -0,0 +1,75 @@ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 7064279 ++ * @summary Tests that Introspector does not have strong references to context class loader ++ * @author Sergey Malenkov ++ */ ++ ++import java.beans.Introspector; ++import java.io.File; ++import java.lang.ref.WeakReference; ++import java.net.URL; ++import java.net.URLClassLoader; ++ ++public class Test7064279 { ++ ++ public static void main(String[] args) throws Exception { ++ WeakReference ref = new WeakReference(test("test.jar", "test.Test")); ++ try { ++ int[] array = new int[1024]; ++ while (true) { ++ array = new int[array.length << 1]; ++ } ++ } ++ catch (OutOfMemoryError error) { ++ System.gc(); ++ } ++ if (null != ref.get()) { ++ throw new Error("ClassLoader is not released"); ++ } ++ } ++ ++ private static Object test(String jarName, String className) throws Exception { ++ StringBuilder sb = new StringBuilder(256); ++ sb.append("file:"); ++ sb.append(System.getProperty("test.src", ".")); ++ sb.append(File.separatorChar); ++ sb.append(jarName); ++ ++ ClassLoader newLoader = new URLClassLoader(new URL[] { new URL(sb.toString()) }); ++ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader(); ++ ++ Thread.currentThread().setContextClassLoader(newLoader); ++ test(newLoader.loadClass(className)); ++ Thread.currentThread().setContextClassLoader(oldLoader); ++ ++ return newLoader; ++ } ++ ++ private static void test(Class type) throws Exception { ++ Introspector.getBeanInfo(type); ++ } ++} +diff --git a/test/java/beans/Introspector/Test6660539.java b/test/java/beans/Introspector/Test6660539.java +--- jdk/test/java/beans/Introspector/Test6660539.java ++++ jdk/test/java/beans/Introspector/Test6660539.java +@@ -28,8 +28,6 @@ + * @author Sergey Malenkov + */ + +-import sun.awt.SunToolkit; +- + import java.beans.BeanInfo; + import java.beans.IntrospectionException; + import java.beans.Introspector; +@@ -49,7 +47,6 @@ + } + + public void run() { +- SunToolkit.createNewAppContext(); + for (PropertyDescriptor pd : getPropertyDescriptors()) { + if (pd.getDisplayName().equals(NAME)) + throw new Error("shared BeanInfo cache"); diff --git a/java/openjdk6/files/icedtea/openjdk/7133220-factory_finder_parser_transform_useBSClassLoader.patch b/java/openjdk6/files/icedtea/openjdk/7133220-factory_finder_parser_transform_useBSClassLoader.patch new file mode 100644 index 000000000000..9b61dd6a6d73 --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/7133220-factory_finder_parser_transform_useBSClassLoader.patch @@ -0,0 +1,299 @@ +--- /dev/null 2013-04-25 14:11:00.000000000 -0400 ++++ jaxp/patches/jaxp_src/7133220-factory_finder_parser_transform_useBSClassLoader.patch 2013-04-25 14:19:44.000000000 -0400 +@@ -0,0 +1,296 @@ ++--- src/javax/xml/parsers/FactoryFinder.java 2013-04-22 12:37:39.305820912 -0400 +++++ src/javax/xml/parsers/FactoryFinder.java 2013-04-22 12:28:52.947388255 -0400 ++@@ -25,15 +25,12 @@ ++ ++ package javax.xml.parsers; ++ ++-import java.io.File; ++-import java.io.FileInputStream; ++- ++-import java.util.Properties; ++ import java.io.BufferedReader; +++import java.io.File; ++ import java.io.IOException; ++ import java.io.InputStream; ++ import java.io.InputStreamReader; ++-import java.net.URL; +++import java.util.Properties; ++ ++ /** ++ * <p>Implements pluggable Datatypes.</p> ++@@ -42,6 +39,7 @@ ++ * sync. It is package private for secure class loading.</p> ++ * ++ * @author Santiago.PericasGeertsen@sun.com +++ * @author Huizhe.Wang@oracle.com ++ */ ++ class FactoryFinder { ++ ++@@ -95,18 +93,24 @@ ++ * If the class loader supplied is <code>null</code>, first try using the ++ * context class loader followed by the current (i.e. bootstrap) class ++ * loader. +++ * +++ * Use bootstrap classLoader if cl = null and useBSClsLoader is true ++ */ ++ static private Class getProviderClass(String className, ClassLoader cl, ++- boolean doFallback) throws ClassNotFoundException +++ boolean doFallback, boolean useBSClsLoader) throws ClassNotFoundException ++ { ++ try { ++ if (cl == null) { ++- cl = ss.getContextClassLoader(); ++- if (cl == null) { ++- throw new ClassNotFoundException(); ++- } ++- else { ++- return cl.loadClass(className); +++ if (useBSClsLoader) { +++ return Class.forName(className, true, FactoryFinder.class.getClassLoader()); +++ } else { +++ cl = ss.getContextClassLoader(); +++ if (cl == null) { +++ throw new ClassNotFoundException(); +++ } +++ else { +++ return cl.loadClass(className); +++ } ++ } ++ } ++ else { ++@@ -131,8 +135,8 @@ ++ * @param className Name of the concrete class corresponding to the ++ * service provider ++ * ++- * @param cl ClassLoader to use to load the class, null means to use ++- * the bootstrap ClassLoader +++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code> +++ * current <code>Thread</code>'s context classLoader is used to load the factory class. ++ * ++ * @param doFallback True if the current ClassLoader should be tried as ++ * a fallback if the class is not found using cl ++@@ -140,8 +144,30 @@ ++ static Object newInstance(String className, ClassLoader cl, boolean doFallback) ++ throws ConfigurationError ++ { +++ return newInstance(className, cl, doFallback, false); +++ } +++ +++ /** +++ * Create an instance of a class. Delegates to method +++ * <code>getProviderClass()</code> in order to load the class. +++ * +++ * @param className Name of the concrete class corresponding to the +++ * service provider +++ * +++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code> +++ * current <code>Thread</code>'s context classLoader is used to load the factory class. +++ * +++ * @param doFallback True if the current ClassLoader should be tried as +++ * a fallback if the class is not found using cl +++ * +++ * @param useBSClsLoader True if cl=null actually meant bootstrap classLoader. This parameter +++ * is needed since DocumentBuilderFactory/SAXParserFactory defined null as context classLoader. +++ */ +++ static Object newInstance(String className, ClassLoader cl, boolean doFallback, boolean useBSClsLoader) +++ throws ConfigurationError +++ { ++ try { ++- Class providerClass = getProviderClass(className, cl, doFallback); +++ Class providerClass = getProviderClass(className, cl, doFallback, useBSClsLoader); ++ Object instance = providerClass.newInstance(); ++ if (debug) { // Extra check to avoid computing cl strings ++ dPrint("created new instance of " + providerClass + ++@@ -244,6 +270,7 @@ ++ ++ // First try the Context ClassLoader ++ ClassLoader cl = ss.getContextClassLoader(); +++ boolean useBSClsLoader = false; ++ if (cl != null) { ++ is = ss.getResourceAsStream(cl, serviceId); ++ ++@@ -251,11 +278,13 @@ ++ if (is == null) { ++ cl = FactoryFinder.class.getClassLoader(); ++ is = ss.getResourceAsStream(cl, serviceId); +++ useBSClsLoader = true; ++ } ++ } else { ++ // No Context ClassLoader, try the current ClassLoader ++ cl = FactoryFinder.class.getClassLoader(); ++ is = ss.getResourceAsStream(cl, serviceId); +++ useBSClsLoader = true; ++ } ++ ++ if (is == null) { ++@@ -293,7 +322,7 @@ ++ // ClassLoader because we want to avoid the case where the ++ // resource file was found using one ClassLoader and the ++ // provider class was instantiated using a different one. ++- return newInstance(factoryClassName, cl, false); +++ return newInstance(factoryClassName, cl, false, useBSClsLoader); ++ } ++ ++ // No provider found ++--- src/javax/xml/transform/FactoryFinder.java 2013-04-22 12:37:39.312820966 -0400 +++++ src/javax/xml/transform/FactoryFinder.java 2013-04-22 12:35:08.715478293 -0400 ++@@ -25,15 +25,12 @@ ++ ++ package javax.xml.transform; ++ ++-import java.io.File; ++-import java.io.FileInputStream; ++- ++-import java.util.Properties; ++ import java.io.BufferedReader; +++import java.io.File; ++ import java.io.IOException; ++ import java.io.InputStream; ++ import java.io.InputStreamReader; ++-import java.net.URL; +++import java.util.Properties; ++ ++ /** ++ * <p>Implements pluggable Datatypes.</p> ++@@ -42,6 +39,7 @@ ++ * sync. It is package private for secure class loading.</p> ++ * ++ * @author Santiago.PericasGeertsen@sun.com +++ * @author Huizhe.Wang@oracle.com ++ */ ++ class FactoryFinder { ++ ++@@ -95,18 +93,24 @@ ++ * If the class loader supplied is <code>null</code>, first try using the ++ * context class loader followed by the current (i.e. bootstrap) class ++ * loader. +++ * +++ * Use bootstrap classLoader if cl = null and useBSClsLoader is true ++ */ ++ static private Class getProviderClass(String className, ClassLoader cl, ++- boolean doFallback) throws ClassNotFoundException +++ boolean doFallback, boolean useBSClsLoader) throws ClassNotFoundException ++ { ++ try { ++ if (cl == null) { ++- cl = ss.getContextClassLoader(); ++- if (cl == null) { ++- throw new ClassNotFoundException(); ++- } ++- else { ++- return cl.loadClass(className); +++ if (useBSClsLoader) { +++ return Class.forName(className, true, FactoryFinder.class.getClassLoader()); +++ } else { +++ cl = ss.getContextClassLoader(); +++ if (cl == null) { +++ throw new ClassNotFoundException(); +++ } +++ else { +++ return cl.loadClass(className); +++ } ++ } ++ } ++ else { ++@@ -131,8 +135,8 @@ ++ * @param className Name of the concrete class corresponding to the ++ * service provider ++ * ++- * @param cl ClassLoader to use to load the class, null means to use ++- * the bootstrap ClassLoader +++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code> +++ * current <code>Thread</code>'s context classLoader is used to load the factory class. ++ * ++ * @param doFallback True if the current ClassLoader should be tried as ++ * a fallback if the class is not found using cl ++@@ -140,8 +144,30 @@ ++ static Object newInstance(String className, ClassLoader cl, boolean doFallback) ++ throws ConfigurationError ++ { +++ return newInstance(className, cl, doFallback, false); +++ } +++ +++ /** +++ * Create an instance of a class. Delegates to method +++ * <code>getProviderClass()</code> in order to load the class. +++ * +++ * @param className Name of the concrete class corresponding to the +++ * service provider +++ * +++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code> +++ * current <code>Thread</code>'s context classLoader is used to load the factory class. +++ * +++ * @param doFallback True if the current ClassLoader should be tried as +++ * a fallback if the class is not found using cl +++ * +++ * @param useBSClsLoader True if cl=null actually meant bootstrap classLoader. This parameter +++ * is needed since DocumentBuilderFactory/SAXParserFactory defined null as context classLoader. +++ */ +++ static Object newInstance(String className, ClassLoader cl, boolean doFallback, boolean useBSClsLoader) +++ throws ConfigurationError +++ { ++ try { ++- Class providerClass = getProviderClass(className, cl, doFallback); +++ Class providerClass = getProviderClass(className, cl, doFallback, useBSClsLoader); ++ Object instance = providerClass.newInstance(); ++ if (debug) { // Extra check to avoid computing cl strings ++ dPrint("created new instance of " + providerClass + ++@@ -182,7 +208,7 @@ ++ String systemProp = ss.getSystemProperty(factoryId); ++ if (systemProp != null) { ++ dPrint("found system property, value=" + systemProp); ++- return newInstance(systemProp, null, true); +++ return newInstance(systemProp, null, true, false); ++ } ++ } ++ catch (SecurityException se) { ++@@ -210,7 +236,7 @@ ++ ++ if (factoryClassName != null) { ++ dPrint("found in $java.home/jaxp.properties, value=" + factoryClassName); ++- return newInstance(factoryClassName, null, true); +++ return newInstance(factoryClassName, null, true, false); ++ } ++ } ++ catch (Exception ex) { ++@@ -228,7 +254,7 @@ ++ } ++ ++ dPrint("loaded from fallback value: " + fallbackClassName); ++- return newInstance(fallbackClassName, null, true); +++ return newInstance(fallbackClassName, null, true, false); ++ } ++ ++ /* ++@@ -244,6 +270,7 @@ ++ ++ // First try the Context ClassLoader ++ ClassLoader cl = ss.getContextClassLoader(); +++ boolean useBSClsLoader = false; ++ if (cl != null) { ++ is = ss.getResourceAsStream(cl, serviceId); ++ ++@@ -251,11 +278,13 @@ ++ if (is == null) { ++ cl = FactoryFinder.class.getClassLoader(); ++ is = ss.getResourceAsStream(cl, serviceId); ++- } +++ useBSClsLoader = true; +++ } ++ } else { ++ // No Context ClassLoader, try the current ClassLoader ++ cl = FactoryFinder.class.getClassLoader(); ++ is = ss.getResourceAsStream(cl, serviceId); +++ useBSClsLoader = true; ++ } ++ ++ if (is == null) { ++@@ -293,7 +322,7 @@ ++ // ClassLoader because we want to avoid the case where the ++ // resource file was found using one ClassLoader and the ++ // provider class was instantiated using a different one. ++- return newInstance(factoryClassName, cl, false); +++ return newInstance(factoryClassName, cl, false, useBSClsLoader); ++ } ++ ++ // No provider found diff --git a/java/openjdk6/files/icedtea/openjdk/8004302-soap_test_failure.patch b/java/openjdk6/files/icedtea/openjdk/8004302-soap_test_failure.patch new file mode 100644 index 000000000000..9102d48d1cad --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/8004302-soap_test_failure.patch @@ -0,0 +1,75 @@ +diff -Nru openjdk.orig/jdk/src/share/lib/security/java.security openjdk/jdk/src/share/lib/security/java.security +--- jdk/src/share/lib/security/java.security 2013-04-16 14:23:48.623949921 +0100 ++++ jdk/src/share/lib/security/java.security 2013-04-16 14:26:07.318184299 +0100 +@@ -128,7 +128,9 @@ + # corresponding RuntimePermission ("accessClassInPackage."+package) has + # been granted. + package.access=sun.,\ +- com.sun.xml.internal.,\ ++ com.sun.xml.internal.bind.,\ ++ com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.ws.,\ + com.sun.imageio.,\ + com.sun.istack.internal.,\ + com.sun.jmx. +@@ -144,7 +146,9 @@ + # checkPackageDefinition. + # + package.definition=sun.,\ +- com.sun.xml.internal.,\ ++ com.sun.xml.internal.bind.,\ ++ com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.ws.,\ + com.sun.imageio.,\ + com.sun.istack.internal.,\ + com.sun.jmx. +diff -Nru openjdk.orig/jdk/src/share/lib/security/java.security-solaris openjdk/jdk/src/share/lib/security/java.security-solaris +--- jdk/src/share/lib/security/java.security-solaris 2013-04-16 14:23:48.623949921 +0100 ++++ jdk/src/share/lib/security/java.security-solaris 2013-04-16 14:26:30.082551058 +0100 +@@ -129,7 +129,9 @@ + # corresponding RuntimePermission ("accessClassInPackage."+package) has + # been granted. + package.access=sun.,\ +- com.sun.xml.internal.,\ ++ com.sun.xml.internal.bind.,\ ++ com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.ws.,\ + com.sun.imageio. + com.sun.istack.internal.,\ + com.sun.jmx. +@@ -145,7 +147,9 @@ + # checkPackageDefinition. + # + package.definition=sun.,\ +- com.sun.xml.internal.,\ ++ com.sun.xml.internal.bind.,\ ++ com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.ws.,\ + com.sun.imageio. + com.sun.istack.internal.,\ + com.sun.jmx. +diff -Nru openjdk.orig/jdk/src/share/lib/security/java.security-windows openjdk/jdk/src/share/lib/security/java.security-windows +--- jdk/src/share/lib/security/java.security-windows 2013-04-16 14:23:48.623949921 +0100 ++++ jdk/src/share/lib/security/java.security-windows 2013-04-16 14:26:51.170890824 +0100 +@@ -129,7 +129,9 @@ + # corresponding RuntimePermission ("accessClassInPackage."+package) has + # been granted. + package.access=sun.,\ +- com.sun.xml.internal.,\ ++ com.sun.xml.internal.bind.,\ ++ com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.ws.,\ + com.sun.imageio. + com.sun.istack.internal.,\ + com.sun.jmx. +@@ -145,7 +147,9 @@ + # checkPackageDefinition. + # + package.definition=sun.,\ +- com.sun.xml.internal.,\ ++ com.sun.xml.internal.bind.,\ ++ com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.ws.,\ + com.sun.imageio. + com.sun.istack.internal.,\ + com.sun.jmx. diff --git a/java/openjdk6/files/icedtea/security/20130201/8001235.patch b/java/openjdk6/files/icedtea/security/20130201/8001235.patch deleted file mode 100644 index 73d700c3bc30..000000000000 --- a/java/openjdk6/files/icedtea/security/20130201/8001235.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff -Nru jaxp.old/build.properties jaxp/build.properties ---- jaxp.old/build.properties 2013-02-01 21:59:17.360429006 +0000 -+++ jaxp/build.properties 2013-02-01 22:04:56.349681812 +0000 -@@ -77,6 +77,9 @@ - # Where patches to drop bundle sources live - patches.dir=patches - -+# Patches to apply -+jaxp_src.patch.list=8001235.patch -+ - # Sanity information - sanity.info= Sanity Settings:${line.separator}\ - ant.home=${ant.home}${line.separator}\ -diff -Nru jaxp.old/patches/jaxp_src/8001235.patch jaxp/patches/jaxp_src/8001235.patch ---- jaxp.old/patches/jaxp_src/8001235.patch 1970-01-01 01:00:00.000000000 +0100 -+++ jaxp/patches/jaxp_src/8001235.patch 2013-02-01 22:04:27.369232768 +0000 -@@ -0,0 +1,20 @@ -+# HG changeset patch -+# User joehw -+# Date 1351536837 25200 -+# Node ID 5df9207c4378b7f4b24d70b365714c5ee6318982 -+# Parent 5449d5396bd8deee90f18f29899343129e3cdc4e -+8001235: Improve JAXP HTTP handling -+Reviewed-by: lancea, skoivu -+ -+diff --git a/src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java b/src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java -+--- src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java -++++ src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java -+@@ -165,7 +165,7 @@ public class FuncSystemProperty extends -+ * should already be fully qualified as path/filename -+ * @param target The target property bag the file will be placed into. -+ */ -+- public void loadPropertyFile(String file, Properties target) -++ private void loadPropertyFile(String file, Properties target) -+ { -+ try -+ { diff --git a/java/openjdk6/files/icedtea/security/20130416/6657673-factory_finder.patch b/java/openjdk6/files/icedtea/security/20130416/6657673-factory_finder.patch new file mode 100644 index 000000000000..5d96ca4ef3d7 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/6657673-factory_finder.patch @@ -0,0 +1,54 @@ +--- /dev/null 2013-04-25 14:56:29.000000000 -0400 ++++ jaxp/patches/jaxp_src/6657673-factory_finder.patch 2013-04-25 14:58:33.000000000 -0400 +@@ -0,0 +1,51 @@ ++--- src/javax/xml/parsers/FactoryFinder.java 2013-04-22 12:42:32.138748378 -0400 +++++ src/javax/xml/parsers/FactoryFinder.java 2013-04-22 12:41:36.033419998 -0400 ++@@ -44,7 +44,7 @@ ++ * @author Santiago.PericasGeertsen@sun.com ++ */ ++ class FactoryFinder { ++- +++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xerces.internal"; ++ /** ++ * Internal debug flag. ++ */ ++@@ -140,6 +140,14 @@ ++ static Object newInstance(String className, ClassLoader cl, boolean doFallback) ++ throws ConfigurationError ++ { +++ // make sure we have access to restricted packages +++ if (System.getSecurityManager() != null) { +++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) { +++ cl = null; +++ useBSClsLoader = true; +++ } +++ } +++ ++ try { ++ Class providerClass = getProviderClass(className, cl, doFallback); ++ Object instance = providerClass.newInstance(); ++--- src/javax/xml/transform/FactoryFinder.java 2013-04-22 12:42:32.230748906 -0400 +++++ src/javax/xml/transform/FactoryFinder.java 2013-04-22 12:41:41.268451218 -0400 ++@@ -44,6 +44,7 @@ ++ * @author Santiago.PericasGeertsen@sun.com ++ */ ++ class FactoryFinder { +++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xalan.internal."; ++ ++ /** ++ * Internal debug flag. ++@@ -140,6 +141,14 @@ ++ static Object newInstance(String className, ClassLoader cl, boolean doFallback) ++ throws ConfigurationError ++ { +++ // make sure we have access to restricted packages +++ if (System.getSecurityManager() != null) { +++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) { +++ cl = null; +++ useBSClsLoader = true; +++ } +++ } +++ ++ try { ++ Class providerClass = getProviderClass(className, cl, doFallback); ++ Object instance = providerClass.newInstance(); diff --git a/java/openjdk6/files/icedtea/security/20130416/6657673-fixup.patch b/java/openjdk6/files/icedtea/security/20130416/6657673-fixup.patch new file mode 100644 index 000000000000..570678055380 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/6657673-fixup.patch @@ -0,0 +1,228 @@ +--- /dev/null 2013-04-25 14:48:41.000000000 -0400 ++++ jaxp/patches/jaxp_src/6657673-fixup.patch 2013-04-25 14:51:50.000000000 -0400 +@@ -0,0 +1,225 @@ ++--- src/com/sun/org/apache/xml/internal/serializer/CharInfo.java +++++ src/com/sun/org/apache/xml/internal/serializer/CharInfo.java ++@@ -36,6 +36,8 @@ ++ ++ import javax.xml.transform.TransformerException; ++ +++import com.sun.org.apache.xalan.internal.utils.ObjectFactory; +++ ++ import com.sun.org.apache.xml.internal.serializer.utils.MsgKey; ++ import com.sun.org.apache.xml.internal.serializer.utils.SystemIDResolver; ++ import com.sun.org.apache.xml.internal.serializer.utils.Utils; ++--- /dev/null +++++ src/com/sun/org/apache/xml/internal/serializer/ObjectFactory.java ++@@ -0,0 +1,200 @@ +++/* +++ * reserved comment block +++ * DO NOT REMOVE OR ALTER! +++ */ +++/* +++ * Copyright 2001-2004 The Apache Software Foundation. +++ * +++ * Licensed under the Apache License, Version 2.0 (the "License"); +++ * you may not use this file except in compliance with the License. +++ * You may obtain a copy of the License at +++ * +++ * http://www.apache.org/licenses/LICENSE-2.0 +++ * +++ * Unless required by applicable law or agreed to in writing, software +++ * distributed under the License is distributed on an "AS IS" BASIS, +++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +++ * See the License for the specific language governing permissions and +++ * limitations under the License. +++ */ +++/* +++ * $Id: ObjectFactory.java,v 1.2.4.1 2005/09/15 08:15:20 suresh_emailid Exp $ +++ */ +++ +++package com.sun.org.apache.xml.internal.serializer; +++ +++import java.io.BufferedReader; +++import java.io.File; +++import java.io.FileInputStream; +++import java.io.IOException; +++import java.io.InputStream; +++import java.io.InputStreamReader; +++import java.util.Properties; +++ +++/** +++ * This class is duplicated for each JAXP subpackage so keep it in sync. +++ * It is package private and therefore is not exposed as part of the JAXP +++ * API. +++ * <p> +++ * This code is designed to implement the JAXP 1.1 spec pluggability +++ * feature and is designed to run on JDK version 1.1 and +++ * later, and to compile on JDK 1.2 and onward. +++ * The code also runs both as part of an unbundled jar file and +++ * when bundled as part of the JDK. +++ * <p> +++ * This class was moved from the <code>javax.xml.parsers.ObjectFactory</code> +++ * class and modified to be used as a general utility for creating objects +++ * dynamically. +++ * +++ * @xsl.usage internal +++ */ +++class ObjectFactory { +++ +++ // +++ // Constants +++ // +++ +++ // name of default properties file to look for in JDK's jre/lib directory +++ private static final String DEFAULT_PROPERTIES_FILENAME = +++ "xalan.properties"; +++ +++ private static final String SERVICES_PATH = "META-INF/services/"; +++ +++ /** Set to true for debugging */ +++ private static final boolean DEBUG = false; +++ +++ /** cache the contents of the xalan.properties file. +++ * Until an attempt has been made to read this file, this will +++ * be null; if the file does not exist or we encounter some other error +++ * during the read, this will be empty. +++ */ +++ private static Properties fXalanProperties = null; +++ +++ /*** +++ * Cache the time stamp of the xalan.properties file so +++ * that we know if it's been modified and can invalidate +++ * the cache when necessary. +++ */ +++ private static long fLastModified = -1; +++ +++ /** +++ * Create an instance of a class using the specified ClassLoader +++ */ +++ static Object newInstance(String className, ClassLoader cl, +++ boolean doFallback) +++ throws ConfigurationError +++ { +++ // assert(className != null); +++ try{ +++ Class providerClass = findProviderClass(className, cl, doFallback); +++ Object instance = providerClass.newInstance(); +++ return instance; +++ } catch (ClassNotFoundException x) { +++ throw new ConfigurationError( +++ "Provider " + className + " not found", x); +++ } catch (Exception x) { +++ throw new ConfigurationError( +++ "Provider " + className + " could not be instantiated: " + x, +++ x); +++ } +++ } +++ +++ /** +++ * Find a Class using the specified ClassLoader +++ */ +++ static Class findProviderClass(String className, ClassLoader cl, +++ boolean doFallback) +++ throws ClassNotFoundException, ConfigurationError +++ { +++ //throw security exception if the calling thread is not allowed to access the +++ //class. Restrict the access to the package classes as specified in java.security policy. +++ SecurityManager security = System.getSecurityManager(); +++ try{ +++ if (security != null){ +++ final int lastDot = className.lastIndexOf("."); +++ String packageName = className; +++ if (lastDot != -1) packageName = className.substring(0, lastDot); +++ security.checkPackageAccess(packageName); +++ } +++ }catch(SecurityException e){ +++ throw e; +++ } +++ +++ Class providerClass; +++ if (cl == null) { +++ // XXX Use the bootstrap ClassLoader. There is no way to +++ // load a class using the bootstrap ClassLoader that works +++ // in both JDK 1.1 and Java 2. However, this should still +++ // work b/c the following should be true: +++ // +++ // (cl == null) iff current ClassLoader == null +++ // +++ // Thus Class.forName(String) will use the current +++ // ClassLoader which will be the bootstrap ClassLoader. +++ providerClass = Class.forName(className); +++ } else { +++ try { +++ providerClass = cl.loadClass(className); +++ } catch (ClassNotFoundException x) { +++ if (doFallback) { +++ // Fall back to current classloader +++ ClassLoader current = ObjectFactory.class.getClassLoader(); +++ if (current == null) { +++ providerClass = Class.forName(className); +++ } else if (cl != current) { +++ cl = current; +++ providerClass = cl.loadClass(className); +++ } else { +++ throw x; +++ } +++ } else { +++ throw x; +++ } +++ } +++ } +++ +++ return providerClass; +++ } +++ +++ // +++ // Classes +++ // +++ +++ /** +++ * A configuration error. +++ */ +++ static class ConfigurationError +++ extends Error { +++ static final long serialVersionUID = 8859254254255146542L; +++ // +++ // Data +++ // +++ +++ /** Exception. */ +++ private Exception exception; +++ +++ // +++ // Constructors +++ // +++ +++ /** +++ * Construct a new instance with the specified detail string and +++ * exception. +++ */ +++ ConfigurationError(String msg, Exception x) { +++ super(msg); +++ this.exception = x; +++ } // <init>(String,Exception) +++ +++ // +++ // Public methods +++ // +++ +++ /** Returns the exception associated to this error. */ +++ Exception getException() { +++ return exception; +++ } // getException():Exception +++ +++ } // class ConfigurationError +++ +++} // class ObjectFactory ++--- src/com/sun/org/apache/xml/internal/serializer/SerializerFactory.java +++++ src/com/sun/org/apache/xml/internal/serializer/SerializerFactory.java ++@@ -126,7 +126,7 @@ ++ ++ ++ ++- ClassLoader loader = ObjectFactory.findClassLoader(); +++ ClassLoader loader = com.sun.org.apache.xalan.internal.utils.ObjectFactory.findClassLoader(); ++ ++ Class cls = ObjectFactory.findProviderClass(className, loader, true); ++ diff --git a/java/openjdk6/files/icedtea/security/20130416/6657673.patch b/java/openjdk6/files/icedtea/security/20130416/6657673.patch new file mode 100644 index 000000000000..c2a57be334bd --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/6657673.patch @@ -0,0 +1,9381 @@ +--- /dev/null 2013-04-25 14:33:00.000000000 -0400 ++++ jaxp/patches/jaxp_src/6657673.patch 2013-04-25 14:43:01.000000000 -0400 +@@ -0,0 +1,9198 @@ ++--- src/com/sun/org/apache/bcel/internal/classfile/JavaClass.java 2013-04-16 14:28:09.232148559 +0100 +++++ src/com/sun/org/apache/bcel/internal/classfile/JavaClass.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -63,6 +63,7 @@ ++ import com.sun.org.apache.bcel.internal.util.ClassVector; ++ import com.sun.org.apache.bcel.internal.util.ClassQueue; ++ import com.sun.org.apache.bcel.internal.generic.Type; +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ ++ import java.io.*; ++ import java.util.StringTokenizer; ++@@ -77,6 +78,7 @@ ++ * class file. Those interested in programatically generating classes ++ * should see the <a href="../generic/ClassGen.html">ClassGen</a> class. ++ +++ * @version $Id: JavaClass.java,v 1.4 2007-07-19 04:34:42 ofung Exp $ ++ * @see com.sun.org.apache.bcel.internal.generic.ClassGen ++ * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A> ++ */ ++@@ -451,9 +453,9 @@ ++ String debug = null, sep = null; ++ ++ try { ++- debug = System.getProperty("JavaClass.debug"); +++ debug = SecuritySupport.getSystemProperty("JavaClass.debug"); ++ // Get path separator either / or \ usually ++- sep = System.getProperty("file.separator"); +++ sep = SecuritySupport.getSystemProperty("file.separator"); ++ } ++ catch (SecurityException e) { ++ // falls through ++--- src/com/sun/org/apache/bcel/internal/util/Class2HTML.java 2013-04-16 14:28:09.312149848 +0100 +++++ src/com/sun/org/apache/bcel/internal/util/Class2HTML.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -82,6 +82,7 @@ ++ * method in the Method's frame will jump to the appropiate method in ++ * the Code frame. ++ * +++ * @version $Id: Class2HTML.java,v 1.3 2007-07-19 04:34:52 ofung Exp $ ++ * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A> ++ */ ++ public class Class2HTML implements Constants ++@@ -137,7 +138,7 @@ ++ ClassParser parser=null; ++ JavaClass java_class=null; ++ String zip_file = null; ++- char sep = System.getProperty("file.separator").toCharArray()[0]; +++ char sep = SecuritySupport.getSystemProperty("file.separator").toCharArray()[0]; ++ String dir = "." + sep; // Where to store HTML files ++ ++ try { ++--- src/com/sun/org/apache/bcel/internal/util/ClassPath.java 2013-04-16 14:28:09.316149912 +0100 +++++ src/com/sun/org/apache/bcel/internal/util/ClassPath.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -66,6 +66,7 @@ ++ * Responsible for loading (class) files from the CLASSPATH. Inspired by ++ * sun.tools.ClassPath. ++ * +++ * @version $Id: ClassPath.java,v 1.4 2007-07-19 04:34:52 ofung Exp $ ++ * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A> ++ */ ++ public class ClassPath implements Serializable { ++@@ -83,7 +84,7 @@ ++ ArrayList vec = new ArrayList(); ++ ++ for(StringTokenizer tok=new StringTokenizer(class_path, ++- System.getProperty("path.separator")); +++ SecuritySupport.getSystemProperty("path.separator")); ++ tok.hasMoreTokens();) ++ { ++ String path = tok.nextToken(); ++@@ -92,7 +93,7 @@ ++ File file = new File(path); ++ ++ try { ++- if(file.exists()) { +++ if(SecuritySupport.getFileExists(file)) { ++ if(file.isDirectory()) ++ vec.add(new Dir(path)); ++ else ++@@ -143,8 +144,9 @@ ++ String name = tok.nextToken(); ++ File file = new File(name); ++ ++- if(file.exists()) +++ if(SecuritySupport.getFileExists(file)) { ++ list.add(name); +++ } ++ } ++ } ++ } ++@@ -159,9 +161,9 @@ ++ String class_path, boot_path, ext_path; ++ ++ try { ++- class_path = System.getProperty("java.class.path"); ++- boot_path = System.getProperty("sun.boot.class.path"); ++- ext_path = System.getProperty("java.ext.dirs"); +++ class_path = SecuritySupport.getSystemProperty("java.class.path"); +++ boot_path = SecuritySupport.getSystemProperty("sun.boot.class.path"); +++ ext_path = SecuritySupport.getSystemProperty("java.ext.dirs"); ++ } ++ catch (SecurityException e) { ++ return ""; ++@@ -176,8 +178,8 @@ ++ getPathComponents(ext_path, dirs); ++ ++ for(Iterator e = dirs.iterator(); e.hasNext(); ) { ++- File ext_dir = new File((String)e.next()); ++- String[] extensions = ext_dir.list(new FilenameFilter() { +++ File ext_dir = new File((String)e.next()); +++ String[] extensions = SecuritySupport.getFileList(ext_dir, new FilenameFilter() { ++ public boolean accept(File dir, String name) { ++ name = name.toLowerCase(); ++ return name.endsWith(".zip") || name.endsWith(".jar"); ++@@ -342,7 +344,7 @@ ++ final File file = new File(dir + File.separatorChar + ++ name.replace('.', File.separatorChar) + suffix); ++ ++- return file.exists()? new ClassFile() { +++ return SecuritySupport.getFileExists(file)? new ClassFile() { ++ public InputStream getInputStream() throws IOException { return new FileInputStream(file); } ++ ++ public String getPath() { try { ++--- src/com/sun/org/apache/bcel/internal/util/JavaWrapper.java 2013-04-16 14:28:09.316149912 +0100 +++++ src/com/sun/org/apache/bcel/internal/util/JavaWrapper.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -72,6 +72,7 @@ ++ * <pre>java com.sun.org.apache.bcel.internal.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]</pre> ++ * </p> ++ * +++ * @version $Id: JavaWrapper.java,v 1.3 2007-07-19 04:34:52 ofung Exp $ ++ * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A> ++ * @see ClassLoader ++ */ ++@@ -79,7 +80,7 @@ ++ private java.lang.ClassLoader loader; ++ ++ private static java.lang.ClassLoader getClassLoader() { ++- String s = System.getProperty("bcel.classloader"); +++ String s = SecuritySupport.getSystemProperty("bcel.classloader"); ++ ++ if((s == null) || "".equals(s)) ++ s = "com.sun.org.apache.bcel.internal.util.ClassLoader"; ++--- src/com/sun/org/apache/bcel/internal/util/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100 +++++ src/com/sun/org/apache/bcel/internal/util/SecuritySupport.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -0,0 +1,223 @@ +++/* +++ * reserved comment block +++ * DO NOT REMOVE OR ALTER! +++ */ +++/* +++ * Copyright 2002-2004 The Apache Software Foundation. +++ * +++ * Licensed under the Apache License, Version 2.0 (the "License"); +++ * you may not use this file except in compliance with the License. +++ * You may obtain a copy of the License at +++ * +++ * http://www.apache.org/licenses/LICENSE-2.0 +++ * +++ * Unless required by applicable law or agreed to in writing, software +++ * distributed under the License is distributed on an "AS IS" BASIS, +++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +++ * See the License for the specific language governing permissions and +++ * limitations under the License. +++ */ +++ +++package com.sun.org.apache.bcel.internal.util; +++ +++import java.io.File; +++import java.io.FileInputStream; +++import java.io.FileNotFoundException; +++import java.io.FilenameFilter; +++import java.io.InputStream; +++import java.lang.ClassLoader; +++import java.security.AccessController; +++import java.security.PrivilegedAction; +++import java.security.PrivilegedActionException; +++import java.security.PrivilegedExceptionAction; +++import java.util.ListResourceBundle; +++import java.util.Locale; +++import java.util.MissingResourceException; +++import java.util.ResourceBundle; +++ +++/** +++ * This class is duplicated for each subpackage so keep it in sync. It is +++ * package private and therefore is not exposed as part of any API. +++ * +++ * @xerces.internal +++ */ +++public final class SecuritySupport { +++ +++ private static final SecuritySupport securitySupport = new SecuritySupport(); +++ +++ /** +++ * Return an instance of this class. +++ */ +++ public static SecuritySupport getInstance() { +++ return securitySupport; +++ } +++ +++ static ClassLoader getContextClassLoader() { +++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ ClassLoader cl = null; +++ try { +++ cl = Thread.currentThread().getContextClassLoader(); +++ } catch (SecurityException ex) { +++ } +++ return cl; +++ } +++ }); +++ } +++ +++ static ClassLoader getSystemClassLoader() { +++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ ClassLoader cl = null; +++ try { +++ cl = ClassLoader.getSystemClassLoader(); +++ } catch (SecurityException ex) { +++ } +++ return cl; +++ } +++ }); +++ } +++ +++ static ClassLoader getParentClassLoader(final ClassLoader cl) { +++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ ClassLoader parent = null; +++ try { +++ parent = cl.getParent(); +++ } catch (SecurityException ex) { +++ } +++ +++ // eliminate loops in case of the boot +++ // ClassLoader returning itself as a parent +++ return (parent == cl) ? null : parent; +++ } +++ }); +++ } +++ +++ public static String getSystemProperty(final String propName) { +++ return (String) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return System.getProperty(propName); +++ } +++ }); +++ } +++ +++ static FileInputStream getFileInputStream(final File file) +++ throws FileNotFoundException { +++ try { +++ return (FileInputStream) AccessController.doPrivileged(new PrivilegedExceptionAction() { +++ public Object run() throws FileNotFoundException { +++ return new FileInputStream(file); +++ } +++ }); +++ } catch (PrivilegedActionException e) { +++ throw (FileNotFoundException) e.getException(); +++ } +++ } +++ +++ /** +++ * Return resource using the same classloader for the ObjectFactory by +++ * default or bootclassloader when Security Manager is in place +++ */ +++ public static InputStream getResourceAsStream(final String name) { +++ if (System.getSecurityManager() != null) { +++ return getResourceAsStream(null, name); +++ } else { +++ return getResourceAsStream(findClassLoader(), name); +++ } +++ } +++ +++ public static InputStream getResourceAsStream(final ClassLoader cl, +++ final String name) { +++ return (InputStream) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ InputStream ris; +++ if (cl == null) { +++ ris = Object.class.getResourceAsStream("/" + name); +++ } else { +++ ris = cl.getResourceAsStream(name); +++ } +++ return ris; +++ } +++ }); +++ } +++ +++ /** +++ * Gets a resource bundle using the specified base name, the default locale, +++ * and the caller's class loader. +++ * +++ * @param bundle the base name of the resource bundle, a fully qualified +++ * class name +++ * @return a resource bundle for the given base name and the default locale +++ */ +++ public static ListResourceBundle getResourceBundle(String bundle) { +++ return getResourceBundle(bundle, Locale.getDefault()); +++ } +++ +++ /** +++ * Gets a resource bundle using the specified base name and locale, and the +++ * caller's class loader. +++ * +++ * @param bundle the base name of the resource bundle, a fully qualified +++ * class name +++ * @param locale the locale for which a resource bundle is desired +++ * @return a resource bundle for the given base name and locale +++ */ +++ public static ListResourceBundle getResourceBundle(final String bundle, final Locale locale) { +++ return AccessController.doPrivileged(new PrivilegedAction<ListResourceBundle>() { +++ public ListResourceBundle run() { +++ try { +++ return (ListResourceBundle) ResourceBundle.getBundle(bundle, locale); +++ } catch (MissingResourceException e) { +++ try { +++ return (ListResourceBundle) ResourceBundle.getBundle(bundle, new Locale("en", "US")); +++ } catch (MissingResourceException e2) { +++ throw new MissingResourceException( +++ "Could not load any resource bundle by " + bundle, bundle, ""); +++ } +++ } +++ } +++ }); +++ } +++ +++ public static String[] getFileList(final File f, final FilenameFilter filter) { +++ return ((String[]) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return f.list(filter); +++ } +++ })); +++ } +++ +++ public static boolean getFileExists(final File f) { +++ return ((Boolean) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return f.exists() ? Boolean.TRUE : Boolean.FALSE; +++ } +++ })).booleanValue(); +++ } +++ +++ static long getLastModified(final File f) { +++ return ((Long) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return new Long(f.lastModified()); +++ } +++ })).longValue(); +++ } +++ +++ +++ /** +++ * Figure out which ClassLoader to use. +++ */ +++ public static ClassLoader findClassLoader() +++ { +++ if (System.getSecurityManager()!=null) { +++ //this will ensure bootclassloader is used +++ return null; +++ } else { +++ return SecuritySupport.class.getClassLoader(); +++ } +++ } // findClassLoader():ClassLoader +++ +++ private SecuritySupport() { +++ } +++} ++--- src/com/sun/org/apache/xalan/internal/res/XSLMessages.java 2013-04-16 14:28:09.324150042 +0100 +++++ src/com/sun/org/apache/xalan/internal/res/XSLMessages.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -22,68 +22,72 @@ ++ */ ++ package com.sun.org.apache.xalan.internal.res; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import java.util.ListResourceBundle; ++ ++ import com.sun.org.apache.xpath.internal.res.XPATHMessages; ++ ++ /** ++- * Sets things up for issuing error messages. This class is misnamed, and ++- * should be called XalanMessages, or some such. +++ * Sets things up for issuing error messages. This class is misnamed, and should +++ * be called XalanMessages, or some such. +++ * ++ * @xsl.usage internal ++ */ ++-public class XSLMessages extends XPATHMessages ++-{ +++public class XSLMessages extends XPATHMessages { ++ ++- /** The language specific resource object for Xalan messages. */ ++- private static ListResourceBundle XSLTBundle = null; ++- ++- /** The class name of the Xalan error message string table. */ ++- private static final String XSLT_ERROR_RESOURCES = ++- "com.sun.org.apache.xalan.internal.res.XSLTErrorResources"; ++- ++- /** ++- * Creates a message from the specified key and replacement ++- * arguments, localized to the given locale. ++- * ++- * @param msgKey The key for the message text. ++- * @param args The arguments to be used as replacement text ++- * in the message created. ++- * ++- * @return The formatted message string. ++- */ ++- public static final String createMessage(String msgKey, Object args[]) //throws Exception ++- { ++- if (XSLTBundle == null) ++- XSLTBundle = loadResourceBundle(XSLT_ERROR_RESOURCES); ++- ++- if (XSLTBundle != null) +++ /** +++ * The language specific resource object for Xalan messages. +++ */ +++ private static ListResourceBundle XSLTBundle = null; +++ /** +++ * The class name of the Xalan error message string table. +++ */ +++ private static final String XSLT_ERROR_RESOURCES = +++ "com.sun.org.apache.xalan.internal.res.XSLTErrorResources"; +++ +++ /** +++ * Creates a message from the specified key and replacement arguments, +++ * localized to the given locale. +++ * +++ * @param msgKey The key for the message text. +++ * @param args The arguments to be used as replacement text in the message +++ * created. +++ * +++ * @return The formatted message string. +++ */ +++ public static String createMessage(String msgKey, Object args[]) //throws Exception ++ { ++- return createMsg(XSLTBundle, msgKey, args); +++ if (XSLTBundle == null) { +++ XSLTBundle = SecuritySupport.getResourceBundle(XSLT_ERROR_RESOURCES); +++ } +++ +++ if (XSLTBundle != null) { +++ return createMsg(XSLTBundle, msgKey, args); +++ } else { +++ return "Could not load any resource bundles."; +++ } ++ } ++- else ++- return "Could not load any resource bundles."; ++- } ++- ++- /** ++- * Creates a message from the specified key and replacement ++- * arguments, localized to the given locale. ++- * ++- * @param msgKey The key for the message text. ++- * @param args The arguments to be used as replacement text ++- * in the message created. ++- * ++- * @return The formatted warning string. ++- */ ++- public static final String createWarning(String msgKey, Object args[]) //throws Exception ++- { ++- if (XSLTBundle == null) ++- XSLTBundle = loadResourceBundle(XSLT_ERROR_RESOURCES); ++ ++- if (XSLTBundle != null) +++ /** +++ * Creates a message from the specified key and replacement arguments, +++ * localized to the given locale. +++ * +++ * @param msgKey The key for the message text. +++ * @param args The arguments to be used as replacement text in the message +++ * created. +++ * +++ * @return The formatted warning string. +++ */ +++ public static String createWarning(String msgKey, Object args[]) //throws Exception ++ { ++- return createMsg(XSLTBundle, msgKey, args); +++ if (XSLTBundle == null) { +++ XSLTBundle = SecuritySupport.getResourceBundle(XSLT_ERROR_RESOURCES); +++ } +++ +++ if (XSLTBundle != null) { +++ return createMsg(XSLTBundle, msgKey, args); +++ } else { +++ return "Could not load any resource bundles."; +++ } ++ } ++- else ++- return "Could not load any resource bundles."; ++- } ++ } ++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_de.java 2013-04-16 14:28:09.328150105 +0100 +++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_de.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -2410,68 +2410,4 @@ ++ public static final String QUERY_HEADER = "MUSTER "; ++ ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XSLTErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XSLTErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XSLTErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++ } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++- ++-} ++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_es.java 2013-04-16 14:28:09.332150170 +0100 +++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_es.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -2409,69 +2409,4 @@ ++ * @deprecated */ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XSLTErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XSLTErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XSLTErrorResources) ResourceBundle.getBundle(className, ++- new Locale("es", "ES")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++- ++ } ++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_fr.java 2013-04-16 14:28:09.332150170 +0100 +++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_fr.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -2410,68 +2410,4 @@ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XSLTErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XSLTErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XSLTErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++ } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++- ++-} ++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_it.java 2013-04-16 14:28:09.336150235 +0100 +++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_it.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -2409,69 +2409,4 @@ ++ * @deprecated */ ++ public static final String QUERY_HEADER = "MODELLO "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XSLTErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XSLTErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XSLTErrorResources) ResourceBundle.getBundle(className, ++- new Locale("it", "IT")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++- ++ } ++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ja.java 2013-04-16 14:28:09.336150235 +0100 +++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ja.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -2410,68 +2410,4 @@ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XSLTErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XSLTErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XSLTErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++ } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++- ++-} ++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources.java 2013-04-16 14:28:09.324150042 +0100 +++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources.java 2013-04-16 14:29:26.549394382 +0100 ++@@ -1446,68 +1446,4 @@ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XSLTErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XSLTErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XSLTErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++ } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++- ++-} ++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ko.java 2013-04-16 14:28:09.340150299 +0100 +++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ko.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -2409,69 +2409,4 @@ ++ * @deprecated */ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XSLTErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XSLTErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XSLTErrorResources) ResourceBundle.getBundle(className, ++- new Locale("ko", "KR")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++- ++ } ++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_CN.java 2013-04-16 14:28:09.340150299 +0100 +++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_CN.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -2409,69 +2409,4 @@ ++ * @deprecated */ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XSLTErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XSLTErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XSLTErrorResources) ResourceBundle.getBundle(className, ++- new Locale("zh", "CN")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "\u65e0\u6cd5\u88c5\u5165\u4efb\u4f55\u8d44\u6e90\u5305\u3002", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++- ++ } ++--- src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_TW.java 2013-04-16 14:28:09.344150364 +0100 +++++ src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_TW.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -2409,69 +2409,4 @@ ++ * @deprecated */ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XSLTErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XSLTErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XSLTErrorResources) ResourceBundle.getBundle(className, ++- new Locale("zh", "TW")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++- ++ } ++--- src/com/sun/org/apache/xalan/internal/utils/ConfigurationError.java 1970-01-01 01:00:00.000000000 +0100 +++++ src/com/sun/org/apache/xalan/internal/utils/ConfigurationError.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -0,0 +1,61 @@ +++/* +++ * reserved comment block +++ * DO NOT REMOVE OR ALTER! +++ */ +++/* +++ * Copyright 2001-2004 The Apache Software Foundation. +++ * +++ * Licensed under the Apache License, Version 2.0 (the "License"); +++ * you may not use this file except in compliance with the License. +++ * You may obtain a copy of the License at +++ * +++ * http://www.apache.org/licenses/LICENSE-2.0 +++ * +++ * Unless required by applicable law or agreed to in writing, software +++ * distributed under the License is distributed on an "AS IS" BASIS, +++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +++ * See the License for the specific language governing permissions and +++ * limitations under the License. +++ */ +++/* +++ * $Id: ObjectFactory.java,v 1.2.4.1 2005/09/15 02:39:54 jeffsuttor Exp $ +++ */ +++ +++package com.sun.org.apache.xalan.internal.utils; +++ +++/** +++ * A configuration error. This was an internal class in ObjectFactory previously +++ */ +++public final class ConfigurationError +++ extends Error { +++ +++ // +++ // Data +++ // +++ +++ /** Exception. */ +++ private Exception exception; +++ +++ // +++ // Constructors +++ // +++ +++ /** +++ * Construct a new instance with the specified detail string and +++ * exception. +++ */ +++ ConfigurationError(String msg, Exception x) { +++ super(msg); +++ this.exception = x; +++ } // <init>(String,Exception) +++ +++ // +++ // methods +++ // +++ +++ /** Returns the exception associated to this error. */ +++ public Exception getException() { +++ return exception; +++ } // getException():Exception +++ +++} // class ConfigurationError ++--- src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java 1970-01-01 01:00:00.000000000 +0100 +++++ src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -0,0 +1,659 @@ +++/* +++ * reserved comment block +++ * DO NOT REMOVE OR ALTER! +++ */ +++/* +++ * Copyright 2001-2004 The Apache Software Foundation. +++ * +++ * Licensed under the Apache License, Version 2.0 (the "License"); +++ * you may not use this file except in compliance with the License. +++ * You may obtain a copy of the License at +++ * +++ * http://www.apache.org/licenses/LICENSE-2.0 +++ * +++ * Unless required by applicable law or agreed to in writing, software +++ * distributed under the License is distributed on an "AS IS" BASIS, +++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +++ * See the License for the specific language governing permissions and +++ * limitations under the License. +++ */ +++/* +++ * $Id: ObjectFactory.java,v 1.2.4.1 2005/09/15 02:39:54 jeffsuttor Exp $ +++ */ +++ +++package com.sun.org.apache.xalan.internal.utils; +++ +++import java.io.InputStream; +++import java.io.IOException; +++import java.io.File; +++import java.io.FileInputStream; +++ +++import java.util.Properties; +++import java.io.BufferedReader; +++import java.io.InputStreamReader; +++ +++/** +++ * This class is duplicated for each JAXP subpackage so keep it in sync. +++ * It is package private and therefore is not exposed as part of the JAXP +++ * API. +++ * <p> +++ * This code is designed to implement the JAXP 1.1 spec pluggability +++ * feature and is designed to run on JDK version 1.1 and +++ * later, and to compile on JDK 1.2 and onward. +++ * The code also runs both as part of an unbundled jar file and +++ * when bundled as part of the JDK. +++ * <p> +++ * This class was moved from the <code>javax.xml.parsers.ObjectFactory</code> +++ * class and modified to be used as a general utility for creating objects +++ * dynamically. +++ * +++ * @version $Id: ObjectFactory.java,v 1.11 2010-11-01 04:34:25 joehw Exp $ +++ */ +++public class ObjectFactory { +++ +++ // +++ // Constants +++ // +++ private static final String XALAN_INTERNAL = "com.sun.org.apache.xalan.internal"; +++ private static final String XERCES_INTERNAL = "com.sun.org.apache.xerces.internal"; +++ +++ // name of default properties file to look for in JDK's jre/lib directory +++ private static final String DEFAULT_PROPERTIES_FILENAME = +++ "xalan.properties"; +++ +++ private static final String SERVICES_PATH = "META-INF/services/"; +++ +++ /** Set to true for debugging */ +++ private static final boolean DEBUG = false; +++ +++ /** cache the contents of the xalan.properties file. +++ * Until an attempt has been made to read this file, this will +++ * be null; if the file does not exist or we encounter some other error +++ * during the read, this will be empty. +++ */ +++ private static Properties fXalanProperties = null; +++ +++ /*** +++ * Cache the time stamp of the xalan.properties file so +++ * that we know if it's been modified and can invalidate +++ * the cache when necessary. +++ */ +++ private static long fLastModified = -1; +++ +++ // +++ // Public static methods +++ // +++ +++ /** +++ * Finds the implementation Class object in the specified order. The +++ * specified order is the following: +++ * <ol> +++ * <li>query the system property using <code>System.getProperty</code> +++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file +++ * <li>use fallback classname +++ * </ol> +++ * +++ * @return instance of factory, never null +++ * +++ * @param factoryId Name of the factory to find, same as +++ * a property name +++ * @param fallbackClassName Implementation class name, if nothing else +++ * is found. Use null to mean no fallback. +++ * +++ * @exception ObjectFactory.ConfigurationError +++ */ +++ public static Object createObject(String factoryId, String fallbackClassName) +++ throws ConfigurationError { +++ return createObject(factoryId, null, fallbackClassName); +++ } // createObject(String,String):Object +++ +++ /** +++ * Finds the implementation Class object in the specified order. The +++ * specified order is the following: +++ * <ol> +++ * <li>query the system property using <code>System.getProperty</code> +++ * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file +++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file +++ * <li>use fallback classname +++ * </ol> +++ * +++ * @return instance of factory, never null +++ * +++ * @param factoryId Name of the factory to find, same as +++ * a property name +++ * @param propertiesFilename The filename in the $java.home/lib directory +++ * of the properties file. If none specified, +++ * ${java.home}/lib/xalan.properties will be used. +++ * @param fallbackClassName Implementation class name, if nothing else +++ * is found. Use null to mean no fallback. +++ * +++ * @exception ObjectFactory.ConfigurationError +++ */ +++ static Object createObject(String factoryId, +++ String propertiesFilename, +++ String fallbackClassName) +++ throws ConfigurationError +++ { +++ Class factoryClass = lookUpFactoryClass(factoryId, +++ propertiesFilename, +++ fallbackClassName); +++ +++ if (factoryClass == null) { +++ throw new ConfigurationError( +++ "Provider for " + factoryId + " cannot be found", null); +++ } +++ +++ try{ +++ Object instance = factoryClass.newInstance(); +++ if (DEBUG) debugPrintln("created new instance of factory " + factoryId); +++ return instance; +++ } catch (Exception x) { +++ throw new ConfigurationError( +++ "Provider for factory " + factoryId +++ + " could not be instantiated: " + x, x); +++ } +++ } // createObject(String,String,String):Object +++ +++ /** +++ * Finds the implementation Class object in the specified order. The +++ * specified order is the following: +++ * <ol> +++ * <li>query the system property using <code>System.getProperty</code> +++ * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file +++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file +++ * <li>use fallback classname +++ * </ol> +++ * +++ * @return Class object of factory, never null +++ * +++ * @param factoryId Name of the factory to find, same as +++ * a property name +++ * @param propertiesFilename The filename in the $java.home/lib directory +++ * of the properties file. If none specified, +++ * ${java.home}/lib/xalan.properties will be used. +++ * @param fallbackClassName Implementation class name, if nothing else +++ * is found. Use null to mean no fallback. +++ * +++ * @exception ObjectFactory.ConfigurationError +++ */ +++ public static Class lookUpFactoryClass(String factoryId) +++ throws ConfigurationError +++ { +++ return lookUpFactoryClass(factoryId, null, null); +++ } // lookUpFactoryClass(String):Class +++ +++ /** +++ * Finds the implementation Class object in the specified order. The +++ * specified order is the following: +++ * <ol> +++ * <li>query the system property using <code>System.getProperty</code> +++ * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file +++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file +++ * <li>use fallback classname +++ * </ol> +++ * +++ * @return Class object that provides factory service, never null +++ * +++ * @param factoryId Name of the factory to find, same as +++ * a property name +++ * @param propertiesFilename The filename in the $java.home/lib directory +++ * of the properties file. If none specified, +++ * ${java.home}/lib/xalan.properties will be used. +++ * @param fallbackClassName Implementation class name, if nothing else +++ * is found. Use null to mean no fallback. +++ * +++ * @exception ObjectFactory.ConfigurationError +++ */ +++ public static Class lookUpFactoryClass(String factoryId, +++ String propertiesFilename, +++ String fallbackClassName) +++ throws ConfigurationError +++ { +++ String factoryClassName = lookUpFactoryClassName(factoryId, +++ propertiesFilename, +++ fallbackClassName); +++ ClassLoader cl = findClassLoader(); +++ +++ if (factoryClassName == null) { +++ factoryClassName = fallbackClassName; +++ } +++ +++ // assert(className != null); +++ try{ +++ Class providerClass = findProviderClass(factoryClassName, +++ cl, +++ true); +++ if (DEBUG) debugPrintln("created new instance of " + providerClass + +++ " using ClassLoader: " + cl); +++ return providerClass; +++ } catch (ClassNotFoundException x) { +++ throw new ConfigurationError( +++ "Provider " + factoryClassName + " not found", x); +++ } catch (Exception x) { +++ throw new ConfigurationError( +++ "Provider "+factoryClassName+" could not be instantiated: "+x, +++ x); +++ } +++ } // lookUpFactoryClass(String,String,String):Class +++ +++ /** +++ * Finds the name of the required implementation class in the specified +++ * order. The specified order is the following: +++ * <ol> +++ * <li>query the system property using <code>System.getProperty</code> +++ * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file +++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file +++ * <li>use fallback classname +++ * </ol> +++ * +++ * @return name of class that provides factory service, never null +++ * +++ * @param factoryId Name of the factory to find, same as +++ * a property name +++ * @param propertiesFilename The filename in the $java.home/lib directory +++ * of the properties file. If none specified, +++ * ${java.home}/lib/xalan.properties will be used. +++ * @param fallbackClassName Implementation class name, if nothing else +++ * is found. Use null to mean no fallback. +++ * +++ * @exception ObjectFactory.ConfigurationError +++ */ +++ static String lookUpFactoryClassName(String factoryId, +++ String propertiesFilename, +++ String fallbackClassName) +++ { +++ // Use the system property first +++ try { +++ String systemProp = SecuritySupport.getSystemProperty(factoryId); +++ if (systemProp != null) { +++ if (DEBUG) debugPrintln("found system property, value=" + systemProp); +++ return systemProp; +++ } +++ } catch (SecurityException se) { +++ // Ignore and continue w/ next location +++ } +++ +++ // Try to read from propertiesFilename, or +++ // $java.home/lib/xalan.properties +++ String factoryClassName = null; +++ // no properties file name specified; use +++ // $JAVA_HOME/lib/xalan.properties: +++ if (propertiesFilename == null) { +++ File propertiesFile = null; +++ boolean propertiesFileExists = false; +++ try { +++ String javah = SecuritySupport.getSystemProperty("java.home"); +++ propertiesFilename = javah + File.separator + +++ "lib" + File.separator + DEFAULT_PROPERTIES_FILENAME; +++ propertiesFile = new File(propertiesFilename); +++ propertiesFileExists = SecuritySupport.getFileExists(propertiesFile); +++ } catch (SecurityException e) { +++ // try again... +++ fLastModified = -1; +++ fXalanProperties = null; +++ } +++ +++ synchronized (ObjectFactory.class) { +++ boolean loadProperties = false; +++ FileInputStream fis = null; +++ try { +++ // file existed last time +++ if(fLastModified >= 0) { +++ if(propertiesFileExists && +++ (fLastModified < (fLastModified = SecuritySupport.getLastModified(propertiesFile)))) { +++ loadProperties = true; +++ } else { +++ // file has stopped existing... +++ if(!propertiesFileExists) { +++ fLastModified = -1; +++ fXalanProperties = null; +++ } // else, file wasn't modified! +++ } +++ } else { +++ // file has started to exist: +++ if(propertiesFileExists) { +++ loadProperties = true; +++ fLastModified = SecuritySupport.getLastModified(propertiesFile); +++ } // else, nothing's changed +++ } +++ if(loadProperties) { +++ // must never have attempted to read xalan.properties +++ // before (or it's outdeated) +++ fXalanProperties = new Properties(); +++ fis = SecuritySupport.getFileInputStream(propertiesFile); +++ fXalanProperties.load(fis); +++ } +++ } catch (Exception x) { +++ fXalanProperties = null; +++ fLastModified = -1; +++ // assert(x instanceof FileNotFoundException +++ // || x instanceof SecurityException) +++ // In both cases, ignore and continue w/ next location +++ } +++ finally { +++ // try to close the input stream if one was opened. +++ if (fis != null) { +++ try { +++ fis.close(); +++ } +++ // Ignore the exception. +++ catch (IOException exc) {} +++ } +++ } +++ } +++ if(fXalanProperties != null) { +++ factoryClassName = fXalanProperties.getProperty(factoryId); +++ } +++ } else { +++ FileInputStream fis = null; +++ try { +++ fis = SecuritySupport.getFileInputStream(new File(propertiesFilename)); +++ Properties props = new Properties(); +++ props.load(fis); +++ factoryClassName = props.getProperty(factoryId); +++ } catch (Exception x) { +++ // assert(x instanceof FileNotFoundException +++ // || x instanceof SecurityException) +++ // In both cases, ignore and continue w/ next location +++ } +++ finally { +++ // try to close the input stream if one was opened. +++ if (fis != null) { +++ try { +++ fis.close(); +++ } +++ // Ignore the exception. +++ catch (IOException exc) {} +++ } +++ } +++ } +++ if (factoryClassName != null) { +++ if (DEBUG) debugPrintln("found in " + propertiesFilename + ", value=" +++ + factoryClassName); +++ return factoryClassName; +++ } +++ +++ // Try Jar Service Provider Mechanism +++ return findJarServiceProviderName(factoryId); +++ } // lookUpFactoryClass(String,String):String +++ +++ // +++ // Private static methods +++ // +++ +++ /** Prints a message to standard error if debugging is enabled. */ +++ private static void debugPrintln(String msg) { +++ if (DEBUG) { +++ System.err.println("JAXP: " + msg); +++ } +++ } // debugPrintln(String) +++ +++ /** +++ * Figure out which ClassLoader to use. For JDK 1.2 and later use +++ * the context ClassLoader. +++ */ +++ public static ClassLoader findClassLoader() +++ throws ConfigurationError +++ { +++ if (System.getSecurityManager()!=null) { +++ //this will ensure bootclassloader is used +++ return null; +++ } +++ +++ // Figure out which ClassLoader to use for loading the provider +++ // class. If there is a Context ClassLoader then use it. +++ ClassLoader context = SecuritySupport.getContextClassLoader(); +++ ClassLoader system = SecuritySupport.getSystemClassLoader(); +++ +++ ClassLoader chain = system; +++ while (true) { +++ if (context == chain) { +++ // Assert: we are on JDK 1.1 or we have no Context ClassLoader +++ // or any Context ClassLoader in chain of system classloader +++ // (including extension ClassLoader) so extend to widest +++ // ClassLoader (always look in system ClassLoader if Xalan +++ // is in boot/extension/system classpath and in current +++ // ClassLoader otherwise); normal classloaders delegate +++ // back to system ClassLoader first so this widening doesn't +++ // change the fact that context ClassLoader will be consulted +++ ClassLoader current = ObjectFactory.class.getClassLoader(); +++ +++ chain = system; +++ while (true) { +++ if (current == chain) { +++ // Assert: Current ClassLoader in chain of +++ // boot/extension/system ClassLoaders +++ return system; +++ } +++ if (chain == null) { +++ break; +++ } +++ chain = SecuritySupport.getParentClassLoader(chain); +++ } +++ +++ // Assert: Current ClassLoader not in chain of +++ // boot/extension/system ClassLoaders +++ return current; +++ } +++ +++ if (chain == null) { +++ // boot ClassLoader reached +++ break; +++ } +++ +++ // Check for any extension ClassLoaders in chain up to +++ // boot ClassLoader +++ chain = SecuritySupport.getParentClassLoader(chain); +++ } +++ +++ // Assert: Context ClassLoader not in chain of +++ // boot/extension/system ClassLoaders +++ return context; +++ } // findClassLoader():ClassLoader +++ +++ /** +++ * Create an instance of a class using the same classloader for the ObjectFactory by default +++ * or bootclassloader when Security Manager is in place +++ */ +++ public static Object newInstance(String className, boolean doFallback) +++ throws ConfigurationError +++ { +++ if (System.getSecurityManager()!=null) { +++ return newInstance(className, null, doFallback); +++ } else { +++ return newInstance(className, +++ findClassLoader (), doFallback); +++ } +++ } +++ +++ /** +++ * Create an instance of a class using the specified ClassLoader +++ */ +++ static Object newInstance(String className, ClassLoader cl, +++ boolean doFallback) +++ throws ConfigurationError +++ { +++ // assert(className != null); +++ try{ +++ Class providerClass = findProviderClass(className, cl, doFallback); +++ Object instance = providerClass.newInstance(); +++ if (DEBUG) debugPrintln("created new instance of " + providerClass + +++ " using ClassLoader: " + cl); +++ return instance; +++ } catch (ClassNotFoundException x) { +++ throw new ConfigurationError( +++ "Provider " + className + " not found", x); +++ } catch (Exception x) { +++ throw new ConfigurationError( +++ "Provider " + className + " could not be instantiated: " + x, +++ x); +++ } +++ } +++ +++ /** +++ * Find a Class using the same classloader for the ObjectFactory by default +++ * or bootclassloader when Security Manager is in place +++ */ +++ public static Class findProviderClass(String className, boolean doFallback) +++ throws ClassNotFoundException, ConfigurationError +++ { +++ if (System.getSecurityManager()!=null) { +++ return Class.forName(className); +++ } else { +++ return findProviderClass (className, +++ findClassLoader (), doFallback); +++ } +++ } +++ +++ /** +++ * Find a Class using the specified ClassLoader +++ */ +++ static Class findProviderClass(String className, ClassLoader cl, +++ boolean doFallback) +++ throws ClassNotFoundException, ConfigurationError +++ { +++ //throw security exception if the calling thread is not allowed to access the +++ //class. Restrict the access to the package classes as specified in java.security policy. +++ SecurityManager security = System.getSecurityManager(); +++ try{ +++ if (security != null){ +++ if (className.startsWith(XALAN_INTERNAL) || +++ className.startsWith(XERCES_INTERNAL)) { +++ cl = null; +++ } else { +++ final int lastDot = className.lastIndexOf("."); +++ String packageName = className; +++ if (lastDot != -1) packageName = className.substring(0, lastDot); +++ security.checkPackageAccess(packageName); +++ } +++ } +++ }catch(SecurityException e){ +++ throw e; +++ } +++ +++ Class providerClass; +++ if (cl == null) { +++ // XXX Use the bootstrap ClassLoader. There is no way to +++ // load a class using the bootstrap ClassLoader that works +++ // in both JDK 1.1 and Java 2. However, this should still +++ // work b/c the following should be true: +++ // +++ // (cl == null) iff current ClassLoader == null +++ // +++ // Thus Class.forName(String) will use the current +++ // ClassLoader which will be the bootstrap ClassLoader. +++ providerClass = Class.forName(className); +++ } else { +++ try { +++ providerClass = cl.loadClass(className); +++ } catch (ClassNotFoundException x) { +++ if (doFallback) { +++ // Fall back to current classloader +++ ClassLoader current = ObjectFactory.class.getClassLoader(); +++ if (current == null) { +++ providerClass = Class.forName(className); +++ } else if (cl != current) { +++ cl = current; +++ providerClass = cl.loadClass(className); +++ } else { +++ throw x; +++ } +++ } else { +++ throw x; +++ } +++ } +++ } +++ +++ return providerClass; +++ } +++ +++ /** +++ * Find the name of service provider using Jar Service Provider Mechanism +++ * +++ * @return instance of provider class if found or null +++ */ +++ private static String findJarServiceProviderName(String factoryId) +++ { +++ String serviceId = SERVICES_PATH + factoryId; +++ InputStream is = null; +++ +++ // First try the Context ClassLoader +++ ClassLoader cl = findClassLoader(); +++ +++ is = SecuritySupport.getResourceAsStream(cl, serviceId); +++ +++ // If no provider found then try the current ClassLoader +++ if (is == null) { +++ ClassLoader current = ObjectFactory.class.getClassLoader(); +++ if (cl != current) { +++ cl = current; +++ is = SecuritySupport.getResourceAsStream(cl, serviceId); +++ } +++ } +++ +++ if (is == null) { +++ // No provider found +++ return null; +++ } +++ +++ if (DEBUG) debugPrintln("found jar resource=" + serviceId + +++ " using ClassLoader: " + cl); +++ +++ // Read the service provider name in UTF-8 as specified in +++ // the jar spec. Unfortunately this fails in Microsoft +++ // VJ++, which does not implement the UTF-8 +++ // encoding. Theoretically, we should simply let it fail in +++ // that case, since the JVM is obviously broken if it +++ // doesn't support such a basic standard. But since there +++ // are still some users attempting to use VJ++ for +++ // development, we have dropped in a fallback which makes a +++ // second attempt using the platform's default encoding. In +++ // VJ++ this is apparently ASCII, which is a subset of +++ // UTF-8... and since the strings we'll be reading here are +++ // also primarily limited to the 7-bit ASCII range (at +++ // least, in English versions), this should work well +++ // enough to keep us on the air until we're ready to +++ // officially decommit from VJ++. [Edited comment from +++ // jkesselm] +++ BufferedReader rd; +++ try { +++ rd = new BufferedReader(new InputStreamReader(is, "UTF-8")); +++ } catch (java.io.UnsupportedEncodingException e) { +++ rd = new BufferedReader(new InputStreamReader(is)); +++ } +++ +++ String factoryClassName = null; +++ try { +++ // XXX Does not handle all possible input as specified by the +++ // Jar Service Provider specification +++ factoryClassName = rd.readLine(); +++ } catch (IOException x) { +++ // No provider found +++ return null; +++ } +++ finally { +++ try { +++ // try to close the reader. +++ rd.close(); +++ } +++ // Ignore the exception. +++ catch (IOException exc) {} +++ } +++ +++ if (factoryClassName != null && +++ ! "".equals(factoryClassName)) { +++ if (DEBUG) debugPrintln("found in resource, value=" +++ + factoryClassName); +++ +++ // Note: here we do not want to fall back to the current +++ // ClassLoader because we want to avoid the case where the +++ // resource file was found using one ClassLoader and the +++ // provider class was instantiated using a different one. +++ return factoryClassName; +++ } +++ +++ // No provider found +++ return null; +++ } +++ +++} // class ObjectFactory ++--- src/com/sun/org/apache/xalan/internal/utils/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100 +++++ src/com/sun/org/apache/xalan/internal/utils/SecuritySupport.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -0,0 +1,206 @@ +++/* +++ * reserved comment block +++ * DO NOT REMOVE OR ALTER! +++ */ +++/* +++ * Copyright 2002-2004 The Apache Software Foundation. +++ * +++ * Licensed under the Apache License, Version 2.0 (the "License"); +++ * you may not use this file except in compliance with the License. +++ * You may obtain a copy of the License at +++ * +++ * http://www.apache.org/licenses/LICENSE-2.0 +++ * +++ * Unless required by applicable law or agreed to in writing, software +++ * distributed under the License is distributed on an "AS IS" BASIS, +++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +++ * See the License for the specific language governing permissions and +++ * limitations under the License. +++ */ +++/* +++ * $Id: SecuritySupport.java,v 1.1.2.1 2005/08/01 02:08:48 jeffsuttor Exp $ +++ */ +++ +++package com.sun.org.apache.xalan.internal.utils; +++ +++import java.io.File; +++import java.io.FileInputStream; +++import java.io.FileNotFoundException; +++import java.io.InputStream; +++ +++import java.security.AccessController; +++import java.security.PrivilegedAction; +++import java.security.PrivilegedActionException; +++import java.security.PrivilegedExceptionAction; +++import java.util.ListResourceBundle; +++import java.util.Locale; +++import java.util.MissingResourceException; +++import java.util.ResourceBundle; +++ +++/** +++ * This class is duplicated for each subpackage so keep it in sync. It is +++ * package private and therefore is not exposed as part of any API. +++ * +++ * @xerces.internal +++ */ +++public final class SecuritySupport { +++ +++ private static final SecuritySupport securitySupport = new SecuritySupport(); +++ +++ /** +++ * Return an instance of this class. +++ */ +++ public static SecuritySupport getInstance() { +++ return securitySupport; +++ } +++ +++ static ClassLoader getContextClassLoader() { +++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ ClassLoader cl = null; +++ try { +++ cl = Thread.currentThread().getContextClassLoader(); +++ } catch (SecurityException ex) { +++ } +++ return cl; +++ } +++ }); +++ } +++ +++ static ClassLoader getSystemClassLoader() { +++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ ClassLoader cl = null; +++ try { +++ cl = ClassLoader.getSystemClassLoader(); +++ } catch (SecurityException ex) { +++ } +++ return cl; +++ } +++ }); +++ } +++ +++ static ClassLoader getParentClassLoader(final ClassLoader cl) { +++ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ ClassLoader parent = null; +++ try { +++ parent = cl.getParent(); +++ } catch (SecurityException ex) { +++ } +++ +++ // eliminate loops in case of the boot +++ // ClassLoader returning itself as a parent +++ return (parent == cl) ? null : parent; +++ } +++ }); +++ } +++ +++ public static String getSystemProperty(final String propName) { +++ return (String) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return System.getProperty(propName); +++ } +++ }); +++ } +++ +++ public static String getSystemProperty(final String propName, final String def) { +++ return (String) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return System.getProperty(propName, def); +++ } +++ }); +++ } +++ +++ static FileInputStream getFileInputStream(final File file) +++ throws FileNotFoundException { +++ try { +++ return (FileInputStream) AccessController.doPrivileged(new PrivilegedExceptionAction() { +++ public Object run() throws FileNotFoundException { +++ return new FileInputStream(file); +++ } +++ }); +++ } catch (PrivilegedActionException e) { +++ throw (FileNotFoundException)e.getException(); +++ } +++ } +++ +++ /** +++ * Return resource using the same classloader for the ObjectFactory by +++ * default or bootclassloader when Security Manager is in place +++ */ +++ public static InputStream getResourceAsStream(final String name) { +++ if (System.getSecurityManager()!=null) { +++ return getResourceAsStream(null, name); +++ } else { +++ return getResourceAsStream(ObjectFactory.findClassLoader(), name); +++ } +++ } +++ +++ public static InputStream getResourceAsStream(final ClassLoader cl, +++ final String name) { +++ return (InputStream) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ InputStream ris; +++ if (cl == null) { +++ ris = Object.class.getResourceAsStream("/"+name); +++ } else { +++ ris = cl.getResourceAsStream(name); +++ } +++ return ris; +++ } +++ }); +++ } +++ +++ /** +++ * Gets a resource bundle using the specified base name, the default locale, and the caller's class loader. +++ * @param bundle the base name of the resource bundle, a fully qualified class name +++ * @return a resource bundle for the given base name and the default locale +++ */ +++ public static ListResourceBundle getResourceBundle(String bundle) { +++ return getResourceBundle(bundle, Locale.getDefault()); +++ } +++ +++ /** +++ * Gets a resource bundle using the specified base name and locale, and the caller's class loader. +++ * @param bundle the base name of the resource bundle, a fully qualified class name +++ * @param locale the locale for which a resource bundle is desired +++ * @return a resource bundle for the given base name and locale +++ */ +++ public static ListResourceBundle getResourceBundle(final String bundle, final Locale locale) { +++ return AccessController.doPrivileged(new PrivilegedAction<ListResourceBundle>() { +++ public ListResourceBundle run() { +++ try { +++ return (ListResourceBundle)ResourceBundle.getBundle(bundle, locale); +++ } catch (MissingResourceException e) { +++ try { +++ return (ListResourceBundle)ResourceBundle.getBundle(bundle, new Locale("en", "US")); +++ } catch (MissingResourceException e2) { +++ throw new MissingResourceException( +++ "Could not load any resource bundle by " + bundle, bundle, ""); +++ } +++ } +++ } +++ }); +++ } +++ +++ public static boolean getFileExists(final File f) { +++ return ((Boolean) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return f.exists() ? Boolean.TRUE : Boolean.FALSE; +++ } +++ })).booleanValue(); +++ } +++ +++ static long getLastModified(final File f) { +++ return ((Long) AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return new Long(f.lastModified()); +++ } +++ })).longValue(); +++ } +++ +++ +++ private SecuritySupport() { +++ } +++} ++--- src/com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java 2013-04-16 14:28:09.344150364 +0100 +++++ src/com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -22,6 +22,8 @@ ++ */ ++ package com.sun.org.apache.xalan.internal.xslt; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; +++ ++ import java.io.File; ++ import java.io.FileWriter; ++ import java.io.PrintWriter; ++@@ -569,7 +571,7 @@ ++ // Grab java version for later use ++ try ++ { ++- String javaVersion = System.getProperty("java.version"); +++ String javaVersion = SecuritySupport.getSystemProperty("java.version"); ++ ++ h.put("java.version", javaVersion); ++ } ++@@ -588,7 +590,7 @@ ++ { ++ ++ // This is present in all JVM's ++- String cp = System.getProperty("java.class.path"); +++ String cp = SecuritySupport.getSystemProperty("java.class.path"); ++ ++ h.put("java.class.path", cp); ++ ++@@ -598,7 +600,7 @@ ++ h.put(FOUNDCLASSES + "java.class.path", classpathJars); ++ ++ // Also check for JDK 1.2+ type classpaths ++- String othercp = System.getProperty("sun.boot.class.path"); +++ String othercp = SecuritySupport.getSystemProperty("sun.boot.class.path"); ++ ++ if (null != othercp) ++ { ++@@ -612,7 +614,7 @@ ++ ++ //@todo NOTE: We don't actually search java.ext.dirs for ++ // *.jar files therein! This should be updated ++- othercp = System.getProperty("java.ext.dirs"); +++ othercp = SecuritySupport.getSystemProperty("java.ext.dirs"); ++ ++ if (null != othercp) ++ { ++--- src/com/sun/org/apache/xalan/internal/xslt/Process.java 2013-04-16 14:28:09.348150428 +0100 +++++ src/com/sun/org/apache/xalan/internal/xslt/Process.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -55,6 +55,7 @@ ++ import com.sun.org.apache.xalan.internal.Version; ++ import com.sun.org.apache.xalan.internal.res.XSLMessages; ++ import com.sun.org.apache.xalan.internal.res.XSLTErrorResources; +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ ++ //J2SE does not support Xalan interpretive ++ /* ++@@ -178,7 +179,7 @@ ++ java.io.PrintWriter diagnosticsWriter = new PrintWriter(System.err, true); ++ java.io.PrintWriter dumpWriter = diagnosticsWriter; ++ ResourceBundle resbundle = ++- (XSLMessages.loadResourceBundle( +++ (SecuritySupport.getResourceBundle( ++ com.sun.org.apache.xml.internal.utils.res.XResourceBundle.ERROR_RESOURCES)); ++ String flavor = "s2s"; ++ ++--- src/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java 2013-04-16 14:28:09.380150944 +0100 +++++ src/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -400,7 +400,7 @@ ++ } ++ } ++ catch (TypeCheckError e) { ++- reportError(ERROR, new ErrorMsg(e)); +++ reportError(ERROR, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e)); ++ } ++ } ++ ++@@ -420,7 +420,7 @@ ++ } ++ catch (IOException e) { ++ if (_xsltc.debug()) e.printStackTrace(); ++- reportError(ERROR,new ErrorMsg(e)); +++ reportError(ERROR,new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e)); ++ } ++ catch (SAXException e) { ++ Throwable ex = e.getException(); ++@@ -428,15 +428,15 @@ ++ e.printStackTrace(); ++ if (ex != null) ex.printStackTrace(); ++ } ++- reportError(ERROR, new ErrorMsg(e)); +++ reportError(ERROR, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e)); ++ } ++ catch (CompilerException e) { ++ if (_xsltc.debug()) e.printStackTrace(); ++- reportError(ERROR, new ErrorMsg(e)); +++ reportError(ERROR, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e)); ++ } ++ catch (Exception e) { ++ if (_xsltc.debug()) e.printStackTrace(); ++- reportError(ERROR, new ErrorMsg(e)); +++ reportError(ERROR, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e)); ++ } ++ return null; ++ } ++--- src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java 2013-04-16 14:28:09.400151266 +0100 +++++ src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -947,7 +947,12 @@ ++ "Cannot set the feature ''{0}'' on this TransformerFactory."}, ++ ++ {ErrorMsg.JAXP_SECUREPROCESSING_FEATURE, ++- "FEATURE_SECURE_PROCESSING: Cannot set the feature to false when security manager is present."} +++ "FEATURE_SECURE_PROCESSING: Cannot set the feature to false when security manager is present."}, +++ +++ {ErrorMsg.DESERIALIZE_TRANSLET_ERR, "When Java security is enabled, " + +++ "support for deserializing TemplatesImpl is disabled." + +++ "This can be overridden by setting the jdk.xml.enableTemplatesImplDeserialization" + +++ " system property to true."} ++ }; ++ } ++ } ++--- src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMsg.java 2013-04-16 14:28:09.420151588 +0100 +++++ src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMsg.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -23,6 +23,7 @@ ++ ++ package com.sun.org.apache.xalan.internal.xsltc.compiler.util; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import java.text.MessageFormat; ++ import java.util.Locale; ++ import java.util.ResourceBundle; ++@@ -46,6 +47,8 @@ ++ Object[] _params = null; ++ private boolean _isWarningError; ++ +++ Throwable _cause; +++ ++ // Compiler error messages ++ public static final String MULTIPLE_STYLESHEET_ERR = "MULTIPLE_STYLESHEET_ERR"; ++ public static final String TEMPLATE_REDEF_ERR = "TEMPLATE_REDEF_ERR"; ++@@ -157,6 +160,8 @@ ++ public static final String INVALID_NCNAME_ERR = "INVALID_NCNAME_ERR"; ++ public static final String INVALID_METHOD_IN_OUTPUT = "INVALID_METHOD_IN_OUTPUT"; ++ +++ public static final String DESERIALIZE_TRANSLET_ERR = "DESERIALIZE_TEMPLATES_ERR"; +++ ++ // All error messages are localized and are stored in resource bundles. ++ // This array and the following 4 strings are read from that bundle. ++ private static ResourceBundle _bundle; ++@@ -167,7 +172,7 @@ ++ public final static String RUNTIME_ERROR_KEY = "RUNTIME_ERROR_KEY"; ++ ++ static { ++- _bundle = ResourceBundle.getBundle( +++ _bundle = SecuritySupport.getResourceBundle( ++ "com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMessages", ++ Locale.getDefault()); ++ } ++@@ -177,10 +182,11 @@ ++ _line = 0; ++ } ++ ++- public ErrorMsg(Throwable e) { ++- _code = null; +++ public ErrorMsg(String code, Throwable e) { +++ _code = code; ++ _message = e.getMessage(); ++ _line = 0; +++ _cause = e; ++ } ++ ++ public ErrorMsg(String message, int line) { ++@@ -232,6 +238,10 @@ ++ _params[1] = param2; ++ } ++ +++ public Throwable getCause() { +++ return _cause; +++ } +++ ++ private String getFileName(SyntaxTreeNode node) { ++ Stylesheet stylesheet = node.getStylesheet(); ++ if (stylesheet != null) ++--- src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/Util.java 2013-04-16 14:28:09.428151717 +0100 +++++ src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/Util.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -26,6 +26,7 @@ ++ import java.util.StringTokenizer; ++ ++ import com.sun.org.apache.bcel.internal.generic.Type; +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import com.sun.org.apache.xalan.internal.xsltc.compiler.Constants; ++ import com.sun.org.apache.xml.internal.utils.XML11Char; ++ ++@@ -37,7 +38,7 @@ ++ private static char filesep; ++ ++ static { ++- String temp = System.getProperty("file.separator", "/"); +++ String temp = SecuritySupport.getSystemProperty("file.separator", "/"); ++ filesep = temp.charAt(0); ++ } ++ ++--- src/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java 2013-04-16 14:28:09.396151201 +0100 +++++ src/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -41,10 +41,12 @@ ++ import java.util.jar.Manifest; ++ ++ import com.sun.org.apache.bcel.internal.classfile.JavaClass; +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg; ++ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util; ++ import com.sun.org.apache.xml.internal.dtm.DTM; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import org.xml.sax.InputSource; ++ import org.xml.sax.XMLReader; ++ ++@@ -257,7 +259,7 @@ ++ return compile(input, _className); ++ } ++ catch (IOException e) { ++- _parser.reportError(Constants.FATAL, new ErrorMsg(e)); +++ _parser.reportError(Constants.FATAL, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e)); ++ return false; ++ } ++ } ++@@ -276,7 +278,7 @@ ++ return compile(input, name); ++ } ++ catch (IOException e) { ++- _parser.reportError(Constants.FATAL, new ErrorMsg(e)); +++ _parser.reportError(Constants.FATAL, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e)); ++ return false; ++ } ++ } ++@@ -361,11 +363,11 @@ ++ } ++ catch (Exception e) { ++ /*if (_debug)*/ e.printStackTrace(); ++- _parser.reportError(Constants.FATAL, new ErrorMsg(e)); +++ _parser.reportError(Constants.FATAL, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e)); ++ } ++ catch (Error e) { ++ if (_debug) e.printStackTrace(); ++- _parser.reportError(Constants.FATAL, new ErrorMsg(e)); +++ _parser.reportError(Constants.FATAL, new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR, e)); ++ } ++ finally { ++ _reader = null; // reset this here to be sure it is not re-used ++@@ -573,7 +575,7 @@ ++ */ ++ public boolean setDestDirectory(String dstDirName) { ++ final File dir = new File(dstDirName); ++- if (dir.exists() || dir.mkdirs()) { +++ if (SecuritySupport.getFileExists(dir) || dir.mkdirs()) { ++ _destDir = dir; ++ return true; ++ } ++@@ -746,7 +748,7 @@ ++ String parentDir = outFile.getParent(); ++ if (parentDir != null) { ++ File parentFile = new File(parentDir); ++- if (!parentFile.exists()) +++ if (!SecuritySupport.getFileExists(parentFile)) ++ parentFile.mkdirs(); ++ } ++ } ++--- src/com/sun/org/apache/xalan/internal/xsltc/dom/NodeSortRecord.java 2013-04-16 14:28:09.444151975 +0100 +++++ src/com/sun/org/apache/xalan/internal/xsltc/dom/NodeSortRecord.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -32,6 +32,7 @@ ++ import com.sun.org.apache.xalan.internal.xsltc.TransletException; ++ import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; ++ import com.sun.org.apache.xml.internal.utils.StringComparable; +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ ++ /** ++ * Base class for sort records containing application specific sort keys ++@@ -111,7 +112,7 @@ ++ try { ++ // -- W. Eliot Kimber (eliot@isogen.com) ++ colFactClassname = ++- System.getProperty("com.sun.org.apache.xalan.internal.xsltc.COLLATOR_FACTORY"); +++ SecuritySupport.getSystemProperty("com.sun.org.apache.xalan.internal.xsltc.COLLATOR_FACTORY"); ++ } ++ catch (SecurityException e) { ++ // If we can't read the propery, just use default collator ++--- src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java 2013-04-16 14:28:09.448152039 +0100 +++++ src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java 2013-04-16 14:29:26.553394447 +0100 ++@@ -23,6 +23,7 @@ ++ ++ package com.sun.org.apache.xalan.internal.xsltc.runtime; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import java.text.DecimalFormat; ++ import java.text.DecimalFormatSymbols; ++ import java.text.FieldPosition; ++@@ -1518,7 +1519,7 @@ ++ ++ static { ++ String resource = "com.sun.org.apache.xalan.internal.xsltc.runtime.ErrorMessages"; ++- m_bundle = ResourceBundle.getBundle(resource); +++ m_bundle = SecuritySupport.getResourceBundle(resource); ++ } ++ ++ /** ++--- src/com/sun/org/apache/xalan/internal/xsltc/runtime/output/WriterOutputBuffer.java 2013-04-16 14:28:09.456152168 +0100 +++++ src/com/sun/org/apache/xalan/internal/xsltc/runtime/output/WriterOutputBuffer.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -23,6 +23,7 @@ ++ ++ package com.sun.org.apache.xalan.internal.xsltc.runtime.output; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import java.io.BufferedWriter; ++ import java.io.IOException; ++ import java.io.Writer; ++@@ -36,7 +37,7 @@ ++ ++ static { ++ // Set a larger buffer size for Solaris ++- final String osName = System.getProperty("os.name"); +++ final String osName = SecuritySupport.getSystemProperty("os.name"); ++ if (osName.equalsIgnoreCase("solaris")) { ++ BUFFER_SIZE = 32 * KB; ++ } ++--- src/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java 2013-04-16 14:28:09.460152233 +0100 +++++ src/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -42,6 +42,7 @@ ++ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg; ++ import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; ++ import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable; +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ ++ /** ++ * @author Morten Jorgensen ++@@ -51,6 +52,8 @@ ++ */ ++ public final class TemplatesImpl implements Templates, Serializable { ++ static final long serialVersionUID = 673094361519270707L; +++ public final static String DESERIALIZE_TRANSLET = "jdk.xml.enableTemplatesImplDeserialization"; +++ ++ /** ++ * Name of the superclass of all translets. This is needed to ++ * determine which, among all classes comprising a translet, ++@@ -181,6 +184,15 @@ ++ private void readObject(ObjectInputStream is) ++ throws IOException, ClassNotFoundException ++ { +++ SecurityManager security = System.getSecurityManager(); +++ if (security != null){ +++ String temp = SecuritySupport.getSystemProperty(DESERIALIZE_TRANSLET); +++ if (temp == null || !(temp.length()==0 || temp.equalsIgnoreCase("true"))) { +++ ErrorMsg err = new ErrorMsg(ErrorMsg.DESERIALIZE_TRANSLET_ERR); +++ throw new UnsupportedOperationException(err.toString()); +++ } +++ } +++ ++ is.defaultReadObject(); ++ if (is.readBoolean()) { ++ _uriResolver = (URIResolver) is.readObject(); ++--- src/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java 2013-04-16 14:28:09.460152233 +0100 +++++ src/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -69,7 +69,7 @@ ++ import com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC; ++ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg; ++ import com.sun.org.apache.xalan.internal.xsltc.dom.XSLTCDTMManager; ++- +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ ++ import org.xml.sax.InputSource; ++ import org.xml.sax.XMLFilter; ++@@ -839,8 +839,14 @@ ++ // Check that the transformation went well before returning ++ if (bytecodes == null) { ++ ++- ErrorMsg err = new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR); ++- TransformerConfigurationException exc = new TransformerConfigurationException(err.toString()); +++ Vector errs = xsltc.getErrors(); +++ ErrorMsg err = null; +++ if (errs != null) { +++ err = (ErrorMsg)errs.get(errs.size()-1); +++ } else { +++ err = new ErrorMsg(ErrorMsg.JAXP_COMPILE_ERR); +++ } +++ TransformerConfigurationException exc = new TransformerConfigurationException(err.toString(), err.getCause()); ++ ++ // Pass compiler errors to the error listener ++ if (_errorListener != null) { ++@@ -1187,7 +1193,7 @@ ++ // Find the parent directory of the translet. ++ String transletParentDir = transletFile.getParent(); ++ if (transletParentDir == null) ++- transletParentDir = System.getProperty("user.dir"); +++ transletParentDir = SecuritySupport.getSystemProperty("user.dir"); ++ ++ File transletParentFile = new File(transletParentDir); ++ ++--- src/com/sun/org/apache/xerces/internal/dom/DOMMessageFormatter.java 2013-04-16 14:28:09.472152426 +0100 +++++ src/com/sun/org/apache/xerces/internal/dom/DOMMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -20,10 +20,10 @@ ++ ++ ++ package com.sun.org.apache.xerces.internal.dom; +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import java.util.Locale; ++ import java.util.MissingResourceException; ++ import java.util.ResourceBundle; ++-import java.util.PropertyResourceBundle; ++ ++ /** ++ * Used to format DOM error messages, using the system locale. ++@@ -31,6 +31,7 @@ ++ * @xerces.internal ++ * ++ * @author Sandy Gao, IBM +++ * @version $Id: DOMMessageFormatter.java,v 1.6 2010-11-01 04:39:38 joehw Exp $ ++ */ ++ public class DOMMessageFormatter { ++ public static final String DOM_DOMAIN = "http://www.w3.org/dom/DOMTR"; ++@@ -122,13 +123,13 @@ ++ */ ++ public static void init(){ ++ if (locale != null) { ++- domResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.DOMMessages", locale); ++- serResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages", locale); ++- xmlResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale); +++ domResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.DOMMessages", locale); +++ serResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages", locale); +++ xmlResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale); ++ }else{ ++- domResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.DOMMessages"); ++- serResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages"); ++- xmlResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages"); +++ domResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.DOMMessages"); +++ serResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages"); +++ xmlResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages"); ++ } ++ } ++ ++--- src/com/sun/org/apache/xerces/internal/impl/dv/DatatypeException.java 2013-04-16 14:28:09.532153393 +0100 +++++ src/com/sun/org/apache/xerces/internal/impl/dv/DatatypeException.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -20,6 +20,7 @@ ++ ++ package com.sun.org.apache.xerces.internal.impl.dv; ++ +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import java.util.ResourceBundle; ++ import java.util.PropertyResourceBundle; ++ import java.util.MissingResourceException; ++@@ -34,6 +35,7 @@ ++ * ++ * @author Sandy Gao, IBM ++ * +++ * @version $Id: DatatypeException.java,v 1.6 2010-11-01 04:39:43 joehw Exp $ ++ */ ++ public class DatatypeException extends Exception { ++ ++@@ -84,7 +86,7 @@ ++ */ ++ public String getMessage() { ++ ResourceBundle resourceBundle = null; ++- resourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages"); +++ resourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages"); ++ if (resourceBundle == null) ++ throw new MissingResourceException("Property file not found!", "com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages", key); ++ ++--- src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter.java 2013-04-16 14:28:09.552153715 +0100 +++++ src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -20,12 +20,11 @@ ++ ++ package com.sun.org.apache.xerces.internal.impl.msg; ++ +++import com.sun.org.apache.xerces.internal.util.MessageFormatter; +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import java.util.Locale; ++ import java.util.MissingResourceException; ++ import java.util.ResourceBundle; ++-import java.util.PropertyResourceBundle; ++- ++-import com.sun.org.apache.xerces.internal.util.MessageFormatter; ++ ++ /** ++ * XMLMessageFormatter provides error messages for the XML 1.0 Recommendation and for ++@@ -71,12 +70,12 @@ ++ ++ if (fResourceBundle == null || locale != fLocale) { ++ if (locale != null) { ++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale); +++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale); ++ // memorize the most-recent locale ++ fLocale = locale; ++ } ++ if (fResourceBundle == null) ++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages"); +++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages"); ++ } ++ ++ // format message ++--- src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java 2013-04-16 14:28:09.504152942 +0100 +++++ src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -52,6 +52,7 @@ ++ import com.sun.org.apache.xerces.internal.xni.XNIException; ++ import com.sun.org.apache.xerces.internal.xni.parser.*; ++ import com.sun.org.apache.xerces.internal.impl.Constants; +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import com.sun.xml.internal.stream.Entity; ++ import com.sun.org.apache.xerces.internal.xni.Augmentations; ++ ++@@ -1811,7 +1812,7 @@ ++ // get the user.dir property ++ String userDir = ""; ++ try { ++- userDir = System.getProperty("user.dir"); +++ userDir = SecuritySupport.getSystemProperty("user.dir"); ++ } ++ catch (SecurityException se) { ++ } ++@@ -2155,9 +2156,6 @@ ++ private static String expandSystemIdStrictOff(String systemId, String baseSystemId) ++ throws URI.MalformedURIException { ++ ++- systemId = escapeNonUSAscii(systemId); ++- baseSystemId = escapeNonUSAscii(baseSystemId); ++- ++ URI systemURI = new URI(systemId, true); ++ // If it's already an absolute one, return it ++ if (systemURI.isAbsoluteURI()) { ++@@ -2623,64 +2621,6 @@ ++ ++ } // fixURI(String):String ++ ++- /** ++- * Escape invalid URI characters. ++- * ++- * Passed a URI that contains invalid characters (like spaces, non-ASCII Unicode characters, and the like), ++- * this function percent encodes the invalid characters per the URI specification (i.e., as a sequence of ++- * %-encoded UTF-8 octets). ++- * ++- * N.B. There are two problems. If the URI contains a '%' character, that might be an indication that ++- * the URI has already been escaped by the author, or it might be an invalid '%'. In the former case, ++- * it's important not to escape it, or we'll wind up with invalid, doubly-escaped '%'s. In the latter, ++- * the URI is broken if we don't encode it. Similarly, a '#' character might be the start of a fragment ++- * identifier or it might be an invalid '#'. ++- * ++- * Given that the former is vastly more likely than the latter in each case (most users are familiar with ++- * the magic status of '%' and '#' and they occur relatively infrequently in filenames, and if the user parses ++- * a proper Java File, we will already have %-escaped the URI), we simply assume that %'s and #'s are legit. ++- * ++- * Very rarely, we may be wrong. If so, tell the user to fix the clearly broken URI. ++- */ ++- protected static String escapeNonUSAscii(String str) { ++- if (str == null) { ++- return str; ++- } ++- ++- // get UTF-8 bytes for the string ++- StringBuffer buffer = new StringBuffer(); ++- byte[] bytes = null; ++- byte b; ++- try { ++- bytes = str.getBytes("UTF-8"); ++- } catch (java.io.UnsupportedEncodingException e) { ++- // should never happen ++- return str; ++- } ++- int len = bytes.length; ++- int ch; ++- ++- // for each byte ++- for (int i = 0; i < len; i++) { ++- b = bytes[i]; ++- // for non-ascii character: make it positive, then escape ++- if (b < 0) { ++- ch = b + 256; ++- buffer.append('%'); ++- buffer.append(gHexChs[ch >> 4]); ++- buffer.append(gHexChs[ch & 0xf]); ++- } ++- else if (b != '%' && b != '#' && gNeedEscaping[b]) { ++- buffer.append('%'); ++- buffer.append(gAfterEscaping1[b]); ++- buffer.append(gAfterEscaping2[b]); ++- } ++- else { ++- buffer.append((char)b); ++- } ++- } ++- return buffer.toString(); ++- } ++ ++ // ++ // Package visible methods ++--- src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegexParser.java 2013-04-16 14:28:09.560153844 +0100 +++++ src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegexParser.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -20,6 +20,7 @@ ++ ++ package com.sun.org.apache.xerces.internal.impl.xpath.regex; ++ +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import java.util.Locale; ++ import java.util.MissingResourceException; ++ import java.util.ResourceBundle; ++@@ -94,10 +95,10 @@ ++ public void setLocale(Locale locale) { ++ try { ++ if (locale != null) { ++- this.resources = ResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.xpath.regex.message", locale); +++ this.resources = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.xpath.regex.message", locale); ++ } ++ else { ++- this.resources = ResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.xpath.regex.message"); +++ this.resources = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.xpath.regex.message"); ++ } ++ } ++ catch (MissingResourceException mre) { ++--- src/com/sun/org/apache/xerces/internal/impl/xs/XSMessageFormatter.java 2013-04-16 14:28:09.572154037 +0100 +++++ src/com/sun/org/apache/xerces/internal/impl/xs/XSMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -20,11 +20,11 @@ ++ ++ package com.sun.org.apache.xerces.internal.impl.xs; ++ +++import com.sun.org.apache.xerces.internal.util.MessageFormatter; +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import java.util.Locale; ++ import java.util.MissingResourceException; ++ import java.util.ResourceBundle; ++-import java.util.PropertyResourceBundle; ++-import com.sun.org.apache.xerces.internal.util.MessageFormatter; ++ ++ ++ /** ++@@ -34,6 +34,7 @@ ++ * @xerces.internal ++ * ++ * @author Elena Litani, IBM +++ * @version $Id: XSMessageFormatter.java,v 1.6 2010-11-01 04:39:55 joehw Exp $ ++ */ ++ public class XSMessageFormatter implements MessageFormatter { ++ /** ++@@ -66,12 +67,12 @@ ++ ++ if (fResourceBundle == null || locale != fLocale) { ++ if (locale != null) { ++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages", locale); +++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages", locale); ++ // memorize the most-recent locale ++ fLocale = locale; ++ } ++ if (fResourceBundle == null) ++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages"); +++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages"); ++ } ++ ++ String msg = fResourceBundle.getString(key); ++--- src/com/sun/org/apache/xerces/internal/jaxp/validation/JAXPValidationMessageFormatter.java 2013-04-16 14:28:09.600154489 +0100 +++++ src/com/sun/org/apache/xerces/internal/jaxp/validation/JAXPValidationMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -20,15 +20,16 @@ ++ ++ package com.sun.org.apache.xerces.internal.jaxp.validation; ++ +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import java.util.Locale; ++ import java.util.MissingResourceException; ++ import java.util.ResourceBundle; ++-import java.util.PropertyResourceBundle; ++ ++ /** ++ * <p>Used to format JAXP Validation API error messages using a specified locale.</p> ++ * ++ * @author Michael Glavassevich, IBM +++ * @version $Id: JAXPValidationMessageFormatter.java,v 1.5 2010-11-01 04:40:08 joehw Exp $ ++ */ ++ final class JAXPValidationMessageFormatter { ++ ++@@ -54,11 +55,11 @@ ++ ResourceBundle resourceBundle = null; ++ if (locale != null) { ++ resourceBundle = ++- PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages", locale); +++ SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages", locale); ++ } ++ else { ++ resourceBundle = ++- PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages"); +++ SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages"); ++ } ++ ++ // format message ++--- src/com/sun/org/apache/xerces/internal/util/DatatypeMessageFormatter.java 2013-04-16 14:28:09.616154746 +0100 +++++ src/com/sun/org/apache/xerces/internal/util/DatatypeMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -20,15 +20,16 @@ ++ ++ package com.sun.org.apache.xerces.internal.util; ++ +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import java.util.Locale; ++ import java.util.MissingResourceException; ++-import java.util.PropertyResourceBundle; ++ import java.util.ResourceBundle; ++ ++ /** ++ * <p>Used to format JAXP 1.3 Datatype API error messages using a specified locale.</p> ++ * ++ * @author Neeraj Bajaj, Sun Microsystems +++ * @version $Id: DatatypeMessageFormatter.java,v 1.6 2010-11-01 04:40:14 joehw Exp $ ++ */ ++ public class DatatypeMessageFormatter { ++ ++@@ -56,11 +57,11 @@ ++ ResourceBundle resourceBundle = null; ++ if (locale != null) { ++ resourceBundle = ++- PropertyResourceBundle.getBundle(BASE_NAME, locale); +++ SecuritySupport.getResourceBundle(BASE_NAME, locale); ++ } ++ else { ++ resourceBundle = ++- PropertyResourceBundle.getBundle(BASE_NAME); +++ SecuritySupport.getResourceBundle(BASE_NAME); ++ } ++ ++ // format message ++--- src/com/sun/org/apache/xerces/internal/util/SAXMessageFormatter.java 2013-04-16 14:28:09.620154811 +0100 +++++ src/com/sun/org/apache/xerces/internal/util/SAXMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -19,16 +19,17 @@ ++ */ ++ package com.sun.org.apache.xerces.internal.util; ++ +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import java.util.Locale; ++ import java.util.MissingResourceException; ++ import java.util.ResourceBundle; ++-import java.util.PropertyResourceBundle; ++ ++ /** ++ * Used to format SAX error messages using a specified locale. ++ * ++ * @author Michael Glavassevich, IBM ++ * +++ * @version $Id: SAXMessageFormatter.java,v 1.6 2010-11-01 04:40:14 joehw Exp $ ++ */ ++ public class SAXMessageFormatter { ++ ++@@ -54,11 +55,11 @@ ++ ResourceBundle resourceBundle = null; ++ if (locale != null) { ++ resourceBundle = ++- PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.SAXMessages", locale); +++ SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.SAXMessages", locale); ++ } ++ else { ++ resourceBundle = ++- PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.SAXMessages"); +++ SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.SAXMessages"); ++ } ++ ++ // format message ++--- src/com/sun/org/apache/xerces/internal/util/SecurityManager.java 2013-04-16 14:28:09.620154811 +0100 +++++ src/com/sun/org/apache/xerces/internal/util/SecurityManager.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -61,6 +61,8 @@ ++ ++ package com.sun.org.apache.xerces.internal.util; ++ import com.sun.org.apache.xerces.internal.impl.Constants; +++import java.security.AccessController; +++import java.security.PrivilegedAction; ++ /** ++ * This class is a container for parser settings that relate to ++ * security, or more specifically, it is intended to be used to prevent denial-of-service ++@@ -77,6 +79,7 @@ ++ * ++ * @author Neil Graham, IBM ++ * +++ * @version $Id: SecurityManager.java,v 1.5 2010-11-01 04:40:14 joehw Exp $ ++ */ ++ public final class SecurityManager { ++ ++@@ -176,41 +179,48 @@ ++ ++ private void readSystemProperties(){ ++ ++- //TODO: also read SYSTEM_PROPERTY_ELEMENT_ATTRIBUTE_LIMIT ++- try { ++- String value = System.getProperty(Constants.ENTITY_EXPANSION_LIMIT); ++- if(value != null && !value.equals("")){ ++- entityExpansionLimit = Integer.parseInt(value); ++- if (entityExpansionLimit < 0) ++- entityExpansionLimit = DEFAULT_ENTITY_EXPANSION_LIMIT; ++- } ++- else ++- entityExpansionLimit = DEFAULT_ENTITY_EXPANSION_LIMIT; ++- }catch(Exception ex){} ++- ++- try { ++- String value = System.getProperty(Constants.MAX_OCCUR_LIMIT); ++- if(value != null && !value.equals("")){ ++- maxOccurLimit = Integer.parseInt(value); ++- if (maxOccurLimit < 0) ++- maxOccurLimit = DEFAULT_MAX_OCCUR_NODE_LIMIT; ++- } ++- else ++- maxOccurLimit = DEFAULT_MAX_OCCUR_NODE_LIMIT; ++- }catch(Exception ex){} ++- ++- try { ++- String value = System.getProperty(Constants.SYSTEM_PROPERTY_ELEMENT_ATTRIBUTE_LIMIT); ++- if(value != null && !value.equals("")){ ++- fElementAttributeLimit = Integer.parseInt(value); ++- if ( fElementAttributeLimit < 0) ++- fElementAttributeLimit = DEFAULT_ELEMENT_ATTRIBUTE_LIMIT; ++- } ++- else ++- fElementAttributeLimit = DEFAULT_ELEMENT_ATTRIBUTE_LIMIT; +++ //TODO: also read SYSTEM_PROPERTY_ELEMENT_ATTRIBUTE_LIMIT +++ try { +++ String value = getSystemProperty(Constants.ENTITY_EXPANSION_LIMIT); +++ if(value != null && !value.equals("")){ +++ entityExpansionLimit = Integer.parseInt(value); +++ if (entityExpansionLimit < 0) +++ entityExpansionLimit = DEFAULT_ENTITY_EXPANSION_LIMIT; +++ } +++ else +++ entityExpansionLimit = DEFAULT_ENTITY_EXPANSION_LIMIT; +++ }catch(Exception ex){} +++ +++ try { +++ String value = getSystemProperty(Constants.MAX_OCCUR_LIMIT); +++ if(value != null && !value.equals("")){ +++ maxOccurLimit = Integer.parseInt(value); +++ if (maxOccurLimit < 0) +++ maxOccurLimit = DEFAULT_MAX_OCCUR_NODE_LIMIT; +++ } +++ else +++ maxOccurLimit = DEFAULT_MAX_OCCUR_NODE_LIMIT; +++ }catch(Exception ex){} +++ +++ try { +++ String value = getSystemProperty(Constants.SYSTEM_PROPERTY_ELEMENT_ATTRIBUTE_LIMIT); +++ if(value != null && !value.equals("")){ +++ fElementAttributeLimit = Integer.parseInt(value); +++ if ( fElementAttributeLimit < 0) +++ fElementAttributeLimit = DEFAULT_ELEMENT_ATTRIBUTE_LIMIT; +++ } +++ else +++ fElementAttributeLimit = DEFAULT_ELEMENT_ATTRIBUTE_LIMIT; ++ ++ }catch(Exception ex){} ++ ++ } ++ +++ private String getSystemProperty(final String propName) { +++ return AccessController.doPrivileged(new PrivilegedAction<String>() { +++ public String run() { +++ return System.getProperty(propName); +++ } +++ }); +++ } ++ } // class SecurityManager ++--- src/com/sun/org/apache/xerces/internal/utils/ConfigurationError.java 1970-01-01 01:00:00.000000000 +0100 +++++ src/com/sun/org/apache/xerces/internal/utils/ConfigurationError.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -0,0 +1,58 @@ +++/* +++ * reserved comment block +++ * DO NOT REMOVE OR ALTER! +++ */ +++/* +++ * Copyright 2001-2005 The Apache Software Foundation. +++ * +++ * Licensed under the Apache License, Version 2.0 (the "License"); +++ * you may not use this file except in compliance with the License. +++ * You may obtain a copy of the License at +++ * +++ * http://www.apache.org/licenses/LICENSE-2.0 +++ * +++ * Unless required by applicable law or agreed to in writing, software +++ * distributed under the License is distributed on an "AS IS" BASIS, +++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +++ * See the License for the specific language governing permissions and +++ * limitations under the License. +++ */ +++ +++package com.sun.org.apache.xerces.internal.utils; +++ +++/** +++ * A configuration error. This was an internal class in ObjectFactory previously +++ */ +++public final class ConfigurationError +++ extends Error { +++ +++ // +++ // Data +++ // +++ +++ /** Exception. */ +++ private Exception exception; +++ +++ // +++ // Constructors +++ // +++ +++ /** +++ * Construct a new instance with the specified detail string and +++ * exception. +++ */ +++ ConfigurationError(String msg, Exception x) { +++ super(msg); +++ this.exception = x; +++ } // <init>(String,Exception) +++ +++ // +++ // methods +++ // +++ +++ /** Returns the exception associated to this error. */ +++ public Exception getException() { +++ return exception; +++ } // getException():Exception +++ +++} // class ConfigurationError ++--- src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java 1970-01-01 01:00:00.000000000 +0100 +++++ src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -0,0 +1,436 @@ +++/* +++ * reserved comment block +++ * DO NOT REMOVE OR ALTER! +++ */ +++/* +++ * Copyright 2001-2005 The Apache Software Foundation. +++ * +++ * Licensed under the Apache License, Version 2.0 (the "License"); +++ * you may not use this file except in compliance with the License. +++ * You may obtain a copy of the License at +++ * +++ * http://www.apache.org/licenses/LICENSE-2.0 +++ * +++ * Unless required by applicable law or agreed to in writing, software +++ * distributed under the License is distributed on an "AS IS" BASIS, +++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +++ * See the License for the specific language governing permissions and +++ * limitations under the License. +++ */ +++ +++package com.sun.org.apache.xerces.internal.utils; +++ +++import java.io.InputStream; +++import java.io.IOException; +++import java.io.File; +++import java.io.FileInputStream; +++ +++import java.util.Properties; +++import java.io.BufferedReader; +++import java.io.InputStreamReader; +++ +++/** +++ * This class is duplicated for each JAXP subpackage so keep it in sync. +++ * It is package private and therefore is not exposed as part of the JAXP +++ * API. +++ * <p> +++ * This code is designed to implement the JAXP 1.1 spec pluggability +++ * feature and is designed to run on JDK version 1.1 and +++ * later, and to compile on JDK 1.2 and onward. +++ * The code also runs both as part of an unbundled jar file and +++ * when bundled as part of the JDK. +++ * <p> +++ * +++ * @version $Id: ObjectFactory.java,v 1.6 2010/04/23 01:44:34 joehw Exp $ +++ */ +++public final class ObjectFactory { +++ +++ // +++ // Constants +++ // +++ private static final String DEFAULT_INTERNAL_CLASSES = "com.sun.org.apache."; +++ +++ // name of default properties file to look for in JDK's jre/lib directory +++ private static final String DEFAULT_PROPERTIES_FILENAME = "xerces.properties"; +++ +++ /** Set to true for debugging */ +++ private static final boolean DEBUG = isDebugEnabled(); +++ +++ /** +++ * Default columns per line. +++ */ +++ private static final int DEFAULT_LINE_LENGTH = 80; +++ +++ /** cache the contents of the xerces.properties file. +++ * Until an attempt has been made to read this file, this will +++ * be null; if the file does not exist or we encounter some other error +++ * during the read, this will be empty. +++ */ +++ private static Properties fXercesProperties = null; +++ +++ /*** +++ * Cache the time stamp of the xerces.properties file so +++ * that we know if it's been modified and can invalidate +++ * the cache when necessary. +++ */ +++ private static long fLastModified = -1; +++ +++ // +++ // static methods +++ // +++ +++ /** +++ * Finds the implementation Class object in the specified order. The +++ * specified order is the following: +++ * <ol> +++ * <li>query the system property using <code>System.getProperty</code> +++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file +++ * <li>use fallback classname +++ * </ol> +++ * +++ * @return Class object of factory, never null +++ * +++ * @param factoryId Name of the factory to find, same as +++ * a property name +++ * @param fallbackClassName Implementation class name, if nothing else +++ * is found. Use null to mean no fallback. +++ * +++ * @exception ObjectFactory.ConfigurationError +++ */ +++ public static Object createObject(String factoryId, String fallbackClassName) +++ throws ConfigurationError { +++ return createObject(factoryId, null, fallbackClassName); +++ } // createObject(String,String):Object +++ +++ /** +++ * Finds the implementation Class object in the specified order. The +++ * specified order is the following: +++ * <ol> +++ * <li>query the system property using <code>System.getProperty</code> +++ * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file +++ * <li>read <code>META-INF/services/<i>factoryId</i></code> file +++ * <li>use fallback classname +++ * </ol> +++ * +++ * @return Class object of factory, never null +++ * +++ * @param factoryId Name of the factory to find, same as +++ * a property name +++ * @param propertiesFilename The filename in the $java.home/lib directory +++ * of the properties file. If none specified, +++ * ${java.home}/lib/xerces.properties will be used. +++ * @param fallbackClassName Implementation class name, if nothing else +++ * is found. Use null to mean no fallback. +++ * +++ * @exception ObjectFactory.ConfigurationError +++ */ +++ public static Object createObject(String factoryId, +++ String propertiesFilename, +++ String fallbackClassName) +++ throws ConfigurationError +++ { +++ if (DEBUG) debugPrintln("debug is on"); +++ +++ ClassLoader cl = findClassLoader(); +++ +++ // Use the system property first +++ try { +++ String systemProp = SecuritySupport.getSystemProperty(factoryId); +++ if (systemProp != null && systemProp.length() > 0) { +++ if (DEBUG) debugPrintln("found system property, value=" + systemProp); +++ return newInstance(systemProp, cl, true); +++ } +++ } catch (SecurityException se) { +++ // Ignore and continue w/ next location +++ } +++ +++ // JAXP specific change +++ // always use fallback class to avoid the expense of constantly +++ // "stat"ing a non-existent "xerces.properties" and jar SPI entry +++ // see CR 6400863: Expensive creating of SAX parser in Mustang +++ if (fallbackClassName == null) { +++ throw new ConfigurationError( +++ "Provider for " + factoryId + " cannot be found", null); +++ } +++ +++ if (DEBUG) debugPrintln("using fallback, value=" + fallbackClassName); +++ return newInstance(fallbackClassName, cl, true); +++ +++ } // createObject(String,String,String):Object +++ +++ // +++ // Private static methods +++ // +++ +++ /** Returns true if debug has been enabled. */ +++ private static boolean isDebugEnabled() { +++ try { +++ String val = SecuritySupport.getSystemProperty("xerces.debug"); +++ // Allow simply setting the prop to turn on debug +++ return (val != null && (!"false".equals(val))); +++ } +++ catch (SecurityException se) {} +++ return false; +++ } // isDebugEnabled() +++ +++ /** Prints a message to standard error if debugging is enabled. */ +++ private static void debugPrintln(String msg) { +++ if (DEBUG) { +++ System.err.println("XERCES: " + msg); +++ } +++ } // debugPrintln(String) +++ +++ /** +++ * Figure out which ClassLoader to use. For JDK 1.2 and later use +++ * the context ClassLoader. +++ */ +++ public static ClassLoader findClassLoader() +++ throws ConfigurationError +++ { +++ if (System.getSecurityManager()!=null) { +++ //this will ensure bootclassloader is used +++ return null; +++ } +++ // Figure out which ClassLoader to use for loading the provider +++ // class. If there is a Context ClassLoader then use it. +++ ClassLoader context = SecuritySupport.getContextClassLoader(); +++ ClassLoader system = SecuritySupport.getSystemClassLoader(); +++ +++ ClassLoader chain = system; +++ while (true) { +++ if (context == chain) { +++ // Assert: we are on JDK 1.1 or we have no Context ClassLoader +++ // or any Context ClassLoader in chain of system classloader +++ // (including extension ClassLoader) so extend to widest +++ // ClassLoader (always look in system ClassLoader if Xerces +++ // is in boot/extension/system classpath and in current +++ // ClassLoader otherwise); normal classloaders delegate +++ // back to system ClassLoader first so this widening doesn't +++ // change the fact that context ClassLoader will be consulted +++ ClassLoader current = ObjectFactory.class.getClassLoader(); +++ +++ chain = system; +++ while (true) { +++ if (current == chain) { +++ // Assert: Current ClassLoader in chain of +++ // boot/extension/system ClassLoaders +++ return system; +++ } +++ if (chain == null) { +++ break; +++ } +++ chain = SecuritySupport.getParentClassLoader(chain); +++ } +++ +++ // Assert: Current ClassLoader not in chain of +++ // boot/extension/system ClassLoaders +++ return current; +++ } +++ +++ if (chain == null) { +++ // boot ClassLoader reached +++ break; +++ } +++ +++ // Check for any extension ClassLoaders in chain up to +++ // boot ClassLoader +++ chain = SecuritySupport.getParentClassLoader(chain); +++ }; +++ +++ // Assert: Context ClassLoader not in chain of +++ // boot/extension/system ClassLoaders +++ return context; +++ } // findClassLoader():ClassLoader +++ +++ /** +++ * Create an instance of a class using the same classloader for the ObjectFactory by default +++ * or bootclassloader when Security Manager is in place +++ */ +++ public static Object newInstance(String className, boolean doFallback) +++ throws ConfigurationError +++ { +++ if (System.getSecurityManager()!=null) { +++ return newInstance(className, null, doFallback); +++ } else { +++ return newInstance(className, +++ findClassLoader (), doFallback); +++ } +++ } +++ +++ /** +++ * Create an instance of a class using the specified ClassLoader +++ */ +++ public static Object newInstance(String className, ClassLoader cl, +++ boolean doFallback) +++ throws ConfigurationError +++ { +++ // assert(className != null); +++ try{ +++ Class providerClass = findProviderClass(className, cl, doFallback); +++ Object instance = providerClass.newInstance(); +++ if (DEBUG) debugPrintln("created new instance of " + providerClass + +++ " using ClassLoader: " + cl); +++ return instance; +++ } catch (ClassNotFoundException x) { +++ throw new ConfigurationError( +++ "Provider " + className + " not found", x); +++ } catch (Exception x) { +++ throw new ConfigurationError( +++ "Provider " + className + " could not be instantiated: " + x, +++ x); +++ } +++ } +++ +++ /** +++ * Find a Class using the same classloader for the ObjectFactory by default +++ * or bootclassloader when Security Manager is in place +++ */ +++ public static Class findProviderClass(String className, boolean doFallback) +++ throws ClassNotFoundException, ConfigurationError +++ { +++ if (System.getSecurityManager()!=null) { +++ return Class.forName(className); +++ } else { +++ return findProviderClass (className, +++ findClassLoader (), doFallback); +++ } +++ } +++ /** +++ * Find a Class using the specified ClassLoader +++ */ +++ public static Class findProviderClass(String className, ClassLoader cl, +++ boolean doFallback) +++ throws ClassNotFoundException, ConfigurationError +++ { +++ //throw security exception if the calling thread is not allowed to access the package +++ //restrict the access to package as speicified in java.security policy +++ SecurityManager security = System.getSecurityManager(); +++ if (security != null) { +++ if (className.startsWith(DEFAULT_INTERNAL_CLASSES)) { +++ cl = null; +++ } else { +++ final int lastDot = className.lastIndexOf("."); +++ String packageName = className; +++ if (lastDot != -1) packageName = className.substring(0, lastDot); +++ security.checkPackageAccess(packageName); +++ } +++ } +++ Class providerClass; +++ if (cl == null) { +++ //use the bootstrap ClassLoader. +++ providerClass = Class.forName(className); +++ } else { +++ try { +++ providerClass = cl.loadClass(className); +++ } catch (ClassNotFoundException x) { +++ if (doFallback) { +++ // Fall back to current classloader +++ ClassLoader current = ObjectFactory.class.getClassLoader(); +++ if (current == null) { +++ providerClass = Class.forName(className); +++ } else if (cl != current) { +++ cl = current; +++ providerClass = cl.loadClass(className); +++ } else { +++ throw x; +++ } +++ } else { +++ throw x; +++ } +++ } +++ } +++ +++ return providerClass; +++ } +++ +++ /* +++ * Try to find provider using Jar Service Provider Mechanism +++ * +++ * @return instance of provider class if found or null +++ */ +++ private static Object findJarServiceProvider(String factoryId) +++ throws ConfigurationError +++ { +++ String serviceId = "META-INF/services/" + factoryId; +++ InputStream is = null; +++ +++ // First try the Context ClassLoader +++ ClassLoader cl = findClassLoader(); +++ +++ is = SecuritySupport.getResourceAsStream(cl, serviceId); +++ +++ // If no provider found then try the current ClassLoader +++ if (is == null) { +++ ClassLoader current = ObjectFactory.class.getClassLoader(); +++ if (cl != current) { +++ cl = current; +++ is = SecuritySupport.getResourceAsStream(cl, serviceId); +++ } +++ } +++ +++ if (is == null) { +++ // No provider found +++ return null; +++ } +++ +++ if (DEBUG) debugPrintln("found jar resource=" + serviceId + +++ " using ClassLoader: " + cl); +++ +++ // Read the service provider name in UTF-8 as specified in +++ // the jar spec. Unfortunately this fails in Microsoft +++ // VJ++, which does not implement the UTF-8 +++ // encoding. Theoretically, we should simply let it fail in +++ // that case, since the JVM is obviously broken if it +++ // doesn't support such a basic standard. But since there +++ // are still some users attempting to use VJ++ for +++ // development, we have dropped in a fallback which makes a +++ // second attempt using the platform's default encoding. In +++ // VJ++ this is apparently ASCII, which is a subset of +++ // UTF-8... and since the strings we'll be reading here are +++ // also primarily limited to the 7-bit ASCII range (at +++ // least, in English versions), this should work well +++ // enough to keep us on the air until we're ready to +++ // officially decommit from VJ++. [Edited comment from +++ // jkesselm] +++ BufferedReader rd; +++ try { +++ rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH); +++ } catch (java.io.UnsupportedEncodingException e) { +++ rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH); +++ } +++ +++ String factoryClassName = null; +++ try { +++ // XXX Does not handle all possible input as specified by the +++ // Jar Service Provider specification +++ factoryClassName = rd.readLine(); +++ } catch (IOException x) { +++ // No provider found +++ return null; +++ } +++ finally { +++ try { +++ // try to close the reader. +++ rd.close(); +++ } +++ // Ignore the exception. +++ catch (IOException exc) {} +++ } +++ +++ if (factoryClassName != null && +++ ! "".equals(factoryClassName)) { +++ if (DEBUG) debugPrintln("found in resource, value=" +++ + factoryClassName); +++ +++ // Note: here we do not want to fall back to the current +++ // ClassLoader because we want to avoid the case where the +++ // resource file was found using one ClassLoader and the +++ // provider class was instantiated using a different one. +++ return newInstance(factoryClassName, cl, false); +++ } +++ +++ // No provider found +++ return null; +++ } +++ +++} // class ObjectFactory ++--- src/com/sun/org/apache/xerces/internal/utils/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100 +++++ src/com/sun/org/apache/xerces/internal/utils/SecuritySupport.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -0,0 +1,199 @@ +++/* +++ * reserved comment block +++ * DO NOT REMOVE OR ALTER! +++ */ +++/* +++ * Copyright 2002,2004 The Apache Software Foundation. +++ * +++ * Licensed under the Apache License, Version 2.0 (the "License"); +++ * you may not use this file except in compliance with the License. +++ * You may obtain a copy of the License at +++ * +++ * http://www.apache.org/licenses/LICENSE-2.0 +++ * +++ * Unless required by applicable law or agreed to in writing, software +++ * distributed under the License is distributed on an "AS IS" BASIS, +++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +++ * See the License for the specific language governing permissions and +++ * limitations under the License. +++ */ +++ +++package com.sun.org.apache.xerces.internal.utils; +++ +++import java.io.File; +++import java.io.FileInputStream; +++import java.io.FileNotFoundException; +++import java.io.InputStream; +++ +++import java.security.AccessController; +++import java.security.PrivilegedAction; +++import java.security.PrivilegedActionException; +++import java.security.PrivilegedExceptionAction; +++import java.util.Locale; +++import java.util.MissingResourceException; +++import java.util.PropertyResourceBundle; +++import java.util.ResourceBundle; +++ +++/** +++ * This class is duplicated for each subpackage so keep it in sync. +++ * It is package private and therefore is not exposed as part of any API. +++ * +++ * @xerces.internal +++ */ +++public final class SecuritySupport { +++ +++ private static final SecuritySupport securitySupport = new SecuritySupport(); +++ +++ /** +++ * Return an instance of this class. +++ */ +++ public static SecuritySupport getInstance() { +++ return securitySupport; +++ } +++ +++ static ClassLoader getContextClassLoader() { +++ return (ClassLoader) +++ AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ ClassLoader cl = null; +++ try { +++ cl = Thread.currentThread().getContextClassLoader(); +++ } catch (SecurityException ex) { } +++ return cl; +++ } +++ }); +++ } +++ +++ static ClassLoader getSystemClassLoader() { +++ return (ClassLoader) +++ AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ ClassLoader cl = null; +++ try { +++ cl = ClassLoader.getSystemClassLoader(); +++ } catch (SecurityException ex) {} +++ return cl; +++ } +++ }); +++ } +++ +++ static ClassLoader getParentClassLoader(final ClassLoader cl) { +++ return (ClassLoader) +++ AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ ClassLoader parent = null; +++ try { +++ parent = cl.getParent(); +++ } catch (SecurityException ex) {} +++ +++ // eliminate loops in case of the boot +++ // ClassLoader returning itself as a parent +++ return (parent == cl) ? null : parent; +++ } +++ }); +++ } +++ +++ public static String getSystemProperty(final String propName) { +++ return (String) +++ AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return System.getProperty(propName); +++ } +++ }); +++ } +++ +++ static FileInputStream getFileInputStream(final File file) +++ throws FileNotFoundException +++ { +++ try { +++ return (FileInputStream) +++ AccessController.doPrivileged(new PrivilegedExceptionAction() { +++ public Object run() throws FileNotFoundException { +++ return new FileInputStream(file); +++ } +++ }); +++ } catch (PrivilegedActionException e) { +++ throw (FileNotFoundException)e.getException(); +++ } +++ } +++ /** +++ * Return resource using the same classloader for the ObjectFactory by default +++ * or bootclassloader when Security Manager is in place +++ */ +++ public static InputStream getResourceAsStream(final String name) { +++ if (System.getSecurityManager()!=null) { +++ return getResourceAsStream(null, name); +++ } else { +++ return getResourceAsStream(ObjectFactory.findClassLoader(), name); +++ } +++ } +++ +++ public static InputStream getResourceAsStream(final ClassLoader cl, +++ final String name) +++ { +++ return (InputStream) +++ AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ InputStream ris; +++ if (cl == null) { +++ ris = Object.class.getResourceAsStream("/"+name); +++ } else { +++ ris = cl.getResourceAsStream(name); +++ } +++ return ris; +++ } +++ }); +++ } +++ +++ /** +++ * Gets a resource bundle using the specified base name, the default locale, and the caller's class loader. +++ * @param bundle the base name of the resource bundle, a fully qualified class name +++ * @return a resource bundle for the given base name and the default locale +++ */ +++ public static ResourceBundle getResourceBundle(String bundle) { +++ return getResourceBundle(bundle, Locale.getDefault()); +++ } +++ +++ /** +++ * Gets a resource bundle using the specified base name and locale, and the caller's class loader. +++ * @param bundle the base name of the resource bundle, a fully qualified class name +++ * @param locale the locale for which a resource bundle is desired +++ * @return a resource bundle for the given base name and locale +++ */ +++ public static ResourceBundle getResourceBundle(final String bundle, final Locale locale) { +++ return AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() { +++ public ResourceBundle run() { +++ try { +++ return PropertyResourceBundle.getBundle(bundle, locale); +++ } catch (MissingResourceException e) { +++ try { +++ return PropertyResourceBundle.getBundle(bundle, new Locale("en", "US")); +++ } catch (MissingResourceException e2) { +++ throw new MissingResourceException( +++ "Could not load any resource bundle by " + bundle, bundle, ""); +++ } +++ } +++ } +++ }); +++ } +++ +++ static boolean getFileExists(final File f) { +++ return ((Boolean) +++ AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return f.exists() ? Boolean.TRUE : Boolean.FALSE; +++ } +++ })).booleanValue(); +++ } +++ +++ static long getLastModified(final File f) { +++ return ((Long) +++ AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return new Long(f.lastModified()); +++ } +++ })).longValue(); +++ } +++ +++ private SecuritySupport () {} +++} ++--- src/com/sun/org/apache/xerces/internal/xinclude/XIncludeMessageFormatter.java 2013-04-16 14:28:09.628154939 +0100 +++++ src/com/sun/org/apache/xerces/internal/xinclude/XIncludeMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -20,11 +20,11 @@ ++ ++ package com.sun.org.apache.xerces.internal.xinclude; ++ +++import com.sun.org.apache.xerces.internal.util.MessageFormatter; +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import java.util.Locale; ++ import java.util.MissingResourceException; ++ import java.util.ResourceBundle; ++-import java.util.PropertyResourceBundle; ++-import com.sun.org.apache.xerces.internal.util.MessageFormatter; ++ ++ // TODO: fix error messages in XIncludeMessages.properties ++ /** ++@@ -32,6 +32,7 @@ ++ * ++ * @author Peter McCracken, IBM ++ * +++ * @version $Id: XIncludeMessageFormatter.java,v 1.7 2010-11-01 04:40:18 joehw Exp $ ++ */ ++ public class XIncludeMessageFormatter implements MessageFormatter { ++ ++@@ -61,12 +62,12 @@ ++ ++ if (fResourceBundle == null || locale != fLocale) { ++ if (locale != null) { ++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages", locale); +++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages", locale); ++ // memorize the most-recent locale ++ fLocale = locale; ++ } ++ if (fResourceBundle == null) ++- fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages"); +++ fResourceBundle = SecuritySupport.getResourceBundle("com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages"); ++ } ++ ++ String msg = fResourceBundle.getString(key); ++--- src/com/sun/org/apache/xerces/internal/xpointer/XPointerMessageFormatter.java 2013-04-16 14:28:09.636155069 +0100 +++++ src/com/sun/org/apache/xerces/internal/xpointer/XPointerMessageFormatter.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -24,6 +24,7 @@ ++ import java.util.ResourceBundle; ++ import java.util.PropertyResourceBundle; ++ import com.sun.org.apache.xerces.internal.util.MessageFormatter; +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ ++ /** ++ * XPointerMessageFormatter provides error messages for the XPointer Framework ++@@ -31,6 +32,7 @@ ++ * ++ * @xerces.internal ++ * +++ * @version $Id: XPointerMessageFormatter.java,v 1.5 2010-11-01 04:40:26 joehw Exp $ ++ */ ++ class XPointerMessageFormatter implements MessageFormatter { ++ ++@@ -64,14 +66,14 @@ ++ ++ if (fResourceBundle == null || locale != fLocale) { ++ if (locale != null) { ++- fResourceBundle = PropertyResourceBundle.getBundle( +++ fResourceBundle = SecuritySupport.getResourceBundle( ++ "com.sun.org.apache.xerces.internal.impl.msg.XPointerMessages", locale); ++ // memorize the most-recent locale ++ fLocale = locale; ++ } ++ if (fResourceBundle == null) ++- fResourceBundle = PropertyResourceBundle ++- .getBundle("com.sun.org.apache.xerces.internal.impl.msg.XPointerMessages"); +++ fResourceBundle = SecuritySupport.getResourceBundle( +++ "com.sun.org.apache.xerces.internal.impl.msg.XPointerMessages"); ++ } ++ ++ String msg = fResourceBundle.getString(key); ++--- src/com/sun/org/apache/xml/internal/dtm/DTMManager.java 2013-04-16 14:28:09.644155197 +0100 +++++ src/com/sun/org/apache/xml/internal/dtm/DTMManager.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -26,6 +26,7 @@ ++ import com.sun.org.apache.xml.internal.res.XMLMessages; ++ import com.sun.org.apache.xml.internal.utils.PrefixResolver; ++ import com.sun.org.apache.xml.internal.utils.XMLStringFactory; +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ ++ /** ++ * A DTMManager instance can be used to create DTM and ++@@ -358,7 +359,7 @@ ++ { ++ try ++ { ++- debug = System.getProperty("dtm.debug") != null; +++ debug = SecuritySupport.getSystemProperty("dtm.debug") != null; ++ } ++ catch (SecurityException ex){} ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ca.java 2013-04-16 14:28:09.664155519 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ca.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("ca", "ES")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_cs.java 2013-04-16 14:28:09.664155519 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_cs.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("cs", "CZ")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_de.java 2013-04-16 14:28:09.664155519 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_de.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_es.java 2013-04-16 14:28:09.664155519 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_es.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("es", "ES")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_fr.java 2013-04-16 14:28:09.664155519 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_fr.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_it.java 2013-04-16 14:28:09.664155519 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_it.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("it", "IT")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ja.java 2013-04-16 14:28:09.664155519 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ja.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources.java 2013-04-16 14:28:09.660155456 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources.java 2013-04-16 14:29:26.557394511 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -461,67 +458,4 @@ ++ return msgCopy; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ko.java 2013-04-16 14:28:09.664155519 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_ko.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("ko", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_sk.java 2013-04-16 14:28:09.664155519 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_sk.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_tr.java 2013-04-16 14:28:09.668155584 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_tr.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("tr", "TR")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_zh_CN.java 2013-04-16 14:28:09.668155584 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_zh_CN.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("zh", "CN")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "\u65e0\u6cd5\u88c5\u5165\u4efb\u4f55\u8d44\u6e90\u5305\u3002", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLErrorResources_zh_TW.java 2013-04-16 14:28:09.668155584 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLErrorResources_zh_TW.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -24,9 +24,6 @@ ++ ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -442,67 +439,4 @@ ++ }; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XMLErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XMLErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XMLErrorResources) ResourceBundle.getBundle(className, ++- new Locale("zh", "TW")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xml/internal/res/XMLMessages.java 2013-04-16 14:28:09.668155584 +0100 +++++ src/com/sun/org/apache/xml/internal/res/XMLMessages.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -22,10 +22,9 @@ ++ */ ++ package com.sun.org.apache.xml.internal.res; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import java.util.ListResourceBundle; ++ import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * A utility class for issuing XML error messages. ++@@ -82,8 +81,9 @@ ++ */ ++ public static final String createXMLMessage(String msgKey, Object args[]) ++ { ++- if (XMLBundle == null) ++- XMLBundle = loadResourceBundle(XML_ERROR_RESOURCES); +++ if (XMLBundle == null) { +++ XMLBundle = SecuritySupport.getResourceBundle(XML_ERROR_RESOURCES); +++ } ++ ++ if (XMLBundle != null) ++ { ++@@ -156,61 +156,4 @@ ++ return fmsg; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className The class name of the resource bundle. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static ListResourceBundle loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- Locale locale = Locale.getDefault(); ++- ++- try ++- { ++- return (ListResourceBundle)ResourceBundle.getBundle(className, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (ListResourceBundle)ResourceBundle.getBundle( ++- className, new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles." + className, className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which can be appended to a resource name ++- */ ++- protected static String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++ } ++--- src/com/sun/org/apache/xml/internal/resolver/Catalog.java 2013-04-16 14:28:09.668155584 +0100 +++++ src/com/sun/org/apache/xml/internal/resolver/Catalog.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -23,6 +23,8 @@ ++ ++ package com.sun.org.apache.xml.internal.resolver; ++ +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; +++ ++ import java.io.IOException; ++ import java.io.FileNotFoundException; ++ import java.io.InputStream; ++@@ -819,7 +821,7 @@ ++ // tack on a basename because URLs point to files not dirs ++ catalogCwd = FileURL.makeURL("basename"); ++ } catch (MalformedURLException e) { ++- String userdir = System.getProperty("user.dir"); +++ String userdir = SecuritySupport.getSystemProperty("user.dir"); ++ userdir.replace('\\', '/'); ++ catalogManager.debug.message(1, "Malformed URL on cwd", userdir); ++ catalogCwd = null; ++@@ -1715,7 +1717,7 @@ ++ protected String resolveLocalSystem(String systemId) ++ throws MalformedURLException, IOException { ++ ++- String osname = System.getProperty("os.name"); +++ String osname = SecuritySupport.getSystemProperty("os.name"); ++ boolean windows = (osname.indexOf("Windows") >= 0); ++ Enumeration en = catalogEntries.elements(); ++ while (en.hasMoreElements()) { ++--- src/com/sun/org/apache/xml/internal/resolver/CatalogManager.java 2013-04-16 14:28:09.668155584 +0100 +++++ src/com/sun/org/apache/xml/internal/resolver/CatalogManager.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -23,6 +23,7 @@ ++ ++ package com.sun.org.apache.xml.internal.resolver; ++ +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import java.io.InputStream; ++ ++ import java.net.URL; ++@@ -141,8 +142,8 @@ ++ ++ /** Flag to ignore missing property files and/or properties */ ++ private boolean ignoreMissingProperties ++- = (System.getProperty(pIgnoreMissing) != null ++- || System.getProperty(pFiles) != null); +++ = (SecuritySupport.getSystemProperty(pIgnoreMissing) != null +++ || SecuritySupport.getSystemProperty(pFiles) != null); ++ ++ /** Holds the resources after they are loaded from the file. */ ++ private ResourceBundle resources; ++@@ -331,7 +332,7 @@ ++ private int queryVerbosity () { ++ String defaultVerbStr = Integer.toString(defaultVerbosity); ++ ++- String verbStr = System.getProperty(pVerbosity); +++ String verbStr = SecuritySupport.getSystemProperty(pVerbosity); ++ ++ if (verbStr == null) { ++ if (resources==null) readProperties(); ++@@ -466,7 +467,7 @@ ++ * @return A semicolon delimited list of catlog file URIs ++ */ ++ private String queryCatalogFiles () { ++- String catalogList = System.getProperty(pFiles); +++ String catalogList = SecuritySupport.getSystemProperty(pFiles); ++ fromPropertiesFile = false; ++ ++ if (catalogList == null) { ++@@ -551,7 +552,7 @@ ++ * defaultPreferSetting. ++ */ ++ private boolean queryPreferPublic () { ++- String prefer = System.getProperty(pPrefer); +++ String prefer = SecuritySupport.getSystemProperty(pPrefer); ++ ++ if (prefer == null) { ++ if (resources==null) readProperties(); ++@@ -610,7 +611,7 @@ ++ * defaultUseStaticCatalog. ++ */ ++ private boolean queryUseStaticCatalog () { ++- String staticCatalog = System.getProperty(pStatic); +++ String staticCatalog = SecuritySupport.getSystemProperty(pStatic); ++ ++ if (staticCatalog == null) { ++ if (resources==null) readProperties(); ++@@ -741,7 +742,7 @@ ++ * defaultOasisXMLCatalogPI. ++ */ ++ public boolean queryAllowOasisXMLCatalogPI () { ++- String allow = System.getProperty(pAllowPI); +++ String allow = SecuritySupport.getSystemProperty(pAllowPI); ++ ++ if (allow == null) { ++ if (resources==null) readProperties(); ++@@ -794,7 +795,7 @@ ++ * ++ */ ++ public String queryCatalogClassName () { ++- String className = System.getProperty(pClassname); +++ String className = SecuritySupport.getSystemProperty(pClassname); ++ ++ if (className == null) { ++ if (resources==null) readProperties(); ++--- src/com/sun/org/apache/xml/internal/resolver/Resolver.java 2013-04-16 14:28:09.668155584 +0100 +++++ src/com/sun/org/apache/xml/internal/resolver/Resolver.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -31,6 +31,7 @@ ++ import java.net.URL; ++ import java.net.URLConnection; ++ import java.net.MalformedURLException; +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import com.sun.org.apache.xml.internal.resolver.readers.SAXCatalogReader; ++ import com.sun.org.apache.xml.internal.resolver.readers.OASISXMLCatalogReader; ++ import com.sun.org.apache.xml.internal.resolver.readers.TR9401CatalogReader; ++@@ -521,7 +522,7 @@ ++ */ ++ private Vector resolveAllLocalSystem(String systemId) { ++ Vector map = new Vector(); ++- String osname = System.getProperty("os.name"); +++ String osname = SecuritySupport.getSystemProperty("os.name"); ++ boolean windows = (osname.indexOf("Windows") >= 0); ++ Enumeration en = catalogEntries.elements(); ++ while (en.hasMoreElements()) { ++@@ -549,7 +550,7 @@ ++ */ ++ private Vector resolveLocalSystemReverse(String systemId) { ++ Vector map = new Vector(); ++- String osname = System.getProperty("os.name"); +++ String osname = SecuritySupport.getSystemProperty("os.name"); ++ boolean windows = (osname.indexOf("Windows") >= 0); ++ Enumeration en = catalogEntries.elements(); ++ while (en.hasMoreElements()) { ++--- src/com/sun/org/apache/xml/internal/serialize/SerializerFactory.java 2013-04-16 14:28:09.684155841 +0100 +++++ src/com/sun/org/apache/xml/internal/serialize/SerializerFactory.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -21,6 +21,7 @@ ++ ++ package com.sun.org.apache.xml.internal.serialize; ++ +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ ++ import java.io.OutputStream; ++ import java.io.Writer; ++@@ -63,7 +64,7 @@ ++ factory = new SerializerFactoryImpl( Method.TEXT ); ++ registerSerializerFactory( factory ); ++ ++- list = System.getProperty( FactoriesProperty ); +++ list = SecuritySupport.getSystemProperty( FactoriesProperty ); ++ if ( list != null ) { ++ token = new StringTokenizer( list, " ;,:" ); ++ while ( token.hasMoreTokens() ) { ++--- src/com/sun/org/apache/xml/internal/serializer/Encodings.java 2013-04-16 14:28:09.684155841 +0100 +++++ src/com/sun/org/apache/xml/internal/serializer/Encodings.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -34,6 +34,7 @@ ++ import java.util.Properties; ++ import java.util.StringTokenizer; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ ++ /** ++ * Provides information about encodings. Depends on the Java runtime ++@@ -218,7 +219,7 @@ ++ // Get the default system character encoding. This may be ++ // incorrect if they passed in a writer, but right now there ++ // seems to be no way to get the encoding from a writer. ++- encoding = System.getProperty("file.encoding", "UTF8"); +++ encoding = SecuritySupport.getSystemProperty("file.encoding", "UTF8"); ++ ++ if (null != encoding) ++ { ++@@ -312,7 +313,7 @@ ++ ++ try ++ { ++- urlString = System.getProperty(ENCODINGS_PROP, ""); +++ urlString = SecuritySupport.getSystemProperty(ENCODINGS_PROP, ""); ++ } ++ catch (SecurityException e) ++ { ++@@ -324,9 +325,7 @@ ++ } ++ ++ if (is == null) { ++- SecuritySupport ss = SecuritySupport.getInstance(); ++- is = ss.getResourceAsStream(ObjectFactory.findClassLoader(), ++- ENCODINGS_FILE); +++ is = SecuritySupport.getResourceAsStream(ENCODINGS_FILE); ++ } ++ ++ Properties props = new Properties(); ++--- src/com/sun/org/apache/xml/internal/serializer/ObjectFactory.java 2013-04-16 14:28:09.688155906 +0100 +++++ src/com/sun/org/apache/xml/internal/serializer/ObjectFactory.java 1970-01-01 01:00:00.000000000 +0100 ++@@ -1,662 +0,0 @@ ++-/* ++- * reserved comment block ++- * DO NOT REMOVE OR ALTER! ++- */ ++-/* ++- * Copyright 2001-2004 The Apache Software Foundation. ++- * ++- * Licensed under the Apache License, Version 2.0 (the "License"); ++- * you may not use this file except in compliance with the License. ++- * You may obtain a copy of the License at ++- * ++- * http://www.apache.org/licenses/LICENSE-2.0 ++- * ++- * Unless required by applicable law or agreed to in writing, software ++- * distributed under the License is distributed on an "AS IS" BASIS, ++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++- * See the License for the specific language governing permissions and ++- * limitations under the License. ++- */ ++-/* ++- * $Id: ObjectFactory.java,v 1.2.4.1 2005/09/15 08:15:20 suresh_emailid Exp $ ++- */ ++- ++-package com.sun.org.apache.xml.internal.serializer; ++- ++-import java.io.BufferedReader; ++-import java.io.File; ++-import java.io.FileInputStream; ++-import java.io.IOException; ++-import java.io.InputStream; ++-import java.io.InputStreamReader; ++-import java.util.Properties; ++- ++-/** ++- * This class is duplicated for each JAXP subpackage so keep it in sync. ++- * It is package private and therefore is not exposed as part of the JAXP ++- * API. ++- * <p> ++- * This code is designed to implement the JAXP 1.1 spec pluggability ++- * feature and is designed to run on JDK version 1.1 and ++- * later, and to compile on JDK 1.2 and onward. ++- * The code also runs both as part of an unbundled jar file and ++- * when bundled as part of the JDK. ++- * <p> ++- * This class was moved from the <code>javax.xml.parsers.ObjectFactory</code> ++- * class and modified to be used as a general utility for creating objects ++- * dynamically. ++- * ++- * @xsl.usage internal ++- */ ++-class ObjectFactory { ++- ++- // ++- // Constants ++- // ++- ++- // name of default properties file to look for in JDK's jre/lib directory ++- private static final String DEFAULT_PROPERTIES_FILENAME = ++- "xalan.properties"; ++- ++- private static final String SERVICES_PATH = "META-INF/services/"; ++- ++- /** Set to true for debugging */ ++- private static final boolean DEBUG = false; ++- ++- /** cache the contents of the xalan.properties file. ++- * Until an attempt has been made to read this file, this will ++- * be null; if the file does not exist or we encounter some other error ++- * during the read, this will be empty. ++- */ ++- private static Properties fXalanProperties = null; ++- ++- /*** ++- * Cache the time stamp of the xalan.properties file so ++- * that we know if it's been modified and can invalidate ++- * the cache when necessary. ++- */ ++- private static long fLastModified = -1; ++- ++- // ++- // Public static methods ++- // ++- ++- /** ++- * Finds the implementation Class object in the specified order. The ++- * specified order is the following: ++- * <ol> ++- * <li>query the system property using <code>System.getProperty</code> ++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file ++- * <li>use fallback classname ++- * </ol> ++- * ++- * @return instance of factory, never null ++- * ++- * @param factoryId Name of the factory to find, same as ++- * a property name ++- * @param fallbackClassName Implementation class name, if nothing else ++- * is found. Use null to mean no fallback. ++- * ++- * @exception ObjectFactory.ConfigurationError ++- */ ++- static Object createObject(String factoryId, String fallbackClassName) ++- throws ConfigurationError { ++- return createObject(factoryId, null, fallbackClassName); ++- } // createObject(String,String):Object ++- ++- /** ++- * Finds the implementation Class object in the specified order. The ++- * specified order is the following: ++- * <ol> ++- * <li>query the system property using <code>System.getProperty</code> ++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file ++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file ++- * <li>use fallback classname ++- * </ol> ++- * ++- * @return instance of factory, never null ++- * ++- * @param factoryId Name of the factory to find, same as ++- * a property name ++- * @param propertiesFilename The filename in the $java.home/lib directory ++- * of the properties file. If none specified, ++- * ${java.home}/lib/xalan.properties will be used. ++- * @param fallbackClassName Implementation class name, if nothing else ++- * is found. Use null to mean no fallback. ++- * ++- * @exception ObjectFactory.ConfigurationError ++- */ ++- static Object createObject(String factoryId, ++- String propertiesFilename, ++- String fallbackClassName) ++- throws ConfigurationError ++- { ++- Class factoryClass = lookUpFactoryClass(factoryId, ++- propertiesFilename, ++- fallbackClassName); ++- ++- if (factoryClass == null) { ++- throw new ConfigurationError( ++- "Provider for " + factoryId + " cannot be found", null); ++- } ++- ++- try{ ++- Object instance = factoryClass.newInstance(); ++- if (DEBUG) debugPrintln("created new instance of factory " + factoryId); ++- return instance; ++- } catch (Exception x) { ++- throw new ConfigurationError( ++- "Provider for factory " + factoryId ++- + " could not be instantiated: " + x, x); ++- } ++- } // createObject(String,String,String):Object ++- ++- /** ++- * Finds the implementation Class object in the specified order. The ++- * specified order is the following: ++- * <ol> ++- * <li>query the system property using <code>System.getProperty</code> ++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file ++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file ++- * <li>use fallback classname ++- * </ol> ++- * ++- * @return Class object of factory, never null ++- * ++- * @param factoryId Name of the factory to find, same as ++- * a property name ++- * @param propertiesFilename The filename in the $java.home/lib directory ++- * of the properties file. If none specified, ++- * ${java.home}/lib/xalan.properties will be used. ++- * @param fallbackClassName Implementation class name, if nothing else ++- * is found. Use null to mean no fallback. ++- * ++- * @exception ObjectFactory.ConfigurationError ++- */ ++- static Class lookUpFactoryClass(String factoryId) ++- throws ConfigurationError ++- { ++- return lookUpFactoryClass(factoryId, null, null); ++- } // lookUpFactoryClass(String):Class ++- ++- /** ++- * Finds the implementation Class object in the specified order. The ++- * specified order is the following: ++- * <ol> ++- * <li>query the system property using <code>System.getProperty</code> ++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file ++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file ++- * <li>use fallback classname ++- * </ol> ++- * ++- * @return Class object that provides factory service, never null ++- * ++- * @param factoryId Name of the factory to find, same as ++- * a property name ++- * @param propertiesFilename The filename in the $java.home/lib directory ++- * of the properties file. If none specified, ++- * ${java.home}/lib/xalan.properties will be used. ++- * @param fallbackClassName Implementation class name, if nothing else ++- * is found. Use null to mean no fallback. ++- * ++- * @exception ObjectFactory.ConfigurationError ++- */ ++- static Class lookUpFactoryClass(String factoryId, ++- String propertiesFilename, ++- String fallbackClassName) ++- throws ConfigurationError ++- { ++- String factoryClassName = lookUpFactoryClassName(factoryId, ++- propertiesFilename, ++- fallbackClassName); ++- ClassLoader cl = findClassLoader(); ++- ++- if (factoryClassName == null) { ++- factoryClassName = fallbackClassName; ++- } ++- ++- // assert(className != null); ++- try{ ++- Class providerClass = findProviderClass(factoryClassName, ++- cl, ++- true); ++- if (DEBUG) debugPrintln("created new instance of " + providerClass + ++- " using ClassLoader: " + cl); ++- return providerClass; ++- } catch (ClassNotFoundException x) { ++- throw new ConfigurationError( ++- "Provider " + factoryClassName + " not found", x); ++- } catch (Exception x) { ++- throw new ConfigurationError( ++- "Provider "+factoryClassName+" could not be instantiated: "+x, ++- x); ++- } ++- } // lookUpFactoryClass(String,String,String):Class ++- ++- /** ++- * Finds the name of the required implementation class in the specified ++- * order. The specified order is the following: ++- * <ol> ++- * <li>query the system property using <code>System.getProperty</code> ++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file ++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file ++- * <li>use fallback classname ++- * </ol> ++- * ++- * @return name of class that provides factory service, never null ++- * ++- * @param factoryId Name of the factory to find, same as ++- * a property name ++- * @param propertiesFilename The filename in the $java.home/lib directory ++- * of the properties file. If none specified, ++- * ${java.home}/lib/xalan.properties will be used. ++- * @param fallbackClassName Implementation class name, if nothing else ++- * is found. Use null to mean no fallback. ++- * ++- * @exception ObjectFactory.ConfigurationError ++- */ ++- static String lookUpFactoryClassName(String factoryId, ++- String propertiesFilename, ++- String fallbackClassName) ++- { ++- SecuritySupport ss = SecuritySupport.getInstance(); ++- ++- // Use the system property first ++- try { ++- String systemProp = ss.getSystemProperty(factoryId); ++- if (systemProp != null) { ++- if (DEBUG) debugPrintln("found system property, value=" + systemProp); ++- return systemProp; ++- } ++- } catch (SecurityException se) { ++- // Ignore and continue w/ next location ++- } ++- ++- // Try to read from propertiesFilename, or ++- // $java.home/lib/xalan.properties ++- String factoryClassName = null; ++- // no properties file name specified; use ++- // $JAVA_HOME/lib/xalan.properties: ++- if (propertiesFilename == null) { ++- File propertiesFile = null; ++- boolean propertiesFileExists = false; ++- try { ++- String javah = ss.getSystemProperty("java.home"); ++- propertiesFilename = javah + File.separator + ++- "lib" + File.separator + DEFAULT_PROPERTIES_FILENAME; ++- propertiesFile = new File(propertiesFilename); ++- propertiesFileExists = ss.getFileExists(propertiesFile); ++- } catch (SecurityException e) { ++- // try again... ++- fLastModified = -1; ++- fXalanProperties = null; ++- } ++- ++- synchronized (ObjectFactory.class) { ++- boolean loadProperties = false; ++- FileInputStream fis = null; ++- try { ++- // file existed last time ++- if(fLastModified >= 0) { ++- if(propertiesFileExists && ++- (fLastModified < (fLastModified = ss.getLastModified(propertiesFile)))) { ++- loadProperties = true; ++- } else { ++- // file has stopped existing... ++- if(!propertiesFileExists) { ++- fLastModified = -1; ++- fXalanProperties = null; ++- } // else, file wasn't modified! ++- } ++- } else { ++- // file has started to exist: ++- if(propertiesFileExists) { ++- loadProperties = true; ++- fLastModified = ss.getLastModified(propertiesFile); ++- } // else, nothing's changed ++- } ++- if(loadProperties) { ++- // must never have attempted to read xalan.properties ++- // before (or it's outdeated) ++- fXalanProperties = new Properties(); ++- fis = ss.getFileInputStream(propertiesFile); ++- fXalanProperties.load(fis); ++- } ++- } catch (Exception x) { ++- fXalanProperties = null; ++- fLastModified = -1; ++- // assert(x instanceof FileNotFoundException ++- // || x instanceof SecurityException) ++- // In both cases, ignore and continue w/ next location ++- } ++- finally { ++- // try to close the input stream if one was opened. ++- if (fis != null) { ++- try { ++- fis.close(); ++- } ++- // Ignore the exception. ++- catch (IOException exc) {} ++- } ++- } ++- } ++- if(fXalanProperties != null) { ++- factoryClassName = fXalanProperties.getProperty(factoryId); ++- } ++- } else { ++- FileInputStream fis = null; ++- try { ++- fis = ss.getFileInputStream(new File(propertiesFilename)); ++- Properties props = new Properties(); ++- props.load(fis); ++- factoryClassName = props.getProperty(factoryId); ++- } catch (Exception x) { ++- // assert(x instanceof FileNotFoundException ++- // || x instanceof SecurityException) ++- // In both cases, ignore and continue w/ next location ++- } ++- finally { ++- // try to close the input stream if one was opened. ++- if (fis != null) { ++- try { ++- fis.close(); ++- } ++- // Ignore the exception. ++- catch (IOException exc) {} ++- } ++- } ++- } ++- if (factoryClassName != null) { ++- if (DEBUG) debugPrintln("found in " + propertiesFilename + ", value=" ++- + factoryClassName); ++- return factoryClassName; ++- } ++- ++- // Try Jar Service Provider Mechanism ++- return findJarServiceProviderName(factoryId); ++- } // lookUpFactoryClass(String,String):String ++- ++- // ++- // Private static methods ++- // ++- ++- /** Prints a message to standard error if debugging is enabled. */ ++- private static void debugPrintln(String msg) { ++- if (DEBUG) { ++- System.err.println("JAXP: " + msg); ++- } ++- } // debugPrintln(String) ++- ++- /** ++- * Figure out which ClassLoader to use. For JDK 1.2 and later use ++- * the context ClassLoader. ++- */ ++- static ClassLoader findClassLoader() ++- throws ConfigurationError ++- { ++- SecuritySupport ss = SecuritySupport.getInstance(); ++- ++- // Figure out which ClassLoader to use for loading the provider ++- // class. If there is a Context ClassLoader then use it. ++- ClassLoader context = ss.getContextClassLoader(); ++- ClassLoader system = ss.getSystemClassLoader(); ++- ++- ClassLoader chain = system; ++- while (true) { ++- if (context == chain) { ++- // Assert: we are on JDK 1.1 or we have no Context ClassLoader ++- // or any Context ClassLoader in chain of system classloader ++- // (including extension ClassLoader) so extend to widest ++- // ClassLoader (always look in system ClassLoader if Xalan ++- // is in boot/extension/system classpath and in current ++- // ClassLoader otherwise); normal classloaders delegate ++- // back to system ClassLoader first so this widening doesn't ++- // change the fact that context ClassLoader will be consulted ++- ClassLoader current = ObjectFactory.class.getClassLoader(); ++- ++- chain = system; ++- while (true) { ++- if (current == chain) { ++- // Assert: Current ClassLoader in chain of ++- // boot/extension/system ClassLoaders ++- return system; ++- } ++- if (chain == null) { ++- break; ++- } ++- chain = ss.getParentClassLoader(chain); ++- } ++- ++- // Assert: Current ClassLoader not in chain of ++- // boot/extension/system ClassLoaders ++- return current; ++- } ++- ++- if (chain == null) { ++- // boot ClassLoader reached ++- break; ++- } ++- ++- // Check for any extension ClassLoaders in chain up to ++- // boot ClassLoader ++- chain = ss.getParentClassLoader(chain); ++- }; ++- ++- // Assert: Context ClassLoader not in chain of ++- // boot/extension/system ClassLoaders ++- return context; ++- } // findClassLoader():ClassLoader ++- ++- /** ++- * Create an instance of a class using the specified ClassLoader ++- */ ++- static Object newInstance(String className, ClassLoader cl, ++- boolean doFallback) ++- throws ConfigurationError ++- { ++- // assert(className != null); ++- try{ ++- Class providerClass = findProviderClass(className, cl, doFallback); ++- Object instance = providerClass.newInstance(); ++- if (DEBUG) debugPrintln("created new instance of " + providerClass + ++- " using ClassLoader: " + cl); ++- return instance; ++- } catch (ClassNotFoundException x) { ++- throw new ConfigurationError( ++- "Provider " + className + " not found", x); ++- } catch (Exception x) { ++- throw new ConfigurationError( ++- "Provider " + className + " could not be instantiated: " + x, ++- x); ++- } ++- } ++- ++- /** ++- * Find a Class using the specified ClassLoader ++- */ ++- static Class findProviderClass(String className, ClassLoader cl, ++- boolean doFallback) ++- throws ClassNotFoundException, ConfigurationError ++- { ++- //throw security exception if the calling thread is not allowed to access the ++- //class. Restrict the access to the package classes as specified in java.security policy. ++- SecurityManager security = System.getSecurityManager(); ++- try{ ++- if (security != null){ ++- final int lastDot = className.lastIndexOf("."); ++- String packageName = className; ++- if (lastDot != -1) packageName = className.substring(0, lastDot); ++- security.checkPackageAccess(packageName); ++- } ++- }catch(SecurityException e){ ++- throw e; ++- } ++- ++- Class providerClass; ++- if (cl == null) { ++- // XXX Use the bootstrap ClassLoader. There is no way to ++- // load a class using the bootstrap ClassLoader that works ++- // in both JDK 1.1 and Java 2. However, this should still ++- // work b/c the following should be true: ++- // ++- // (cl == null) iff current ClassLoader == null ++- // ++- // Thus Class.forName(String) will use the current ++- // ClassLoader which will be the bootstrap ClassLoader. ++- providerClass = Class.forName(className); ++- } else { ++- try { ++- providerClass = cl.loadClass(className); ++- } catch (ClassNotFoundException x) { ++- if (doFallback) { ++- // Fall back to current classloader ++- ClassLoader current = ObjectFactory.class.getClassLoader(); ++- if (current == null) { ++- providerClass = Class.forName(className); ++- } else if (cl != current) { ++- cl = current; ++- providerClass = cl.loadClass(className); ++- } else { ++- throw x; ++- } ++- } else { ++- throw x; ++- } ++- } ++- } ++- ++- return providerClass; ++- } ++- ++- /** ++- * Find the name of service provider using Jar Service Provider Mechanism ++- * ++- * @return instance of provider class if found or null ++- */ ++- private static String findJarServiceProviderName(String factoryId) ++- { ++- SecuritySupport ss = SecuritySupport.getInstance(); ++- String serviceId = SERVICES_PATH + factoryId; ++- InputStream is = null; ++- ++- // First try the Context ClassLoader ++- ClassLoader cl = findClassLoader(); ++- ++- is = ss.getResourceAsStream(cl, serviceId); ++- ++- // If no provider found then try the current ClassLoader ++- if (is == null) { ++- ClassLoader current = ObjectFactory.class.getClassLoader(); ++- if (cl != current) { ++- cl = current; ++- is = ss.getResourceAsStream(cl, serviceId); ++- } ++- } ++- ++- if (is == null) { ++- // No provider found ++- return null; ++- } ++- ++- if (DEBUG) debugPrintln("found jar resource=" + serviceId + ++- " using ClassLoader: " + cl); ++- ++- // Read the service provider name in UTF-8 as specified in ++- // the jar spec. Unfortunately this fails in Microsoft ++- // VJ++, which does not implement the UTF-8 ++- // encoding. Theoretically, we should simply let it fail in ++- // that case, since the JVM is obviously broken if it ++- // doesn't support such a basic standard. But since there ++- // are still some users attempting to use VJ++ for ++- // development, we have dropped in a fallback which makes a ++- // second attempt using the platform's default encoding. In ++- // VJ++ this is apparently ASCII, which is a subset of ++- // UTF-8... and since the strings we'll be reading here are ++- // also primarily limited to the 7-bit ASCII range (at ++- // least, in English versions), this should work well ++- // enough to keep us on the air until we're ready to ++- // officially decommit from VJ++. [Edited comment from ++- // jkesselm] ++- BufferedReader rd; ++- try { ++- rd = new BufferedReader(new InputStreamReader(is, "UTF-8")); ++- } catch (java.io.UnsupportedEncodingException e) { ++- rd = new BufferedReader(new InputStreamReader(is)); ++- } ++- ++- String factoryClassName = null; ++- try { ++- // XXX Does not handle all possible input as specified by the ++- // Jar Service Provider specification ++- factoryClassName = rd.readLine(); ++- } catch (IOException x) { ++- // No provider found ++- return null; ++- } ++- finally { ++- try { ++- // try to close the reader. ++- rd.close(); ++- } ++- // Ignore the exception. ++- catch (IOException exc) {} ++- } ++- ++- if (factoryClassName != null && ++- ! "".equals(factoryClassName)) { ++- if (DEBUG) debugPrintln("found in resource, value=" ++- + factoryClassName); ++- ++- // Note: here we do not want to fall back to the current ++- // ClassLoader because we want to avoid the case where the ++- // resource file was found using one ClassLoader and the ++- // provider class was instantiated using a different one. ++- return factoryClassName; ++- } ++- ++- // No provider found ++- return null; ++- } ++- ++- // ++- // Classes ++- // ++- ++- /** ++- * A configuration error. ++- */ ++- static class ConfigurationError ++- extends Error { ++- static final long serialVersionUID = 8859254254255146542L; ++- // ++- // Data ++- // ++- ++- /** Exception. */ ++- private Exception exception; ++- ++- // ++- // Constructors ++- // ++- ++- /** ++- * Construct a new instance with the specified detail string and ++- * exception. ++- */ ++- ConfigurationError(String msg, Exception x) { ++- super(msg); ++- this.exception = x; ++- } // <init>(String,Exception) ++- ++- // ++- // Public methods ++- // ++- ++- /** Returns the exception associated to this error. */ ++- Exception getException() { ++- return exception; ++- } // getException():Exception ++- ++- } // class ConfigurationError ++- ++-} // class ObjectFactory ++--- src/com/sun/org/apache/xml/internal/serializer/OutputPropertiesFactory.java 2013-04-16 14:28:09.688155906 +0100 +++++ src/com/sun/org/apache/xml/internal/serializer/OutputPropertiesFactory.java 2013-04-16 14:29:26.561394576 +0100 ++@@ -22,6 +22,7 @@ ++ */ ++ package com.sun.org.apache.xml.internal.serializer; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import java.io.BufferedInputStream; ++ import java.io.IOException; ++ import java.io.InputStream; ++@@ -451,7 +452,7 @@ ++ String value = null; ++ try ++ { ++- value = System.getProperty(key); +++ value = SecuritySupport.getSystemProperty(key); ++ } ++ catch (SecurityException se) ++ { ++@@ -464,7 +465,7 @@ ++ String newValue = null; ++ try ++ { ++- newValue = System.getProperty(newKey); +++ newValue = SecuritySupport.getSystemProperty(newKey); ++ } ++ catch (SecurityException se) ++ { ++--- src/com/sun/org/apache/xml/internal/serializer/SecuritySupport12.java 2013-04-16 14:28:09.688155906 +0100 +++++ src/com/sun/org/apache/xml/internal/serializer/SecuritySupport12.java 1970-01-01 01:00:00.000000000 +0100 ++@@ -1,145 +0,0 @@ ++-/* ++- * reserved comment block ++- * DO NOT REMOVE OR ALTER! ++- */ ++-/* ++- * Copyright 2002-2004 The Apache Software Foundation. ++- * ++- * Licensed under the Apache License, Version 2.0 (the "License"); ++- * you may not use this file except in compliance with the License. ++- * You may obtain a copy of the License at ++- * ++- * http://www.apache.org/licenses/LICENSE-2.0 ++- * ++- * Unless required by applicable law or agreed to in writing, software ++- * distributed under the License is distributed on an "AS IS" BASIS, ++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++- * See the License for the specific language governing permissions and ++- * limitations under the License. ++- */ ++-/* ++- * $Id: SecuritySupport12.java,v 1.2.4.1 2005/09/15 08:15:22 suresh_emailid Exp $ ++- */ ++- ++-package com.sun.org.apache.xml.internal.serializer; ++- ++-import java.io.File; ++-import java.io.FileInputStream; ++-import java.io.FileNotFoundException; ++-import java.io.InputStream; ++-import java.security.AccessController; ++-import java.security.PrivilegedAction; ++-import java.security.PrivilegedActionException; ++-import java.security.PrivilegedExceptionAction; ++- ++-/** ++- * This class is duplicated for each Xalan-Java subpackage so keep it in sync. ++- * It is package private and therefore is not exposed as part of the Xalan-Java ++- * API. ++- * ++- * Security related methods that only work on J2SE 1.2 and newer. ++- */ ++-class SecuritySupport12 extends SecuritySupport { ++- ++- ClassLoader getContextClassLoader() { ++- return (ClassLoader) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- ClassLoader cl = null; ++- try { ++- cl = Thread.currentThread().getContextClassLoader(); ++- } catch (SecurityException ex) { } ++- return cl; ++- } ++- }); ++- } ++- ++- ClassLoader getSystemClassLoader() { ++- return (ClassLoader) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- ClassLoader cl = null; ++- try { ++- cl = ClassLoader.getSystemClassLoader(); ++- } catch (SecurityException ex) {} ++- return cl; ++- } ++- }); ++- } ++- ++- ClassLoader getParentClassLoader(final ClassLoader cl) { ++- return (ClassLoader) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- ClassLoader parent = null; ++- try { ++- parent = cl.getParent(); ++- } catch (SecurityException ex) {} ++- ++- // eliminate loops in case of the boot ++- // ClassLoader returning itself as a parent ++- return (parent == cl) ? null : parent; ++- } ++- }); ++- } ++- ++- String getSystemProperty(final String propName) { ++- return (String) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- return System.getProperty(propName); ++- } ++- }); ++- } ++- ++- FileInputStream getFileInputStream(final File file) ++- throws FileNotFoundException ++- { ++- try { ++- return (FileInputStream) ++- AccessController.doPrivileged(new PrivilegedExceptionAction() { ++- public Object run() throws FileNotFoundException { ++- return new FileInputStream(file); ++- } ++- }); ++- } catch (PrivilegedActionException e) { ++- throw (FileNotFoundException)e.getException(); ++- } ++- } ++- ++- InputStream getResourceAsStream(final ClassLoader cl, ++- final String name) ++- { ++- return (InputStream) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- InputStream ris; ++- if (cl == null) { ++- ris = ClassLoader.getSystemResourceAsStream(name); ++- } else { ++- ris = cl.getResourceAsStream(name); ++- } ++- return ris; ++- } ++- }); ++- } ++- ++- boolean getFileExists(final File f) { ++- return ((Boolean) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- return new Boolean(f.exists()); ++- } ++- })).booleanValue(); ++- } ++- ++- long getLastModified(final File f) { ++- return ((Long) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- return new Long(f.lastModified()); ++- } ++- })).longValue(); ++- } ++- ++-} ++--- src/com/sun/org/apache/xml/internal/serializer/SecuritySupport.java 2013-04-16 14:28:09.688155906 +0100 +++++ src/com/sun/org/apache/xml/internal/serializer/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100 ++@@ -1,125 +0,0 @@ ++-/* ++- * reserved comment block ++- * DO NOT REMOVE OR ALTER! ++- */ ++-/* ++- * Copyright 2002-2004 The Apache Software Foundation. ++- * ++- * Licensed under the Apache License, Version 2.0 (the "License"); ++- * you may not use this file except in compliance with the License. ++- * You may obtain a copy of the License at ++- * ++- * http://www.apache.org/licenses/LICENSE-2.0 ++- * ++- * Unless required by applicable law or agreed to in writing, software ++- * distributed under the License is distributed on an "AS IS" BASIS, ++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++- * See the License for the specific language governing permissions and ++- * limitations under the License. ++- */ ++-/* ++- * $Id: SecuritySupport.java,v 1.2.4.1 2005/09/15 08:15:21 suresh_emailid Exp $ ++- */ ++- ++-package com.sun.org.apache.xml.internal.serializer; ++- ++-import java.io.File; ++-import java.io.FileInputStream; ++-import java.io.FileNotFoundException; ++-import java.io.InputStream; ++- ++-/** ++- * This class is duplicated for each Xalan-Java subpackage so keep it in sync. ++- * It is package private and therefore is not exposed as part of the Xalan-Java ++- * API. ++- * ++- * Base class with security related methods that work on JDK 1.1. ++- */ ++-class SecuritySupport { ++- ++- /* ++- * Make this of type Object so that the verifier won't try to ++- * prove its type, thus possibly trying to load the SecuritySupport12 ++- * class. ++- */ ++- private static final Object securitySupport; ++- ++- static { ++- SecuritySupport ss = null; ++- try { ++- Class c = Class.forName("java.security.AccessController"); ++- // if that worked, we're on 1.2. ++- /* ++- // don't reference the class explicitly so it doesn't ++- // get dragged in accidentally. ++- c = Class.forName("javax.mail.SecuritySupport12"); ++- Constructor cons = c.getConstructor(new Class[] { }); ++- ss = (SecuritySupport)cons.newInstance(new Object[] { }); ++- */ ++- /* ++- * Unfortunately, we can't load the class using reflection ++- * because the class is package private. And the class has ++- * to be package private so the APIs aren't exposed to other ++- * code that could use them to circumvent security. Thus, ++- * we accept the risk that the direct reference might fail ++- * on some JDK 1.1 JVMs, even though we would never execute ++- * this code in such a case. Sigh... ++- */ ++- ss = new SecuritySupport12(); ++- } catch (Exception ex) { ++- // ignore it ++- } finally { ++- if (ss == null) ++- ss = new SecuritySupport(); ++- securitySupport = ss; ++- } ++- } ++- ++- /** ++- * Return an appropriate instance of this class, depending on whether ++- * we're on a JDK 1.1 or J2SE 1.2 (or later) system. ++- */ ++- static SecuritySupport getInstance() { ++- return (SecuritySupport)securitySupport; ++- } ++- ++- ClassLoader getContextClassLoader() { ++- return null; ++- } ++- ++- ClassLoader getSystemClassLoader() { ++- return null; ++- } ++- ++- ClassLoader getParentClassLoader(ClassLoader cl) { ++- return null; ++- } ++- ++- String getSystemProperty(String propName) { ++- return System.getProperty(propName); ++- } ++- ++- FileInputStream getFileInputStream(File file) ++- throws FileNotFoundException ++- { ++- return new FileInputStream(file); ++- } ++- ++- InputStream getResourceAsStream(ClassLoader cl, String name) { ++- InputStream ris; ++- if (cl == null) { ++- ris = ClassLoader.getSystemResourceAsStream(name); ++- } else { ++- ris = cl.getResourceAsStream(name); ++- } ++- return ris; ++- } ++- ++- boolean getFileExists(File f) { ++- return f.exists(); ++- } ++- ++- long getLastModified(File f) { ++- return f.lastModified(); ++- } ++-} ++--- src/com/sun/org/apache/xml/internal/serializer/ToStream.java 2013-04-16 14:28:09.700156100 +0100 +++++ src/com/sun/org/apache/xml/internal/serializer/ToStream.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -22,6 +22,7 @@ ++ */ ++ package com.sun.org.apache.xml.internal.serializer; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import java.io.IOException; ++ import java.io.OutputStream; ++ import java.io.UnsupportedEncodingException; ++@@ -140,7 +141,7 @@ ++ * extension attribute xalan:line-separator. ++ */ ++ protected char[] m_lineSep = ++- System.getProperty("line.separator").toCharArray(); +++ SecuritySupport.getSystemProperty("line.separator").toCharArray(); ++ ++ /** ++ * True if the the system line separator is to be used. ++--- src/com/sun/org/apache/xml/internal/serializer/TreeWalker.java 2013-04-16 14:28:09.704156164 +0100 +++++ src/com/sun/org/apache/xml/internal/serializer/TreeWalker.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -22,6 +22,7 @@ ++ */ ++ package com.sun.org.apache.xml.internal.serializer; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import java.io.File; ++ ++ import com.sun.org.apache.xml.internal.serializer.utils.AttList; ++@@ -104,7 +105,7 @@ ++ else { ++ try { ++ // Bug see Bugzilla 26741 ++- m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl"); +++ m_locator.setSystemId(SecuritySupport.getSystemProperty("user.dir") + File.separator + "dummy.xsl"); ++ } ++ catch (SecurityException se) {// user.dir not accessible from applet ++ } ++@@ -115,7 +116,7 @@ ++ m_contentHandler.setDocumentLocator(m_locator); ++ try { ++ // Bug see Bugzilla 26741 ++- m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl"); +++ m_locator.setSystemId(SecuritySupport.getSystemProperty("user.dir") + File.separator + "dummy.xsl"); ++ } ++ catch (SecurityException se){// user.dir not accessible from applet ++ ++--- src/com/sun/org/apache/xml/internal/serializer/utils/Messages.java 2013-04-16 14:28:09.708156229 +0100 +++++ src/com/sun/org/apache/xml/internal/serializer/utils/Messages.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -22,6 +22,7 @@ ++ */ ++ package com.sun.org.apache.xml.internal.serializer.utils; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import java.util.ListResourceBundle; ++ import java.util.Locale; ++ import java.util.MissingResourceException; ++@@ -87,9 +88,6 @@ ++ * can have the Message strings translated in an alternate language ++ * in a errorResourceClass with a language suffix. ++ * ++- * More sophisticated use of this class would be to pass null ++- * when contructing it, but then call loadResourceBundle() ++- * before creating any messages. ++ * ++ * This class is not a public API, it is only public because it is ++ * used in com.sun.org.apache.xml.internal.serializer. ++@@ -126,18 +124,6 @@ ++ m_resourceBundleName = resourceBundle; ++ } ++ ++- /* ++- * Set the Locale object to use. If this method is not called the ++- * default locale is used. This method needs to be called before ++- * loadResourceBundle(). ++- * ++- * @param locale non-null reference to Locale object. ++- * @xsl.usage internal ++- */ ++-// public void setLocale(Locale locale) ++-// { ++-// m_locale = locale; ++-// } ++ ++ /** ++ * Get the Locale object that is being used. ++@@ -151,16 +137,6 @@ ++ } ++ ++ /** ++- * Get the ListResourceBundle being used by this Messages instance which was ++- * previously set by a call to loadResourceBundle(className) ++- * @xsl.usage internal ++- */ ++- private ListResourceBundle getResourceBundle() ++- { ++- return m_resourceBundle; ++- } ++- ++- /** ++ * Creates a message from the specified key and replacement ++ * arguments, localized to the given locale. ++ * ++@@ -174,7 +150,7 @@ ++ public final String createMessage(String msgKey, Object args[]) ++ { ++ if (m_resourceBundle == null) ++- m_resourceBundle = loadResourceBundle(m_resourceBundleName); +++ m_resourceBundle = SecuritySupport.getResourceBundle(m_resourceBundleName); ++ ++ if (m_resourceBundle != null) ++ { ++@@ -293,76 +269,4 @@ ++ return fmsg; ++ } ++ ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className the name of the class that implements ListResourceBundle, ++- * without language suffix. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- * @xsl.usage internal ++- */ ++- private ListResourceBundle loadResourceBundle(String resourceBundle) ++- throws MissingResourceException ++- { ++- m_resourceBundleName = resourceBundle; ++- Locale locale = getLocale(); ++- ++- ListResourceBundle lrb; ++- ++- try ++- { ++- ++- ResourceBundle rb = ++- ResourceBundle.getBundle(m_resourceBundleName, locale); ++- lrb = (ListResourceBundle) rb; ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- lrb = ++- (ListResourceBundle) ResourceBundle.getBundle( ++- m_resourceBundleName, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles." + m_resourceBundleName, ++- m_resourceBundleName, ++- ""); ++- } ++- } ++- m_resourceBundle = lrb; ++- return lrb; ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which can be appended to a resource name ++- * @xsl.usage internal ++- */ ++- private static String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++ } ++--- src/com/sun/org/apache/xml/internal/utils/res/XResourceBundle.java 2013-04-16 14:28:09.728156552 +0100 +++++ src/com/sun/org/apache/xml/internal/utils/res/XResourceBundle.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -22,6 +22,8 @@ ++ */ ++ package com.sun.org.apache.xml.internal.utils.res; ++ +++import java.security.AccessController; +++import java.security.PrivilegedAction; ++ import java.util.ListResourceBundle; ++ import java.util.Locale; ++ import java.util.MissingResourceException; ++@@ -29,114 +31,45 @@ ++ ++ /** ++ * The default (english) resource bundle. +++ * ++ * @xsl.usage internal ++ */ ++-public class XResourceBundle extends ListResourceBundle ++-{ +++public class XResourceBundle extends ListResourceBundle { ++ ++- /** Error resource constants */ ++- public static final String ERROR_RESOURCES = ++- "com.sun.org.apache.xalan.internal.res.XSLTErrorResources", XSLT_RESOURCE = ++- "com.sun.org.apache.xml.internal.utils.res.XResourceBundle", LANG_BUNDLE_NAME = ++- "com.sun.org.apache.xml.internal.utils.res.XResources", MULT_ORDER = ++- "multiplierOrder", MULT_PRECEDES = "precedes", MULT_FOLLOWS = ++- "follows", LANG_ORIENTATION = "orientation", LANG_RIGHTTOLEFT = ++- "rightToLeft", LANG_LEFTTORIGHT = "leftToRight", LANG_NUMBERING = ++- "numbering", LANG_ADDITIVE = "additive", LANG_MULT_ADD = ++- "multiplicative-additive", LANG_MULTIPLIER = ++- "multiplier", LANG_MULTIPLIER_CHAR = ++- "multiplierChar", LANG_NUMBERGROUPS = "numberGroups", LANG_NUM_TABLES = ++- "tables", LANG_ALPHABET = "alphabet", LANG_TRAD_ALPHABET = "tradAlphabet"; ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className Name of local-specific subclass. ++- * @param locale the locale to prefer when searching for the bundle ++- */ ++- public static final XResourceBundle loadResourceBundle( ++- String className, Locale locale) throws MissingResourceException ++- { ++- ++- String suffix = getResourceSuffix(locale); ++- ++- //System.out.println("resource " + className + suffix); ++- try ++- { ++- ++- // first try with the given locale ++- String resourceName = className + suffix; ++- return (XResourceBundle) ResourceBundle.getBundle(resourceName, locale); +++ /** +++ * Error resource constants +++ */ +++ public static final String ERROR_RESOURCES = +++ "com.sun.org.apache.xalan.internal.res.XSLTErrorResources", XSLT_RESOURCE = +++ "com.sun.org.apache.xml.internal.utils.res.XResourceBundle", LANG_BUNDLE_NAME = +++ "com.sun.org.apache.xml.internal.utils.res.XResources", MULT_ORDER = +++ "multiplierOrder", MULT_PRECEDES = "precedes", MULT_FOLLOWS = +++ "follows", LANG_ORIENTATION = "orientation", LANG_RIGHTTOLEFT = +++ "rightToLeft", LANG_LEFTTORIGHT = "leftToRight", LANG_NUMBERING = +++ "numbering", LANG_ADDITIVE = "additive", LANG_MULT_ADD = +++ "multiplicative-additive", LANG_MULTIPLIER = +++ "multiplier", LANG_MULTIPLIER_CHAR = +++ "multiplierChar", LANG_NUMBERGROUPS = "numberGroups", LANG_NUM_TABLES = +++ "tables", LANG_ALPHABET = "alphabet", LANG_TRAD_ALPHABET = "tradAlphabet"; +++ +++ +++ /** +++ * Get the association list. +++ * +++ * @return The association list. +++ */ +++ public Object[][] getContents() { +++ return new Object[][]{ +++ {"ui_language", "en"}, {"help_language", "en"}, {"language", "en"}, +++ {"alphabet", new CharArrayWrapper(new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', +++ 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', +++ 'V', 'W', 'X', 'Y', 'Z'})}, +++ {"tradAlphabet", new CharArrayWrapper(new char[]{'A', 'B', 'C', 'D', 'E', 'F', +++ 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', +++ 'U', 'V', 'W', 'X', 'Y', 'Z'})}, +++ //language orientation +++ {"orientation", "LeftToRight"}, +++ //language numbering +++ {"numbering", "additive"},}; ++ } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XResourceBundle) ResourceBundle.getBundle( ++- XSLT_RESOURCE, new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String lang = locale.getLanguage(); ++- String country = locale.getCountry(); ++- String variant = locale.getVariant(); ++- String suffix = "_" + locale.getLanguage(); ++- ++- if (lang.equals("zh")) ++- suffix += "_" + country; ++- ++- if (country.equals("JP")) ++- suffix += "_" + country + "_" + variant; ++- ++- return suffix; ++- } ++- ++- /** ++- * Get the association list. ++- * ++- * @return The association list. ++- */ ++- public Object[][] getContents() ++- { ++- return new Object[][] ++- { ++- { "ui_language", "en" }, { "help_language", "en" }, { "language", "en" }, ++- { "alphabet", new CharArrayWrapper(new char[]{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', ++- 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', ++- 'V', 'W', 'X', 'Y', 'Z' })}, ++- { "tradAlphabet", new CharArrayWrapper(new char[]{ 'A', 'B', 'C', 'D', 'E', 'F', ++- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', ++- 'U', 'V', 'W', 'X', 'Y', 'Z' }) }, ++- ++- //language orientation ++- { "orientation", "LeftToRight" }, ++- ++- //language numbering ++- { "numbering", "additive" }, ++- }; ++- } ++ } ++--- src/com/sun/org/apache/xml/internal/utils/TreeWalker.java 2013-04-16 14:28:09.720156422 +0100 +++++ src/com/sun/org/apache/xml/internal/utils/TreeWalker.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -22,6 +22,7 @@ ++ */ ++ package com.sun.org.apache.xml.internal.utils; ++ +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ import java.io.File; ++ ++ import org.w3c.dom.Comment; ++@@ -93,7 +94,7 @@ ++ else { ++ try { ++ // Bug see Bugzilla 26741 ++- m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl"); +++ m_locator.setSystemId(SecuritySupport.getSystemProperty("user.dir") + File.separator + "dummy.xsl"); ++ } ++ catch (SecurityException se) {// user.dir not accessible from applet ++ } ++@@ -112,7 +113,7 @@ ++ m_contentHandler.setDocumentLocator(m_locator); ++ try { ++ // Bug see Bugzilla 26741 ++- m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl"); +++ m_locator.setSystemId(SecuritySupport.getSystemProperty("user.dir") + File.separator + "dummy.xsl"); ++ } ++ catch (SecurityException se){// user.dir not accessible from applet ++ } ++@@ -131,7 +132,7 @@ ++ m_contentHandler.setDocumentLocator(m_locator); ++ try { ++ // Bug see Bugzilla 26741 ++- m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl"); +++ m_locator.setSystemId(SecuritySupport.getSystemProperty("user.dir") + File.separator + "dummy.xsl"); ++ } ++ catch (SecurityException se){// user.dir not accessible from applet ++ ++--- src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java 2013-04-16 14:28:09.752156937 +0100 +++++ src/com/sun/org/apache/xpath/internal/functions/FuncSystemProperty.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -31,6 +31,8 @@ ++ import com.sun.org.apache.xpath.internal.objects.XObject; ++ import com.sun.org.apache.xpath.internal.objects.XString; ++ import com.sun.org.apache.xpath.internal.res.XPATHErrorResources; +++import com.sun.org.apache.xalan.internal.utils.ObjectFactory; +++import com.sun.org.apache.xalan.internal.utils.SecuritySupport; ++ ++ /** ++ * Execute the SystemProperty() function. ++@@ -100,7 +102,7 @@ ++ ++ try ++ { ++- result = System.getProperty(propName); +++ result = SecuritySupport.getSystemProperty(propName); ++ ++ if (null == result) ++ { ++@@ -122,7 +124,7 @@ ++ { ++ try ++ { ++- result = System.getProperty(fullName); +++ result = SecuritySupport.getSystemProperty(fullName); ++ ++ if (null == result) ++ { ++@@ -163,14 +165,12 @@ ++ * should already be fully qualified as path/filename ++ * @param target The target property bag the file will be placed into. ++ */ ++- private void loadPropertyFile(String file, Properties target) +++ public void loadPropertyFile(String file, Properties target) ++ { ++ try ++ { ++ // Use SecuritySupport class to provide priveleged access to property file ++- SecuritySupport ss = SecuritySupport.getInstance(); ++- ++- InputStream is = ss.getResourceAsStream(ObjectFactory.findClassLoader(), +++ InputStream is = SecuritySupport.getResourceAsStream(ObjectFactory.findClassLoader(), ++ file); ++ ++ // get a buffered version ++--- src/com/sun/org/apache/xpath/internal/functions/ObjectFactory.java 2013-04-16 14:28:09.752156937 +0100 +++++ src/com/sun/org/apache/xpath/internal/functions/ObjectFactory.java 1970-01-01 01:00:00.000000000 +0100 ++@@ -1,663 +0,0 @@ ++-/* ++- * reserved comment block ++- * DO NOT REMOVE OR ALTER! ++- */ ++-/* ++- * Copyright 2001-2004 The Apache Software Foundation. ++- * ++- * Licensed under the Apache License, Version 2.0 (the "License"); ++- * you may not use this file except in compliance with the License. ++- * You may obtain a copy of the License at ++- * ++- * http://www.apache.org/licenses/LICENSE-2.0 ++- * ++- * Unless required by applicable law or agreed to in writing, software ++- * distributed under the License is distributed on an "AS IS" BASIS, ++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++- * See the License for the specific language governing permissions and ++- * limitations under the License. ++- */ ++-/* ++- * $Id: ObjectFactory.java,v 1.2.4.1 2005/09/14 20:25:54 jeffsuttor Exp $ ++- */ ++- ++-package com.sun.org.apache.xpath.internal.functions; ++- ++-import java.io.InputStream; ++-import java.io.IOException; ++-import java.io.File; ++-import java.io.FileInputStream; ++- ++-import java.util.Properties; ++-import java.io.BufferedReader; ++-import java.io.InputStreamReader; ++- ++-/** ++- * This class is duplicated for each JAXP subpackage so keep it in sync. ++- * It is package private and therefore is not exposed as part of the JAXP ++- * API. ++- * <p> ++- * This code is designed to implement the JAXP 1.1 spec pluggability ++- * feature and is designed to run on JDK version 1.1 and ++- * later, and to compile on JDK 1.2 and onward. ++- * The code also runs both as part of an unbundled jar file and ++- * when bundled as part of the JDK. ++- * <p> ++- * This class was moved from the <code>javax.xml.parsers.ObjectFactory</code> ++- * class and modified to be used as a general utility for creating objects ++- * dynamically. ++- * ++- * @version $Id: ObjectFactory.java,v 1.7 2008/04/02 00:40:59 joehw Exp $ ++- */ ++-class ObjectFactory { ++- ++- // ++- // Constants ++- // ++- ++- // name of default properties file to look for in JDK's jre/lib directory ++- private static final String DEFAULT_PROPERTIES_FILENAME = ++- "xalan.properties"; ++- ++- private static final String SERVICES_PATH = "META-INF/services/"; ++- ++- /** Set to true for debugging */ ++- private static final boolean DEBUG = false; ++- ++- /** cache the contents of the xalan.properties file. ++- * Until an attempt has been made to read this file, this will ++- * be null; if the file does not exist or we encounter some other error ++- * during the read, this will be empty. ++- */ ++- private static Properties fXalanProperties = null; ++- ++- /*** ++- * Cache the time stamp of the xalan.properties file so ++- * that we know if it's been modified and can invalidate ++- * the cache when necessary. ++- */ ++- private static long fLastModified = -1; ++- ++- // ++- // Public static methods ++- // ++- ++- /** ++- * Finds the implementation Class object in the specified order. The ++- * specified order is the following: ++- * <ol> ++- * <li>query the system property using <code>System.getProperty</code> ++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file ++- * <li>use fallback classname ++- * </ol> ++- * ++- * @return instance of factory, never null ++- * ++- * @param factoryId Name of the factory to find, same as ++- * a property name ++- * @param fallbackClassName Implementation class name, if nothing else ++- * is found. Use null to mean no fallback. ++- * ++- * @exception ObjectFactory.ConfigurationError ++- */ ++- static Object createObject(String factoryId, String fallbackClassName) ++- throws ConfigurationError { ++- return createObject(factoryId, null, fallbackClassName); ++- } // createObject(String,String):Object ++- ++- /** ++- * Finds the implementation Class object in the specified order. The ++- * specified order is the following: ++- * <ol> ++- * <li>query the system property using <code>System.getProperty</code> ++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file ++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file ++- * <li>use fallback classname ++- * </ol> ++- * ++- * @return instance of factory, never null ++- * ++- * @param factoryId Name of the factory to find, same as ++- * a property name ++- * @param propertiesFilename The filename in the $java.home/lib directory ++- * of the properties file. If none specified, ++- * ${java.home}/lib/xalan.properties will be used. ++- * @param fallbackClassName Implementation class name, if nothing else ++- * is found. Use null to mean no fallback. ++- * ++- * @exception ObjectFactory.ConfigurationError ++- */ ++- static Object createObject(String factoryId, ++- String propertiesFilename, ++- String fallbackClassName) ++- throws ConfigurationError ++- { ++- Class factoryClass = lookUpFactoryClass(factoryId, ++- propertiesFilename, ++- fallbackClassName); ++- ++- if (factoryClass == null) { ++- throw new ConfigurationError( ++- "Provider for " + factoryId + " cannot be found", null); ++- } ++- ++- try{ ++- Object instance = factoryClass.newInstance(); ++- if (DEBUG) debugPrintln("created new instance of factory " + factoryId); ++- return instance; ++- } catch (Exception x) { ++- throw new ConfigurationError( ++- "Provider for factory " + factoryId ++- + " could not be instantiated: " + x, x); ++- } ++- } // createObject(String,String,String):Object ++- ++- /** ++- * Finds the implementation Class object in the specified order. The ++- * specified order is the following: ++- * <ol> ++- * <li>query the system property using <code>System.getProperty</code> ++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file ++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file ++- * <li>use fallback classname ++- * </ol> ++- * ++- * @return Class object of factory, never null ++- * ++- * @param factoryId Name of the factory to find, same as ++- * a property name ++- * @param propertiesFilename The filename in the $java.home/lib directory ++- * of the properties file. If none specified, ++- * ${java.home}/lib/xalan.properties will be used. ++- * @param fallbackClassName Implementation class name, if nothing else ++- * is found. Use null to mean no fallback. ++- * ++- * @exception ObjectFactory.ConfigurationError ++- */ ++- static Class lookUpFactoryClass(String factoryId) ++- throws ConfigurationError ++- { ++- return lookUpFactoryClass(factoryId, null, null); ++- } // lookUpFactoryClass(String):Class ++- ++- /** ++- * Finds the implementation Class object in the specified order. The ++- * specified order is the following: ++- * <ol> ++- * <li>query the system property using <code>System.getProperty</code> ++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file ++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file ++- * <li>use fallback classname ++- * </ol> ++- * ++- * @return Class object that provides factory service, never null ++- * ++- * @param factoryId Name of the factory to find, same as ++- * a property name ++- * @param propertiesFilename The filename in the $java.home/lib directory ++- * of the properties file. If none specified, ++- * ${java.home}/lib/xalan.properties will be used. ++- * @param fallbackClassName Implementation class name, if nothing else ++- * is found. Use null to mean no fallback. ++- * ++- * @exception ObjectFactory.ConfigurationError ++- */ ++- static Class lookUpFactoryClass(String factoryId, ++- String propertiesFilename, ++- String fallbackClassName) ++- throws ConfigurationError ++- { ++- String factoryClassName = lookUpFactoryClassName(factoryId, ++- propertiesFilename, ++- fallbackClassName); ++- ClassLoader cl = findClassLoader(); ++- ++- if (factoryClassName == null) { ++- factoryClassName = fallbackClassName; ++- } ++- ++- // assert(className != null); ++- try{ ++- Class providerClass = findProviderClass(factoryClassName, ++- cl, ++- true); ++- if (DEBUG) debugPrintln("created new instance of " + providerClass + ++- " using ClassLoader: " + cl); ++- return providerClass; ++- } catch (ClassNotFoundException x) { ++- throw new ConfigurationError( ++- "Provider " + factoryClassName + " not found", x); ++- } catch (Exception x) { ++- throw new ConfigurationError( ++- "Provider "+factoryClassName+" could not be instantiated: "+x, ++- x); ++- } ++- } // lookUpFactoryClass(String,String,String):Class ++- ++- /** ++- * Finds the name of the required implementation class in the specified ++- * order. The specified order is the following: ++- * <ol> ++- * <li>query the system property using <code>System.getProperty</code> ++- * <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file ++- * <li>read <code>META-INF/services/<i>factoryId</i></code> file ++- * <li>use fallback classname ++- * </ol> ++- * ++- * @return name of class that provides factory service, never null ++- * ++- * @param factoryId Name of the factory to find, same as ++- * a property name ++- * @param propertiesFilename The filename in the $java.home/lib directory ++- * of the properties file. If none specified, ++- * ${java.home}/lib/xalan.properties will be used. ++- * @param fallbackClassName Implementation class name, if nothing else ++- * is found. Use null to mean no fallback. ++- * ++- * @exception ObjectFactory.ConfigurationError ++- */ ++- static String lookUpFactoryClassName(String factoryId, ++- String propertiesFilename, ++- String fallbackClassName) ++- { ++- SecuritySupport ss = SecuritySupport.getInstance(); ++- ++- // Use the system property first ++- try { ++- String systemProp = ss.getSystemProperty(factoryId); ++- if (systemProp != null) { ++- if (DEBUG) debugPrintln("found system property, value=" + systemProp); ++- return systemProp; ++- } ++- } catch (SecurityException se) { ++- // Ignore and continue w/ next location ++- } ++- ++- // Try to read from propertiesFilename, or ++- // $java.home/lib/xalan.properties ++- String factoryClassName = null; ++- // no properties file name specified; use ++- // $JAVA_HOME/lib/xalan.properties: ++- if (propertiesFilename == null) { ++- File propertiesFile = null; ++- boolean propertiesFileExists = false; ++- try { ++- String javah = ss.getSystemProperty("java.home"); ++- propertiesFilename = javah + File.separator + ++- "lib" + File.separator + DEFAULT_PROPERTIES_FILENAME; ++- propertiesFile = new File(propertiesFilename); ++- propertiesFileExists = ss.getFileExists(propertiesFile); ++- } catch (SecurityException e) { ++- // try again... ++- fLastModified = -1; ++- fXalanProperties = null; ++- } ++- ++- synchronized (ObjectFactory.class) { ++- boolean loadProperties = false; ++- FileInputStream fis = null; ++- try { ++- // file existed last time ++- if(fLastModified >= 0) { ++- if(propertiesFileExists && ++- (fLastModified < (fLastModified = ss.getLastModified(propertiesFile)))) { ++- loadProperties = true; ++- } else { ++- // file has stopped existing... ++- if(!propertiesFileExists) { ++- fLastModified = -1; ++- fXalanProperties = null; ++- } // else, file wasn't modified! ++- } ++- } else { ++- // file has started to exist: ++- if(propertiesFileExists) { ++- loadProperties = true; ++- fLastModified = ss.getLastModified(propertiesFile); ++- } // else, nothing's changed ++- } ++- if(loadProperties) { ++- // must never have attempted to read xalan.properties ++- // before (or it's outdeated) ++- fXalanProperties = new Properties(); ++- fis = ss.getFileInputStream(propertiesFile); ++- fXalanProperties.load(fis); ++- } ++- } catch (Exception x) { ++- fXalanProperties = null; ++- fLastModified = -1; ++- // assert(x instanceof FileNotFoundException ++- // || x instanceof SecurityException) ++- // In both cases, ignore and continue w/ next location ++- } ++- finally { ++- // try to close the input stream if one was opened. ++- if (fis != null) { ++- try { ++- fis.close(); ++- } ++- // Ignore the exception. ++- catch (IOException exc) {} ++- } ++- } ++- } ++- if(fXalanProperties != null) { ++- factoryClassName = fXalanProperties.getProperty(factoryId); ++- } ++- } else { ++- FileInputStream fis = null; ++- try { ++- fis = ss.getFileInputStream(new File(propertiesFilename)); ++- Properties props = new Properties(); ++- props.load(fis); ++- factoryClassName = props.getProperty(factoryId); ++- } catch (Exception x) { ++- // assert(x instanceof FileNotFoundException ++- // || x instanceof SecurityException) ++- // In both cases, ignore and continue w/ next location ++- } ++- finally { ++- // try to close the input stream if one was opened. ++- if (fis != null) { ++- try { ++- fis.close(); ++- } ++- // Ignore the exception. ++- catch (IOException exc) {} ++- } ++- } ++- } ++- if (factoryClassName != null) { ++- if (DEBUG) debugPrintln("found in " + propertiesFilename + ", value=" ++- + factoryClassName); ++- return factoryClassName; ++- } ++- ++- // Try Jar Service Provider Mechanism ++- return findJarServiceProviderName(factoryId); ++- } // lookUpFactoryClass(String,String):String ++- ++- // ++- // Private static methods ++- // ++- ++- /** Prints a message to standard error if debugging is enabled. */ ++- private static void debugPrintln(String msg) { ++- if (DEBUG) { ++- System.err.println("JAXP: " + msg); ++- } ++- } // debugPrintln(String) ++- ++- /** ++- * Figure out which ClassLoader to use. For JDK 1.2 and later use ++- * the context ClassLoader. ++- */ ++- static ClassLoader findClassLoader() ++- throws ConfigurationError ++- { ++- SecuritySupport ss = SecuritySupport.getInstance(); ++- ++- // Figure out which ClassLoader to use for loading the provider ++- // class. If there is a Context ClassLoader then use it. ++- ClassLoader context = ss.getContextClassLoader(); ++- ClassLoader system = ss.getSystemClassLoader(); ++- ++- ClassLoader chain = system; ++- while (true) { ++- if (context == chain) { ++- // Assert: we are on JDK 1.1 or we have no Context ClassLoader ++- // or any Context ClassLoader in chain of system classloader ++- // (including extension ClassLoader) so extend to widest ++- // ClassLoader (always look in system ClassLoader if Xalan ++- // is in boot/extension/system classpath and in current ++- // ClassLoader otherwise); normal classloaders delegate ++- // back to system ClassLoader first so this widening doesn't ++- // change the fact that context ClassLoader will be consulted ++- ClassLoader current = ObjectFactory.class.getClassLoader(); ++- ++- chain = system; ++- while (true) { ++- if (current == chain) { ++- // Assert: Current ClassLoader in chain of ++- // boot/extension/system ClassLoaders ++- return system; ++- } ++- if (chain == null) { ++- break; ++- } ++- chain = ss.getParentClassLoader(chain); ++- } ++- ++- // Assert: Current ClassLoader not in chain of ++- // boot/extension/system ClassLoaders ++- return current; ++- } ++- ++- if (chain == null) { ++- // boot ClassLoader reached ++- break; ++- } ++- ++- // Check for any extension ClassLoaders in chain up to ++- // boot ClassLoader ++- chain = ss.getParentClassLoader(chain); ++- }; ++- ++- // Assert: Context ClassLoader not in chain of ++- // boot/extension/system ClassLoaders ++- return context; ++- } // findClassLoader():ClassLoader ++- ++- /** ++- * Create an instance of a class using the specified ClassLoader ++- */ ++- static Object newInstance(String className, ClassLoader cl, ++- boolean doFallback) ++- throws ConfigurationError ++- { ++- // assert(className != null); ++- try{ ++- Class providerClass = findProviderClass(className, cl, doFallback); ++- Object instance = providerClass.newInstance(); ++- if (DEBUG) debugPrintln("created new instance of " + providerClass + ++- " using ClassLoader: " + cl); ++- return instance; ++- } catch (ClassNotFoundException x) { ++- throw new ConfigurationError( ++- "Provider " + className + " not found", x); ++- } catch (Exception x) { ++- throw new ConfigurationError( ++- "Provider " + className + " could not be instantiated: " + x, ++- x); ++- } ++- } ++- ++- /** ++- * Find a Class using the specified ClassLoader ++- */ ++- static Class findProviderClass(String className, ClassLoader cl, ++- boolean doFallback) ++- throws ClassNotFoundException, ConfigurationError ++- { ++- //throw security exception if the calling thread is not allowed to access the ++- //class. Restrict the access to the package classes as specified in java.security policy. ++- SecurityManager security = System.getSecurityManager(); ++- try{ ++- if (security != null){ ++- final int lastDot = className.lastIndexOf("."); ++- String packageName = className; ++- if (lastDot != -1) packageName = className.substring(0, lastDot); ++- security.checkPackageAccess(packageName); ++- } ++- }catch(SecurityException e){ ++- throw e; ++- } ++- ++- Class providerClass; ++- if (cl == null) { ++- // XXX Use the bootstrap ClassLoader. There is no way to ++- // load a class using the bootstrap ClassLoader that works ++- // in both JDK 1.1 and Java 2. However, this should still ++- // work b/c the following should be true: ++- // ++- // (cl == null) iff current ClassLoader == null ++- // ++- // Thus Class.forName(String) will use the current ++- // ClassLoader which will be the bootstrap ClassLoader. ++- providerClass = Class.forName(className); ++- } else { ++- try { ++- providerClass = cl.loadClass(className); ++- } catch (ClassNotFoundException x) { ++- if (doFallback) { ++- // Fall back to current classloader ++- ClassLoader current = ObjectFactory.class.getClassLoader(); ++- if (current == null) { ++- providerClass = Class.forName(className); ++- } else if (cl != current) { ++- cl = current; ++- providerClass = cl.loadClass(className); ++- } else { ++- throw x; ++- } ++- } else { ++- throw x; ++- } ++- } ++- } ++- ++- return providerClass; ++- } ++- ++- /** ++- * Find the name of service provider using Jar Service Provider Mechanism ++- * ++- * @return instance of provider class if found or null ++- */ ++- private static String findJarServiceProviderName(String factoryId) ++- { ++- SecuritySupport ss = SecuritySupport.getInstance(); ++- String serviceId = SERVICES_PATH + factoryId; ++- InputStream is = null; ++- ++- // First try the Context ClassLoader ++- ClassLoader cl = findClassLoader(); ++- ++- is = ss.getResourceAsStream(cl, serviceId); ++- ++- // If no provider found then try the current ClassLoader ++- if (is == null) { ++- ClassLoader current = ObjectFactory.class.getClassLoader(); ++- if (cl != current) { ++- cl = current; ++- is = ss.getResourceAsStream(cl, serviceId); ++- } ++- } ++- ++- if (is == null) { ++- // No provider found ++- return null; ++- } ++- ++- if (DEBUG) debugPrintln("found jar resource=" + serviceId + ++- " using ClassLoader: " + cl); ++- ++- // Read the service provider name in UTF-8 as specified in ++- // the jar spec. Unfortunately this fails in Microsoft ++- // VJ++, which does not implement the UTF-8 ++- // encoding. Theoretically, we should simply let it fail in ++- // that case, since the JVM is obviously broken if it ++- // doesn't support such a basic standard. But since there ++- // are still some users attempting to use VJ++ for ++- // development, we have dropped in a fallback which makes a ++- // second attempt using the platform's default encoding. In ++- // VJ++ this is apparently ASCII, which is a subset of ++- // UTF-8... and since the strings we'll be reading here are ++- // also primarily limited to the 7-bit ASCII range (at ++- // least, in English versions), this should work well ++- // enough to keep us on the air until we're ready to ++- // officially decommit from VJ++. [Edited comment from ++- // jkesselm] ++- BufferedReader rd; ++- try { ++- rd = new BufferedReader(new InputStreamReader(is, "UTF-8")); ++- } catch (java.io.UnsupportedEncodingException e) { ++- rd = new BufferedReader(new InputStreamReader(is)); ++- } ++- ++- String factoryClassName = null; ++- try { ++- // XXX Does not handle all possible input as specified by the ++- // Jar Service Provider specification ++- factoryClassName = rd.readLine(); ++- } catch (IOException x) { ++- // No provider found ++- return null; ++- } ++- finally { ++- try { ++- // try to close the reader. ++- rd.close(); ++- } ++- // Ignore the exception. ++- catch (IOException exc) {} ++- } ++- ++- if (factoryClassName != null && ++- ! "".equals(factoryClassName)) { ++- if (DEBUG) debugPrintln("found in resource, value=" ++- + factoryClassName); ++- ++- // Note: here we do not want to fall back to the current ++- // ClassLoader because we want to avoid the case where the ++- // resource file was found using one ClassLoader and the ++- // provider class was instantiated using a different one. ++- return factoryClassName; ++- } ++- ++- // No provider found ++- return null; ++- } ++- ++- // ++- // Classes ++- // ++- ++- /** ++- * A configuration error. ++- */ ++- static class ConfigurationError ++- extends Error { ++- static final long serialVersionUID = -5782303800588797207L; ++- // ++- // Data ++- // ++- ++- /** Exception. */ ++- private Exception exception; ++- ++- // ++- // Constructors ++- // ++- ++- /** ++- * Construct a new instance with the specified detail string and ++- * exception. ++- */ ++- ConfigurationError(String msg, Exception x) { ++- super(msg); ++- this.exception = x; ++- } // <init>(String,Exception) ++- ++- // ++- // Public methods ++- // ++- ++- /** Returns the exception associated to this error. */ ++- Exception getException() { ++- return exception; ++- } // getException():Exception ++- ++- } // class ConfigurationError ++- ++-} // class ObjectFactory ++--- src/com/sun/org/apache/xpath/internal/functions/SecuritySupport12.java 2013-04-16 14:28:09.752156937 +0100 +++++ src/com/sun/org/apache/xpath/internal/functions/SecuritySupport12.java 1970-01-01 01:00:00.000000000 +0100 ++@@ -1,148 +0,0 @@ ++-/* ++- * reserved comment block ++- * DO NOT REMOVE OR ALTER! ++- */ ++-/* ++- * Copyright 2002-2004 The Apache Software Foundation. ++- * ++- * Licensed under the Apache License, Version 2.0 (the "License"); ++- * you may not use this file except in compliance with the License. ++- * You may obtain a copy of the License at ++- * ++- * http://www.apache.org/licenses/LICENSE-2.0 ++- * ++- * Unless required by applicable law or agreed to in writing, software ++- * distributed under the License is distributed on an "AS IS" BASIS, ++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++- * See the License for the specific language governing permissions and ++- * limitations under the License. ++- */ ++-/* ++- * $Id: SecuritySupport12.java,v 1.1.2.1 2005/08/01 01:29:45 jeffsuttor Exp $ ++- */ ++- ++-package com.sun.org.apache.xpath.internal.functions; ++- ++-import java.io.File; ++-import java.io.FileInputStream; ++-import java.io.FileNotFoundException; ++-import java.io.InputStream; ++- ++-import java.security.AccessController; ++-import java.security.PrivilegedAction; ++-import java.security.PrivilegedActionException; ++-import java.security.PrivilegedExceptionAction; ++- ++-import java.util.Properties; ++- ++-/** ++- * This class is duplicated for each Xalan-Java subpackage so keep it in sync. ++- * It is package private and therefore is not exposed as part of the Xalan-Java ++- * API. ++- * ++- * Security related methods that only work on J2SE 1.2 and newer. ++- */ ++-class SecuritySupport12 extends SecuritySupport { ++- ++- ClassLoader getContextClassLoader() { ++- return (ClassLoader) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- ClassLoader cl = null; ++- try { ++- cl = Thread.currentThread().getContextClassLoader(); ++- } catch (SecurityException ex) { } ++- return cl; ++- } ++- }); ++- } ++- ++- ClassLoader getSystemClassLoader() { ++- return (ClassLoader) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- ClassLoader cl = null; ++- try { ++- cl = ClassLoader.getSystemClassLoader(); ++- } catch (SecurityException ex) {} ++- return cl; ++- } ++- }); ++- } ++- ++- ClassLoader getParentClassLoader(final ClassLoader cl) { ++- return (ClassLoader) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- ClassLoader parent = null; ++- try { ++- parent = cl.getParent(); ++- } catch (SecurityException ex) {} ++- ++- // eliminate loops in case of the boot ++- // ClassLoader returning itself as a parent ++- return (parent == cl) ? null : parent; ++- } ++- }); ++- } ++- ++- String getSystemProperty(final String propName) { ++- return (String) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- return System.getProperty(propName); ++- } ++- }); ++- } ++- ++- FileInputStream getFileInputStream(final File file) ++- throws FileNotFoundException ++- { ++- try { ++- return (FileInputStream) ++- AccessController.doPrivileged(new PrivilegedExceptionAction() { ++- public Object run() throws FileNotFoundException { ++- return new FileInputStream(file); ++- } ++- }); ++- } catch (PrivilegedActionException e) { ++- throw (FileNotFoundException)e.getException(); ++- } ++- } ++- ++- InputStream getResourceAsStream(final ClassLoader cl, ++- final String name) ++- { ++- return (InputStream) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- InputStream ris; ++- if (cl == null) { ++- ris = ClassLoader.getSystemResourceAsStream(name); ++- } else { ++- ris = cl.getResourceAsStream(name); ++- } ++- return ris; ++- } ++- }); ++- } ++- ++- boolean getFileExists(final File f) { ++- return ((Boolean) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- return new Boolean(f.exists()); ++- } ++- })).booleanValue(); ++- } ++- ++- long getLastModified(final File f) { ++- return ((Long) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- return new Long(f.lastModified()); ++- } ++- })).longValue(); ++- } ++- ++-} ++--- src/com/sun/org/apache/xpath/internal/functions/SecuritySupport.java 2013-04-16 14:28:09.752156937 +0100 +++++ src/com/sun/org/apache/xpath/internal/functions/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100 ++@@ -1,127 +0,0 @@ ++-/* ++- * reserved comment block ++- * DO NOT REMOVE OR ALTER! ++- */ ++-/* ++- * Copyright 2002-2004 The Apache Software Foundation. ++- * ++- * Licensed under the Apache License, Version 2.0 (the "License"); ++- * you may not use this file except in compliance with the License. ++- * You may obtain a copy of the License at ++- * ++- * http://www.apache.org/licenses/LICENSE-2.0 ++- * ++- * Unless required by applicable law or agreed to in writing, software ++- * distributed under the License is distributed on an "AS IS" BASIS, ++- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++- * See the License for the specific language governing permissions and ++- * limitations under the License. ++- */ ++-/* ++- * $Id: SecuritySupport.java,v 1.1.2.1 2005/08/01 01:29:39 jeffsuttor Exp $ ++- */ ++- ++-package com.sun.org.apache.xpath.internal.functions; ++- ++-import java.io.File; ++-import java.io.FileInputStream; ++-import java.io.FileNotFoundException; ++-import java.io.InputStream; ++- ++-import java.util.Properties; ++- ++-/** ++- * This class is duplicated for each Xalan-Java subpackage so keep it in sync. ++- * It is package private and therefore is not exposed as part of the Xalan-Java ++- * API. ++- * ++- * Base class with security related methods that work on JDK 1.1. ++- */ ++-class SecuritySupport { ++- ++- /* ++- * Make this of type Object so that the verifier won't try to ++- * prove its type, thus possibly trying to load the SecuritySupport12 ++- * class. ++- */ ++- private static final Object securitySupport; ++- ++- static { ++- SecuritySupport ss = null; ++- try { ++- Class c = Class.forName("java.security.AccessController"); ++- // if that worked, we're on 1.2. ++- /* ++- // don't reference the class explicitly so it doesn't ++- // get dragged in accidentally. ++- c = Class.forName("javax.mail.SecuritySupport12"); ++- Constructor cons = c.getConstructor(new Class[] { }); ++- ss = (SecuritySupport)cons.newInstance(new Object[] { }); ++- */ ++- /* ++- * Unfortunately, we can't load the class using reflection ++- * because the class is package private. And the class has ++- * to be package private so the APIs aren't exposed to other ++- * code that could use them to circumvent security. Thus, ++- * we accept the risk that the direct reference might fail ++- * on some JDK 1.1 JVMs, even though we would never execute ++- * this code in such a case. Sigh... ++- */ ++- ss = new SecuritySupport12(); ++- } catch (Exception ex) { ++- // ignore it ++- } finally { ++- if (ss == null) ++- ss = new SecuritySupport(); ++- securitySupport = ss; ++- } ++- } ++- ++- /** ++- * Return an appropriate instance of this class, depending on whether ++- * we're on a JDK 1.1 or J2SE 1.2 (or later) system. ++- */ ++- static SecuritySupport getInstance() { ++- return (SecuritySupport)securitySupport; ++- } ++- ++- ClassLoader getContextClassLoader() { ++- return null; ++- } ++- ++- ClassLoader getSystemClassLoader() { ++- return null; ++- } ++- ++- ClassLoader getParentClassLoader(ClassLoader cl) { ++- return null; ++- } ++- ++- String getSystemProperty(String propName) { ++- return System.getProperty(propName); ++- } ++- ++- FileInputStream getFileInputStream(File file) ++- throws FileNotFoundException ++- { ++- return new FileInputStream(file); ++- } ++- ++- InputStream getResourceAsStream(ClassLoader cl, String name) { ++- InputStream ris; ++- if (cl == null) { ++- ris = ClassLoader.getSystemResourceAsStream(name); ++- } else { ++- ris = cl.getResourceAsStream(name); ++- } ++- return ris; ++- } ++- ++- boolean getFileExists(File f) { ++- return f.exists(); ++- } ++- ++- long getLastModified(File f) { ++- return f.lastModified(); ++- } ++-} ++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java 2013-04-16 14:28:09.764157131 +0100 +++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -23,9 +23,6 @@ ++ package com.sun.org.apache.xpath.internal.res; ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -1269,68 +1266,4 @@ ++ /** Field QUERY_HEADER */ ++ public static final String QUERY_HEADER = "MUSTER "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className Name of local-specific subclass. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XPATHErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XPATHErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XPATHErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_es.java 2013-04-16 14:28:09.764157131 +0100 +++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_es.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -23,9 +23,6 @@ ++ package com.sun.org.apache.xpath.internal.res; ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -1273,68 +1270,4 @@ ++ /** Field QUERY_HEADER */ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className Name of local-specific subclass. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XPATHErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XPATHErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XPATHErrorResources) ResourceBundle.getBundle(className, ++- new Locale("es", "ES")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_fr.java 2013-04-16 14:28:09.768157196 +0100 +++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_fr.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -23,9 +23,6 @@ ++ package com.sun.org.apache.xpath.internal.res; ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -1270,68 +1267,4 @@ ++ /** Field QUERY_HEADER */ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className Name of local-specific subclass. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XPATHErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XPATHErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XPATHErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_it.java 2013-04-16 14:28:09.768157196 +0100 +++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_it.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -23,9 +23,6 @@ ++ package com.sun.org.apache.xpath.internal.res; ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -1272,68 +1269,4 @@ ++ /** Field QUERY_HEADER */ ++ public static final String QUERY_HEADER = "MODELLO "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className Name of local-specific subclass. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XPATHErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XPATHErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XPATHErrorResources) ResourceBundle.getBundle(className, ++- new Locale("it", "IT")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_ja.java 2013-04-16 14:28:09.768157196 +0100 +++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_ja.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -23,9 +23,6 @@ ++ package com.sun.org.apache.xpath.internal.res; ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -1269,68 +1266,4 @@ ++ /** Field QUERY_HEADER */ ++ public static final String QUERY_HEADER = "\u30d1\u30bf\u30fc\u30f3 "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className Name of local-specific subclass. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XPATHErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XPATHErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XPATHErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources.java 2013-04-16 14:28:09.764157131 +0100 +++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -23,9 +23,6 @@ ++ package com.sun.org.apache.xpath.internal.res; ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -938,68 +935,4 @@ ++ /** Field QUERY_HEADER */ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className Name of local-specific subclass. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XPATHErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XPATHErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XPATHErrorResources) ResourceBundle.getBundle(className, ++- new Locale("en", "US")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_ko.java 2013-04-16 14:28:09.768157196 +0100 +++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_ko.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -23,9 +23,6 @@ ++ package com.sun.org.apache.xpath.internal.res; ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -1269,68 +1266,4 @@ ++ /** Field QUERY_HEADER */ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className Name of local-specific subclass. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XPATHErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XPATHErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XPATHErrorResources) ResourceBundle.getBundle(className, ++- new Locale("ko", "KR")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_zh_CN.java 2013-04-16 14:28:09.772157260 +0100 +++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_zh_CN.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -23,9 +23,6 @@ ++ package com.sun.org.apache.xpath.internal.res; ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -1270,68 +1267,4 @@ ++ /** Field QUERY_HEADER */ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className Name of local-specific subclass. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XPATHErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XPATHErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XPATHErrorResources) ResourceBundle.getBundle(className, ++- new Locale("zh", "CN")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "\u65e0\u6cd5\u88c5\u5165\u4efb\u4f55\u8d44\u6e90\u5305\u3002", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_zh_TW.java 2013-04-16 14:28:09.772157260 +0100 +++++ src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_zh_TW.java 2013-04-16 14:29:26.565394640 +0100 ++@@ -23,9 +23,6 @@ ++ package com.sun.org.apache.xpath.internal.res; ++ ++ import java.util.ListResourceBundle; ++-import java.util.Locale; ++-import java.util.MissingResourceException; ++-import java.util.ResourceBundle; ++ ++ /** ++ * Set up error messages. ++@@ -1270,68 +1267,4 @@ ++ /** Field QUERY_HEADER */ ++ public static final String QUERY_HEADER = "PATTERN "; ++ ++- ++- /** ++- * Return a named ResourceBundle for a particular locale. This method mimics the behavior ++- * of ResourceBundle.getBundle(). ++- * ++- * @param className Name of local-specific subclass. ++- * @return the ResourceBundle ++- * @throws MissingResourceException ++- */ ++- public static final XPATHErrorResources loadResourceBundle(String className) ++- throws MissingResourceException ++- { ++- ++- Locale locale = Locale.getDefault(); ++- String suffix = getResourceSuffix(locale); ++- ++- try ++- { ++- ++- // first try with the given locale ++- return (XPATHErrorResources) ResourceBundle.getBundle(className ++- + suffix, locale); ++- } ++- catch (MissingResourceException e) ++- { ++- try // try to fall back to en_US if we can't load ++- { ++- ++- // Since we can't find the localized property file, ++- // fall back to en_US. ++- return (XPATHErrorResources) ResourceBundle.getBundle(className, ++- new Locale("zh", "TW")); ++- } ++- catch (MissingResourceException e2) ++- { ++- ++- // Now we are really in trouble. ++- // very bad, definitely very bad...not going to get very far ++- throw new MissingResourceException( ++- "Could not load any resource bundles.", className, ""); ++- } ++- } ++- } ++- ++- /** ++- * Return the resource file suffic for the indicated locale ++- * For most locales, this will be based the language code. However ++- * for Chinese, we do distinguish between Taiwan and PRC ++- * ++- * @param locale the locale ++- * @return an String suffix which canbe appended to a resource name ++- */ ++- private static final String getResourceSuffix(Locale locale) ++- { ++- ++- String suffix = "_" + locale.getLanguage(); ++- String country = locale.getCountry(); ++- ++- if (country.equals("TW")) ++- suffix += "_" + country; ++- ++- return suffix; ++- } ++- ++ } ++--- src/com/sun/org/apache/xpath/internal/res/XPATHMessages.java 2013-04-16 14:28:09.772157260 +0100 +++++ src/com/sun/org/apache/xpath/internal/res/XPATHMessages.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -22,130 +22,128 @@ ++ */ ++ package com.sun.org.apache.xpath.internal.res; ++ ++-import java.util.ListResourceBundle; ++- +++import com.sun.org.apache.bcel.internal.util.SecuritySupport; ++ import com.sun.org.apache.xml.internal.res.XMLMessages; +++import java.util.ListResourceBundle; ++ ++ /** ++ * A utility class for issuing XPath error messages. +++ * ++ * @xsl.usage internal ++ */ ++-public class XPATHMessages extends XMLMessages ++-{ ++- /** The language specific resource object for XPath messages. */ ++- private static ListResourceBundle XPATHBundle = null; ++- ++- /** The class name of the XPath error message string table. */ ++- private static final String XPATH_ERROR_RESOURCES = ++- "com.sun.org.apache.xpath.internal.res.XPATHErrorResources"; ++- ++- /** ++- * Creates a message from the specified key and replacement ++- * arguments, localized to the given locale. ++- * ++- * @param msgKey The key for the message text. ++- * @param args The arguments to be used as replacement text ++- * in the message created. ++- * ++- * @return The formatted message string. ++- */ ++- public static final String createXPATHMessage(String msgKey, Object args[]) //throws Exception ++- { ++- if (XPATHBundle == null) ++- XPATHBundle = loadResourceBundle(XPATH_ERROR_RESOURCES); +++public class XPATHMessages extends XMLMessages { ++ ++- if (XPATHBundle != null) +++ /** +++ * The language specific resource object for XPath messages. +++ */ +++ private static ListResourceBundle XPATHBundle = null; +++ /** +++ * The class name of the XPath error message string table. +++ */ +++ private static final String XPATH_ERROR_RESOURCES = +++ "com.sun.org.apache.xpath.internal.res.XPATHErrorResources"; +++ +++ /** +++ * Creates a message from the specified key and replacement arguments, +++ * localized to the given locale. +++ * +++ * @param msgKey The key for the message text. +++ * @param args The arguments to be used as replacement text in the message +++ * created. +++ * +++ * @return The formatted message string. +++ */ +++ public static final String createXPATHMessage(String msgKey, Object args[]) //throws Exception ++ { ++- return createXPATHMsg(XPATHBundle, msgKey, args); ++- } ++- else ++- return "Could not load any resource bundles."; ++- } ++- ++- /** ++- * Creates a message from the specified key and replacement ++- * arguments, localized to the given locale. ++- * ++- * @param msgKey The key for the message text. ++- * @param args The arguments to be used as replacement text ++- * in the message created. ++- * ++- * @return The formatted warning string. ++- */ ++- public static final String createXPATHWarning(String msgKey, Object args[]) //throws Exception ++- { ++- if (XPATHBundle == null) ++- XPATHBundle = loadResourceBundle(XPATH_ERROR_RESOURCES); +++ if (XPATHBundle == null) { +++ XPATHBundle = SecuritySupport.getResourceBundle(XPATH_ERROR_RESOURCES); +++ } ++ ++- if (XPATHBundle != null) ++- { ++- return createXPATHMsg(XPATHBundle, msgKey, args); +++ if (XPATHBundle != null) { +++ return createXPATHMsg(XPATHBundle, msgKey, args); +++ } else { +++ return "Could not load any resource bundles."; +++ } ++ } ++- else ++- return "Could not load any resource bundles."; ++- } ++- ++- /** ++- * Creates a message from the specified key and replacement ++- * arguments, localized to the given locale. ++- * ++- * @param fResourceBundle The resource bundle to use. ++- * @param msgKey The message key to use. ++- * @param args The arguments to be used as replacement text ++- * in the message created. ++- * ++- * @return The formatted message string. ++- */ ++- public static final String createXPATHMsg(ListResourceBundle fResourceBundle, ++- String msgKey, Object args[]) //throws Exception ++- { ++- ++- String fmsg = null; ++- boolean throwex = false; ++- String msg = null; ++- ++- if (msgKey != null) ++- msg = fResourceBundle.getString(msgKey); ++ ++- if (msg == null) +++ /** +++ * Creates a message from the specified key and replacement arguments, +++ * localized to the given locale. +++ * +++ * @param msgKey The key for the message text. +++ * @param args The arguments to be used as replacement text in the message +++ * created. +++ * +++ * @return The formatted warning string. +++ */ +++ public static final String createXPATHWarning(String msgKey, Object args[]) //throws Exception ++ { ++- msg = fResourceBundle.getString(XPATHErrorResources.BAD_CODE); ++- throwex = true; +++ if (XPATHBundle == null) { +++ XPATHBundle = SecuritySupport.getResourceBundle(XPATH_ERROR_RESOURCES); +++ } +++ +++ if (XPATHBundle != null) { +++ return createXPATHMsg(XPATHBundle, msgKey, args); +++ } else { +++ return "Could not load any resource bundles."; +++ } ++ } ++ ++- if (args != null) +++ /** +++ * Creates a message from the specified key and replacement arguments, +++ * localized to the given locale. +++ * +++ * @param fResourceBundle The resource bundle to use. +++ * @param msgKey The message key to use. +++ * @param args The arguments to be used as replacement text in the message +++ * created. +++ * +++ * @return The formatted message string. +++ */ +++ public static final String createXPATHMsg(ListResourceBundle fResourceBundle, +++ String msgKey, Object args[]) //throws Exception ++ { ++- try ++- { ++ ++- // Do this to keep format from crying. ++- // This is better than making a bunch of conditional ++- // code all over the place. ++- int n = args.length; ++- ++- for (int i = 0; i < n; i++) ++- { ++- if (null == args[i]) ++- args[i] = ""; ++- } ++- ++- fmsg = java.text.MessageFormat.format(msg, args); ++- } ++- catch (Exception e) ++- { ++- fmsg = fResourceBundle.getString(XPATHErrorResources.FORMAT_FAILED); ++- fmsg += " " + msg; ++- } ++- } ++- else ++- fmsg = msg; +++ String fmsg = null; +++ boolean throwex = false; +++ String msg = null; ++ ++- if (throwex) ++- { ++- throw new RuntimeException(fmsg); ++- } +++ if (msgKey != null) { +++ msg = fResourceBundle.getString(msgKey); +++ } +++ +++ if (msg == null) { +++ msg = fResourceBundle.getString(XPATHErrorResources.BAD_CODE); +++ throwex = true; +++ } ++ ++- return fmsg; ++- } +++ if (args != null) { +++ try { ++ +++ // Do this to keep format from crying. +++ // This is better than making a bunch of conditional +++ // code all over the place. +++ int n = args.length; +++ +++ for (int i = 0; i < n; i++) { +++ if (null == args[i]) { +++ args[i] = ""; +++ } +++ } +++ +++ fmsg = java.text.MessageFormat.format(msg, args); +++ } catch (Exception e) { +++ fmsg = fResourceBundle.getString(XPATHErrorResources.FORMAT_FAILED); +++ fmsg += " " + msg; +++ } +++ } else { +++ fmsg = msg; +++ } +++ +++ if (throwex) { +++ throw new RuntimeException(fmsg); +++ } +++ +++ return fmsg; +++ } ++ } ++--- src/com/sun/xml/internal/stream/writers/WriterUtility.java 2013-04-16 14:28:09.780157389 +0100 +++++ src/com/sun/xml/internal/stream/writers/WriterUtility.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -32,6 +32,7 @@ ++ import java.nio.charset.Charset; ++ import java.nio.charset.CharsetEncoder; ++ import com.sun.org.apache.xerces.internal.util.XMLChar; +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ ++ /** ++ * Implements common xml writer functions. ++@@ -240,7 +241,7 @@ ++ ++ private CharsetEncoder getDefaultEncoder(){ ++ try{ ++- String encoding = System.getProperty("file.encoding"); +++ String encoding = SecuritySupport.getSystemProperty("file.encoding"); ++ if(encoding != null){ ++ return Charset.forName(encoding).newEncoder(); ++ } ++--- src/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java 2013-04-16 14:28:09.780157389 +0100 +++++ src/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -53,6 +53,7 @@ ++ import com.sun.org.apache.xerces.internal.impl.PropertyManager; ++ import com.sun.org.apache.xerces.internal.util.NamespaceSupport; ++ import com.sun.org.apache.xerces.internal.util.SymbolTable; +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ import com.sun.org.apache.xerces.internal.xni.QName; ++ ++ import com.sun.xml.internal.stream.util.ReadOnlyIterator; ++@@ -339,7 +340,7 @@ ++ fEncoder = Charset.forName(encoding).newEncoder(); ++ } ++ } else { ++- encoding = System.getProperty("file.encoding"); +++ encoding = SecuritySupport.getSystemProperty("file.encoding"); ++ if (encoding != null && encoding.equalsIgnoreCase("utf-8")) { ++ fWriter = new UTF8OutputStreamWriter(os); ++ } else { ++--- src/com/sun/xml/internal/stream/XMLEntityStorage.java 2013-04-16 14:28:09.772157260 +0100 +++++ src/com/sun/xml/internal/stream/XMLEntityStorage.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -36,6 +36,7 @@ ++ import com.sun.org.apache.xerces.internal.impl.PropertyManager; ++ import com.sun.org.apache.xerces.internal.impl.XMLErrorReporter; ++ import com.sun.org.apache.xerces.internal.impl.Constants; +++import com.sun.org.apache.xerces.internal.utils.SecuritySupport; ++ ++ /** ++ * ++@@ -410,7 +411,7 @@ ++ // get the user.dir property ++ String userDir = ""; ++ try { ++- userDir = System.getProperty("user.dir"); +++ userDir = SecuritySupport.getSystemProperty("user.dir"); ++ } ++ catch (SecurityException se) { ++ } ++--- src/javax/xml/datatype/FactoryFinder.java 2013-04-16 14:28:09.784157453 +0100 +++++ src/javax/xml/datatype/FactoryFinder.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -44,6 +44,7 @@ ++ * @author Santiago.PericasGeertsen@sun.com ++ */ ++ class FactoryFinder { +++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xerces.internal"; ++ ++ /** ++ * Internal debug flag. ++@@ -95,18 +96,24 @@ ++ * If the class loader supplied is <code>null</code>, first try using the ++ * context class loader followed by the current (i.e. bootstrap) class ++ * loader. +++ * +++ * Use bootstrap classLoader if cl = null and useBSClsLoader is true ++ */ ++ static private Class getProviderClass(String className, ClassLoader cl, ++- boolean doFallback) throws ClassNotFoundException +++ boolean doFallback, boolean useBSClsLoader) throws ClassNotFoundException ++ { ++ try { ++ if (cl == null) { ++- cl = ss.getContextClassLoader(); ++- if (cl == null) { ++- throw new ClassNotFoundException(); ++- } ++- else { ++- return cl.loadClass(className); +++ if (useBSClsLoader) { +++ return Class.forName(className, true, FactoryFinder.class.getClassLoader()); +++ } else { +++ cl = ss.getContextClassLoader(); +++ if (cl == null) { +++ throw new ClassNotFoundException(); +++ } +++ else { +++ return cl.loadClass(className); +++ } ++ } ++ } ++ else { ++@@ -131,8 +138,8 @@ ++ * @param className Name of the concrete class corresponding to the ++ * service provider ++ * ++- * @param cl ClassLoader to use to load the class, null means to use ++- * the bootstrap ClassLoader +++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code> +++ * current <code>Thread</code>'s context classLoader is used to load the factory class. ++ * ++ * @param doFallback True if the current ClassLoader should be tried as ++ * a fallback if the class is not found using cl ++@@ -140,8 +147,38 @@ ++ static Object newInstance(String className, ClassLoader cl, boolean doFallback) ++ throws ConfigurationError ++ { +++ return newInstance(className, cl, doFallback, false); +++ } +++ +++ /** +++ * Create an instance of a class. Delegates to method +++ * <code>getProviderClass()</code> in order to load the class. +++ * +++ * @param className Name of the concrete class corresponding to the +++ * service provider +++ * +++ * @param cl ClassLoader to use to load the class, null means to use +++ * the bootstrap ClassLoader +++ * +++ * @param doFallback True if the current ClassLoader should be tried as +++ * a fallback if the class is not found using cl +++ * +++ * @param useBSClsLoader True if cl=null actually meant bootstrap classLoader. This parameter +++ * is needed since DocumentBuilderFactory/SAXParserFactory defined null as context classLoader. +++ */ +++ static Object newInstance(String className, ClassLoader cl, boolean doFallback, boolean useBSClsLoader) +++ throws ConfigurationError +++ { +++ // make sure we have access to restricted packages +++ if (System.getSecurityManager() != null) { +++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) { +++ cl = null; +++ useBSClsLoader = true; +++ } +++ } +++ ++ try { ++- Class providerClass = getProviderClass(className, cl, doFallback); +++ Class providerClass = getProviderClass(className, cl, doFallback, useBSClsLoader); ++ Object instance = providerClass.newInstance(); ++ if (debug) { // Extra check to avoid computing cl strings ++ dPrint("created new instance of " + providerClass + ++@@ -244,6 +281,7 @@ ++ ++ // First try the Context ClassLoader ++ ClassLoader cl = ss.getContextClassLoader(); +++ boolean useBSClsLoader = false; ++ if (cl != null) { ++ is = ss.getResourceAsStream(cl, serviceId); ++ ++@@ -251,11 +289,13 @@ ++ if (is == null) { ++ cl = FactoryFinder.class.getClassLoader(); ++ is = ss.getResourceAsStream(cl, serviceId); +++ useBSClsLoader = true; ++ } ++ } else { ++ // No Context ClassLoader, try the current ClassLoader ++ cl = FactoryFinder.class.getClassLoader(); ++ is = ss.getResourceAsStream(cl, serviceId); +++ useBSClsLoader = true; ++ } ++ ++ if (is == null) { ++@@ -293,7 +333,7 @@ ++ // ClassLoader because we want to avoid the case where the ++ // resource file was found using one ClassLoader and the ++ // provider class was instantiated using a different one. ++- return newInstance(factoryClassName, cl, false); +++ return newInstance(factoryClassName, cl, false, useBSClsLoader); ++ } ++ ++ // No provider found ++--- src/javax/xml/stream/FactoryFinder.java 2013-04-16 14:28:09.788157518 +0100 +++++ src/javax/xml/stream/FactoryFinder.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -25,14 +25,12 @@ ++ ++ package javax.xml.stream; ++ ++-import java.io.InputStream; ++-import java.io.IOException; ++-import java.io.File; ++-import java.io.FileInputStream; ++- ++-import java.util.Properties; ++ import java.io.BufferedReader; +++import java.io.File; +++import java.io.IOException; +++import java.io.InputStream; ++ import java.io.InputStreamReader; +++import java.util.Properties; ++ ++ /** ++ * <p>Implements pluggable Datatypes.</p> ++@@ -43,6 +41,8 @@ ++ * @author Santiago.PericasGeertsen@sun.com ++ */ ++ class FactoryFinder { +++ // Check we have access to package. +++ private static final String DEFAULT_PACKAGE = "com.sun.xml.internal."; ++ ++ /** ++ * Internal debug flag. ++@@ -94,18 +94,24 @@ ++ * If the class loader supplied is <code>null</code>, first try using the ++ * context class loader followed by the current (i.e. bootstrap) class ++ * loader. +++ * +++ * Use bootstrap classLoader if cl = null and useBSClsLoader is true ++ */ ++ static private Class getProviderClass(String className, ClassLoader cl, ++- boolean doFallback) throws ClassNotFoundException +++ boolean doFallback, boolean useBSClsLoader) throws ClassNotFoundException ++ { ++ try { ++ if (cl == null) { ++- cl = ss.getContextClassLoader(); ++- if (cl == null) { ++- throw new ClassNotFoundException(); ++- } ++- else { ++- return cl.loadClass(className); +++ if (useBSClsLoader) { +++ return Class.forName(className, true, FactoryFinder.class.getClassLoader()); +++ } else { +++ cl = ss.getContextClassLoader(); +++ if (cl == null) { +++ throw new ClassNotFoundException(); +++ } +++ else { +++ return cl.loadClass(className); +++ } ++ } ++ } ++ else { ++@@ -130,8 +136,8 @@ ++ * @param className Name of the concrete class corresponding to the ++ * service provider ++ * ++- * @param cl ClassLoader to use to load the class, null means to use ++- * the bootstrap ClassLoader +++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code> +++ * current <code>Thread</code>'s context classLoader is used to load the factory class. ++ * ++ * @param doFallback True if the current ClassLoader should be tried as ++ * a fallback if the class is not found using cl ++@@ -139,8 +145,38 @@ ++ static Object newInstance(String className, ClassLoader cl, boolean doFallback) ++ throws ConfigurationError ++ { +++ return newInstance(className, cl, doFallback, false); +++ } +++ +++ /** +++ * Create an instance of a class. Delegates to method +++ * <code>getProviderClass()</code> in order to load the class. +++ * +++ * @param className Name of the concrete class corresponding to the +++ * service provider +++ * +++ * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code> +++ * current <code>Thread</code>'s context classLoader is used to load the factory class. +++ * +++ * @param doFallback True if the current ClassLoader should be tried as +++ * a fallback if the class is not found using cl +++ * +++ * @param useBSClsLoader True if cl=null actually meant bootstrap classLoader. This parameter +++ * is needed since DocumentBuilderFactory/SAXParserFactory defined null as context classLoader. +++ */ +++ static Object newInstance(String className, ClassLoader cl, boolean doFallback, boolean useBSClsLoader) +++ throws ConfigurationError +++ { +++ // make sure we have access to restricted packages +++ if (System.getSecurityManager() != null) { +++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) { +++ cl = null; +++ useBSClsLoader = true; +++ } +++ } +++ ++ try { ++- Class providerClass = getProviderClass(className, cl, doFallback); +++ Class providerClass = getProviderClass(className, cl, doFallback, useBSClsLoader); ++ Object instance = providerClass.newInstance(); ++ if (debug) { // Extra check to avoid computing cl strings ++ dPrint("created new instance of " + providerClass + ++@@ -233,11 +269,11 @@ ++ if (ss.doesFileExist(f)) { ++ dPrint("Read properties file "+f); ++ cacheProps.load(ss.getFileInputStream(f)); ++- } ++- } ++ } ++ } ++ } +++ } +++ } ++ factoryClassName = cacheProps.getProperty(factoryId); ++ ++ if (factoryClassName != null) { ++@@ -276,6 +312,7 @@ ++ ++ // First try the Context ClassLoader ++ ClassLoader cl = ss.getContextClassLoader(); +++ boolean useBSClsLoader = false; ++ if (cl != null) { ++ is = ss.getResourceAsStream(cl, serviceId); ++ ++@@ -283,11 +320,13 @@ ++ if (is == null) { ++ cl = FactoryFinder.class.getClassLoader(); ++ is = ss.getResourceAsStream(cl, serviceId); +++ useBSClsLoader = true; ++ } ++ } else { ++ // No Context ClassLoader, try the current ClassLoader ++ cl = FactoryFinder.class.getClassLoader(); ++ is = ss.getResourceAsStream(cl, serviceId); +++ useBSClsLoader = true; ++ } ++ ++ if (is == null) { ++@@ -325,7 +364,7 @@ ++ // ClassLoader because we want to avoid the case where the ++ // resource file was found using one ClassLoader and the ++ // provider class was instantiated using a different one. ++- return newInstance(factoryClassName, cl, false); +++ return newInstance(factoryClassName, cl, false, useBSClsLoader); ++ } ++ ++ // No provider found ++--- src/javax/xml/validation/SchemaFactoryFinder.java 2013-04-16 14:28:09.800157711 +0100 +++++ src/javax/xml/validation/SchemaFactoryFinder.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -53,6 +53,7 @@ ++ *<p> Take care of restrictions imposed by java security model </p> ++ */ ++ private static SecuritySupport ss = new SecuritySupport(); +++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xerces.internal"; ++ /** ++ * <p>Cache properties for performance.</p> ++ */ ++@@ -212,28 +213,6 @@ ++ } ++ } ++ ++- /** ++- // try to read from $java.home/lib/jaxp.properties ++- try { ++- String javah = ss.getSystemProperty( "java.home" ); ++- String configFile = javah + File.separator + ++- "lib" + File.separator + "jaxp.properties"; ++- File f = new File( configFile ); ++- if( ss.doesFileExist(f)) { ++- sf = loadFromProperty( ++- propertyName,f.getAbsolutePath(), new FileInputStream(f)); ++- if(sf!=null) return sf; ++- } else { ++- debugPrintln("Tried to read "+ f.getAbsolutePath()+", but it doesn't exist."); ++- } ++- } catch(Throwable e) { ++- if( debug ) { ++- debugPrintln("failed to read $java.home/lib/jaxp.properties"); ++- e.printStackTrace(); ++- } ++- } ++- */ ++- ++ // try META-INF/services files ++ Iterator sitr = createServiceFileIterator(); ++ while(sitr.hasNext()) { ++@@ -268,14 +247,20 @@ ++ */ ++ private Class createClass(String className) { ++ Class clazz; +++ // make sure we have access to restricted packages +++ boolean internal = false; +++ if (System.getSecurityManager() != null) { +++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) { +++ internal = true; +++ } +++ } ++ ++- // use approprite ClassLoader ++ try { ++- if (classLoader != null) { ++- clazz = classLoader.loadClass(className); ++- } else { ++- clazz = Class.forName(className); ++- } +++ if (classLoader != null && !internal) { +++ clazz = classLoader.loadClass(className); +++ } else { +++ clazz = Class.forName(className); +++ } ++ } catch (Throwable t) { ++ if(debug) t.printStackTrace(); ++ return null; ++--- src/javax/xml/xpath/XPathFactoryFinder.java 2013-04-16 14:28:09.800157711 +0100 +++++ src/javax/xml/xpath/XPathFactoryFinder.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -47,6 +47,7 @@ ++ * @since 1.5 ++ */ ++ class XPathFactoryFinder { +++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xpath.internal"; ++ ++ private static SecuritySupport ss = new SecuritySupport() ; ++ /** debug support code. */ ++@@ -245,18 +246,25 @@ ++ */ ++ private Class createClass(String className) { ++ Class clazz; ++- ++- // use approprite ClassLoader ++- try { ++- if (classLoader != null) { ++- clazz = classLoader.loadClass(className); ++- } else { ++- clazz = Class.forName(className); ++- } ++- } catch (Throwable t) { ++- if(debug) t.printStackTrace(); ++- return null; +++ // make sure we have access to restricted packages +++ boolean internal = false; +++ if (System.getSecurityManager() != null) { +++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) { +++ internal = true; ++ } +++ } +++ +++ // use approprite ClassLoader +++ try { +++ if (classLoader != null && !internal) { +++ clazz = classLoader.loadClass(className); +++ } else { +++ clazz = Class.forName(className); +++ } +++ } catch (Throwable t) { +++ if(debug) t.printStackTrace(); +++ return null; +++ } ++ ++ return clazz; ++ } ++--- src/org/w3c/dom/bootstrap/DOMImplementationRegistry.java 2013-04-16 14:28:09.808157841 +0100 +++++ src/org/w3c/dom/bootstrap/DOMImplementationRegistry.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -104,6 +104,8 @@ ++ */ ++ private static final String FALLBACK_CLASS = ++ "com.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl"; +++ private static final String DEFAULT_PACKAGE = +++ "com.sun.org.apache.xerces.internal.dom"; ++ /** ++ * Private constructor. ++ * @param srcs Vector List of DOMImplementationSources ++@@ -168,10 +170,15 @@ ++ StringTokenizer st = new StringTokenizer(p); ++ while (st.hasMoreTokens()) { ++ String sourceName = st.nextToken(); ++- // Use context class loader, falling back to Class.forName ++- // if and only if this fails... +++ // make sure we have access to restricted packages +++ boolean internal = false; +++ if (System.getSecurityManager() != null) { +++ if (sourceName != null && sourceName.startsWith(DEFAULT_PACKAGE)) { +++ internal = true; +++ } +++ } ++ Class sourceClass = null; ++- if (classLoader != null) { +++ if (classLoader != null && !internal) { ++ sourceClass = classLoader.loadClass(sourceName); ++ } else { ++ sourceClass = Class.forName(sourceName); ++--- src/org/xml/sax/helpers/NewInstance.java 2013-04-16 14:28:09.832158226 +0100 +++++ src/org/xml/sax/helpers/NewInstance.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -54,9 +54,10 @@ ++ * including versions of Java 2.</p> ++ * ++ * @author Edwin Goei, David Brownell +++ * @version 2.0.1 (sax2r2) ++ */ ++ class NewInstance { ++- +++ private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xerces.internal"; ++ /** ++ * Creates a new instance of the specified class name ++ * ++@@ -66,8 +67,16 @@ ++ throws ClassNotFoundException, IllegalAccessException, ++ InstantiationException ++ { +++ // make sure we have access to restricted packages +++ boolean internal = false; +++ if (System.getSecurityManager() != null) { +++ if (className != null && className.startsWith(DEFAULT_PACKAGE)) { +++ internal = true; +++ } +++ } +++ ++ Class driverClass; ++- if (classLoader == null) { +++ if (classLoader == null || internal) { ++ driverClass = Class.forName(className); ++ } else { ++ driverClass = classLoader.loadClass(className); ++@@ -75,29 +84,4 @@ ++ return driverClass.newInstance(); ++ } ++ ++- /** ++- * Figure out which ClassLoader to use. For JDK 1.2 and later use ++- * the context ClassLoader. ++- */ ++- static ClassLoader getClassLoader () ++- { ++- Method m = null; ++- ++- try { ++- m = Thread.class.getMethod("getContextClassLoader", (Class[]) null); ++- } catch (NoSuchMethodException e) { ++- // Assume that we are running JDK 1.1, use the current ClassLoader ++- return NewInstance.class.getClassLoader(); ++- } ++- ++- try { ++- return (ClassLoader) m.invoke(Thread.currentThread(), (Object[]) null); ++- } catch (IllegalAccessException e) { ++- // assert(false) ++- throw new UnknownError(e.getMessage()); ++- } catch (InvocationTargetException e) { ++- // assert(e.getTargetException() instanceof SecurityException) ++- throw new UnknownError(e.getMessage()); ++- } ++- } ++ } ++--- src/org/xml/sax/helpers/ParserAdapter.java 2013-04-16 14:28:09.836158291 +0100 +++++ src/org/xml/sax/helpers/ParserAdapter.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -74,13 +74,14 @@ ++ * ++ * @since SAX 2.0 ++ * @author David Megginson +++ * @version 2.0.1 (sax2r2) ++ * @see org.xml.sax.helpers.XMLReaderAdapter ++ * @see org.xml.sax.XMLReader ++ * @see org.xml.sax.Parser ++ */ ++ public class ParserAdapter implements XMLReader, DocumentHandler ++ { ++- +++ private static SecuritySupport ss = new SecuritySupport(); ++ ++ //////////////////////////////////////////////////////////////////// ++ // Constructors. ++@@ -102,7 +103,7 @@ ++ { ++ super(); ++ ++- String driver = System.getProperty("org.xml.sax.parser"); +++ String driver = ss.getSystemProperty("org.xml.sax.parser"); ++ ++ try { ++ setup(ParserFactory.makeParser()); ++--- src/org/xml/sax/helpers/ParserFactory.java 2013-04-16 14:28:09.836158291 +0100 +++++ src/org/xml/sax/helpers/ParserFactory.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -30,12 +30,6 @@ ++ ++ package org.xml.sax.helpers; ++ ++-import java.lang.ClassNotFoundException; ++-import java.lang.IllegalAccessException; ++-import java.lang.InstantiationException; ++-import java.lang.SecurityException; ++-import java.lang.ClassCastException; ++- ++ import org.xml.sax.Parser; ++ ++ ++@@ -69,9 +63,10 @@ ++ * interface. ++ * @since SAX 1.0 ++ * @author David Megginson +++ * @version 2.0.1 (sax2r2) ++ */ ++ public class ParserFactory { ++- +++ private static SecuritySupport ss = new SecuritySupport(); ++ ++ /** ++ * Private null constructor. ++@@ -109,7 +104,7 @@ ++ NullPointerException, ++ ClassCastException ++ { ++- String className = System.getProperty("org.xml.sax.parser"); +++ String className = ss.getSystemProperty("org.xml.sax.parser"); ++ if (className == null) { ++ throw new NullPointerException("No value for sax.parser property"); ++ } else { ++@@ -146,7 +141,7 @@ ++ ClassCastException ++ { ++ return (Parser) NewInstance.newInstance ( ++- NewInstance.getClassLoader (), className); +++ ss.getContextClassLoader(), className); ++ } ++ ++ } ++--- src/org/xml/sax/helpers/SecuritySupport.java 1970-01-01 01:00:00.000000000 +0100 +++++ src/org/xml/sax/helpers/SecuritySupport.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -0,0 +1,108 @@ +++/* +++ * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. +++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +++ * +++ * This code is free software; you can redistribute it and/or modify it +++ * under the terms of the GNU General Public License version 2 only, as +++ * published by the Free Software Foundation. Oracle designates this +++ * particular file as subject to the "Classpath" exception as provided +++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +++ * or visit www.oracle.com if you need additional information or have any +++ * questions. +++ */ +++ +++package org.xml.sax.helpers; +++ +++import java.io.*; +++import java.security.*; +++ +++/** +++ * This class is duplicated for each JAXP subpackage so keep it in sync. +++ * It is package private and therefore is not exposed as part of the JAXP +++ * API. +++ * +++ * Security related methods that only work on J2SE 1.2 and newer. +++ */ +++class SecuritySupport { +++ +++ +++ ClassLoader getContextClassLoader() throws SecurityException{ +++ return (ClassLoader) +++ AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ ClassLoader cl = null; +++ //try { +++ cl = Thread.currentThread().getContextClassLoader(); +++ //} catch (SecurityException ex) { } +++ +++ if (cl == null) +++ cl = ClassLoader.getSystemClassLoader(); +++ +++ return cl; +++ } +++ }); +++ } +++ +++ String getSystemProperty(final String propName) { +++ return (String) +++ AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return System.getProperty(propName); +++ } +++ }); +++ } +++ +++ FileInputStream getFileInputStream(final File file) +++ throws FileNotFoundException +++ { +++ try { +++ return (FileInputStream) +++ AccessController.doPrivileged(new PrivilegedExceptionAction() { +++ public Object run() throws FileNotFoundException { +++ return new FileInputStream(file); +++ } +++ }); +++ } catch (PrivilegedActionException e) { +++ throw (FileNotFoundException)e.getException(); +++ } +++ } +++ +++ InputStream getResourceAsStream(final ClassLoader cl, +++ final String name) +++ { +++ return (InputStream) +++ AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ InputStream ris; +++ if (cl == null) { +++ ris = Object.class.getResourceAsStream(name); +++ } else { +++ ris = cl.getResourceAsStream(name); +++ } +++ return ris; +++ } +++ }); +++ } +++ +++ boolean doesFileExist(final File f) { +++ return ((Boolean) +++ AccessController.doPrivileged(new PrivilegedAction() { +++ public Object run() { +++ return new Boolean(f.exists()); +++ } +++ })).booleanValue(); +++ } +++ +++} ++--- src/org/xml/sax/helpers/XMLReaderFactory.java 2013-04-16 14:28:09.836158291 +0100 +++++ src/org/xml/sax/helpers/XMLReaderFactory.java 2013-04-16 14:29:26.569394704 +0100 ++@@ -34,8 +34,6 @@ ++ import java.io.BufferedReader; ++ import java.io.InputStream; ++ import java.io.InputStreamReader; ++-import java.security.AccessController; ++-import java.security.PrivilegedAction; ++ import org.xml.sax.XMLReader; ++ import org.xml.sax.SAXException; ++ ++@@ -85,8 +83,8 @@ ++ } ++ ++ private static final String property = "org.xml.sax.driver"; +++ private static SecuritySupport ss = new SecuritySupport(); ++ ++- private static String _clsFromJar = null; ++ private static boolean _jarread = false; ++ /** ++ * Attempt to create an XMLReader from system defaults. ++@@ -134,43 +132,45 @@ ++ throws SAXException ++ { ++ String className = null; ++- ClassLoader loader = NewInstance.getClassLoader (); +++ ClassLoader cl = ss.getContextClassLoader(); ++ ++ // 1. try the JVM-instance-wide system property ++- try { className = System.getProperty (property); } ++- catch (RuntimeException e) { /* normally fails for applets */ } +++ try { +++ className = ss.getSystemProperty(property); +++ } +++ catch (RuntimeException e) { /* continue searching */ } ++ ++ // 2. if that fails, try META-INF/services/ ++ if (className == null) { ++ if (!_jarread) { ++- final ClassLoader loader1 = loader; ++ _jarread = true; ++- _clsFromJar = (String) ++- AccessController.doPrivileged(new PrivilegedAction() { ++- public Object run() { ++- String clsName = null; ++- try { ++- String service = "META-INF/services/" + property; ++- InputStream in; ++- BufferedReader reader; ++- if (loader1 == null) ++- in = ClassLoader.getSystemResourceAsStream (service); ++- else ++- in = loader1.getResourceAsStream (service); ++- ++- if (in != null) { ++- reader = new BufferedReader ( ++- new InputStreamReader (in, "UTF8")); ++- clsName = reader.readLine (); ++- in.close (); ++- } ++- } catch (Exception e) { +++ String service = "META-INF/services/" + property; +++ InputStream in; +++ BufferedReader reader; +++ +++ try { +++ if (cl != null) { +++ in = ss.getResourceAsStream(cl, service); +++ +++ // If no provider found then try the current ClassLoader +++ if (in == null) { +++ cl = null; +++ in = ss.getResourceAsStream(cl, service); ++ } ++- return clsName; +++ } else { +++ // No Context ClassLoader, try the current ClassLoader +++ in = ss.getResourceAsStream(cl, service); ++ } ++- }); +++ +++ if (in != null) { +++ reader = new BufferedReader ( +++ new InputStreamReader (in, "UTF8")); +++ className = reader.readLine (); +++ in.close (); +++ } +++ } catch (Exception e) { +++ } ++ } ++- className = _clsFromJar; ++ } ++ ++ // 3. Distro-specific fallback ++@@ -187,7 +187,7 @@ ++ ++ // do we know the XMLReader implementation class yet? ++ if (className != null) ++- return loadClass (loader, className); +++ return loadClass (cl, className); ++ ++ // 4. panic -- adapt any SAX1 parser ++ try { ++@@ -217,7 +217,7 @@ ++ public static XMLReader createXMLReader (String className) ++ throws SAXException ++ { ++- return loadClass (NewInstance.getClassLoader (), className); +++ return loadClass (ss.getContextClassLoader(), className); ++ } ++ ++ private static XMLReader loadClass (ClassLoader loader, String className) +--- jdk/src/share/lib/security/java.security 2013-04-16 14:28:12.392199476 +0100 ++++ jdk/src/share/lib/security/java.security 2013-04-16 14:29:26.545394318 +0100 +@@ -130,10 +130,27 @@ + package.access=sun.,\ + com.sun.xml.internal.bind.,\ + com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.stream.,\ + com.sun.xml.internal.ws.,\ + com.sun.imageio.,\ + com.sun.istack.internal.,\ +- com.sun.jmx. ++ com.sun.jmx.,\ ++ com.sun.org.apache.bcel.internal.,\ ++ com.sun.org.apache.regexp.internal.,\ ++ com.sun.org.apache.xerces.internal.,\ ++ com.sun.org.apache.xpath.internal.,\ ++ com.sun.org.apache.xalan.internal.extensions.,\ ++ com.sun.org.apache.xalan.internal.lib.,\ ++ com.sun.org.apache.xalan.internal.res.,\ ++ com.sun.org.apache.xalan.internal.templates.,\ ++ com.sun.org.apache.xalan.internal.xslt.,\ ++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\ ++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\ ++ com.sun.org.apache.xalan.internal.xsltc.trax.,\ ++ com.sun.org.apache.xalan.internal.xsltc.util.,\ ++ com.sun.org.apache.xml.internal.res.,\ ++ com.sun.org.apache.xml.internal.serializer.utils.,\ ++ com.sun.org.apache.xml.internal.utils. + + # + # List of comma-separated packages that start with or equal this string +@@ -148,10 +165,27 @@ + package.definition=sun.,\ + com.sun.xml.internal.bind.,\ + com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.stream.,\ + com.sun.xml.internal.ws.,\ + com.sun.imageio.,\ + com.sun.istack.internal.,\ +- com.sun.jmx. ++ com.sun.jmx.,\ ++ com.sun.org.apache.bcel.internal.,\ ++ com.sun.org.apache.regexp.internal.,\ ++ com.sun.org.apache.xerces.internal.,\ ++ com.sun.org.apache.xpath.internal.,\ ++ com.sun.org.apache.xalan.internal.extensions.,\ ++ com.sun.org.apache.xalan.internal.lib.,\ ++ com.sun.org.apache.xalan.internal.res.,\ ++ com.sun.org.apache.xalan.internal.templates.,\ ++ com.sun.org.apache.xalan.internal.xslt.,\ ++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\ ++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\ ++ com.sun.org.apache.xalan.internal.xsltc.trax.,\ ++ com.sun.org.apache.xalan.internal.xsltc.util.,\ ++ com.sun.org.apache.xml.internal.res.,\ ++ com.sun.org.apache.xml.internal.serializer.utils.,\ ++ com.sun.org.apache.xml.internal.utils. + + # + # Determines whether this properties file can be appended to +--- jdk/src/share/lib/security/java.security-solaris 2013-04-16 14:28:12.396199540 +0100 ++++ jdk/src/share/lib/security/java.security-solaris 2013-04-16 14:30:42.026610629 +0100 +@@ -131,10 +131,27 @@ + package.access=sun.,\ + com.sun.xml.internal.bind.,\ + com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.stream.,\ + com.sun.xml.internal.ws.,\ + com.sun.imageio. + com.sun.istack.internal.,\ +- com.sun.jmx. ++ com.sun.jmx.,\ ++ com.sun.org.apache.bcel.internal.,\ ++ com.sun.org.apache.regexp.internal.,\ ++ com.sun.org.apache.xerces.internal.,\ ++ com.sun.org.apache.xpath.internal.,\ ++ com.sun.org.apache.xalan.internal.extensions.,\ ++ com.sun.org.apache.xalan.internal.lib.,\ ++ com.sun.org.apache.xalan.internal.res.,\ ++ com.sun.org.apache.xalan.internal.templates.,\ ++ com.sun.org.apache.xalan.internal.xslt.,\ ++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\ ++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\ ++ com.sun.org.apache.xalan.internal.xsltc.trax.,\ ++ com.sun.org.apache.xalan.internal.xsltc.util.,\ ++ com.sun.org.apache.xml.internal.res.,\ ++ com.sun.org.apache.xml.internal.serializer.utils.,\ ++ com.sun.org.apache.xml.internal.utils. + + # + # List of comma-separated packages that start with or equal this string +@@ -149,10 +166,27 @@ + package.definition=sun.,\ + com.sun.xml.internal.bind.,\ + com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.stream.,\ + com.sun.xml.internal.ws.,\ + com.sun.imageio. + com.sun.istack.internal.,\ +- com.sun.jmx. ++ com.sun.jmx.,\ ++ com.sun.org.apache.bcel.internal.,\ ++ com.sun.org.apache.regexp.internal.,\ ++ com.sun.org.apache.xerces.internal.,\ ++ com.sun.org.apache.xpath.internal.,\ ++ com.sun.org.apache.xalan.internal.extensions.,\ ++ com.sun.org.apache.xalan.internal.lib.,\ ++ com.sun.org.apache.xalan.internal.res.,\ ++ com.sun.org.apache.xalan.internal.templates.,\ ++ com.sun.org.apache.xalan.internal.xslt.,\ ++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\ ++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\ ++ com.sun.org.apache.xalan.internal.xsltc.trax.,\ ++ com.sun.org.apache.xalan.internal.xsltc.util.,\ ++ com.sun.org.apache.xml.internal.res.,\ ++ com.sun.org.apache.xml.internal.serializer.utils.,\ ++ com.sun.org.apache.xml.internal.utils. + + # + # Determines whether this properties file can be appended to +--- jdk/src/share/lib/security/java.security-windows 2013-04-16 14:28:12.396199540 +0100 ++++ jdk/src/share/lib/security/java.security-windows 2013-04-16 14:31:35.027464728 +0100 +@@ -131,10 +131,27 @@ + package.access=sun.,\ + com.sun.xml.internal.bind.,\ + com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.stream.,\ + com.sun.xml.internal.ws.,\ + com.sun.imageio. + com.sun.istack.internal.,\ +- com.sun.jmx. ++ com.sun.jmx.,\ ++ com.sun.org.apache.bcel.internal.,\ ++ com.sun.org.apache.regexp.internal.,\ ++ com.sun.org.apache.xerces.internal.,\ ++ com.sun.org.apache.xpath.internal.,\ ++ com.sun.org.apache.xalan.internal.extensions.,\ ++ com.sun.org.apache.xalan.internal.lib.,\ ++ com.sun.org.apache.xalan.internal.res.,\ ++ com.sun.org.apache.xalan.internal.templates.,\ ++ com.sun.org.apache.xalan.internal.xslt.,\ ++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\ ++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\ ++ com.sun.org.apache.xalan.internal.xsltc.trax.,\ ++ com.sun.org.apache.xalan.internal.xsltc.util.,\ ++ com.sun.org.apache.xml.internal.res.,\ ++ com.sun.org.apache.xml.internal.serializer.utils.,\ ++ com.sun.org.apache.xml.internal.utils. + + # + # List of comma-separated packages that start with or equal this string +@@ -149,10 +166,27 @@ + package.definition=sun.,\ + com.sun.xml.internal.bind.,\ + com.sun.xml.internal.org.jvnet.staxex.,\ ++ com.sun.xml.internal.stream.,\ + com.sun.xml.internal.ws.,\ + com.sun.imageio. + com.sun.istack.internal.,\ +- com.sun.jmx. ++ com.sun.jmx.,\ ++ com.sun.org.apache.bcel.internal.,\ ++ com.sun.org.apache.regexp.internal.,\ ++ com.sun.org.apache.xerces.internal.,\ ++ com.sun.org.apache.xpath.internal.,\ ++ com.sun.org.apache.xalan.internal.extensions.,\ ++ com.sun.org.apache.xalan.internal.lib.,\ ++ com.sun.org.apache.xalan.internal.res.,\ ++ com.sun.org.apache.xalan.internal.templates.,\ ++ com.sun.org.apache.xalan.internal.xslt.,\ ++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\ ++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\ ++ com.sun.org.apache.xalan.internal.xsltc.trax.,\ ++ com.sun.org.apache.xalan.internal.xsltc.util.,\ ++ com.sun.org.apache.xml.internal.res.,\ ++ com.sun.org.apache.xml.internal.serializer.utils.,\ ++ com.sun.org.apache.xml.internal.utils. + + # + # Determines whether this properties file can be appended to diff --git a/java/openjdk6/files/icedtea/security/20130416/7200507.patch b/java/openjdk6/files/icedtea/security/20130416/7200507.patch new file mode 100644 index 000000000000..db3c012bf638 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/7200507.patch @@ -0,0 +1,230 @@ +# HG changeset patch +# User malenkov +# Date 1360332416 -14400 +# Node ID b2b6ab9d345561a349b840b4d0f18ef9bb9911e4 +# Parent 4d66f7ebcf99c1b322f47ff0aa6adadcd995f8f4 +7200507: Refactor Introspector internals +Reviewed-by: ahgross, art + +diff --git a/src/share/classes/java/beans/ThreadGroupContext.java b/src/share/classes/java/beans/ThreadGroupContext.java +--- jdk/src/share/classes/java/beans/ThreadGroupContext.java ++++ jdk/src/share/classes/java/beans/ThreadGroupContext.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * 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 com.sun.beans.finder.PropertyEditorFinder; + + import java.awt.GraphicsEnvironment; +-import java.util.HashMap; + import java.util.Map; + import java.util.WeakHashMap; + +@@ -42,7 +41,7 @@ + */ + final class ThreadGroupContext { + +- private static final Map<ThreadGroup, ThreadGroupContext> contexts = new WeakHashMap<ThreadGroup, ThreadGroupContext>(); ++ private static final WeakIdentityMap<ThreadGroupContext> contexts = new WeakIdentityMap<ThreadGroupContext>(); + + /** + * Returns the appropriate {@code AppContext} for the caller, +@@ -69,6 +68,8 @@ + private BeanInfoFinder beanInfoFinder; + private PropertyEditorFinder propertyEditorFinder; + ++ private ThreadGroupContext() { ++ } + + boolean isDesignTime() { + return this.isDesignTime; +diff --git a/src/share/classes/java/beans/WeakIdentityMap.java b/src/share/classes/java/beans/WeakIdentityMap.java +new file mode 100644 +--- /dev/null ++++ jdk/src/share/classes/java/beans/WeakIdentityMap.java +@@ -0,0 +1,181 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package java.beans; ++ ++import java.lang.ref.ReferenceQueue; ++import java.lang.ref.WeakReference; ++ ++/** ++ * Hash table based mapping, which uses weak references to store keys ++ * and reference-equality in place of object-equality to compare them. ++ * An entry will automatically be removed when its key is no longer ++ * in ordinary use. Both null values and the null key are supported. ++ * ++ * @see java.util.IdentityHashMap ++ * @see java.util.WeakHashMap ++ */ ++final class WeakIdentityMap<T> { ++ ++ private static final int MAXIMUM_CAPACITY = 1 << 30; // it MUST be a power of two ++ private static final Object NULL = new Object(); // special object for null key ++ ++ private final ReferenceQueue<Object> queue = new ReferenceQueue<Object>(); ++ ++ private Entry<T>[] table = newTable(1<<3); // table's length MUST be a power of two ++ private int threshold = 6; // the next size value at which to resize ++ private int size = 0; // the number of key-value mappings ++ ++ public T get(Object key) { ++ removeStaleEntries(); ++ if (key == null) { ++ key = NULL; ++ } ++ int hash = key.hashCode(); ++ int index = getIndex(this.table, hash); ++ for (Entry<T> entry = this.table[index]; entry != null; entry = entry.next) { ++ if (entry.isMatched(key, hash)) { ++ return entry.value; ++ } ++ } ++ return null; ++ } ++ ++ public T put(Object key, T value) { ++ removeStaleEntries(); ++ if (key == null) { ++ key = NULL; ++ } ++ int hash = key.hashCode(); ++ int index = getIndex(this.table, hash); ++ for (Entry<T> entry = this.table[index]; entry != null; entry = entry.next) { ++ if (entry.isMatched(key, hash)) { ++ T oldValue = entry.value; ++ entry.value = value; ++ return oldValue; ++ } ++ } ++ this.table[index] = new Entry<T>(key, hash, value, this.queue, this.table[index]); ++ if (++this.size >= this.threshold) { ++ if (this.table.length == MAXIMUM_CAPACITY) { ++ this.threshold = Integer.MAX_VALUE; ++ } ++ else { ++ removeStaleEntries(); ++ Entry<T>[] table = newTable(this.table.length * 2); ++ transfer(this.table, table); ++ ++ // If ignoring null elements and processing ref queue caused massive ++ // shrinkage, then restore old table. This should be rare, but avoids ++ // unbounded expansion of garbage-filled tables. ++ if (this.size >= this.threshold / 2) { ++ this.table = table; ++ this.threshold *= 2; ++ } ++ else { ++ transfer(table, this.table); ++ } ++ } ++ } ++ return null; ++ } ++ ++ private void removeStaleEntries() { ++ for (Object ref = this.queue.poll(); ref != null; ref = this.queue.poll()) { ++ @SuppressWarnings("unchecked") ++ Entry<T> entry = (Entry<T>) ref; ++ int index = getIndex(this.table, entry.hash); ++ ++ Entry<T> prev = this.table[index]; ++ Entry<T> current = prev; ++ while (current != null) { ++ Entry<T> next = current.next; ++ if (current == entry) { ++ if (prev == entry) { ++ this.table[index] = next; ++ } ++ else { ++ prev.next = next; ++ } ++ entry.value = null; // Help GC ++ entry.next = null; // Help GC ++ this.size--; ++ break; ++ } ++ prev = current; ++ current = next; ++ } ++ } ++ } ++ ++ private void transfer(Entry<T>[] oldTable, Entry<T>[] newTable) { ++ for (int i = 0; i < oldTable.length; i++) { ++ Entry<T> entry = oldTable[i]; ++ oldTable[i] = null; ++ while (entry != null) { ++ Entry<T> next = entry.next; ++ Object key = entry.get(); ++ if (key == null) { ++ entry.value = null; // Help GC ++ entry.next = null; // Help GC ++ this.size--; ++ } ++ else { ++ int index = getIndex(newTable, entry.hash); ++ entry.next = newTable[index]; ++ newTable[index] = entry; ++ } ++ entry = next; ++ } ++ } ++ } ++ ++ ++ @SuppressWarnings("unchecked") ++ private Entry<T>[] newTable(int length) { ++ return (Entry<T>[]) new Entry<?>[length]; ++ } ++ ++ private static int getIndex(Entry<?>[] table, int hash) { ++ return hash & (table.length - 1); ++ } ++ ++ private static class Entry<T> extends WeakReference<Object> { ++ private final int hash; ++ private T value; ++ private Entry<T> next; ++ ++ Entry(Object key, int hash, T value, ReferenceQueue<Object> queue, Entry<T> next) { ++ super(key, queue); ++ this.hash = hash; ++ this.value = value; ++ this.next = next; ++ } ++ ++ boolean isMatched(Object key, int hash) { ++ return (this.hash == hash) && (key == get()); ++ } ++ } ++} diff --git a/java/openjdk6/files/icedtea/security/20130416/8000724.patch b/java/openjdk6/files/icedtea/security/20130416/8000724.patch new file mode 100644 index 000000000000..c288d52a497c --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8000724.patch @@ -0,0 +1,1368 @@ +# HG changeset patch +# User andrew +# Date 1365736051 -3600 +# Node ID a5bbb8808ac9a6a8e20c5f267044bb0cef0bbdc1 +# Parent a98937f9777091ef36ec58b79962336d2b1ae538 +8000724: Improve networking serialization +Summary: delegate InetAddress fields to a holder object +Reviewed-by: alanb, chegar + +diff --git a/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java b/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java +--- jdk/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java ++++ jdk/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java +@@ -114,7 +114,7 @@ + * not connected already. + */ + protected void disconnect() { +- disconnect0(connectedAddress.family); ++ disconnect0(connectedAddress.holder().getFamily()); + connected = false; + connectedAddress = null; + connectedPort = -1; +diff --git a/src/share/classes/java/net/Inet4Address.java b/src/share/classes/java/net/Inet4Address.java +--- jdk/src/share/classes/java/net/Inet4Address.java ++++ jdk/src/share/classes/java/net/Inet4Address.java +@@ -102,27 +102,28 @@ + + Inet4Address() { + super(); +- hostName = null; +- address = 0; +- family = IPv4; ++ holder().hostName = null; ++ holder().address = 0; ++ holder().family = IPv4; + } + + Inet4Address(String hostName, byte addr[]) { +- this.hostName = hostName; +- this.family = IPv4; ++ holder().hostName = hostName; ++ holder().family = IPv4; + if (addr != null) { + if (addr.length == INADDRSZ) { +- address = addr[3] & 0xFF; ++ int address = addr[3] & 0xFF; + address |= ((addr[2] << 8) & 0xFF00); + address |= ((addr[1] << 16) & 0xFF0000); + address |= ((addr[0] << 24) & 0xFF000000); ++ holder().address = address; + } + } + } + Inet4Address(String hostName, int address) { +- this.hostName = hostName; +- this.family = IPv4; +- this.address = address; ++ holder().hostName = hostName; ++ holder().family = IPv4; ++ holder().address = address; + } + + /** +@@ -136,8 +137,8 @@ + private Object writeReplace() throws ObjectStreamException { + // will replace the to be serialized 'this' object + InetAddress inet = new InetAddress(); +- inet.hostName = this.hostName; +- inet.address = this.address; ++ inet.holder().hostName = holder().getHostName(); ++ inet.holder().address = holder().getAddress(); + + /** + * Prior to 1.4 an InetAddress was created with a family +@@ -145,7 +146,7 @@ + * For compatibility reasons we must therefore write the + * the InetAddress with this family. + */ +- inet.family = 2; ++ inet.holder().family = 2; + + return inet; + } +@@ -159,7 +160,7 @@ + * @since JDK1.1 + */ + public boolean isMulticastAddress() { +- return ((address & 0xf0000000) == 0xe0000000); ++ return ((holder().getAddress() & 0xf0000000) == 0xe0000000); + } + + /** +@@ -169,7 +170,7 @@ + * @since 1.4 + */ + public boolean isAnyLocalAddress() { +- return address == 0; ++ return holder().getAddress() == 0; + } + + /** +@@ -198,6 +199,7 @@ + // defined in "Documenting Special Use IPv4 Address Blocks + // that have been Registered with IANA" by Bill Manning + // draft-manning-dsua-06.txt ++ int address = holder().getAddress(); + return (((address >>> 24) & 0xFF) == 169) + && (((address >>> 16) & 0xFF) == 254); + } +@@ -214,6 +216,7 @@ + // 10/8 prefix + // 172.16/12 prefix + // 192.168/16 prefix ++ int address = holder().getAddress(); + return (((address >>> 24) & 0xFF) == 10) + || ((((address >>> 24) & 0xFF) == 172) + && (((address >>> 16) & 0xF0) == 16)) +@@ -260,6 +263,7 @@ + */ + public boolean isMCLinkLocal() { + // 224.0.0/24 prefix and ttl == 1 ++ int address = holder().getAddress(); + return (((address >>> 24) & 0xFF) == 224) + && (((address >>> 16) & 0xFF) == 0) + && (((address >>> 8) & 0xFF) == 0); +@@ -275,6 +279,7 @@ + */ + public boolean isMCSiteLocal() { + // 239.255/16 prefix or ttl < 32 ++ int address = holder().getAddress(); + return (((address >>> 24) & 0xFF) == 239) + && (((address >>> 16) & 0xFF) == 255); + } +@@ -290,6 +295,7 @@ + */ + public boolean isMCOrgLocal() { + // 239.192 - 239.195 ++ int address = holder().getAddress(); + return (((address >>> 24) & 0xFF) == 239) + && (((address >>> 16) & 0xFF) >= 192) + && (((address >>> 16) & 0xFF) <= 195); +@@ -303,6 +309,7 @@ + * @return the raw IP address of this object. + */ + public byte[] getAddress() { ++ int address = holder().getAddress(); + byte[] addr = new byte[INADDRSZ]; + + addr[0] = (byte) ((address >>> 24) & 0xFF); +@@ -328,7 +335,7 @@ + * @return a hash code value for this IP address. + */ + public int hashCode() { +- return address; ++ return holder().getAddress(); + } + + /** +@@ -349,7 +356,7 @@ + */ + public boolean equals(Object obj) { + return (obj != null) && (obj instanceof Inet4Address) && +- (((InetAddress)obj).address == address); ++ (((InetAddress)obj).holder().getAddress() == holder().getAddress()); + } + + // Utilities +diff --git a/src/share/classes/java/net/Inet4AddressImpl.java b/src/share/classes/java/net/Inet4AddressImpl.java +--- jdk/src/share/classes/java/net/Inet4AddressImpl.java ++++ jdk/src/share/classes/java/net/Inet4AddressImpl.java +@@ -40,7 +40,7 @@ + public synchronized InetAddress anyLocalAddress() { + if (anyLocalAddress == null) { + anyLocalAddress = new Inet4Address(); // {0x00,0x00,0x00,0x00} +- anyLocalAddress.hostName = "0.0.0.0"; ++ anyLocalAddress.holder().hostName = "0.0.0.0"; + } + return anyLocalAddress; + } +diff --git a/src/share/classes/java/net/Inet6Address.java b/src/share/classes/java/net/Inet6Address.java +--- jdk/src/share/classes/java/net/Inet6Address.java ++++ jdk/src/share/classes/java/net/Inet6Address.java +@@ -216,18 +216,18 @@ + + Inet6Address() { + super(); +- hostName = null; ++ holder().hostName = null; + ipaddress = new byte[INADDRSZ]; +- family = IPv6; ++ holder().family = IPv6; + } + + /* checking of value for scope_id should be done by caller + * scope_id must be >= 0, or -1 to indicate not being set + */ + Inet6Address(String hostName, byte addr[], int scope_id) { +- this.hostName = hostName; ++ holder().hostName = hostName; + if (addr.length == INADDRSZ) { // normal IPv6 address +- family = IPv6; ++ holder().family = IPv6; + ipaddress = addr.clone(); + } + if (scope_id >= 0) { +@@ -328,9 +328,9 @@ + } + + private void initif(String hostName, byte addr[],NetworkInterface nif) throws UnknownHostException { +- this.hostName = hostName; ++ holder().hostName = hostName; + if (addr.length == INADDRSZ) { // normal IPv6 address +- family = IPv6; ++ holder().family = IPv6; + ipaddress = addr.clone(); + } + if (nif != null) { +@@ -415,6 +415,11 @@ + throws IOException, ClassNotFoundException { + scope_ifname = null; + scope_ifname_set = false; ++ ++ if (getClass().getClassLoader() != null) { ++ throw new SecurityException ("invalid address type"); ++ } ++ + s.defaultReadObject(); + + if (ifname != null && !"".equals (ifname)) { +@@ -446,7 +451,7 @@ + ipaddress.length); + } + +- if (family != IPv6) { ++ if (holder().getFamily() != IPv6) { + throw new InvalidObjectException("invalid address family type"); + } + } +diff --git a/src/share/classes/java/net/Inet6AddressImpl.java b/src/share/classes/java/net/Inet6AddressImpl.java +--- jdk/src/share/classes/java/net/Inet6AddressImpl.java ++++ jdk/src/share/classes/java/net/Inet6AddressImpl.java +@@ -81,7 +81,7 @@ + if (anyLocalAddress == null) { + if (InetAddress.preferIPv6Address) { + anyLocalAddress = new Inet6Address(); +- anyLocalAddress.hostName = "::"; ++ anyLocalAddress.holder().hostName = "::"; + } else { + anyLocalAddress = (new Inet4AddressImpl()).anyLocalAddress(); + } +diff --git a/src/share/classes/java/net/InetAddress.java b/src/share/classes/java/net/InetAddress.java +--- jdk/src/share/classes/java/net/InetAddress.java ++++ jdk/src/share/classes/java/net/InetAddress.java +@@ -34,8 +34,12 @@ + import java.util.ArrayList; + import java.security.AccessController; + import java.io.ObjectStreamException; ++import java.io.ObjectStreamField; + import java.io.IOException; + import java.io.ObjectInputStream; ++import java.io.ObjectInputStream.GetField; ++import java.io.ObjectOutputStream; ++import java.io.ObjectOutputStream.PutField; + import sun.security.action.*; + import sun.net.InetAddressCachePolicy; + import sun.net.util.IPAddressUtil; +@@ -196,25 +200,47 @@ + /* Specify address family preference */ + static transient boolean preferIPv6Address = false; + +- /** +- * @serial +- */ +- String hostName; ++ static class InetAddressHolder { + +- /** +- * Holds a 32-bit IPv4 address. +- * +- * @serial +- */ +- int address; ++ InetAddressHolder() {} + +- /** +- * Specifies the address family type, for instance, '1' for IPv4 +- * addresses, and '2' for IPv6 addresses. +- * +- * @serial +- */ +- int family; ++ InetAddressHolder(String hostName, int address, int family) { ++ this.hostName = hostName; ++ this.address = address; ++ this.family = family; ++ } ++ ++ String hostName; ++ ++ String getHostName() { ++ return hostName; ++ } ++ ++ /** ++ * Holds a 32-bit IPv4 address. ++ */ ++ int address; ++ ++ int getAddress() { ++ return address; ++ } ++ ++ /** ++ * Specifies the address family type, for instance, '1' for IPv4 ++ * addresses, and '2' for IPv6 addresses. ++ */ ++ int family; ++ ++ int getFamily() { ++ return family; ++ } ++ } ++ ++ final transient InetAddressHolder holder; ++ ++ InetAddressHolder holder() { ++ return holder; ++ } + + /* Used to store the name service provider */ + private static List<NameService> nameServices = null; +@@ -242,6 +268,7 @@ + * put in the address cache, since it is not created by name. + */ + InetAddress() { ++ holder = new InetAddressHolder(); + } + + /** +@@ -254,7 +281,7 @@ + */ + private Object readResolve() throws ObjectStreamException { + // will replace the deserialized 'this' object +- return new Inet4Address(this.hostName, this.address); ++ return new Inet4Address(holder().getHostName(), holder().getAddress()); + } + + /** +@@ -491,10 +518,10 @@ + * @see SecurityManager#checkConnect + */ + String getHostName(boolean check) { +- if (hostName == null) { +- hostName = InetAddress.getHostFromNameService(this, check); ++ if (holder().getHostName() == null) { ++ holder().hostName = InetAddress.getHostFromNameService(this, check); + } +- return hostName; ++ return holder().getHostName(); + } + + /** +@@ -657,6 +684,7 @@ + * @return a string representation of this IP address. + */ + public String toString() { ++ String hostName = holder().getHostName(); + return ((hostName != null) ? hostName : "") + + "/" + getHostAddress(); + } +@@ -1500,14 +1528,58 @@ + } + } + ++ private static final long FIELDS_OFFSET; ++ private static final sun.misc.Unsafe UNSAFE; ++ ++ static { ++ try { ++ sun.misc.Unsafe unsafe = sun.misc.Unsafe.getUnsafe(); ++ FIELDS_OFFSET = unsafe.objectFieldOffset( ++ InetAddress.class.getDeclaredField("holder") ++ ); ++ UNSAFE = unsafe; ++ } catch (NoSuchFieldException e) { ++ throw new Error(e); ++ } ++ } ++ + private void readObject (ObjectInputStream s) throws + IOException, ClassNotFoundException { +- s.defaultReadObject (); + if (getClass().getClassLoader() != null) { +- hostName = null; +- address = 0; + throw new SecurityException ("invalid address type"); + } ++ GetField gf = s.readFields(); ++ String host = (String)gf.get("hostName", null); ++ int address= gf.get("address", 0); ++ int family= gf.get("family", 0); ++ InetAddressHolder h = new InetAddressHolder(host, address, family); ++ UNSAFE.putObject(this, FIELDS_OFFSET, h); ++ } ++ ++ /* needed because the serializable fields no longer exist */ ++ ++ /** ++ * @serialField hostName String ++ * @serialField address int ++ * @serialField family int ++ */ ++ private static final ObjectStreamField[] serialPersistentFields = { ++ new ObjectStreamField("hostName", String.class), ++ new ObjectStreamField("address", int.class), ++ new ObjectStreamField("family", int.class), ++ }; ++ ++ private void writeObject (ObjectOutputStream s) throws ++ IOException { ++ if (getClass().getClassLoader() != null) { ++ throw new SecurityException ("invalid address type"); ++ } ++ PutField pf = s.putFields(); ++ pf.put("hostName", holder().hostName); ++ pf.put("address", holder().address); ++ pf.put("family", holder().family); ++ s.writeFields(); ++ s.flush(); + } + } + +diff --git a/src/share/classes/java/net/InetSocketAddress.java b/src/share/classes/java/net/InetSocketAddress.java +--- jdk/src/share/classes/java/net/InetSocketAddress.java ++++ jdk/src/share/classes/java/net/InetSocketAddress.java +@@ -87,8 +87,8 @@ + if (hostname != null) + return hostname; + if (addr != null) { +- if (addr.hostName != null) +- return addr.hostName; ++ if (addr.holder().getHostName() != null) ++ return addr.holder().getHostName(); + else + return addr.getHostAddress(); + } +diff --git a/src/share/native/java/net/InetAddress.c b/src/share/native/java/net/InetAddress.c +--- jdk/src/share/native/java/net/InetAddress.c ++++ jdk/src/share/native/java/net/InetAddress.c +@@ -33,8 +33,11 @@ + */ + + jclass ia_class; +-jfieldID ia_addressID; +-jfieldID ia_familyID; ++jclass iac_class; ++jfieldID ia_holderID; ++jfieldID iac_addressID; ++jfieldID iac_familyID; ++jfieldID iac_hostNameID; + jfieldID ia_preferIPv6AddressID; + + /* +@@ -48,10 +51,18 @@ + CHECK_NULL(c); + ia_class = (*env)->NewGlobalRef(env, c); + CHECK_NULL(ia_class); +- ia_addressID = (*env)->GetFieldID(env, ia_class, "address", "I"); +- CHECK_NULL(ia_addressID); +- ia_familyID = (*env)->GetFieldID(env, ia_class, "family", "I"); +- CHECK_NULL(ia_familyID); ++ c = (*env)->FindClass(env,"java/net/InetAddress$InetAddressHolder"); ++ CHECK_NULL(c); ++ iac_class = (*env)->NewGlobalRef(env, c); ++ ia_holderID = (*env)->GetFieldID(env, ia_class, "holder", "Ljava/net/InetAddress$InetAddressHolder;"); ++ CHECK_NULL(ia_holderID); + ia_preferIPv6AddressID = (*env)->GetStaticFieldID(env, ia_class, "preferIPv6Address", "Z"); + CHECK_NULL(ia_preferIPv6AddressID); ++ ++ iac_addressID = (*env)->GetFieldID(env, iac_class, "address", "I"); ++ CHECK_NULL(iac_addressID); ++ iac_familyID = (*env)->GetFieldID(env, iac_class, "family", "I"); ++ CHECK_NULL(iac_familyID); ++ iac_hostNameID = (*env)->GetFieldID(env, iac_class, "hostName", "Ljava/lang/String;"); ++ CHECK_NULL(iac_hostNameID); + } +diff --git a/src/share/native/java/net/net_util.c b/src/share/native/java/net/net_util.c +--- jdk/src/share/native/java/net/net_util.c ++++ jdk/src/share/native/java/net/net_util.c +@@ -84,6 +84,58 @@ + } + } + ++/* The address, and family fields used to be in InetAddress ++ * but are now in an implementation object. So, there is an extra ++ * level of indirection to access them now. ++ */ ++ ++extern jclass iac_class; ++extern jfieldID ia_holderID; ++extern jfieldID iac_addressID; ++extern jfieldID iac_familyID; ++ ++void setInetAddress_addr(JNIEnv *env, jobject iaObj, int address) { ++ jobject holder; ++ init(env); ++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID); ++ (*env)->SetIntField(env, holder, iac_addressID, address); ++} ++ ++void setInetAddress_family(JNIEnv *env, jobject iaObj, int family) { ++ jobject holder; ++ init(env); ++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID); ++ (*env)->SetIntField(env, holder, iac_familyID, family); ++} ++ ++void setInetAddress_hostName(JNIEnv *env, jobject iaObj, jobject host) { ++ jobject holder; ++ init(env); ++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID); ++ (*env)->SetObjectField(env, holder, iac_hostNameID, host); ++} ++ ++int getInetAddress_addr(JNIEnv *env, jobject iaObj) { ++ jobject holder; ++ init(env); ++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID); ++ return (*env)->GetIntField(env, holder, iac_addressID); ++} ++ ++int getInetAddress_family(JNIEnv *env, jobject iaObj) { ++ jobject holder; ++ init(env); ++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID); ++ return (*env)->GetIntField(env, holder, iac_familyID); ++} ++ ++jobject getInetAddress_hostName(JNIEnv *env, jobject iaObj) { ++ jobject holder; ++ init(env); ++ holder = (*env)->GetObjectField(env, iaObj, ia_holderID); ++ return (*env)->GetObjectField(env, holder, iac_hostNameID); ++} ++ + jobject + NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) { + jobject iaObj; +@@ -110,8 +162,8 @@ + iaObj = (*env)->NewObject(env, inet4Cls, ia4_ctrID); + CHECK_NULL_RETURN(iaObj, NULL); + address = NET_IPv4MappedToIPv4(caddr); +- (*env)->SetIntField(env, iaObj, ia_addressID, address); +- (*env)->SetIntField(env, iaObj, ia_familyID, IPv4); ++ setInetAddress_addr(env, iaObj, address); ++ setInetAddress_family(env, iaObj, IPv4); + } else { + static jclass inet6Cls = 0; + if (inet6Cls == 0) { +@@ -130,7 +182,7 @@ + + (*env)->SetObjectField(env, iaObj, ia6_ipaddressID, ipaddress); + +- (*env)->SetIntField(env, iaObj, ia_familyID, IPv6); ++ setInetAddress_family(env, iaObj, IPv6); + (*env)->SetIntField(env, iaObj, ia6_scopeidID, getScopeID(him)); + } + *port = ntohs(him6->sin6_port); +@@ -149,9 +201,8 @@ + } + iaObj = (*env)->NewObject(env, inet4Cls, ia4_ctrID); + CHECK_NULL_RETURN(iaObj, NULL); +- (*env)->SetIntField(env, iaObj, ia_familyID, IPv4); +- (*env)->SetIntField(env, iaObj, ia_addressID, +- ntohl(him4->sin_addr.s_addr)); ++ setInetAddress_family(env, iaObj, IPv4); ++ setInetAddress_addr(env, iaObj, ntohl(him4->sin_addr.s_addr)); + *port = ntohs(him4->sin_port); + } + return iaObj; +@@ -160,8 +211,7 @@ + jint + NET_SockaddrEqualsInetAddress(JNIEnv *env, struct sockaddr *him, jobject iaObj) + { +- jint family = (*env)->GetIntField(env, iaObj, ia_familyID) == IPv4? +- AF_INET : AF_INET6; ++ jint family = getInetAddress_family(env, iaObj) == IPv4?AF_INET : AF_INET6; + + #ifdef AF_INET6 + if (him->sa_family == AF_INET6) { +@@ -178,7 +228,7 @@ + return JNI_FALSE; + } + addrNew = NET_IPv4MappedToIPv4(caddrNew); +- addrCur = (*env)->GetIntField(env, iaObj, ia_addressID); ++ addrCur = getInetAddress_addr(env, iaObj); + if (addrNew == addrCur) { + return JNI_TRUE; + } else { +@@ -210,7 +260,7 @@ + return JNI_FALSE; + } + addrNew = ntohl(him4->sin_addr.s_addr); +- addrCur = (*env)->GetIntField(env, iaObj, ia_addressID); ++ addrCur = getInetAddress_addr(env, iaObj); + if (addrNew == addrCur) { + return JNI_TRUE; + } else { +diff --git a/src/share/native/java/net/net_util.h b/src/share/native/java/net/net_util.h +--- jdk/src/share/native/java/net/net_util.h ++++ jdk/src/share/native/java/net/net_util.h +@@ -53,10 +53,18 @@ + * i.e. psi_timeoutID is PlainSocketImpl's timeout field's ID. + */ + extern jclass ia_class; +-extern jfieldID ia_addressID; +-extern jfieldID ia_familyID; ++extern jfieldID iac_addressID; ++extern jfieldID iac_familyID; ++extern jfieldID iac_hostNameID; + extern jfieldID ia_preferIPv6AddressID; + ++extern void setInetAddress_addr(JNIEnv *env, jobject iaObj, int address); ++extern void setInetAddress_family(JNIEnv *env, jobject iaObj, int family); ++extern void setInetAddress_hostName(JNIEnv *env, jobject iaObj, jobject h); ++extern int getInetAddress_addr(JNIEnv *env, jobject iaObj); ++extern int getInetAddress_family(JNIEnv *env, jobject iaObj); ++extern jobject getInetAddress_hostName(JNIEnv *env, jobject iaObj); ++ + extern jclass ia4_class; + extern jmethodID ia4_ctrID; + +diff --git a/src/solaris/native/java/net/Inet4AddressImpl.c b/src/solaris/native/java/net/Inet4AddressImpl.c +--- jdk/src/solaris/native/java/net/Inet4AddressImpl.c ++++ jdk/src/solaris/native/java/net/Inet4AddressImpl.c +@@ -118,9 +118,6 @@ + static jclass ni_iacls; + static jclass ni_ia4cls; + static jmethodID ni_ia4ctrID; +-static jfieldID ni_iaaddressID; +-static jfieldID ni_iahostID; +-static jfieldID ni_iafamilyID; + static int initialized = 0; + + /* +@@ -153,9 +150,6 @@ + ni_ia4cls = (*env)->FindClass(env, "java/net/Inet4Address"); + ni_ia4cls = (*env)->NewGlobalRef(env, ni_ia4cls); + ni_ia4ctrID = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V"); +- ni_iaaddressID = (*env)->GetFieldID(env, ni_iacls, "address", "I"); +- ni_iafamilyID = (*env)->GetFieldID(env, ni_iacls, "family", "I"); +- ni_iahostID = (*env)->GetFieldID(env, ni_iacls, "hostName", "Ljava/lang/String;"); + initialized = 1; + } + +@@ -229,9 +223,8 @@ + ret = NULL; + goto cleanupAndReturn; + } +- (*env)->SetIntField(env, iaObj, ni_iaaddressID, +- ntohl((*addrp)->s_addr)); +- (*env)->SetObjectField(env, iaObj, ni_iahostID, name); ++ setInetAddress_addr(env, iaObj, ntohl((*addrp)->s_addr)); ++ setInetAddress_hostName(env, iaObj, name); + (*env)->SetObjectArrayElement(env, ret, i, iaObj); + addrp++; + i++; +diff --git a/src/solaris/native/java/net/Inet6AddressImpl.c b/src/solaris/native/java/net/Inet6AddressImpl.c +--- jdk/src/solaris/native/java/net/Inet6AddressImpl.c ++++ jdk/src/solaris/native/java/net/Inet6AddressImpl.c +@@ -120,9 +120,6 @@ + static jclass ni_ia6cls; + static jmethodID ni_ia4ctrID; + static jmethodID ni_ia6ctrID; +-static jfieldID ni_iaaddressID; +-static jfieldID ni_iahostID; +-static jfieldID ni_iafamilyID; + static jfieldID ni_ia6ipaddressID; + static int initialized = 0; + +@@ -161,9 +158,6 @@ + ni_ia6cls = (*env)->NewGlobalRef(env, ni_ia6cls); + ni_ia4ctrID = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V"); + ni_ia6ctrID = (*env)->GetMethodID(env, ni_ia6cls, "<init>", "()V"); +- ni_iaaddressID = (*env)->GetFieldID(env, ni_iacls, "address", "I"); +- ni_iafamilyID = (*env)->GetFieldID(env, ni_iacls, "family", "I"); +- ni_iahostID = (*env)->GetFieldID(env, ni_iacls, "hostName", "Ljava/lang/String;"); + ni_ia6ipaddressID = (*env)->GetFieldID(env, ni_ia6cls, "ipaddress", "[B"); + initialized = 1; + } +@@ -322,9 +316,8 @@ + ret = NULL; + goto cleanupAndReturn; + } +- (*env)->SetIntField(env, iaObj, ni_iaaddressID, +- ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr)); +- (*env)->SetObjectField(env, iaObj, ni_iahostID, name); ++ setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr)); ++ setInetAddress_hostName(env, iaObj, name); + (*env)->SetObjectArrayElement(env, ret, inetIndex, iaObj); + inetIndex++; + } else if (iterator->ai_family == AF_INET6) { +@@ -355,7 +348,7 @@ + (*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE); + } + (*env)->SetObjectField(env, iaObj, ni_ia6ipaddressID, ipaddress); +- (*env)->SetObjectField(env, iaObj, ni_iahostID, name); ++ setInetAddress_hostName(env, iaObj, name); + (*env)->SetObjectArrayElement(env, ret, inet6Index, iaObj); + inet6Index++; + } +diff --git a/src/solaris/native/java/net/NetworkInterface.c b/src/solaris/native/java/net/NetworkInterface.c +--- jdk/src/solaris/native/java/net/NetworkInterface.c ++++ jdk/src/solaris/native/java/net/NetworkInterface.c +@@ -101,8 +101,6 @@ + static jmethodID ni_ia4ctrID; + static jmethodID ni_ia6ctrID; + static jmethodID ni_ibctrID; +-static jfieldID ni_iaaddressID; +-static jfieldID ni_iafamilyID; + static jfieldID ni_ia6ipaddressID; + static jfieldID ni_ibaddressID; + static jfieldID ni_ib4broadcastID; +@@ -153,8 +151,6 @@ + ni_ia4ctrID = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V"); + ni_ia6ctrID = (*env)->GetMethodID(env, ni_ia6cls, "<init>", "()V"); + ni_ibctrID = (*env)->GetMethodID(env, ni_ibcls, "<init>", "()V"); +- ni_iaaddressID = (*env)->GetFieldID(env, ni_iacls, "address", "I"); +- ni_iafamilyID = (*env)->GetFieldID(env, ni_iacls, "family", "I"); + ni_ia6ipaddressID = (*env)->GetFieldID(env, ni_ia6cls, "ipaddress", "[B"); + ni_ibaddressID = (*env)->GetFieldID(env, ni_ibcls, "address", "Ljava/net/InetAddress;"); + ni_ib4broadcastID = (*env)->GetFieldID(env, ni_ibcls, "broadcast", "Ljava/net/Inet4Address;"); +@@ -253,8 +249,7 @@ + (JNIEnv *env, jclass cls, jobject iaObj) { + + netif *ifs, *curr; +- int family = (*env)->GetIntField(env, iaObj, ni_iafamilyID) == IPv4? +- AF_INET : AF_INET6; ++ int family = (getInetAddress_family(env, iaObj) == IPv4) ? AF_INET : AF_INET6; + jobject obj = NULL; + jboolean match = JNI_FALSE; + +@@ -275,7 +270,7 @@ + if (family == addrP->family) { + if (family == AF_INET) { + int address1 = htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr); +- int address2 = (*env)->GetIntField(env, iaObj, ni_iaaddressID); ++ int address2 = getInetAddress_addr(env, iaObj); + + if (address1 == address2) { + match = JNI_TRUE; +@@ -450,8 +445,7 @@ + if (addrP->family == AF_INET) { + iaObj = (*env)->NewObject(env, ni_ia4cls, ni_ia4ctrID); + if (iaObj) { +- (*env)->SetIntField(env, iaObj, ni_iaaddressID, +- htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr)); ++ setInetAddress_addr(env, iaObj, htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr)); + } + ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); + if (ibObj) { +@@ -460,8 +454,7 @@ + jobject ia2Obj = NULL; + ia2Obj = (*env)->NewObject(env, ni_ia4cls, ni_ia4ctrID); + if (ia2Obj) { +- (*env)->SetIntField(env, ia2Obj, ni_iaaddressID, +- htonl(((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr)); ++ setInetAddress_addr(env, ia2Obj, htonl(((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr)); + (*env)->SetObjectField(env, ibObj, ni_ib4broadcastID, ia2Obj); + (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask); + } +diff --git a/src/solaris/native/java/net/PlainDatagramSocketImpl.c b/src/solaris/native/java/net/PlainDatagramSocketImpl.c +--- jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c ++++ jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c +@@ -610,11 +610,10 @@ + } + + iaObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&remote_addr, &port); +- family = (*env)->GetIntField(env, iaObj, ia_familyID) == IPv4? +- AF_INET : AF_INET6; ++ family = getInetAddress_family(env, iaObj) == IPv4? AF_INET : AF_INET6; + if (family == AF_INET) { /* this api can't handle IPV6 addresses */ +- int address = (*env)->GetIntField(env, iaObj, ia_addressID); +- (*env)->SetIntField(env, addressObj, ia_addressID, address); ++ int address = getInetAddress_addr(env, iaObj); ++ setInetAddress_addr(env, addressObj, address); + } + return port; + } +@@ -1142,7 +1141,6 @@ + */ + static void mcast_set_if_by_if_v4(JNIEnv *env, jobject this, int fd, jobject value) { + static jfieldID ni_addrsID; +- static jfieldID ia_addressID; + struct in_addr in; + jobjectArray addrArray; + jsize len; +@@ -1155,10 +1153,6 @@ + ni_addrsID = (*env)->GetFieldID(env, c, "addrs", + "[Ljava/net/InetAddress;"); + CHECK_NULL(ni_addrsID); +- c = (*env)->FindClass(env,"java/net/InetAddress"); +- CHECK_NULL(c); +- ia_addressID = (*env)->GetFieldID(env, c, "address", "I"); +- CHECK_NULL(ia_addressID); + } + + addrArray = (*env)->GetObjectField(env, value, ni_addrsID); +@@ -1179,8 +1173,8 @@ + */ + for (i = 0; i < len; i++) { + addr = (*env)->GetObjectArrayElement(env, addrArray, i); +- if ((*env)->GetIntField(env, addr, ia_familyID) == IPv4) { +- in.s_addr = htonl((*env)->GetIntField(env, addr, ia_addressID)); ++ if (getInetAddress_family(env, addr) == IPv4) { ++ in.s_addr = htonl(getInetAddress_addr(env, addr)); + break; + } + } +@@ -1238,17 +1232,9 @@ + * Throw exception if failed. + */ + static void mcast_set_if_by_addr_v4(JNIEnv *env, jobject this, int fd, jobject value) { +- static jfieldID ia_addressID; + struct in_addr in; + +- if (ia_addressID == NULL) { +- jclass c = (*env)->FindClass(env,"java/net/InetAddress"); +- CHECK_NULL(c); +- ia_addressID = (*env)->GetFieldID(env, c, "address", "I"); +- CHECK_NULL(ia_addressID); +- } +- +- in.s_addr = htonl( (*env)->GetIntField(env, value, ia_addressID) ); ++ in.s_addr = htonl( getInetAddress_addr(env, value) ); + + if (JVM_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF, + (const char*)&in, sizeof(in)) < 0) { +@@ -1583,7 +1569,6 @@ + if (isIPV4) { + static jclass inet4_class; + static jmethodID inet4_ctrID; +- static jfieldID inet4_addrID; + + static jclass ni_class; + static jmethodID ni_ctrID; +@@ -1621,8 +1606,6 @@ + CHECK_NULL_RETURN(c, NULL); + inet4_ctrID = (*env)->GetMethodID(env, c, "<init>", "()V"); + CHECK_NULL_RETURN(inet4_ctrID, NULL); +- inet4_addrID = (*env)->GetFieldID(env, c, "address", "I"); +- CHECK_NULL_RETURN(inet4_addrID, NULL); + inet4_class = (*env)->NewGlobalRef(env, c); + CHECK_NULL_RETURN(inet4_class, NULL); + } +@@ -1630,10 +1613,10 @@ + CHECK_NULL_RETURN(addr, NULL); + + #ifdef __linux__ +- (*env)->SetIntField(env, addr, inet4_addrID, +- (isOldKernel ? ntohl(mreqn.imr_address.s_addr) : ntohl(in.s_addr)) ); ++ setInetAddress_addr(env, addr, (isOldKernel ? ++ ntohl(mreqn.imr_address.s_addr) : ntohl(in.s_addr))); + #else +- (*env)->SetIntField(env, addr, inet4_addrID, ntohl(in.s_addr)); ++ setInetAddress_addr(env, addr, ntohl(in.s_addr)); + #endif + + /* +@@ -2112,7 +2095,7 @@ + ipv6_join_leave = ipv6_available(); + + #ifdef __linux__ +- if ((*env)->GetIntField(env, iaObj, ia_familyID) == IPv4) { ++ if (getInetAddress_family(env, iaObj) == IPv4) { + ipv6_join_leave = JNI_FALSE; + } + #endif +@@ -2159,7 +2142,7 @@ + CHECK_NULL(ni_indexID); + } + +- mname.imr_multiaddr.s_addr = htonl((*env)->GetIntField(env, iaObj, ia_addressID)); ++ mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj)); + mname.imr_address.s_addr = 0; + mname.imr_ifindex = (*env)->GetIntField(env, niObj, ni_indexID); + mname_len = sizeof(struct ip_mreqn); +@@ -2177,11 +2160,11 @@ + } + addr = (*env)->GetObjectArrayElement(env, addrArray, 0); + +- mname.imr_multiaddr.s_addr = htonl((*env)->GetIntField(env, iaObj, ia_addressID)); ++ mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj)); + #ifdef __linux__ +- mname.imr_address.s_addr = htonl((*env)->GetIntField(env, addr, ia_addressID)); ++ mname.imr_address.s_addr = htonl(getInetAddress_addr(env, addr)); + #else +- mname.imr_interface.s_addr = htonl((*env)->GetIntField(env, addr, ia_addressID)); ++ mname.imr_interface.s_addr = htonl(getInetAddress_addr(env, addr)); + #endif + mname_len = sizeof(struct ip_mreq); + } +@@ -2220,7 +2203,7 @@ + } + } + +- mname.imr_multiaddr.s_addr = htonl((*env)->GetIntField(env, iaObj, ia_addressID)); ++ mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj)); + mname.imr_address.s_addr = 0 ; + mname.imr_ifindex = index; + mname_len = sizeof(struct ip_mreqn); +@@ -2250,7 +2233,7 @@ + #else + mname.imr_interface.s_addr = in.s_addr; + #endif +- mname.imr_multiaddr.s_addr = htonl((*env)->GetIntField(env, iaObj, ia_addressID)); ++ mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj)); + mname_len = sizeof(struct ip_mreq); + } + } +@@ -2315,10 +2298,10 @@ + jbyte caddr[16]; + jint family; + jint address; +- family = (*env)->GetIntField(env, iaObj, ia_familyID) == IPv4? AF_INET : AF_INET6; ++ family = getInetAddress_family(env, iaObj) == IPv4? AF_INET : AF_INET6; + if (family == AF_INET) { /* will convert to IPv4-mapped address */ + memset((char *) caddr, 0, 16); +- address = (*env)->GetIntField(env, iaObj, ia_addressID); ++ address = getInetAddress_addr(env, iaObj); + + caddr[10] = 0xff; + caddr[11] = 0xff; +diff --git a/src/solaris/native/java/net/net_util_md.c b/src/solaris/native/java/net/net_util_md.c +--- jdk/src/solaris/native/java/net/net_util_md.c ++++ jdk/src/solaris/native/java/net/net_util_md.c +@@ -675,7 +675,7 @@ + NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr *him, + int *len, jboolean v4MappedAddress) { + jint family; +- family = (*env)->GetIntField(env, iaObj, ia_familyID); ++ family = getInetAddress_family(env, iaObj); + #ifdef AF_INET6 + /* needs work. 1. family 2. clean up him6 etc deallocate memory */ + if (ipv6_available() && !(family == IPv4 && v4MappedAddress == JNI_FALSE)) { +@@ -687,7 +687,7 @@ + + if (family == IPv4) { /* will convert to IPv4-mapped address */ + memset((char *) caddr, 0, 16); +- address = (*env)->GetIntField(env, iaObj, ia_addressID); ++ address = getInetAddress_addr(env, iaObj); + if (address == INADDR_ANY) { + /* we would always prefer IPv6 wildcard address + caddr[10] = 0xff; +@@ -794,7 +794,7 @@ + return -1; + } + memset((char *) him4, 0, sizeof(struct sockaddr_in)); +- address = (*env)->GetIntField(env, iaObj, ia_addressID); ++ address = getInetAddress_addr(env, iaObj); + him4->sin_port = htons((short) port); + him4->sin_addr.s_addr = (uint32_t) htonl(address); + him4->sin_family = AF_INET; +diff --git a/src/windows/native/java/net/Inet4AddressImpl.c b/src/windows/native/java/net/Inet4AddressImpl.c +--- jdk/src/windows/native/java/net/Inet4AddressImpl.c ++++ jdk/src/windows/native/java/net/Inet4AddressImpl.c +@@ -113,9 +113,6 @@ + static jclass ni_iacls; + static jclass ni_ia4cls; + static jmethodID ni_ia4ctrID; +-static jfieldID ni_iaaddressID; +-static jfieldID ni_iahostID; +-static jfieldID ni_iafamilyID; + static int initialized = 0; + + /* +@@ -150,9 +147,6 @@ + ni_ia4cls = (*env)->FindClass(env, "java/net/Inet4Address"); + ni_ia4cls = (*env)->NewGlobalRef(env, ni_ia4cls); + ni_ia4ctrID = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V"); +- ni_iaaddressID = (*env)->GetFieldID(env, ni_iacls, "address", "I"); +- ni_iafamilyID = (*env)->GetFieldID(env, ni_iacls, "family", "I"); +- ni_iahostID = (*env)->GetFieldID(env, ni_iacls, "hostName", "Ljava/lang/String;"); + initialized = 1; + } + +@@ -209,8 +203,7 @@ + ret = NULL; + goto cleanupAndReturn; + } +- (*env)->SetIntField(env, iaObj, ni_iaaddressID, +- ntohl(address)); ++ setInetAddress_addr(env, iaObj, ntohl(address)); + (*env)->SetObjectArrayElement(env, ret, 0, iaObj); + JNU_ReleaseStringPlatformChars(env, host, hostname); + return ret; +@@ -247,9 +240,8 @@ + ret = NULL; + goto cleanupAndReturn; + } +- (*env)->SetIntField(env, iaObj, ni_iaaddressID, +- ntohl((*addrp)->s_addr)); +- (*env)->SetObjectField(env, iaObj, ni_iahostID, name); ++ setInetAddress_addr(env, iaObj, ntohl((*addrp)->s_addr)); ++ setInetAddress_hostName(env, iaObj, name); + (*env)->SetObjectArrayElement(env, ret, i, iaObj); + addrp++; + i++; +diff --git a/src/windows/native/java/net/Inet6AddressImpl.c b/src/windows/native/java/net/Inet6AddressImpl.c +--- jdk/src/windows/native/java/net/Inet6AddressImpl.c ++++ jdk/src/windows/native/java/net/Inet6AddressImpl.c +@@ -76,9 +76,6 @@ + static jclass ni_ia6cls; + static jmethodID ni_ia4ctrID; + static jmethodID ni_ia6ctrID; +-static jfieldID ni_iaaddressID; +-static jfieldID ni_iahostID; +-static jfieldID ni_iafamilyID; + static jfieldID ni_ia6ipaddressID; + static int initialized = 0; + +@@ -103,9 +100,6 @@ + ni_ia6cls = (*env)->NewGlobalRef(env, ni_ia6cls); + ni_ia4ctrID = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V"); + ni_ia6ctrID = (*env)->GetMethodID(env, ni_ia6cls, "<init>", "()V"); +- ni_iaaddressID = (*env)->GetFieldID(env, ni_iacls, "address", "I"); +- ni_iafamilyID = (*env)->GetFieldID(env, ni_iacls, "family", "I"); +- ni_iahostID = (*env)->GetFieldID(env, ni_iacls, "hostName", "Ljava/lang/String;"); + ni_ia6ipaddressID = (*env)->GetFieldID(env, ni_ia6cls, "ipaddress", "[B"); + initialized = 1; + } +@@ -250,9 +244,8 @@ + ret = NULL; + goto cleanupAndReturn; + } +- (*env)->SetIntField(env, iaObj, ni_iaaddressID, +- ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr)); +- (*env)->SetObjectField(env, iaObj, ni_iahostID, name); ++ setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr)); ++ setInetAddress_hostName(env, iaObj, name); + (*env)->SetObjectArrayElement(env, ret, inetIndex, iaObj); + inetIndex ++; + } else if (iterator->ai_family == AF_INET6) { +@@ -276,7 +269,7 @@ + (*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE); + } + (*env)->SetObjectField(env, iaObj, ni_ia6ipaddressID, ipaddress); +- (*env)->SetObjectField(env, iaObj, ni_iahostID, name); ++ setInetAddress_hostName(env, iaObj, name); + (*env)->SetObjectArrayElement(env, ret, inet6Index, iaObj); + inet6Index ++; + } +diff --git a/src/windows/native/java/net/NetworkInterface.c b/src/windows/native/java/net/NetworkInterface.c +--- jdk/src/windows/native/java/net/NetworkInterface.c ++++ jdk/src/windows/native/java/net/NetworkInterface.c +@@ -97,7 +97,6 @@ + jfieldID ni_displayNameID; /* NetworkInterface.displayName */ + jfieldID ni_childsID; /* NetworkInterface.childs */ + jclass ni_iacls; /* InetAddress */ +-jfieldID ni_iaAddr; /* InetAddress.address */ + + jclass ni_ia4cls; /* Inet4Address */ + jmethodID ni_ia4Ctor; /* Inet4Address() */ +@@ -558,7 +557,6 @@ + + ni_iacls = (*env)->FindClass(env, "Ljava/net/InetAddress;"); + ni_iacls = (*env)->NewGlobalRef(env, ni_iacls); +- ni_iaAddr = (*env)->GetFieldID(env, ni_iacls, "address", "I"); + + ni_ia4cls = (*env)->FindClass(env, "Ljava/net/Inet4Address;"); + ni_ia4cls = (*env)->NewGlobalRef(env, ni_ia4cls); +@@ -645,7 +643,7 @@ + } + /* default ctor will set family to AF_INET */ + +- (*env)->SetIntField(env, iaObj, ni_iaAddr, ntohl(addrs->addr.him4.sin_addr.s_addr)); ++ setInetAddress_addr(env, iaObj, ntohl(addrs->addr.him4.sin_addr.s_addr)); + if (addrs->mask != -1) { + ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); + if (ibObj == NULL) { +@@ -658,8 +656,7 @@ + free_netaddr(netaddrP); + return NULL; + } +- (*env)->SetIntField(env, ia2Obj, ni_iaAddr, +- ntohl(addrs->brdcast.him4.sin_addr.s_addr)); ++ setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.him4.sin_addr.s_addr)); + (*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj); + (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask); + (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj); +@@ -811,7 +808,7 @@ + (JNIEnv *env, jclass cls, jobject iaObj) + { + netif *ifList, *curr; +- jint addr = (*env)->GetIntField(env, iaObj, ni_iaAddr); ++ jint addr = getInetAddress_addr(env, iaObj); + jobject netifObj = NULL; + + if (os_supports_ipv6 && ipv6_available()) { +diff --git a/src/windows/native/java/net/NetworkInterface.h b/src/windows/native/java/net/NetworkInterface.h +--- jdk/src/windows/native/java/net/NetworkInterface.h ++++ jdk/src/windows/native/java/net/NetworkInterface.h +@@ -70,7 +70,6 @@ + extern jfieldID ni_childsID; /* NetworkInterface.childs */ + + extern jclass ni_iacls; /* InetAddress */ +-extern jfieldID ni_iaAddr; /* InetAddress.address */ + + extern jclass ni_ia4cls; /* Inet4Address */ + extern jmethodID ni_ia4Ctor; /* Inet4Address() */ +diff --git a/src/windows/native/java/net/NetworkInterface_winXP.c b/src/windows/native/java/net/NetworkInterface_winXP.c +--- jdk/src/windows/native/java/net/NetworkInterface_winXP.c ++++ jdk/src/windows/native/java/net/NetworkInterface_winXP.c +@@ -33,6 +33,7 @@ + #include "jni_util.h" + + #include "NetworkInterface.h" ++#include "net_util.h" + + /* + * Windows implementation of the java.net.NetworkInterface native methods. +@@ -468,7 +469,7 @@ + } + /* default ctor will set family to AF_INET */ + +- (*env)->SetIntField(env, iaObj, ni_iaAddr, ntohl(addrs->addr.him4.sin_addr.s_addr)); ++ setInetAddress_addr(env, iaObj, ntohl(addrs->addr.him4.sin_addr.s_addr)); + + ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); + if (ibObj == NULL) { +@@ -481,8 +482,7 @@ + free_netaddr(netaddrP); + return NULL; + } +- (*env)->SetIntField(env, ia2Obj, ni_iaAddr, +- ntohl(addrs->brdcast.him4.sin_addr.s_addr)); ++ setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.him4.sin_addr.s_addr)); + (*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj); + (*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask); + (*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj); +diff --git a/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c b/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c +--- jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c ++++ jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c +@@ -432,7 +432,7 @@ + int lcladdrlen; + int address; + +- family = (*env)->GetIntField(env, addressObj, ia_familyID); ++ family = getInetAddress_family(env, addressObj); + if (family == IPv6 && !ipv6_supported) { + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", + "Protocol family not supported"); +@@ -452,7 +452,7 @@ + JNU_ThrowNullPointerException(env, "argument address"); + return; + } else { +- address = (*env)->GetIntField(env, addressObj, ia_addressID); ++ address = getInetAddress_addr(env, addressObj); + } + + if (NET_InetAddressToSockaddr(env, addressObj, port, (struct sockaddr *)&lcladdr, &lcladdrlen, JNI_FALSE) != 0) { +@@ -552,9 +552,9 @@ + return; + } + +- addr = (*env)->GetIntField(env, address, ia_addressID); ++ addr = getInetAddress_addr(env, address); + +- family = (*env)->GetIntField(env, address, ia_familyID); ++ family = getInetAddress_family(env, address); + if (family == IPv6 && !ipv6_supported) { + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", + "Protocol family not supported"); +@@ -671,7 +671,7 @@ + return; + } + +- family = (*env)->GetIntField(env, iaObj, ia_familyID); ++ family = getInetAddress_family(env, iaObj); + if (family == IPv4) { + fdObj = (*env)->GetObjectField(env, this, pdsi_fdID); + } else { +@@ -715,7 +715,7 @@ + if (!w2k_or_later) { /* avoid this check on Win 2K or better. Does not work with IPv6. + * Check is not necessary on these OSes */ + if (connected) { +- address = (*env)->GetIntField(env, iaObj, ia_addressID); ++ address = getInetAddress_addr(env, iaObj); + } else { + address = ntohl(rmtaddr.him4.sin_addr.s_addr); + } +@@ -824,7 +824,7 @@ + if (IS_NULL(addressObj)) { + JNU_ThrowNullPointerException(env, "Null address in peek()"); + } else { +- address = (*env)->GetIntField(env, addressObj, ia_addressID); ++ address = getInetAddress_addr(env, addressObj); + /* We only handle IPv4 for now. Will support IPv6 once its in the os */ + family = AF_INET; + } +@@ -906,9 +906,8 @@ + JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException", 0); + return 0; + } +- (*env)->SetIntField(env, addressObj, ia_addressID, +- ntohl(remote_addr.sin_addr.s_addr)); +- (*env)->SetIntField(env, addressObj, ia_familyID, IPv4); ++ setInetAddress_addr(env, addressObj, ntohl(remote_addr.sin_addr.s_addr)); ++ setInetAddress_family(env, addressObj, IPv4); + + /* return port */ + return ntohs(remote_addr.sin_port); +@@ -1578,7 +1577,6 @@ + { + jobjectArray addrArray; + static jfieldID ni_addrsID=0; +- static jfieldID ia_familyID=0; + jsize len; + jobject addr; + int i; +@@ -1589,10 +1587,6 @@ + ni_addrsID = (*env)->GetFieldID(env, c, "addrs", + "[Ljava/net/InetAddress;"); + CHECK_NULL_RETURN (ni_addrsID, -1); +- c = (*env)->FindClass(env,"java/net/InetAddress"); +- CHECK_NULL_RETURN (c, -1); +- ia_familyID = (*env)->GetFieldID(env, c, "family", "I"); +- CHECK_NULL_RETURN (ia_familyID, -1); + } + + addrArray = (*env)->GetObjectField(env, nif, ni_addrsID); +@@ -1610,7 +1604,7 @@ + for (i=0; i<len; i++) { + int fam; + addr = (*env)->GetObjectArrayElement(env, addrArray, i); +- fam = (*env)->GetIntField(env, addr, ia_familyID); ++ fam = getInetAddress_family(env, addr); + if (fam == family) { + *iaddr = addr; + return 0; +@@ -1622,20 +1616,13 @@ + static int getInet4AddrFromIf (JNIEnv *env, jobject nif, struct in_addr *iaddr) + { + jobject addr; +- static jfieldID ia_addressID; + + int ret = getInetAddrFromIf (env, IPv4, nif, &addr); + if (ret == -1) { + return -1; + } + +- if (ia_addressID == 0) { +- jclass c = (*env)->FindClass(env,"java/net/InetAddress"); +- CHECK_NULL_RETURN (c, -1); +- ia_addressID = (*env)->GetFieldID(env, c, "address", "I"); +- CHECK_NULL_RETURN (ia_addressID, -1); +- } +- iaddr->s_addr = htonl((*env)->GetIntField(env, addr, ia_addressID)); ++ iaddr->s_addr = htonl(getInetAddress_addr(env, addr)); + return 0; + } + +@@ -1710,17 +1697,9 @@ + } + opt = java_net_SocketOptions_IP_MULTICAST_IF2; + } else { +- static jfieldID ia_addressID; + struct in_addr in; + +- if (ia_addressID == NULL) { +- jclass c = (*env)->FindClass(env,"java/net/InetAddress"); +- CHECK_NULL(c); +- ia_addressID = (*env)->GetFieldID(env, c, "address", "I"); +- CHECK_NULL(ia_addressID); +- } +- +- in.s_addr = htonl((*env)->GetIntField(env, value, ia_addressID)); ++ in.s_addr = htonl(getInetAddress_addr(env, value)); + + if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, + (const char*)&in, sizeof(in)) < 0) { +@@ -1949,7 +1928,6 @@ + if (isIPV4) { + static jclass inet4_class; + static jmethodID inet4_ctrID; +- static jfieldID inet4_addrID; + + static jclass ni_class; + static jmethodID ni_ctrID; +@@ -1979,15 +1957,13 @@ + CHECK_NULL_RETURN(c, NULL); + inet4_ctrID = (*env)->GetMethodID(env, c, "<init>", "()V"); + CHECK_NULL_RETURN(inet4_ctrID, NULL); +- inet4_addrID = (*env)->GetFieldID(env, c, "address", "I"); +- CHECK_NULL_RETURN(inet4_addrID, NULL); + inet4_class = (*env)->NewGlobalRef(env, c); + CHECK_NULL_RETURN(inet4_class, NULL); + } + addr = (*env)->NewObject(env, inet4_class, inet4_ctrID, 0); + CHECK_NULL_RETURN(addr, NULL); + +- (*env)->SetIntField(env, addr, inet4_addrID, ntohl(in.s_addr)); ++ setInetAddress_addr(env, addr, ntohl(in.s_addr)); + + /* + * For IP_MULTICAST_IF return InetAddress +diff --git a/src/windows/native/java/net/TwoStacksPlainSocketImpl.c b/src/windows/native/java/net/TwoStacksPlainSocketImpl.c +--- jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c ++++ jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c +@@ -410,7 +410,7 @@ + fdObj = (*env)->GetObjectField(env, this, psi_fdID); + fd1Obj = (*env)->GetObjectField(env, this, psi_fd1ID); + +- family = (*env)->GetIntField(env, iaObj, ia_familyID); ++ family = getInetAddress_family(env, iaObj); + + if (family == IPv6 && !ipv6_supported) { + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", +@@ -722,9 +722,8 @@ + return; + } + +- (*env)->SetIntField(env, socketAddressObj, ia_addressID, +- ntohl(him.him4.sin_addr.s_addr)); +- (*env)->SetIntField(env, socketAddressObj, ia_familyID, IPv4); ++ setInetAddress_addr(env, socketAddressObj, ntohl(him.him4.sin_addr.s_addr)); ++ setInetAddress_family(env, socketAddressObj, IPv4); + (*env)->SetObjectField(env, socket, psi_addressID, socketAddressObj); + } else { + jbyteArray addr; +@@ -752,7 +751,7 @@ + } + addr = (*env)->GetObjectField (env, socketAddressObj, ia6_ipaddressID); + (*env)->SetByteArrayRegion (env, addr, 0, 16, (const char *)&him.him6.sin6_addr); +- (*env)->SetIntField(env, socketAddressObj, ia_familyID, IPv6); ++ setInetAddress_family(env, socketAddressObj, IPv6); + (*env)->SetIntField(env, socketAddressObj, ia6_scopeidID, him.him6.sin6_scope_id); + } + /* fields common to AF_INET and AF_INET6 */ +diff --git a/src/windows/native/java/net/net_util_md.c b/src/windows/native/java/net/net_util_md.c +--- jdk/src/windows/native/java/net/net_util_md.c ++++ jdk/src/windows/native/java/net/net_util_md.c +@@ -832,7 +832,7 @@ + NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr *him, + int *len, jboolean v4MappedAddress) { + jint family, iafam; +- iafam = (*env)->GetIntField(env, iaObj, ia_familyID); ++ iafam = getInetAddress_family(env, iaObj); + family = (iafam == IPv4)? AF_INET : AF_INET6; + if (ipv6_available() && !(family == AF_INET && v4MappedAddress == JNI_FALSE)) { + struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him; +@@ -843,7 +843,7 @@ + + if (family == AF_INET) { /* will convert to IPv4-mapped address */ + memset((char *) caddr, 0, 16); +- address = (*env)->GetIntField(env, iaObj, ia_addressID); ++ address = getInetAddress_addr(env, iaObj); + if (address == INADDR_ANY) { + /* we would always prefer IPv6 wildcard address + caddr[10] = 0xff; +@@ -882,7 +882,7 @@ + return -1; + } + memset((char *) him4, 0, sizeof(struct sockaddr_in)); +- address = (int)(*env)->GetIntField(env, iaObj, ia_addressID); ++ address = getInetAddress_addr(env, iaObj); + him4->sin_port = htons((short) port); + him4->sin_addr.s_addr = (u_long) htonl(address); + him4->sin_family = AF_INET; diff --git a/java/openjdk6/files/icedtea/security/20130416/8001031.patch b/java/openjdk6/files/icedtea/security/20130416/8001031.patch new file mode 100644 index 000000000000..288c0e749436 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8001031.patch @@ -0,0 +1,5457 @@ +# HG changeset patch +# User andrew +# Date 1365744917 -3600 +# Node ID d79bfc0c6371d1174209585a8d2bf08e3f3625f9 +# Parent ec8a935f0737e033e4ffd401c4d554cd73739c39 +8001031: Better font processing. +Reviewed-by: vadim, prr, mschoene + +diff --git a/src/share/native/sun/font/FontInstanceAdapter.cpp b/src/share/native/sun/font/FontInstanceAdapter.cpp +--- jdk/src/share/native/sun/font/FontInstanceAdapter.cpp ++++ jdk/src/share/native/sun/font/FontInstanceAdapter.cpp +@@ -66,8 +66,21 @@ + yScalePixelsToUnits = upem / yppem; + }; + ++ + const void *FontInstanceAdapter::getFontTable(LETag tableTag) const + { ++ size_t ignored = 0; ++ return getFontTable(tableTag, ignored); ++} ++ ++static const LETag cacheMap[LAYOUTCACHE_ENTRIES] = { ++ GPOS_TAG, GDEF_TAG, GSUB_TAG, MORT_TAG, MORX_TAG, KERN_TAG ++}; ++ ++const void *FontInstanceAdapter::getFontTable(LETag tableTag, size_t &length) const ++{ ++ length = 0; ++ + if (!layoutTables) { // t1 font + return 0; + } +@@ -75,14 +88,19 @@ + // cache in font's pscaler object + // font disposer will handle for us + +- switch(tableTag) { +- case GSUB_TAG: if (layoutTables->gsub_len != -1) return (void*)layoutTables->gsub; break; +- case GPOS_TAG: if (layoutTables->gpos_len != -1) return (void*)layoutTables->gpos; break; +- case GDEF_TAG: if (layoutTables->gdef_len != -1) return (void*)layoutTables->gdef; break; +- case MORT_TAG: if (layoutTables->mort_len != -1) return (void*)layoutTables->mort; break; +- case KERN_TAG: if (layoutTables->kern_len != -1) return (void*)layoutTables->kern; break; +- default: +- //fprintf(stderr, "unexpected table request from font instance adapter: %x\n", tableTag); ++ int cacheIdx; ++ for (cacheIdx=0;cacheIdx<LAYOUTCACHE_ENTRIES;cacheIdx++) { ++ if (tableTag==cacheMap[cacheIdx]) break; ++ } ++ ++ if (cacheIdx<LAYOUTCACHE_ENTRIES) { // if found ++ if (layoutTables->entries[cacheIdx].len != -1) { ++ length = layoutTables->entries[cacheIdx].len; ++ return layoutTables->entries[cacheIdx].ptr; ++ } ++ } else { ++ //fprintf(stderr, "unexpected table request from font instance adapter: %x\n", tableTag); ++ // (don't load any other tables) + return 0; + } + +@@ -96,16 +114,13 @@ + env->GetByteArrayRegion(tableBytes, 0, len, result); + } + +- switch(tableTag) { +- case GSUB_TAG: layoutTables->gsub = (void*)result; layoutTables->gsub_len = len; break; +- case GPOS_TAG: layoutTables->gpos = (void*)result; layoutTables->gpos_len = len; break; +- case GDEF_TAG: layoutTables->gdef = (void*)result; layoutTables->gdef_len = len; break; +- case MORT_TAG: layoutTables->mort = (void*)result; layoutTables->mort_len = len; break; +- case KERN_TAG: layoutTables->kern = (void*)result; layoutTables->kern_len = len; break; +- default: break; ++ if (cacheIdx<LAYOUTCACHE_ENTRIES) { // if cacheable table ++ layoutTables->entries[cacheIdx].len = len; ++ layoutTables->entries[cacheIdx].ptr = (const void*)result; + } + +- return (void*)result; ++ length = len; ++ return (const void*)result; + }; + + LEGlyphID FontInstanceAdapter::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const +diff --git a/src/share/native/sun/font/FontInstanceAdapter.h b/src/share/native/sun/font/FontInstanceAdapter.h +--- jdk/src/share/native/sun/font/FontInstanceAdapter.h ++++ jdk/src/share/native/sun/font/FontInstanceAdapter.h +@@ -86,6 +86,7 @@ + // tables are cached with the native font scaler data + // only supports gsub, gpos, gdef, mort tables at present + virtual const void *getFontTable(LETag tableTag) const; ++ virtual const void *getFontTable(LETag tableTag, size_t &len) const; + + virtual void *getKernPairs() const { + return layoutTables->kernPairs; +diff --git a/src/share/native/sun/font/fontscalerdefs.h b/src/share/native/sun/font/fontscalerdefs.h +--- jdk/src/share/native/sun/font/fontscalerdefs.h ++++ jdk/src/share/native/sun/font/fontscalerdefs.h +@@ -107,20 +107,19 @@ + #define GPOS_TAG 0x47504F53 /* 'GPOS' */ + #define GDEF_TAG 0x47444546 /* 'GDEF' */ + #define MORT_TAG 0x6D6F7274 /* 'mort' */ ++#define MORX_TAG 0x6D6F7278 /* 'morx' */ + #define KERN_TAG 0x6B65726E /* 'kern' */ + ++typedef struct TTLayoutTableCacheEntry { ++ const void* ptr; ++ int len; ++} TTLayoutTableCacheEntry; ++ ++#define LAYOUTCACHE_ENTRIES 6 ++ + typedef struct TTLayoutTableCache { +- void* gsub; +- void* gpos; +- void* gdef; +- void* mort; +- void* kern; +- void* kernPairs; +- int gsub_len; +- int gpos_len; +- int gdef_len; +- int mort_len; +- int kern_len; ++ TTLayoutTableCacheEntry entries[LAYOUTCACHE_ENTRIES]; ++ void* kernPairs; + } TTLayoutTableCache; + + #include "sunfontids.h" +diff --git a/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp b/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp +--- jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.cpp +@@ -39,19 +39,20 @@ + + U_NAMESPACE_BEGIN + +-le_uint32 AlternateSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const ++le_uint32 AlternateSubstitutionSubtable::process(const LEReferenceTo<AlternateSubstitutionSubtable> &base, ++ GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const + { + // NOTE: For now, we'll just pick the first alternative... + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(glyph); ++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); + +- if (coverageIndex >= 0) { ++ if (coverageIndex >= 0 && LE_SUCCESS(success)) { + le_uint16 altSetCount = SWAPW(alternateSetCount); + + if (coverageIndex < altSetCount) { + Offset alternateSetTableOffset = SWAPW(alternateSetTableOffsetArray[coverageIndex]); +- const AlternateSetTable *alternateSetTable = +- (const AlternateSetTable *) ((char *) this + alternateSetTableOffset); ++ const LEReferenceTo<AlternateSetTable> alternateSetTable(base, success, ++ (const AlternateSetTable *) ((char *) this + alternateSetTableOffset)); + TTGlyphID alternate = SWAPW(alternateSetTable->alternateArray[0]); + + if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, alternate))) { +diff --git a/src/share/native/sun/font/layout/AlternateSubstSubtables.h b/src/share/native/sun/font/layout/AlternateSubstSubtables.h +--- jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.h ++++ jdk/src/share/native/sun/font/layout/AlternateSubstSubtables.h +@@ -51,13 +51,17 @@ + TTGlyphID alternateArray[ANY_NUMBER]; + }; + ++LE_VAR_ARRAY(AlternateSetTable, alternateArray) ++ + struct AlternateSubstitutionSubtable : GlyphSubstitutionSubtable + { + le_uint16 alternateSetCount; + Offset alternateSetTableOffsetArray[ANY_NUMBER]; + +- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; ++ le_uint32 process(const LEReferenceTo<AlternateSubstitutionSubtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const; + }; + ++LE_VAR_ARRAY(AlternateSubstitutionSubtable, alternateSetTableOffsetArray) ++ + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp b/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp +@@ -58,15 +58,18 @@ + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ArabicOpenTypeLayoutEngine) + +-ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, ++ le_int32 languageCode, le_int32 typoFlags, ++ const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, ++ LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) + { + fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; + } + +-ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, ++ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, ++ le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) + { +@@ -88,8 +91,9 @@ + // Input: characters + // Output: characters, char indices, tags + // Returns: output character count +-le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, +- LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) ++le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, ++ le_int32 max, le_bool rightToLeft, LEUnicode *&outChars, ++ LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + if (LE_FAILURE(success)) { + return 0; +@@ -137,22 +141,21 @@ + return; + } + +- if (fGPOSTable != NULL) { ++ if (!fGPOSTable.isEmpty()) { + OpenTypeLayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphStorage, success); +- } else if (fGDEFTable != NULL) { +- GDEFMarkFilter filter(fGDEFTable); +- ++ } else if (!fGDEFTable.isEmpty()) { ++ GDEFMarkFilter filter(fGDEFTable, success); + adjustMarkGlyphs(glyphStorage, &filter, success); + } else { +- GlyphDefinitionTableHeader *gdefTable = (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; +- GDEFMarkFilter filter(gdefTable); ++ LEReferenceTo<GlyphDefinitionTableHeader> gdefTable(CanonShaping::glyphDefinitionTable, CanonShaping::glyphDefinitionTableLen); ++ GDEFMarkFilter filter(gdefTable, success); + + adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); + } + } + + UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) +- : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG, success) ++ : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG, success) + { + fGSUBTable = (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; + fGDEFTable = (const GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; +@@ -232,7 +235,7 @@ + return; + } + +- GDEFMarkFilter filter(fGDEFTable); ++ GDEFMarkFilter filter(fGDEFTable, success); + + adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); + } +diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.h b/src/share/native/sun/font/layout/ArabicLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.h +@@ -75,7 +75,7 @@ + * @internal + */ + ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); ++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +diff --git a/src/share/native/sun/font/layout/ArabicShaping.cpp b/src/share/native/sun/font/layout/ArabicShaping.cpp +--- jdk/src/share/native/sun/font/layout/ArabicShaping.cpp ++++ jdk/src/share/native/sun/font/layout/ArabicShaping.cpp +@@ -58,14 +58,16 @@ + */ + ArabicShaping::ShapeType ArabicShaping::getShapeType(LEUnicode c) + { +- const ClassDefinitionTable *joiningTypes = (const ClassDefinitionTable *) ArabicShaping::shapingTypeTable; +- le_int32 joiningType = joiningTypes->getGlyphClass(c); ++ LEErrorCode success = LE_NO_ERROR; ++ const LEReferenceTo<ClassDefinitionTable> joiningTypes((const ClassDefinitionTable *) ArabicShaping::shapingTypeTable, ++ ArabicShaping::shapingTypeTableLen); ++ le_int32 joiningType = joiningTypes->getGlyphClass(joiningTypes, c, success); + +- if (joiningType >= 0 && joiningType < ArabicShaping::JT_COUNT) { +- return ArabicShaping::shapeTypes[joiningType]; +- } ++ if (joiningType >= 0 && joiningType < ArabicShaping::JT_COUNT && LE_SUCCESS(success)) { ++ return ArabicShaping::shapeTypes[joiningType]; ++ } + +- return ArabicShaping::ST_NOSHAPE_NONE; ++ return ArabicShaping::ST_NOSHAPE_NONE; + } + + #define isolFeatureTag LE_ISOL_FEATURE_TAG +diff --git a/src/share/native/sun/font/layout/ArabicShaping.h b/src/share/native/sun/font/layout/ArabicShaping.h +--- jdk/src/share/native/sun/font/layout/ArabicShaping.h ++++ jdk/src/share/native/sun/font/layout/ArabicShaping.h +@@ -93,6 +93,8 @@ + static ShapeType getShapeType(LEUnicode c); + + static const le_uint8 shapingTypeTable[]; ++ static const size_t shapingTypeTableLen; ++ + static const ShapeType shapeTypes[]; + + static void adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage); +diff --git a/src/share/native/sun/font/layout/AttachmentPosnSubtables.h b/src/share/native/sun/font/layout/AttachmentPosnSubtables.h +--- jdk/src/share/native/sun/font/layout/AttachmentPosnSubtables.h ++++ jdk/src/share/native/sun/font/layout/AttachmentPosnSubtables.h +@@ -52,14 +52,14 @@ + Offset markArrayOffset; + Offset baseArrayOffset; + +- inline le_int32 getBaseCoverage(LEGlyphID baseGlyphId) const; ++ inline le_int32 getBaseCoverage(const LETableReference &base, LEGlyphID baseGlyphId, LEErrorCode &success) const; + + le_uint32 process(GlyphIterator *glyphIterator) const; + }; + +-inline le_int32 AttachmentPositioningSubtable::getBaseCoverage(LEGlyphID baseGlyphID) const ++inline le_int32 AttachmentPositioningSubtable::getBaseCoverage(const LETableReference &base, LEGlyphID baseGlyphID, LEErrorCode &success) const + { +- return getGlyphCoverage(baseCoverageTableOffset, baseGlyphID); ++ return getGlyphCoverage(base, baseCoverageTableOffset, baseGlyphID, success); + } + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/CanonData.cpp b/src/share/native/sun/font/layout/CanonData.cpp +--- jdk/src/share/native/sun/font/layout/CanonData.cpp ++++ jdk/src/share/native/sun/font/layout/CanonData.cpp +@@ -3641,4 +3641,9 @@ + 0x00, 0xE6, 0xD2, 0x42, 0xD2, 0x44, 0x00, 0xE6 + }; + ++ ++const size_t CanonShaping::glyphSubstitutionTableLen = sizeof(glyphSubstitutionTable)/sizeof(glyphSubstitutionTable[0]); ++ ++const size_t CanonShaping::glyphDefinitionTableLen = sizeof(glyphDefinitionTable)/sizeof(glyphDefinitionTable[0]); ++ + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/CanonShaping.cpp b/src/share/native/sun/font/layout/CanonShaping.cpp +--- jdk/src/share/native/sun/font/layout/CanonShaping.cpp ++++ jdk/src/share/native/sun/font/layout/CanonShaping.cpp +@@ -59,15 +59,15 @@ + void CanonShaping::reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft, + LEUnicode *outChars, LEGlyphStorage &glyphStorage) + { +- const GlyphDefinitionTableHeader *gdefTable = (const GlyphDefinitionTableHeader *) glyphDefinitionTable; +- const ClassDefinitionTable *classTable = gdefTable->getMarkAttachClassDefinitionTable(); ++ LEErrorCode success = LE_NO_ERROR; ++ LEReferenceTo<GlyphDefinitionTableHeader> gdefTable(CanonShaping::glyphDefinitionTable, CanonShaping::glyphDefinitionTableLen); ++ LEReferenceTo<ClassDefinitionTable> classTable = gdefTable->getMarkAttachClassDefinitionTable(gdefTable, success); + le_int32 *combiningClasses = LE_NEW_ARRAY(le_int32, charCount); + le_int32 *indices = LE_NEW_ARRAY(le_int32, charCount); +- LEErrorCode status = LE_NO_ERROR; + le_int32 i; + + for (i = 0; i < charCount; i += 1) { +- combiningClasses[i] = classTable->getGlyphClass((LEGlyphID) inChars[i]); ++ combiningClasses[i] = classTable->getGlyphClass(classTable, (LEGlyphID) inChars[i], success); + indices[i] = i; + } + +@@ -96,7 +96,7 @@ + le_int32 index = indices[i]; + + outChars[i] = inChars[index]; +- glyphStorage.setCharIndex(out, index, status); ++ glyphStorage.setCharIndex(out, index, success); + } + + LE_DELETE_ARRAY(indices); +diff --git a/src/share/native/sun/font/layout/CanonShaping.h b/src/share/native/sun/font/layout/CanonShaping.h +--- jdk/src/share/native/sun/font/layout/CanonShaping.h ++++ jdk/src/share/native/sun/font/layout/CanonShaping.h +@@ -42,7 +42,9 @@ + { + public: + static const le_uint8 glyphSubstitutionTable[]; ++ static const size_t glyphSubstitutionTableLen; + static const le_uint8 glyphDefinitionTable[]; ++ static const size_t glyphDefinitionTableLen; + + static void reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft, + LEUnicode *outChars, LEGlyphStorage &glyphStorage); +diff --git a/src/share/native/sun/font/layout/ClassDefinitionTables.cpp b/src/share/native/sun/font/layout/ClassDefinitionTables.cpp +--- jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp ++++ jdk/src/share/native/sun/font/layout/ClassDefinitionTables.cpp +@@ -37,24 +37,51 @@ + + U_NAMESPACE_BEGIN + +-le_int32 ClassDefinitionTable::getGlyphClass(LEGlyphID glyphID) const ++le_int32 ClassDefinitionTable::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const + { ++ LEReferenceTo<ClassDefinitionTable> thisRef(base, success); ++ if (LE_FAILURE(success)) return 0; ++ ++ switch(SWAPW(classFormat)) { ++ case 0: ++ return 0; ++ ++ case 1: ++ { ++ const LEReferenceTo<ClassDefFormat1Table> f1Table(thisRef, success); ++ return f1Table->getGlyphClass(f1Table, glyphID, success); ++ } ++ ++ case 2: ++ { ++ const LEReferenceTo<ClassDefFormat2Table> f2Table(thisRef, success); ++ return f2Table->getGlyphClass(f2Table, glyphID, success); ++ } ++ ++ default: ++ return 0; ++ } ++} ++ ++le_bool ClassDefinitionTable::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const ++{ ++ LEReferenceTo<ClassDefinitionTable> thisRef(base, success); ++ if (LE_FAILURE(success)) return 0; ++ + switch(SWAPW(classFormat)) { + case 0: + return 0; + + case 1: + { +- const ClassDefFormat1Table *f1Table = (const ClassDefFormat1Table *) this; +- +- return f1Table->getGlyphClass(glyphID); ++ const LEReferenceTo<ClassDefFormat1Table> f1Table(thisRef, success); ++ return f1Table->hasGlyphClass(f1Table, glyphClass, success); + } + + case 2: + { +- const ClassDefFormat2Table *f2Table = (const ClassDefFormat2Table *) this; +- +- return f2Table->getGlyphClass(glyphID); ++ const LEReferenceTo<ClassDefFormat2Table> f2Table(thisRef, success); ++ return f2Table->hasGlyphClass(f2Table, glyphClass, success); + } + + default: +@@ -62,51 +89,32 @@ + } + } + +-le_bool ClassDefinitionTable::hasGlyphClass(le_int32 glyphClass) const ++le_int32 ClassDefFormat1Table::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const + { +- switch(SWAPW(classFormat)) { +- case 0: +- return 0; ++ if(LE_FAILURE(success)) return 0; + +- case 1: +- { +- const ClassDefFormat1Table *f1Table = (const ClassDefFormat1Table *) this; +- +- return f1Table->hasGlyphClass(glyphClass); +- } +- +- case 2: +- { +- const ClassDefFormat2Table *f2Table = (const ClassDefFormat2Table *) this; +- +- return f2Table->hasGlyphClass(glyphClass); +- } +- +- default: +- return 0; +- } +-} +- +-le_int32 ClassDefFormat1Table::getGlyphClass(LEGlyphID glyphID) const +-{ ++ le_uint16 count = SWAPW(glyphCount); ++ LEReferenceToArrayOf<le_uint16> classValueArrayRef(base, success, &classValueArray[0], count); + TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); + TTGlyphID firstGlyph = SWAPW(startGlyph); +- TTGlyphID lastGlyph = firstGlyph + SWAPW(glyphCount); ++ TTGlyphID lastGlyph = firstGlyph + count; + +- if (ttGlyphID >= firstGlyph && ttGlyphID < lastGlyph) { +- return SWAPW(classValueArray[ttGlyphID - firstGlyph]); ++ if (LE_SUCCESS(success) && ttGlyphID >= firstGlyph && ttGlyphID < lastGlyph) { ++ return SWAPW( classValueArrayRef(ttGlyphID - firstGlyph, success) ); + } + + return 0; + } + +-le_bool ClassDefFormat1Table::hasGlyphClass(le_int32 glyphClass) const ++le_bool ClassDefFormat1Table::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const + { +- le_uint16 count = SWAPW(glyphCount); ++ if(LE_FAILURE(success)) return 0; ++ le_uint16 count = SWAPW(glyphCount); ++ LEReferenceToArrayOf<le_uint16> classValueArrayRef(base, success, &classValueArray[0], count); + int i; + +- for (i = 0; i < count; i += 1) { +- if (SWAPW(classValueArray[i]) == glyphClass) { ++ for (i = 0; LE_SUCCESS(success)&& (i < count); i += 1) { ++ if (SWAPW(classValueArrayRef(i,success)) == glyphClass) { + return TRUE; + } + } +@@ -114,27 +122,31 @@ + return FALSE; + } + +-le_int32 ClassDefFormat2Table::getGlyphClass(LEGlyphID glyphID) const ++le_int32 ClassDefFormat2Table::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const + { ++ if(LE_FAILURE(success)) return 0; + TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyphID); + le_uint16 rangeCount = SWAPW(classRangeCount); ++ LEReferenceToArrayOf<GlyphRangeRecord> classRangeRecordArrayRef(base, success, &classRangeRecordArray[0], rangeCount); + le_int32 rangeIndex = +- OpenTypeUtilities::getGlyphRangeIndex(ttGlyph, classRangeRecordArray, rangeCount); ++ OpenTypeUtilities::getGlyphRangeIndex(ttGlyph, classRangeRecordArrayRef, success); + +- if (rangeIndex < 0) { ++ if (rangeIndex < 0 || LE_FAILURE(success)) { + return 0; + } + +- return SWAPW(classRangeRecordArray[rangeIndex].rangeValue); ++ return SWAPW(classRangeRecordArrayRef(rangeIndex, success).rangeValue); + } + +-le_bool ClassDefFormat2Table::hasGlyphClass(le_int32 glyphClass) const ++le_bool ClassDefFormat2Table::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const + { ++ if(LE_FAILURE(success)) return 0; + le_uint16 rangeCount = SWAPW(classRangeCount); ++ LEReferenceToArrayOf<GlyphRangeRecord> classRangeRecordArrayRef(base, success, &classRangeRecordArray[0], rangeCount); + int i; + +- for (i = 0; i < rangeCount; i += 1) { +- if (SWAPW(classRangeRecordArray[i].rangeValue) == glyphClass) { ++ for (i = 0; i < rangeCount && LE_SUCCESS(success); i += 1) { ++ if (SWAPW(classRangeRecordArrayRef(i,success).rangeValue) == glyphClass) { + return TRUE; + } + } +diff --git a/src/share/native/sun/font/layout/ClassDefinitionTables.h b/src/share/native/sun/font/layout/ClassDefinitionTables.h +--- jdk/src/share/native/sun/font/layout/ClassDefinitionTables.h ++++ jdk/src/share/native/sun/font/layout/ClassDefinitionTables.h +@@ -46,8 +46,20 @@ + { + le_uint16 classFormat; + +- le_int32 getGlyphClass(LEGlyphID glyphID) const; +- le_bool hasGlyphClass(le_int32 glyphClass) const; ++ le_int32 getGlyphClass(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const; ++ le_bool hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const; ++ ++ le_int32 getGlyphClass(LEGlyphID glyphID) const { ++ LETableReference base((const le_uint8*)this); ++ LEErrorCode ignored = LE_NO_ERROR; ++ return getGlyphClass(base,glyphID,ignored); ++ } ++ ++ le_bool hasGlyphClass(le_int32 glyphClass) const { ++ LETableReference base((const le_uint8*)this); ++ LEErrorCode ignored = LE_NO_ERROR; ++ return hasGlyphClass(base,glyphClass,ignored); ++ } + }; + + struct ClassDefFormat1Table : ClassDefinitionTable +@@ -56,9 +68,11 @@ + le_uint16 glyphCount; + le_uint16 classValueArray[ANY_NUMBER]; + +- le_int32 getGlyphClass(LEGlyphID glyphID) const; +- le_bool hasGlyphClass(le_int32 glyphClass) const; ++ le_int32 getGlyphClass(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const; ++ le_bool hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const; + }; ++LE_VAR_ARRAY(ClassDefFormat1Table, classValueArray) ++ + + struct ClassRangeRecord + { +@@ -72,9 +86,10 @@ + le_uint16 classRangeCount; + GlyphRangeRecord classRangeRecordArray[ANY_NUMBER]; + +- le_int32 getGlyphClass(LEGlyphID glyphID) const; +- le_bool hasGlyphClass(le_int32 glyphClass) const; ++ le_int32 getGlyphClass(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const; ++ le_bool hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const; + }; ++LE_VAR_ARRAY(ClassDefFormat2Table, classRangeRecordArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp b/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp +--- jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp ++++ jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.cpp +@@ -43,13 +43,18 @@ + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ContextualGlyphSubstitutionProcessor) + +-ContextualGlyphSubstitutionProcessor::ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) +- : StateTableProcessor(morphSubtableHeader) ++ContextualGlyphSubstitutionProcessor::ContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) ++ : StateTableProcessor(morphSubtableHeader, success), entryTable(), contextualGlyphSubstitutionHeader(morphSubtableHeader, success) + { +- contextualGlyphSubstitutionHeader = (const ContextualGlyphSubstitutionHeader *) morphSubtableHeader; +- substitutionTableOffset = SWAPW(contextualGlyphSubstitutionHeader->substitutionTableOffset); ++ contextualGlyphSubstitutionHeader.orphan(); ++ substitutionTableOffset = SWAPW(contextualGlyphSubstitutionHeader->substitutionTableOffset); + +- entryTable = (const ContextualGlyphSubstitutionStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset); ++ ++ entryTable = LEReferenceToArrayOf<ContextualGlyphSubstitutionStateEntry>(stateTableHeader, success, ++ (const ContextualGlyphSubstitutionStateEntry*)(&stateTableHeader->stHeader), ++ entryTableOffset, LE_UNBOUNDED_ARRAY); ++ int16Table = LEReferenceToArrayOf<le_int16>(stateTableHeader, success, (const le_int16*)(&stateTableHeader->stHeader), ++ 0, LE_UNBOUNDED_ARRAY); // rest of the table as le_int16s + } + + ContextualGlyphSubstitutionProcessor::~ContextualGlyphSubstitutionProcessor() +@@ -63,27 +68,26 @@ + + ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) + { +- const ContextualGlyphSubstitutionStateEntry *entry = &entryTable[index]; +- ByteOffset newState = SWAPW(entry->newStateOffset); +- le_int16 flags = SWAPW(entry->flags); +- WordOffset markOffset = SWAPW(entry->markOffset); +- WordOffset currOffset = SWAPW(entry->currOffset); ++ LEErrorCode success = LE_NO_ERROR; ++ const ContextualGlyphSubstitutionStateEntry *entry = entryTable.getAlias(index, success); ++ ByteOffset newState = SWAPW(entry->newStateOffset); ++ le_int16 flags = SWAPW(entry->flags); ++ WordOffset markOffset = SWAPW(entry->markOffset); ++ WordOffset currOffset = SWAPW(entry->currOffset); + +- if (markOffset != 0) { +- const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + markOffset * 2); +- LEGlyphID mGlyph = glyphStorage[markGlyph]; +- TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(mGlyph)]); ++ if (markOffset != 0 && LE_SUCCESS(success)) { ++ LEGlyphID mGlyph = glyphStorage[markGlyph]; ++ TTGlyphID newGlyph = SWAPW(int16Table.getObject(markOffset + LE_GET_GLYPH(mGlyph), success)); // whew. + +- glyphStorage[markGlyph] = LE_SET_GLYPH(mGlyph, newGlyph); +- } ++ glyphStorage[markGlyph] = LE_SET_GLYPH(mGlyph, newGlyph); ++ } + +- if (currOffset != 0) { +- const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + currOffset * 2); +- LEGlyphID thisGlyph = glyphStorage[currGlyph]; +- TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(thisGlyph)]); ++ if (currOffset != 0) { ++ LEGlyphID thisGlyph = glyphStorage[currGlyph]; ++ TTGlyphID newGlyph = SWAPW(int16Table.getObject(currOffset + LE_GET_GLYPH(thisGlyph), success)); // whew. + +- glyphStorage[currGlyph] = LE_SET_GLYPH(thisGlyph, newGlyph); +- } ++ glyphStorage[currGlyph] = LE_SET_GLYPH(thisGlyph, newGlyph); ++ } + + if (flags & cgsSetMark) { + markGlyph = currGlyph; +diff --git a/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h b/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h +--- jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h ++++ jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc.h +@@ -56,7 +56,7 @@ + + virtual void endStateTable(); + +- ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader); ++ ContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); + virtual ~ContextualGlyphSubstitutionProcessor(); + + /** +@@ -78,11 +78,11 @@ + + protected: + ByteOffset substitutionTableOffset; +- const ContextualGlyphSubstitutionStateEntry *entryTable; +- ++ LEReferenceToArrayOf<ContextualGlyphSubstitutionStateEntry> entryTable; ++ LEReferenceToArrayOf<le_int16> int16Table; + le_int32 markGlyph; + +- const ContextualGlyphSubstitutionHeader *contextualGlyphSubstitutionHeader; ++ LEReferenceTo<ContextualGlyphSubstitutionHeader> contextualGlyphSubstitutionHeader; + + }; + +diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp b/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp +--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp +@@ -217,7 +217,7 @@ + } + + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(glyph); ++ le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success); + + if (coverageIndex >= 0) { + le_uint16 srSetCount = SWAPW(subRuleSetCount); +@@ -266,7 +266,7 @@ + } + + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(glyph); ++ le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success); + + if (coverageIndex >= 0) { + const ClassDefinitionTable *classDefinitionTable = +@@ -394,7 +394,7 @@ + } + + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(glyph); ++ le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success); + + if (coverageIndex >= 0) { + le_uint16 srSetCount = SWAPW(chainSubRuleSetCount); +@@ -465,7 +465,7 @@ + } + + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(glyph); ++ le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success); + + if (coverageIndex >= 0) { + const ClassDefinitionTable *backtrackClassDefinitionTable = +diff --git a/src/share/native/sun/font/layout/ContextualSubstSubtables.h b/src/share/native/sun/font/layout/ContextualSubstSubtables.h +--- jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h ++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.h +@@ -43,6 +43,7 @@ + #include "GlyphSubstitutionTables.h" + #include "GlyphIterator.h" + #include "LookupProcessor.h" ++#include "LETableReference.h" + + U_NAMESPACE_BEGIN + +@@ -88,6 +89,8 @@ + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; ++LE_VAR_ARRAY(ContextualSubstitutionFormat1Subtable, subRuleSetTableOffsetArray) ++ + + struct SubRuleSetTable + { +@@ -95,6 +98,7 @@ + Offset subRuleTableOffsetArray[ANY_NUMBER]; + + }; ++LE_VAR_ARRAY(SubRuleSetTable, subRuleTableOffsetArray) + + // NOTE: Multiple variable size arrays!! + struct SubRuleTable +@@ -104,6 +108,7 @@ + TTGlyphID inputGlyphArray[ANY_NUMBER]; + //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(SubRuleTable, inputGlyphArray) + + struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable + { +@@ -113,12 +118,16 @@ + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; ++LE_VAR_ARRAY(ContextualSubstitutionFormat2Subtable, subClassSetTableOffsetArray) ++ + + struct SubClassSetTable + { + le_uint16 subClassRuleCount; + Offset subClassRuleTableOffsetArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(SubClassSetTable, subClassRuleTableOffsetArray) ++ + + // NOTE: Multiple variable size arrays!! + struct SubClassRuleTable +@@ -128,6 +137,8 @@ + le_uint16 classArray[ANY_NUMBER]; + //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(SubClassRuleTable, classArray) ++ + + // NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause + // it has an array of coverage tables instead of a single coverage table... +@@ -143,6 +154,7 @@ + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; ++LE_VAR_ARRAY(ContextualSubstitutionFormat3Subtable, coverageTableOffsetArray) + + struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase + { +@@ -156,6 +168,8 @@ + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; ++LE_VAR_ARRAY(ChainingContextualSubstitutionFormat1Subtable, chainSubRuleSetTableOffsetArray) ++ + + struct ChainSubRuleSetTable + { +@@ -163,6 +177,7 @@ + Offset chainSubRuleTableOffsetArray[ANY_NUMBER]; + + }; ++LE_VAR_ARRAY(ChainSubRuleSetTable, chainSubRuleTableOffsetArray) + + // NOTE: Multiple variable size arrays!! + struct ChainSubRuleTable +@@ -176,6 +191,7 @@ + //le_uint16 substCount; + //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(ChainSubRuleTable, backtrackGlyphArray) + + struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstitutionSubtable + { +@@ -187,12 +203,15 @@ + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; ++LE_VAR_ARRAY(ChainingContextualSubstitutionFormat2Subtable, chainSubClassSetTableOffsetArray) + + struct ChainSubClassSetTable + { + le_uint16 chainSubClassRuleCount; + Offset chainSubClassRuleTableOffsetArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(ChainSubClassSetTable, chainSubClassRuleTableOffsetArray) ++ + + // NOTE: Multiple variable size arrays!! + struct ChainSubClassRuleTable +@@ -206,6 +225,7 @@ + //le_uint16 substCount; + //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(ChainSubClassRuleTable, backtrackClassArray) + + // NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause + // it has arrays of coverage tables instead of a single coverage table... +@@ -225,6 +245,8 @@ + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + }; ++LE_VAR_ARRAY(ChainingContextualSubstitutionFormat3Subtable, backtrackCoverageTableOffsetArray) ++ + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/CoverageTables.h b/src/share/native/sun/font/layout/CoverageTables.h +--- jdk/src/share/native/sun/font/layout/CoverageTables.h ++++ jdk/src/share/native/sun/font/layout/CoverageTables.h +@@ -56,6 +56,8 @@ + + le_int32 getGlyphCoverage(LEGlyphID glyphID) const; + }; ++LE_VAR_ARRAY(CoverageFormat1Table, glyphArray) ++ + + struct CoverageFormat2Table : CoverageTable + { +@@ -64,6 +66,7 @@ + + le_int32 getGlyphCoverage(LEGlyphID glyphID) const; + }; ++LE_VAR_ARRAY(CoverageFormat2Table, rangeRecordArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp b/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp +--- jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.cpp +@@ -39,10 +39,10 @@ + + U_NAMESPACE_BEGIN + +-le_uint32 CursiveAttachmentSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++le_uint32 CursiveAttachmentSubtable::process(const LEReferenceTo<CursiveAttachmentSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const + { + LEGlyphID glyphID = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(glyphID); ++ le_int32 coverageIndex = getGlyphCoverage(base, glyphID, success); + le_uint16 eeCount = SWAPW(entryExitCount); + + if (coverageIndex < 0 || coverageIndex >= eeCount) { +@@ -51,7 +51,7 @@ + } + + LEPoint entryAnchor, exitAnchor; +- Offset entryOffset = SWAPW(entryExitRecords[coverageIndex].entryAnchor); ++ Offset entryOffset = SWAPW(entryExitRecords[coverageIndex].entryAnchor); // TODO + Offset exitOffset = SWAPW(entryExitRecords[coverageIndex].exitAnchor); + + if (entryOffset != 0) { +diff --git a/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h b/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h +--- jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h ++++ jdk/src/share/native/sun/font/layout/CursiveAttachmentSubtables.h +@@ -57,8 +57,9 @@ + le_uint16 entryExitCount; + EntryExitRecord entryExitRecords[ANY_NUMBER]; + +- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LEReferenceTo<CursiveAttachmentSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; + }; ++LE_VAR_ARRAY(CursiveAttachmentSubtable, entryExitRecords) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/DeviceTables.h b/src/share/native/sun/font/layout/DeviceTables.h +--- jdk/src/share/native/sun/font/layout/DeviceTables.h ++++ jdk/src/share/native/sun/font/layout/DeviceTables.h +@@ -57,6 +57,7 @@ + static const le_uint16 fieldSignBits[]; + static const le_uint16 fieldBits[]; + }; ++LE_VAR_ARRAY(DeviceTable, deltaValues) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/ExtensionSubtables.cpp b/src/share/native/sun/font/layout/ExtensionSubtables.cpp +--- jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/ExtensionSubtables.cpp +@@ -47,6 +47,8 @@ + le_uint32 ExtensionSubtable::process(const LookupProcessor *lookupProcessor, le_uint16 lookupType, + GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const + { ++ const LEReferenceTo<ExtensionSubtable> thisRef(lookupProcessor->getReference(), success); // create a reference to this ++ + if (LE_FAILURE(success)) { + return 0; + } +@@ -55,9 +57,11 @@ + + if (elt != lookupType) { + le_uint32 extOffset = READ_LONG(extensionOffset); +- LookupSubtable *subtable = (LookupSubtable *) ((char *) this + extOffset); ++ LEReferenceTo<LookupSubtable> subtable(thisRef, success, extOffset); + +- return lookupProcessor->applySubtable(subtable, elt, glyphIterator, fontInstance, success); ++ if(LE_SUCCESS(success)) { ++ return lookupProcessor->applySubtable(subtable, elt, glyphIterator, fontInstance, success); ++ } + } + + return 0; +diff --git a/src/share/native/sun/font/layout/Features.cpp b/src/share/native/sun/font/layout/Features.cpp +--- jdk/src/share/native/sun/font/layout/Features.cpp ++++ jdk/src/share/native/sun/font/layout/Features.cpp +@@ -38,19 +38,20 @@ + + U_NAMESPACE_BEGIN + +-const FeatureTable *FeatureListTable::getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const ++LEReferenceTo<FeatureTable> FeatureListTable::getFeatureTable(const LETableReference &base, le_uint16 featureIndex, LETag *featureTag, LEErrorCode &success) const + { +- if (featureIndex >= SWAPW(featureCount)) { +- return 0; +- } ++ if (featureIndex >= SWAPW(featureCount) || LE_FAILURE(success)) { ++ return LEReferenceTo<FeatureTable>(); ++ } + + Offset featureTableOffset = featureRecordArray[featureIndex].featureTableOffset; + + *featureTag = SWAPT(featureRecordArray[featureIndex].featureTag); + +- return (const FeatureTable *) ((char *) this + SWAPW(featureTableOffset)); ++ return LEReferenceTo<FeatureTable>(base, success, SWAPW(featureTableOffset)); + } + ++#if 0 + /* + * Note: according to the OpenType Spec. v 1.4, the entries in the Feature + * List Table are sorted alphabetically by feature tag; however, there seem +@@ -82,5 +83,6 @@ + return 0; + #endif + } ++#endif + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GDEFMarkFilter.cpp b/src/share/native/sun/font/layout/GDEFMarkFilter.cpp +--- jdk/src/share/native/sun/font/layout/GDEFMarkFilter.cpp ++++ jdk/src/share/native/sun/font/layout/GDEFMarkFilter.cpp +@@ -36,9 +36,12 @@ + + U_NAMESPACE_BEGIN + +-GDEFMarkFilter::GDEFMarkFilter(const GlyphDefinitionTableHeader *gdefTable) ++GDEFMarkFilter::GDEFMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success) ++ : classDefTable(gdefTable->getGlyphClassDefinitionTable(gdefTable, success)) + { +- classDefTable = gdefTable->getGlyphClassDefinitionTable(); ++ if(!classDefTable.isValid()) { ++ success = LE_INTERNAL_ERROR; ++ } + } + + GDEFMarkFilter::~GDEFMarkFilter() +diff --git a/src/share/native/sun/font/layout/GDEFMarkFilter.h b/src/share/native/sun/font/layout/GDEFMarkFilter.h +--- jdk/src/share/native/sun/font/layout/GDEFMarkFilter.h ++++ jdk/src/share/native/sun/font/layout/GDEFMarkFilter.h +@@ -46,13 +46,13 @@ + class GDEFMarkFilter : public UMemory, public LEGlyphFilter + { + private: +- const GlyphClassDefinitionTable *classDefTable; ++ const LEReferenceTo<GlyphClassDefinitionTable> classDefTable; + + GDEFMarkFilter(const GDEFMarkFilter &other); // forbid copying of this class + GDEFMarkFilter &operator=(const GDEFMarkFilter &other); // forbid copying of this class + + public: +- GDEFMarkFilter(const GlyphDefinitionTableHeader *gdefTable); ++ GDEFMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success); + virtual ~GDEFMarkFilter(); + + virtual le_bool accept(LEGlyphID glyph) const; +diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.cpp b/src/share/native/sun/font/layout/GXLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.cpp +@@ -41,9 +41,10 @@ + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GXLayoutEngine) + +-GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable, LEErrorCode &success) ++ GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const LEReferenceTo<MorphTableHeader> &morphTable, LEErrorCode &success) + : LayoutEngine(fontInstance, scriptCode, languageCode, 0, success), fMorphTable(morphTable) + { ++ fMorphTable.orphan(); + // nothing else to do? + } + +@@ -70,7 +71,7 @@ + return 0; + } + +- fMorphTable->process(glyphStorage); ++ fMorphTable->process(fMorphTable, glyphStorage, success); + + return count; + } +diff --git a/src/share/native/sun/font/layout/GXLayoutEngine.h b/src/share/native/sun/font/layout/GXLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/GXLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/GXLayoutEngine.h +@@ -74,7 +74,7 @@ + * + * @internal + */ +- GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable, LEErrorCode &success); ++ GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const LEReferenceTo<MorphTableHeader> &morphTable, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. +@@ -104,7 +104,7 @@ + * + * @internal + */ +- const MorphTableHeader *fMorphTable; ++ LEReferenceTo<MorphTableHeader> fMorphTable; + + /** + * This method does GX layout using the font's 'mort' table. It converts the +diff --git a/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp b/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp +--- jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.cpp +@@ -36,24 +36,36 @@ + + U_NAMESPACE_BEGIN + +-const GlyphClassDefinitionTable *GlyphDefinitionTableHeader::getGlyphClassDefinitionTable() const ++const LEReferenceTo<GlyphClassDefinitionTable> ++GlyphDefinitionTableHeader::getGlyphClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, ++ LEErrorCode &success) const + { +- return (const GlyphClassDefinitionTable *) ((char *) this + SWAPW(glyphClassDefOffset)); ++ if(LE_FAILURE(success)) return LEReferenceTo<GlyphClassDefinitionTable>(); ++ return LEReferenceTo<GlyphClassDefinitionTable>(base, success, SWAPW(glyphClassDefOffset)); + } + +-const AttachmentListTable *GlyphDefinitionTableHeader::getAttachmentListTable() const ++const LEReferenceTo<AttachmentListTable> ++GlyphDefinitionTableHeader::getAttachmentListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, ++ LEErrorCode &success) const + { +- return (const AttachmentListTable *) ((char *) this + SWAPW(attachListOffset)); ++ if(LE_FAILURE(success)) return LEReferenceTo<AttachmentListTable>(); ++ return LEReferenceTo<AttachmentListTable>(base, success, SWAPW(attachListOffset)); + } + +-const LigatureCaretListTable *GlyphDefinitionTableHeader::getLigatureCaretListTable() const ++const LEReferenceTo<LigatureCaretListTable> ++GlyphDefinitionTableHeader::getLigatureCaretListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, ++ LEErrorCode &success) const + { +- return (const LigatureCaretListTable *) ((char *) this + SWAPW(ligCaretListOffset)); ++ if(LE_FAILURE(success)) return LEReferenceTo<LigatureCaretListTable>(); ++ return LEReferenceTo<LigatureCaretListTable>(base, success, SWAPW(ligCaretListOffset)); + } + +-const MarkAttachClassDefinitionTable *GlyphDefinitionTableHeader::getMarkAttachClassDefinitionTable() const ++const LEReferenceTo<MarkAttachClassDefinitionTable> ++GlyphDefinitionTableHeader::getMarkAttachClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, ++ LEErrorCode &success) const + { +- return (const MarkAttachClassDefinitionTable *) ((char *) this + SWAPW(MarkAttachClassDefOffset)); ++ if(LE_FAILURE(success)) return LEReferenceTo<MarkAttachClassDefinitionTable>(); ++ return LEReferenceTo<MarkAttachClassDefinitionTable>(base, success, SWAPW(MarkAttachClassDefOffset)); + } + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphDefinitionTables.h b/src/share/native/sun/font/layout/GlyphDefinitionTables.h +--- jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.h ++++ jdk/src/share/native/sun/font/layout/GlyphDefinitionTables.h +@@ -60,12 +60,14 @@ + le_uint16 glyphCount; + Offset attachPointTableOffsetArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(AttachmentListTable, attachPointTableOffsetArray) + + struct AttachPointTable + { + le_uint16 pointCount; + le_uint16 pointIndexArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(AttachPointTable, pointIndexArray) + + struct LigatureCaretListTable + { +@@ -73,12 +75,14 @@ + le_uint16 ligGlyphCount; + Offset ligGlyphTableOffsetArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(LigatureCaretListTable, ligGlyphTableOffsetArray) + + struct LigatureGlyphTable + { + le_uint16 caretCount; + Offset caretValueTableOffsetArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(LigatureGlyphTable, caretValueTableOffsetArray) + + struct CaretValueTable + { +@@ -111,10 +115,18 @@ + Offset ligCaretListOffset; + Offset MarkAttachClassDefOffset; + +- const GlyphClassDefinitionTable *getGlyphClassDefinitionTable() const; +- const AttachmentListTable *getAttachmentListTable()const ; +- const LigatureCaretListTable *getLigatureCaretListTable() const; +- const MarkAttachClassDefinitionTable *getMarkAttachClassDefinitionTable() const; ++ const LEReferenceTo<GlyphClassDefinitionTable> ++ getGlyphClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, ++ LEErrorCode &success) const; ++ const LEReferenceTo<AttachmentListTable> ++ getAttachmentListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, ++ LEErrorCode &success)const ; ++ const LEReferenceTo<LigatureCaretListTable> ++ getLigatureCaretListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, ++ LEErrorCode &success) const; ++ const LEReferenceTo<MarkAttachClassDefinitionTable> ++ getMarkAttachClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, ++ LEErrorCode &success) const; + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphIterator.cpp b/src/share/native/sun/font/layout/GlyphIterator.cpp +--- jdk/src/share/native/sun/font/layout/GlyphIterator.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphIterator.cpp +@@ -41,18 +41,21 @@ + U_NAMESPACE_BEGIN + + GlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, +- FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader) ++ FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader) + : direction(1), position(-1), nextLimit(-1), prevLimit(-1), + glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments), + srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), glyphGroup(0), +- glyphClassDefinitionTable(NULL), markAttachClassDefinitionTable(NULL) ++ glyphClassDefinitionTable(), markAttachClassDefinitionTable() + + { ++ LEErrorCode success = LE_NO_ERROR; // TODO + le_int32 glyphCount = glyphStorage.getGlyphCount(); + +- if (theGlyphDefinitionTableHeader != NULL) { +- glyphClassDefinitionTable = theGlyphDefinitionTableHeader->getGlyphClassDefinitionTable(); +- markAttachClassDefinitionTable = theGlyphDefinitionTableHeader->getMarkAttachClassDefinitionTable(); ++ if (theGlyphDefinitionTableHeader.isValid()) { ++ glyphClassDefinitionTable = theGlyphDefinitionTableHeader ++ -> getGlyphClassDefinitionTable(theGlyphDefinitionTableHeader, success); ++ markAttachClassDefinitionTable = theGlyphDefinitionTableHeader ++ ->getMarkAttachClassDefinitionTable(theGlyphDefinitionTableHeader, success); + } + + nextLimit = glyphCount; +@@ -380,6 +383,7 @@ + + le_bool GlyphIterator::filterGlyph(le_uint32 index) const + { ++ LEErrorCode success = LE_NO_ERROR; + LEGlyphID glyphID = glyphStorage[index]; + le_int32 glyphClass = gcdNoGlyphClass; + +@@ -387,8 +391,8 @@ + return TRUE; + } + +- if (glyphClassDefinitionTable != NULL) { +- glyphClass = glyphClassDefinitionTable->getGlyphClass(glyphID); ++ if (glyphClassDefinitionTable.isValid()) { ++ glyphClass = glyphClassDefinitionTable->getGlyphClass(glyphClassDefinitionTable, glyphID, success); + } + + switch (glyphClass) +@@ -410,8 +414,9 @@ + + le_uint16 markAttachType = (lookupFlags & lfMarkAttachTypeMask) >> lfMarkAttachTypeShift; + +- if ((markAttachType != 0) && (markAttachClassDefinitionTable != NULL)) { +- return markAttachClassDefinitionTable->getGlyphClass(glyphID) != markAttachType; ++ if ((markAttachType != 0) && (markAttachClassDefinitionTable.isValid())) { ++ return markAttachClassDefinitionTable ++ -> getGlyphClass(markAttachClassDefinitionTable, glyphID, success) != markAttachType; + } + + return FALSE; +@@ -461,6 +466,7 @@ + while (newPosition != nextLimit && delta > 0) { + do { + newPosition += direction; ++ //fprintf(stderr,"%s:%d:%s: newPosition = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, newPosition, delta); + } while (newPosition != nextLimit && filterGlyph(newPosition)); + + delta -= 1; +@@ -468,6 +474,7 @@ + + position = newPosition; + ++ //fprintf(stderr,"%s:%d:%s: exit position = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, position, delta); + return position != nextLimit; + } + +@@ -483,6 +490,7 @@ + while (newPosition != prevLimit && delta > 0) { + do { + newPosition -= direction; ++ //fprintf(stderr,"%s:%d:%s: newPosition = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, newPosition, delta); + } while (newPosition != prevLimit && filterGlyph(newPosition)); + + delta -= 1; +@@ -490,6 +498,7 @@ + + position = newPosition; + ++ //fprintf(stderr,"%s:%d:%s: exit position = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, position, delta); + return position != prevLimit; + } + +diff --git a/src/share/native/sun/font/layout/GlyphIterator.h b/src/share/native/sun/font/layout/GlyphIterator.h +--- jdk/src/share/native/sun/font/layout/GlyphIterator.h ++++ jdk/src/share/native/sun/font/layout/GlyphIterator.h +@@ -49,7 +49,7 @@ + class GlyphIterator : public UMemory { + public: + GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, +- FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader); ++ FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader); + + GlyphIterator(GlyphIterator &that); + +@@ -117,8 +117,8 @@ + FeatureMask featureMask; + le_int32 glyphGroup; + +- const GlyphClassDefinitionTable *glyphClassDefinitionTable; +- const MarkAttachClassDefinitionTable *markAttachClassDefinitionTable; ++ LEReferenceTo<GlyphClassDefinitionTable> glyphClassDefinitionTable; ++ LEReferenceTo<MarkAttachClassDefinitionTable> markAttachClassDefinitionTable; + + GlyphIterator &operator=(const GlyphIterator &other); // forbid copying of this class + }; +diff --git a/src/share/native/sun/font/layout/GlyphLookupTables.cpp b/src/share/native/sun/font/layout/GlyphLookupTables.cpp +--- jdk/src/share/native/sun/font/layout/GlyphLookupTables.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphLookupTables.cpp +@@ -37,21 +37,22 @@ + + U_NAMESPACE_BEGIN + +-le_bool GlyphLookupTableHeader::coversScript(LETag scriptTag) const ++le_bool GlyphLookupTableHeader::coversScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const + { +- const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset)); ++ LEReferenceTo<ScriptListTable> scriptListTable(base, success, SWAPW(scriptListOffset)); + +- return scriptListOffset != 0 && scriptListTable->findScript(scriptTag) != NULL; ++ return (scriptListOffset != 0) && scriptListTable->findScript(scriptListTable, scriptTag, success) .isValid(); + } + +-le_bool GlyphLookupTableHeader::coversScriptAndLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch) const ++le_bool GlyphLookupTableHeader::coversScriptAndLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch) const + { +- const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset)); +- const LangSysTable *langSysTable = scriptListTable->findLanguage(scriptTag, languageTag, exactMatch); ++ LEReferenceTo<ScriptListTable> scriptListTable(base, success, SWAPW(scriptListOffset)); ++ LEReferenceTo<LangSysTable> langSysTable = scriptListTable->findLanguage(scriptListTable, ++ scriptTag, languageTag, success, exactMatch); + + // FIXME: could check featureListOffset, lookupListOffset, and lookup count... + // Note: don't have to SWAPW langSysTable->featureCount to check for non-zero. +- return langSysTable != NULL && langSysTable->featureCount != 0; ++ return LE_SUCCESS(success)&&langSysTable.isValid() && langSysTable->featureCount != 0; + } + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphLookupTables.h b/src/share/native/sun/font/layout/GlyphLookupTables.h +--- jdk/src/share/native/sun/font/layout/GlyphLookupTables.h ++++ jdk/src/share/native/sun/font/layout/GlyphLookupTables.h +@@ -49,8 +49,8 @@ + Offset featureListOffset; + Offset lookupListOffset; + +- le_bool coversScript(LETag scriptTag) const; +- le_bool coversScriptAndLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const; ++ le_bool coversScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const; ++ le_bool coversScriptAndLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch = FALSE) const; + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.cpp b/src/share/native/sun/font/layout/GlyphPositioningTables.cpp +--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.cpp +@@ -41,16 +41,16 @@ + + U_NAMESPACE_BEGIN + +-void GlyphPositioningTableHeader::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft, ++void GlyphPositioningTableHeader::process(const LEReferenceTo<GlyphPositioningTableHeader> &base, LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft, + LETag scriptTag, LETag languageTag, +- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, LEErrorCode &success, ++ const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, LEErrorCode &success, + const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const + { + if (LE_FAILURE(success)) { + return; + } + +- GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success); ++ GlyphPositioningLookupProcessor processor(base, scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success); + if (LE_FAILURE(success)) { + return; + } +diff --git a/src/share/native/sun/font/layout/GlyphPositioningTables.h b/src/share/native/sun/font/layout/GlyphPositioningTables.h +--- jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h ++++ jdk/src/share/native/sun/font/layout/GlyphPositioningTables.h +@@ -40,6 +40,7 @@ + #include "OpenTypeTables.h" + #include "Lookups.h" + #include "GlyphLookupTables.h" ++#include "LETableReference.h" + + U_NAMESPACE_BEGIN + +@@ -51,9 +52,9 @@ + + struct GlyphPositioningTableHeader : public GlyphLookupTableHeader + { +- void process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, ++ void process(const LEReferenceTo<GlyphPositioningTableHeader> &base, LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, + le_bool rightToLeft, LETag scriptTag, LETag languageTag, +- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, LEErrorCode &success, ++ const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, LEErrorCode &success, + const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const; + }; + +diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp b/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp +--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.cpp +@@ -57,7 +57,7 @@ + typedef ChainingContextualSubstitutionSubtable ChainingContextualPositioningSubtable; + + GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor( +- const GlyphPositioningTableHeader *glyphPositioningTableHeader, ++ const LEReferenceTo<GlyphPositioningTableHeader> &glyphPositioningTableHeader, + LETag scriptTag, + LETag languageTag, + const FeatureMap *featureMap, +@@ -65,7 +65,7 @@ + le_bool featureOrder, + LEErrorCode& success) + : LookupProcessor( +- (char *) glyphPositioningTableHeader, ++ glyphPositioningTableHeader, + SWAPW(glyphPositioningTableHeader->scriptListOffset), + SWAPW(glyphPositioningTableHeader->featureListOffset), + SWAPW(glyphPositioningTableHeader->lookupListOffset), +@@ -84,7 +84,7 @@ + { + } + +-le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, ++le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + LEErrorCode& success) const +@@ -102,55 +102,55 @@ + + case gpstSingle: + { +- const SinglePositioningSubtable *subtable = (const SinglePositioningSubtable *) lookupSubtable; ++ LEReferenceTo<SinglePositioningSubtable> subtable(lookupSubtable, success); + +- delta = subtable->process(glyphIterator, fontInstance); ++ delta = subtable->process(subtable, glyphIterator, fontInstance, success); + break; + } + + case gpstPair: + { +- const PairPositioningSubtable *subtable = (const PairPositioningSubtable *) lookupSubtable; ++ LEReferenceTo<PairPositioningSubtable> subtable(lookupSubtable, success); + +- delta = subtable->process(glyphIterator, fontInstance); ++ delta = subtable->process(subtable, glyphIterator, fontInstance, success); + break; + } + + case gpstCursive: + { +- const CursiveAttachmentSubtable *subtable = (const CursiveAttachmentSubtable *) lookupSubtable; ++ LEReferenceTo<CursiveAttachmentSubtable> subtable(lookupSubtable, success); + +- delta = subtable->process(glyphIterator, fontInstance); ++ delta = subtable->process(subtable, glyphIterator, fontInstance, success); + break; + } + + case gpstMarkToBase: + { +- const MarkToBasePositioningSubtable *subtable = (const MarkToBasePositioningSubtable *) lookupSubtable; ++ LEReferenceTo<MarkToBasePositioningSubtable> subtable(lookupSubtable, success); + +- delta = subtable->process(glyphIterator, fontInstance); ++ delta = subtable->process(subtable, glyphIterator, fontInstance, success); + break; + } + + case gpstMarkToLigature: + { +- const MarkToLigaturePositioningSubtable *subtable = (const MarkToLigaturePositioningSubtable *) lookupSubtable; ++ LEReferenceTo<MarkToLigaturePositioningSubtable> subtable(lookupSubtable, success); + +- delta = subtable->process(glyphIterator, fontInstance); ++ delta = subtable->process(subtable, glyphIterator, fontInstance, success); + break; + } + + case gpstMarkToMark: + { +- const MarkToMarkPositioningSubtable *subtable = (const MarkToMarkPositioningSubtable *) lookupSubtable; ++ LEReferenceTo<MarkToMarkPositioningSubtable> subtable(lookupSubtable, success); + +- delta = subtable->process(glyphIterator, fontInstance); ++ delta = subtable->process(subtable, glyphIterator, fontInstance, success); + break; + } + + case gpstContext: + { +- const ContextualPositioningSubtable *subtable = (const ContextualPositioningSubtable *) lookupSubtable; ++ LEReferenceTo<ContextualPositioningSubtable> subtable(lookupSubtable, success); + + delta = subtable->process(this, glyphIterator, fontInstance, success); + break; +@@ -158,7 +158,7 @@ + + case gpstChainedContext: + { +- const ChainingContextualPositioningSubtable *subtable = (const ChainingContextualPositioningSubtable *) lookupSubtable; ++ LEReferenceTo<ChainingContextualPositioningSubtable> subtable(lookupSubtable, success); + + delta = subtable->process(this, glyphIterator, fontInstance, success); + break; +@@ -166,7 +166,7 @@ + + case gpstExtension: + { +- const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable; ++ LEReferenceTo<ExtensionSubtable> subtable(lookupSubtable, success); + + delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success); + break; +diff --git a/src/share/native/sun/font/layout/GlyphPosnLookupProc.h b/src/share/native/sun/font/layout/GlyphPosnLookupProc.h +--- jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h ++++ jdk/src/share/native/sun/font/layout/GlyphPosnLookupProc.h +@@ -51,7 +51,7 @@ + class GlyphPositioningLookupProcessor : public LookupProcessor + { + public: +- GlyphPositioningLookupProcessor(const GlyphPositioningTableHeader *glyphPositioningTableHeader, ++ GlyphPositioningLookupProcessor(const LEReferenceTo<GlyphPositioningTableHeader> &glyphPositioningTableHeader, + LETag scriptTag, + LETag languageTag, + const FeatureMap *featureMap, +@@ -61,7 +61,7 @@ + + virtual ~GlyphPositioningLookupProcessor(); + +- virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator, ++ virtual le_uint32 applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, LEErrorCode& success) const; + + protected: +diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp b/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp +--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.cpp +@@ -51,7 +51,7 @@ + U_NAMESPACE_BEGIN + + GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor( +- const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader, ++ const LEReferenceTo<GlyphSubstitutionTableHeader> &glyphSubstitutionTableHeader, + LETag scriptTag, + LETag languageTag, + const LEGlyphFilter *filter, +@@ -60,7 +60,7 @@ + le_bool featureOrder, + LEErrorCode& success) + : LookupProcessor( +- (char *) glyphSubstitutionTableHeader, ++ glyphSubstitutionTableHeader, + SWAPW(glyphSubstitutionTableHeader->scriptListOffset), + SWAPW(glyphSubstitutionTableHeader->featureListOffset), + SWAPW(glyphSubstitutionTableHeader->lookupListOffset), +@@ -73,7 +73,7 @@ + { + } + +-le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, ++le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType, + GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const + { + if (LE_FAILURE(success)) { +@@ -89,39 +89,39 @@ + + case gsstSingle: + { +- const SingleSubstitutionSubtable *subtable = (const SingleSubstitutionSubtable *) lookupSubtable; ++ const LEReferenceTo<SingleSubstitutionSubtable> subtable(lookupSubtable, success); + +- delta = subtable->process(glyphIterator, fFilter); ++ delta = subtable->process(subtable, glyphIterator, success, fFilter); + break; + } + + case gsstMultiple: + { +- const MultipleSubstitutionSubtable *subtable = (const MultipleSubstitutionSubtable *) lookupSubtable; ++ const LEReferenceTo<MultipleSubstitutionSubtable> subtable(lookupSubtable, success); + +- delta = subtable->process(glyphIterator, success, fFilter); ++ delta = subtable->process(subtable, glyphIterator, success, fFilter); + break; + } + + case gsstAlternate: + { +- const AlternateSubstitutionSubtable *subtable = (const AlternateSubstitutionSubtable *) lookupSubtable; ++ const LEReferenceTo<AlternateSubstitutionSubtable> subtable(lookupSubtable, success); + +- delta = subtable->process(glyphIterator, fFilter); ++ delta = subtable->process(subtable, glyphIterator, success, fFilter); + break; + } + + case gsstLigature: + { +- const LigatureSubstitutionSubtable *subtable = (const LigatureSubstitutionSubtable *) lookupSubtable; ++ const LEReferenceTo<LigatureSubstitutionSubtable> subtable(lookupSubtable, success); + +- delta = subtable->process(glyphIterator, fFilter); ++ delta = subtable->process(subtable, glyphIterator, success, fFilter); + break; + } + + case gsstContext: + { +- const ContextualSubstitutionSubtable *subtable = (const ContextualSubstitutionSubtable *) lookupSubtable; ++ const LEReferenceTo<ContextualSubstitutionSubtable> subtable(lookupSubtable, success); + + delta = subtable->process(this, glyphIterator, fontInstance, success); + break; +@@ -129,7 +129,7 @@ + + case gsstChainingContext: + { +- const ChainingContextualSubstitutionSubtable *subtable = (const ChainingContextualSubstitutionSubtable *) lookupSubtable; ++ const LEReferenceTo<ChainingContextualSubstitutionSubtable> subtable(lookupSubtable, success); + + delta = subtable->process(this, glyphIterator, fontInstance, success); + break; +@@ -137,7 +137,7 @@ + + case gsstExtension: + { +- const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable; ++ const LEReferenceTo<ExtensionSubtable> subtable(lookupSubtable, success); + + delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success); + break; +diff --git a/src/share/native/sun/font/layout/GlyphSubstLookupProc.h b/src/share/native/sun/font/layout/GlyphSubstLookupProc.h +--- jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h ++++ jdk/src/share/native/sun/font/layout/GlyphSubstLookupProc.h +@@ -52,7 +52,7 @@ + class GlyphSubstitutionLookupProcessor : public LookupProcessor + { + public: +- GlyphSubstitutionLookupProcessor(const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader, ++ GlyphSubstitutionLookupProcessor(const LEReferenceTo<GlyphSubstitutionTableHeader> &glyphSubstitutionTableHeader, + LETag scriptTag, + LETag languageTag, + const LEGlyphFilter *filter, +@@ -63,7 +63,7 @@ + + virtual ~GlyphSubstitutionLookupProcessor(); + +- virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator, ++ virtual le_uint32 applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, LEErrorCode& success) const; + + protected: +diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp b/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp +--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp ++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.cpp +@@ -42,11 +42,12 @@ + + U_NAMESPACE_BEGIN + +-le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage, ++le_int32 GlyphSubstitutionTableHeader::process(const LEReferenceTo<GlyphSubstitutionTableHeader> &base, ++ LEGlyphStorage &glyphStorage, + le_bool rightToLeft, + LETag scriptTag, + LETag languageTag, +- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, ++ const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, + const LEGlyphFilter *filter, + const FeatureMap *featureMap, + le_int32 featureMapCount, +@@ -57,7 +58,7 @@ + return 0; + } + +- GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder, success); ++ GlyphSubstitutionLookupProcessor processor(base, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder, success); + return processor.process(glyphStorage, NULL, rightToLeft, glyphDefinitionTableHeader, NULL, success); + } + +diff --git a/src/share/native/sun/font/layout/GlyphSubstitutionTables.h b/src/share/native/sun/font/layout/GlyphSubstitutionTables.h +--- jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h ++++ jdk/src/share/native/sun/font/layout/GlyphSubstitutionTables.h +@@ -50,11 +50,12 @@ + + struct GlyphSubstitutionTableHeader : public GlyphLookupTableHeader + { +- le_int32 process(LEGlyphStorage &glyphStorage, ++ le_int32 process(const LEReferenceTo<GlyphSubstitutionTableHeader> &base, ++ LEGlyphStorage &glyphStorage, + le_bool rightToLeft, + LETag scriptTag, + LETag languageTag, +- const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, ++ const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, + const LEGlyphFilter *filter, + const FeatureMap *featureMap, + le_int32 featureMapCount, +diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.cpp b/src/share/native/sun/font/layout/HanLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.cpp +@@ -64,7 +64,7 @@ + #define features (loclFeatureMask) + + HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) + { + fFeatureMap = featureMap; +diff --git a/src/share/native/sun/font/layout/HanLayoutEngine.h b/src/share/native/sun/font/layout/HanLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/HanLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/HanLayoutEngine.h +@@ -73,7 +73,7 @@ + * @internal + */ + HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTablem, LEErrorCode &success); ++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTablem, LEErrorCode &success); + + + /** +diff --git a/src/share/native/sun/font/layout/HangulLayoutEngine.cpp b/src/share/native/sun/font/layout/HangulLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/HangulLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/HangulLayoutEngine.cpp +@@ -209,7 +209,7 @@ + } + + HangulOpenTypeLayoutEngine::HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 /*languageCode*/, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, korLanguageCode, typoFlags, gsubTable, success) + { + fFeatureMap = featureMap; +diff --git a/src/share/native/sun/font/layout/HangulLayoutEngine.h b/src/share/native/sun/font/layout/HangulLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/HangulLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/HangulLayoutEngine.h +@@ -79,7 +79,7 @@ + * @internal + */ + HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); ++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +diff --git a/src/share/native/sun/font/layout/ICUFeatures.h b/src/share/native/sun/font/layout/ICUFeatures.h +--- jdk/src/share/native/sun/font/layout/ICUFeatures.h ++++ jdk/src/share/native/sun/font/layout/ICUFeatures.h +@@ -54,16 +54,21 @@ + le_uint16 lookupCount; + le_uint16 lookupListIndexArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(FeatureTable, lookupListIndexArray) + + struct FeatureListTable + { + le_uint16 featureCount; + FeatureRecord featureRecordArray[ANY_NUMBER]; + +- const FeatureTable *getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const; ++ LEReferenceTo<FeatureTable> getFeatureTable(const LETableReference &base, le_uint16 featureIndex, LETag *featureTag, LEErrorCode &success) const; + +- const FeatureTable *getFeatureTable(LETag featureTag) const; ++#if 0 ++ const LEReferenceTo<FeatureTable> getFeatureTable(const LETableReference &base, LETag featureTag, LEErrorCode &success) const; ++#endif + }; + ++LE_VAR_ARRAY(FeatureListTable, featureRecordArray) ++ + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.cpp b/src/share/native/sun/font/layout/IndicLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp +@@ -50,7 +50,7 @@ + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicOpenTypeLayoutEngine) + + IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, le_bool version2, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ le_int32 typoFlags, le_bool version2, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success), fMPreFixups(NULL) + { + if ( version2 ) { +diff --git a/src/share/native/sun/font/layout/IndicLayoutEngine.h b/src/share/native/sun/font/layout/IndicLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/IndicLayoutEngine.h +@@ -81,7 +81,7 @@ + * @internal + */ + IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, le_bool version2, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); ++ le_int32 typoFlags, le_bool version2, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +diff --git a/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp b/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp +--- jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp +@@ -43,11 +43,14 @@ + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicRearrangementProcessor) + +-IndicRearrangementProcessor::IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader) +- : StateTableProcessor(morphSubtableHeader) ++ IndicRearrangementProcessor::IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) ++ : StateTableProcessor(morphSubtableHeader, success), ++ indicRearrangementSubtableHeader(morphSubtableHeader, success), ++ entryTable(stateTableHeader, success, (const IndicRearrangementStateEntry*)(&stateTableHeader->stHeader), ++ entryTableOffset, LE_UNBOUNDED_ARRAY), ++ int16Table(stateTableHeader, success, (const le_int16*)entryTable.getAlias(), 0, LE_UNBOUNDED_ARRAY) ++ + { +- indicRearrangementSubtableHeader = (const IndicRearrangementSubtableHeader *) morphSubtableHeader; +- entryTable = (const IndicRearrangementStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset); + } + + IndicRearrangementProcessor::~IndicRearrangementProcessor() +@@ -62,7 +65,8 @@ + + ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) + { +- const IndicRearrangementStateEntry *entry = &entryTable[index]; ++ LEErrorCode success = LE_NO_ERROR; // todo- make a param? ++ const IndicRearrangementStateEntry *entry = entryTable.getAlias(index,success); + ByteOffset newState = SWAPW(entry->newStateOffset); + IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags); + +diff --git a/src/share/native/sun/font/layout/IndicRearrangementProcessor.h b/src/share/native/sun/font/layout/IndicRearrangementProcessor.h +--- jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.h ++++ jdk/src/share/native/sun/font/layout/IndicRearrangementProcessor.h +@@ -58,7 +58,7 @@ + + void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const; + +- IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader); ++ IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); + virtual ~IndicRearrangementProcessor(); + + /** +@@ -79,8 +79,9 @@ + le_int32 firstGlyph; + le_int32 lastGlyph; + +- const IndicRearrangementStateEntry *entryTable; +- const IndicRearrangementSubtableHeader *indicRearrangementSubtableHeader; ++ LEReferenceTo<IndicRearrangementSubtableHeader> indicRearrangementSubtableHeader; ++ LEReferenceToArrayOf<IndicRearrangementStateEntry> entryTable; ++ LEReferenceToArrayOf<le_int16> int16Table; + + }; + +diff --git a/src/share/native/sun/font/layout/IndicReordering.cpp b/src/share/native/sun/font/layout/IndicReordering.cpp +--- jdk/src/share/native/sun/font/layout/IndicReordering.cpp ++++ jdk/src/share/native/sun/font/layout/IndicReordering.cpp +@@ -658,6 +658,11 @@ + MPreFixups *mpreFixups = NULL; + const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); + ++ if(classTable==NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return 0; ++ } ++ + if (classTable->scriptFlags & SF_MPRE_FIXUP) { + mpreFixups = new MPreFixups(charCount); + if (mpreFixups == NULL) { +diff --git a/src/share/native/sun/font/layout/KernTable.cpp b/src/share/native/sun/font/layout/KernTable.cpp +--- jdk/src/share/native/sun/font/layout/KernTable.cpp ++++ jdk/src/share/native/sun/font/layout/KernTable.cpp +@@ -92,16 +92,16 @@ + * TODO: support multiple subtables + * TODO: respect header flags + */ +-KernTable::KernTable(const LEFontInstance* font_, const void* tableData) +- : pairs(0), font(font_) ++KernTable::KernTable(const LETableReference &table, LEErrorCode &success) ++ : pairs(table, success), pairsSwapped(NULL), fTable(table) + { +- const KernTableHeader* header = (const KernTableHeader*)tableData; +- if (header == 0) { ++ if(LE_FAILURE(success) || (fTable.isEmpty())) { + #if DEBUG + fprintf(stderr, "no kern data\n"); + #endif + return; + } ++ LEReferenceTo<KernTableHeader> header(fTable, success); + + #if DEBUG + // dump first 32 bytes of header +@@ -115,12 +115,17 @@ + } + #endif + +- if (header->version == 0 && SWAPW(header->nTables) > 0) { +- const SubtableHeader* subhead = (const SubtableHeader*)((char*)tableData + KERN_TABLE_HEADER_SIZE); +- if (subhead->version == 0) { ++ if(LE_FAILURE(success)) return; ++ ++ if (!header.isEmpty() && header->version == 0 && SWAPW(header->nTables) > 0) { ++ LEReferenceTo<SubtableHeader> subhead(header, success, KERN_TABLE_HEADER_SIZE); ++ ++ if (LE_SUCCESS(success) && !subhead.isEmpty() && subhead->version == 0) { + coverage = SWAPW(subhead->coverage); + if (coverage & COVERAGE_HORIZONTAL) { // only handle horizontal kerning +- const Subtable_0* table = (const Subtable_0*)((char*)subhead + KERN_SUBTABLE_HEADER_SIZE); ++ LEReferenceTo<Subtable_0> table(subhead, success, KERN_SUBTABLE_HEADER_SIZE); ++ ++ if(table.isEmpty() || LE_FAILURE(success)) return; + + nPairs = SWAPW(table->nPairs); + +@@ -134,17 +139,17 @@ + rangeShift = (nPairs * KERN_PAIRINFO_SIZE) - searchRange; + #endif + +- pairs = (PairInfo*)font->getKernPairs(); +- if (pairs == NULL) { +- char *pairData = (char*)table + KERN_SUBTABLE_0_HEADER_SIZE; +- char *pptr = pairData; +- pairs = (PairInfo*)(malloc(nPairs*sizeof(PairInfo))); +- PairInfo *p = (PairInfo*)pairs; +- for (int i = 0; i < nPairs; i++, pptr += KERN_PAIRINFO_SIZE, p++) { +- memcpy(p, pptr, KERN_PAIRINFO_SIZE); ++ if(LE_SUCCESS(success) && nPairs>0) { ++ pairs.setToOffsetInParent(table, KERN_SUBTABLE_0_HEADER_SIZE, nPairs, success); ++ } ++ if (LE_SUCCESS(success) && pairs.isValid()) { ++ pairsSwapped = (PairInfo*)(malloc(nPairs*sizeof(PairInfo))); ++ PairInfo *p = (PairInfo*)pairsSwapped; ++ for (int i = 0; LE_SUCCESS(success) && i < nPairs; i++, p++) { ++ memcpy(p, pairs.getAlias(i,success), KERN_PAIRINFO_SIZE); + p->key = SWAPL(p->key); + } +- font->setKernPairs((void*)pairs); ++ fTable.getFont()->setKernPairs((void*)pairsSwapped); // store it + } + + #if DEBUG +@@ -162,7 +167,7 @@ + ids[id] = (char)i; + } + } +- PairInfo *p = pairs; ++ PairInfo* p = pairs; + for (int i = 0; i < nPairs; ++i, p++) { + le_uint32 k = p->key; + le_uint16 left = (k >> 16) & 0xffff; +@@ -194,10 +199,12 @@ + * Process the glyph positions. The positions array has two floats for each + * glyph, plus a trailing pair to mark the end of the last glyph. + */ +-void KernTable::process(LEGlyphStorage& storage) ++void KernTable::process(LEGlyphStorage& storage, LEErrorCode &success) + { +- if (pairs) { +- LEErrorCode success = LE_NO_ERROR; ++ if(LE_FAILURE(success)) return; ++ ++ if (pairsSwapped) { ++ success = LE_NO_ERROR; + + le_uint32 key = storage[0]; // no need to mask off high bits + float adjust = 0; +@@ -209,7 +216,7 @@ + // so either I have to swap the element each time I examine it, or I have to swap + // all the elements ahead of time and store them in the font + +- const PairInfo* p = pairs; ++ const PairInfo* p = pairsSwapped; + const PairInfo* tp = (const PairInfo*)(p + rangeShift); + if (key > tp->key) { + p = tp; +@@ -225,7 +232,7 @@ + tp = (const PairInfo*)(p + probe); + le_uint32 tkey = tp->key; + #if DEBUG +- fprintf(stdout, " %.3d (%0.8x)\n", (tp - pairs), tkey); ++ fprintf(stdout, " %.3d (%0.8x)\n", (tp - pairsSwapped), tkey); + #endif + if (tkey <= key) { + if (tkey == key) { +@@ -240,10 +247,10 @@ + // device transform, or a faster way, such as moving the + // entire kern table up to Java. + LEPoint pt; +- pt.fX = font->xUnitsToPoints(value); ++ pt.fX = fTable.getFont()->xUnitsToPoints(value); + pt.fY = 0; + +- font->getKerningAdjustment(pt); ++ fTable.getFont()->getKerningAdjustment(pt); + adjust += pt.fX; + break; + } +diff --git a/src/share/native/sun/font/layout/KernTable.h b/src/share/native/sun/font/layout/KernTable.h +--- jdk/src/share/native/sun/font/layout/KernTable.h ++++ jdk/src/share/native/sun/font/layout/KernTable.h +@@ -26,7 +26,7 @@ + /* + * + * +- * (C) Copyright IBM Corp. 2004-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 2004-2013 - All Rights Reserved + * + */ + +@@ -38,6 +38,7 @@ + #endif + + #include "LETypes.h" ++#include "LETableReference.h" + //#include "LEFontInstance.h" + //#include "LEGlyphStorage.h" + +@@ -56,19 +57,20 @@ + private: + le_uint16 coverage; + le_uint16 nPairs; +- const PairInfo* pairs; +- const LEFontInstance* font; ++ LEReferenceToArrayOf<PairInfo> pairs; ++ PairInfo *pairsSwapped; ++ const LETableReference &fTable; + le_uint16 searchRange; + le_uint16 entrySelector; + le_uint16 rangeShift; + + public: +- KernTable(const LEFontInstance* font, const void* tableData); ++ KernTable(const LETableReference &table, LEErrorCode &success); + + /* + * Process the glyph positions. + */ +- void process(LEGlyphStorage& storage); ++ void process(LEGlyphStorage& storage, LEErrorCode &success); + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp b/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.cpp +@@ -43,7 +43,7 @@ + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(KhmerOpenTypeLayoutEngine) + + KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) + { + fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount); +diff --git a/src/share/native/sun/font/layout/KhmerLayoutEngine.h b/src/share/native/sun/font/layout/KhmerLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/KhmerLayoutEngine.h +@@ -83,7 +83,7 @@ + * @internal + */ + KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); ++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +diff --git a/src/share/native/sun/font/layout/LEFontInstance.h b/src/share/native/sun/font/layout/LEFontInstance.h +--- jdk/src/share/native/sun/font/layout/LEFontInstance.h ++++ jdk/src/share/native/sun/font/layout/LEFontInstance.h +@@ -194,6 +194,25 @@ + virtual void setKernPairs(void *pairs) const = 0; + + /** ++ * This method reads a table from the font. Note that in general, ++ * it only makes sense to call this method on an <code>LEFontInstance</code> ++ * which represents a physical font - i.e. one which has been returned by ++ * <code>getSubFont()</code>. This is because each subfont in a composite font ++ * will have different tables, and there's no way to know which subfont to access. ++ * ++ * Subclasses which represent composite fonts should always return <code>NULL</code>. ++ * ++ * This version sets a length, for range checking. ++ * ++ * @param tableTag - the four byte table tag. (e.g. 'cmap') ++ * @param length - ignored on entry, on exit will be the length of the table if known, or -1 if unknown. ++ * @return the address of the table in memory, or <code>NULL</code> ++ * if the table doesn't exist. ++ * @internal ++ */ ++ virtual const void* getFontTable(LETag tableTag, size_t &length) const { length=-1; return getFontTable(tableTag); } /* -1 = unknown length */ ++ ++ /** + * This method is used to determine if the font can + * render the given character. This can usually be done + * by looking the character up in the font's character +diff --git a/src/share/native/sun/font/layout/LEScripts.h b/src/share/native/sun/font/layout/LEScripts.h +--- jdk/src/share/native/sun/font/layout/LEScripts.h ++++ jdk/src/share/native/sun/font/layout/LEScripts.h +@@ -241,8 +241,28 @@ + palmScriptCode = 144, + sindScriptCode = 145, + waraScriptCode = 146, ++/** ++ * @stable ICU 4.8 ++ */ + +- scriptCodeCount = 147 ++ afakScriptCode = 147, ++ jurcScriptCode = 148, ++ mrooScriptCode = 149, ++ nshuScriptCode = 150, ++ shrdScriptCode = 151, ++ soraScriptCode = 152, ++ takrScriptCode = 153, ++ tangScriptCode = 154, ++ woleScriptCode = 155, ++/** ++ * @stable ICU 49 ++ */ ++ ++ hluwScriptCode = 156, /* bump to match current ICU */ ++ khojScriptCode = 157, ++ tirhScriptCode = 158, ++ ++ scriptCodeCount = 159 + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/LETableReference.h b/src/share/native/sun/font/layout/LETableReference.h +new file mode 100644 +--- /dev/null ++++ jdk/src/share/native/sun/font/layout/LETableReference.h +@@ -0,0 +1,497 @@ ++/* ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/* ++ * -*- c++ -*- ++ * ++ * (C) Copyright IBM Corp. and others 2013 - All Rights Reserved ++ * ++ * Range checking ++ * ++ */ ++ ++#ifndef __LETABLEREFERENCE_H ++#define __LETABLEREFERENCE_H ++ ++#include "LETypes.h" ++#include "LEFontInstance.h" ++ ++ ++#define kQuestionmarkTableTag 0x3F3F3F3FUL ++#define kTildeTableTag 0x7e7e7e7eUL ++#ifdef __cplusplus ++ ++// internal - interface for range checking ++U_NAMESPACE_BEGIN ++ ++#if LE_ASSERT_BAD_FONT ++class LETableReference; // fwd ++/** ++ * defined in OpenTypeUtilities.cpp ++ * @internal ++ */ ++U_INTERNAL void U_EXPORT2 _debug_LETableReference(const char *f, int l, const char *msg, const LETableReference *what, const void *ptr, size_t len); ++ ++#define LE_DEBUG_TR(x) _debug_LETableReference(__FILE__, __LINE__, x, this, NULL, 0); ++#define LE_DEBUG_TR3(x,y,z) _debug_LETableReference(__FILE__, __LINE__, x, this, (const void*)y, (size_t)z); ++#if 0 ++#define LE_TRACE_TR(x) _debug_LETableReference(__FILE__, __LINE__, x, this, NULL, 0); ++#else ++#define LE_TRACE_TR(x) ++#endif ++ ++#else ++#define LE_DEBUG_TR(x) ++#define LE_DEBUG_TR3(x,y,z) ++#define LE_TRACE_TR(x) ++#endif ++ ++/** ++ * @internal ++ */ ++class LETableReference { ++public: ++/** ++ * @internal ++ * Construct from a specific tag ++ */ ++ LETableReference(const LEFontInstance* font, LETag tableTag, LEErrorCode &success) : ++ fFont(font), fTag(tableTag), fParent(NULL), fStart(NULL),fLength(LE_UINTPTR_MAX) { ++ loadTable(success); ++ LE_TRACE_TR("INFO: new table load") ++ } ++ ++ LETableReference(const LETableReference &parent, LEErrorCode &success) : fFont(parent.fFont), fTag(parent.fTag), fParent(&parent), fStart(parent.fStart), fLength(parent.fLength) { ++ if(LE_FAILURE(success)) { ++ clear(); ++ } ++ LE_TRACE_TR("INFO: new clone") ++ } ++ ++ LETableReference(const le_uint8* data, size_t length = LE_UINTPTR_MAX) : ++ fFont(NULL), fTag(kQuestionmarkTableTag), fParent(NULL), fStart(data), fLength(length) { ++ LE_TRACE_TR("INFO: new raw") ++ } ++ LETableReference() : ++ fFont(NULL), fTag(kQuestionmarkTableTag), fParent(NULL), fStart(NULL), fLength(0) { ++ LE_TRACE_TR("INFO: new empty") ++ } ++ ++ ~LETableReference() { ++ fTag=kTildeTableTag; ++ LE_TRACE_TR("INFO: new dtor") ++ } ++ ++ /** ++ * @internal ++ * @param length if LE_UINTPTR_MAX means "whole table" ++ * subset ++ */ ++ LETableReference(const LETableReference &parent, size_t offset, size_t length, ++ LEErrorCode &err) : ++ fFont(parent.fFont), fTag(parent.fTag), fParent(&parent), ++ fStart((parent.fStart)+offset), fLength(length) { ++ if(LE_SUCCESS(err)) { ++ if(isEmpty()) { ++ //err = LE_MISSING_FONT_TABLE_ERROR; ++ clear(); // it's just empty. Not an error. ++ } else if(offset >= fParent->fLength) { ++ LE_DEBUG_TR3("offset out of range: (%p) +%d", NULL, offset); ++ err = LE_INDEX_OUT_OF_BOUNDS_ERROR; ++ clear(); ++ } else { ++ if(fLength == LE_UINTPTR_MAX && ++ fParent->fLength != LE_UINTPTR_MAX) { ++ fLength = (fParent->fLength) - offset; // decrement length as base address is incremented ++ } ++ if(fLength != LE_UINTPTR_MAX) { // if we have bounds: ++ if(offset+fLength > fParent->fLength) { ++ LE_DEBUG_TR3("offset+fLength out of range: (%p) +%d", NULL, offset+fLength); ++ err = LE_INDEX_OUT_OF_BOUNDS_ERROR; // exceeded ++ clear(); ++ } ++ } ++ } ++ } else { ++ clear(); ++ } ++ LE_TRACE_TR("INFO: new subset") ++ } ++ ++ const void* getAlias() const { return (const void*)fStart; } ++ const void* getAliasTODO() const { LE_DEBUG_TR("getAliasTODO()"); return (const void*)fStart; } ++ le_bool isEmpty() const { return fStart==NULL || fLength==0; } ++ le_bool isValid() const { return !isEmpty(); } ++ le_bool hasBounds() const { return fLength!=LE_UINTPTR_MAX; } ++ void clear() { fLength=0; fStart=NULL; } ++ size_t getLength() const { return fLength; } ++ const LEFontInstance* getFont() const { return fFont; } ++ LETag getTag() const { return fTag; } ++ const LETableReference* getParent() const { return fParent; } ++ ++ void addOffset(size_t offset, LEErrorCode &success) { ++ if(hasBounds()) { ++ if(offset > fLength) { ++ LE_DEBUG_TR("addOffset off end"); ++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR; ++ return; ++ } else { ++ fLength -= offset; ++ } ++ } ++ fStart += offset; ++ } ++ ++ size_t ptrToOffset(const void *atPtr, LEErrorCode &success) const { ++ if(atPtr==NULL) return 0; ++ if(LE_FAILURE(success)) return LE_UINTPTR_MAX; ++ if((atPtr < fStart) || ++ (hasBounds() && (atPtr > fStart+fLength))) { ++ LE_DEBUG_TR3("ptrToOffset args out of range: %p", atPtr, 0); ++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR; ++ return LE_UINTPTR_MAX; ++ } ++ return ((const le_uint8*)atPtr)-fStart; ++ } ++ ++ /** ++ * Clamp down the length, for range checking. ++ */ ++ size_t contractLength(size_t newLength) { ++ if(fLength!=LE_UINTPTR_MAX&&newLength>0&&newLength<=fLength) { ++ fLength = newLength; ++ } ++ return fLength; ++ } ++ ++ /** ++ * Throw an error if offset+length off end ++ */ ++public: ++ size_t verifyLength(size_t offset, size_t length, LEErrorCode &success) { ++ if(isValid()&& ++ LE_SUCCESS(success) && ++ fLength!=LE_UINTPTR_MAX && length!=LE_UINTPTR_MAX && offset!=LE_UINTPTR_MAX && ++ (offset+length)>fLength) { ++ LE_DEBUG_TR3("verifyLength failed (%p) %d",NULL, offset+length); ++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR; ++#if LE_ASSERT_BAD_FONT ++ fprintf(stderr, "offset=%lu, len=%lu, would be at %p, (%lu) off end. End at %p\n", offset,length, fStart+offset+length, (offset+length-fLength), (offset+length-fLength)+fStart); ++#endif ++ } ++ return fLength; ++ } ++ ++ le_bool isSubsetOf(const LETableReference& base) const { ++ if(this == &base) return true; ++ if(fStart < base.fStart) return false; ++ if(base.hasBounds()) { ++ if(fStart >= base.fStart + base.fLength) return false; ++ if(hasBounds()) { ++ if(fStart + fLength > base.fStart + base.fLength) return false; ++ } ++ } ++ return true; ++ } ++ ++ /** ++ * Change parent link to another ++ */ ++ LETableReference &reparent(const LETableReference &base) { ++ fParent = &base; ++ return *this; ++ } ++ ++ /** ++ * remove parent link. Factory functions should do this. ++ */ ++ void orphan(void) { ++ fParent=NULL; ++ } ++ ++protected: ++ const LEFontInstance* fFont; ++ LETag fTag; ++ const LETableReference *fParent; ++ const le_uint8 *fStart; // keep as 8 bit internally, for pointer math ++ size_t fLength; ++ ++ void loadTable(LEErrorCode &success) { ++ if(LE_SUCCESS(success)) { ++ fStart = (const le_uint8*)(fFont->getFontTable(fTag, fLength)); // note - a null table is not an error. ++ } ++ } ++ ++ void setRaw(const void *data, size_t length = LE_UINTPTR_MAX) { ++ fFont = NULL; ++ fTag = kQuestionmarkTableTag; ++ fParent = NULL; ++ fStart = (const le_uint8*)data; ++ fLength = length; ++ } ++}; ++ ++ ++template<class T> ++class LETableVarSizer { ++ public: ++ inline static size_t getSize(); ++}; ++ ++// base definition- could override for adjustments ++template<class T> inline ++size_t LETableVarSizer<T>::getSize() { ++ return sizeof(T); ++} ++ ++/** ++ * \def LE_VAR_ARRAY ++ * @param x Type (T) ++ * @param y some member that is of length ANY_NUMBER ++ * Call this after defining a class, for example: ++ * LE_VAR_ARRAY(FeatureListTable,featureRecordArray) ++ * this is roughly equivalent to: ++ * template<> inline size_t LETableVarSizer<FeatureListTable>::getSize() { return sizeof(FeatureListTable) - (sizeof(le_uint16)*ANY_NUMBER); } ++ * it's a specialization that informs the LETableReference subclasses to NOT include the variable array in the size. ++ * dereferencing NULL is valid here because we never actually dereference it, just inside sizeof. ++ */ ++#define LE_VAR_ARRAY(x,y) template<> inline size_t LETableVarSizer<x>::getSize() { return sizeof(x) - (sizeof(((const x*)0)->y)); } ++ ++/** ++ * Open a new entry based on an existing table ++ */ ++ ++/** ++ * \def LE_UNBOUNDED_ARRAY ++ * define an array with no *known* bound. Will trim to available size. ++ * @internal ++ */ ++#define LE_UNBOUNDED_ARRAY LE_UINT32_MAX ++ ++template<class T> ++class LEReferenceToArrayOf : public LETableReference { ++public: ++ LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, size_t offset, le_uint32 count) ++ : LETableReference(parent, offset, LE_UINTPTR_MAX, success), fCount(count) { ++ LE_TRACE_TR("INFO: new RTAO by offset") ++ if(LE_SUCCESS(success)) { ++ if(count == LE_UNBOUNDED_ARRAY) { // not a known length ++ count = getLength()/LETableVarSizer<T>::getSize(); // fit to max size ++ } ++ LETableReference::verifyLength(0, LETableVarSizer<T>::getSize()*count, success); ++ } ++ if(LE_FAILURE(success)) { ++ fCount=0; ++ clear(); ++ } ++ } ++ ++ LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, const T* array, le_uint32 count) ++ : LETableReference(parent, parent.ptrToOffset(array, success), LE_UINTPTR_MAX, success), fCount(count) { ++LE_TRACE_TR("INFO: new RTAO") ++ if(LE_SUCCESS(success)) { ++ if(count == LE_UNBOUNDED_ARRAY) { // not a known length ++ count = getLength()/LETableVarSizer<T>::getSize(); // fit to max size ++ } ++ LETableReference::verifyLength(0, LETableVarSizer<T>::getSize()*count, success); ++ } ++ if(LE_FAILURE(success)) clear(); ++ } ++ LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, const T* array, size_t offset, le_uint32 count) ++ : LETableReference(parent, parent.ptrToOffset(array, success)+offset, LE_UINTPTR_MAX, success), fCount(count) { ++LE_TRACE_TR("INFO: new RTAO") ++ if(LE_SUCCESS(success)) { ++ if(count == LE_UNBOUNDED_ARRAY) { // not a known length ++ count = getLength()/LETableVarSizer<T>::getSize(); // fit to max size ++ } ++ LETableReference::verifyLength(0, LETableVarSizer<T>::getSize()*count, success); ++ } ++ if(LE_FAILURE(success)) clear(); ++ } ++ ++ LEReferenceToArrayOf() :LETableReference(), fCount(0) {} ++ ++ le_uint32 getCount() const { return fCount; } ++ ++ using LETableReference::getAlias; ++ ++ const T *getAlias(le_uint32 i, LEErrorCode &success) const { ++ if(LE_SUCCESS(success)&& i<getCount()) { ++ return ((const T*)getAlias())+i; ++ } else { ++ if(LE_SUCCESS(success)) { ++ LE_DEBUG_TR("getAlias(subscript) out of range"); ++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR; ++ } ++ return ((const T*)getAlias()); // return first item, so there's no crash ++ } ++ } ++ ++ const T *getAliasTODO() const { LE_DEBUG_TR("getAliasTODO<>"); return (const T*)fStart; } ++ ++ const T& getObject(le_uint32 i, LEErrorCode &success) const { ++ return *getAlias(i,success); ++ } ++ ++ const T& operator()(le_uint32 i, LEErrorCode &success) const { ++ return *getAlias(i,success); ++ } ++ ++ size_t getOffsetFor(le_uint32 i, LEErrorCode &success) const { ++ if(LE_SUCCESS(success)&&i<getCount()) { ++ return LETableVarSizer<T>::getSize()*i; ++ } else { ++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR; ++ } ++ return 0; ++ } ++ ++ LEReferenceToArrayOf<T> &reparent(const LETableReference &base) { ++ fParent = &base; ++ return *this; ++ } ++ ++ LEReferenceToArrayOf(const LETableReference& parent, LEErrorCode & success) : LETableReference(parent,0, LE_UINTPTR_MAX, success), fCount(0) { ++ LE_TRACE_TR("INFO: null RTAO") ++ } ++ ++ /** ++ * set this to point within our fParent, but based on 'base' as a subtable. ++ */ ++ void setToOffsetInParent(const LETableReference& base, size_t offset, le_uint32 count, LEErrorCode &success) { ++LE_TRACE_TR("INFO: sTOIP") ++ if(LE_FAILURE(success)) return; ++ if(!fParent->isSubsetOf(base)) { // Ensure that 'base' is containable within our parent. ++ clear(); // otherwise, it's not a subtable of our parent. ++ LE_DEBUG_TR("setToOffsetInParents called on non subsets"); ++ success = LE_ILLEGAL_ARGUMENT_ERROR; return; ++ } ++ size_t baseOffset = fParent->ptrToOffset(((const le_uint8*)base.getAlias())+offset, success); ++ if(LE_FAILURE(success)) return; // base was outside of parent's range ++ if(fParent->hasBounds()) { ++ if((baseOffset >= fParent->getLength()) || // start off end of parent ++ (baseOffset+(count*LETableVarSizer<T>::getSize()) >= fParent->getLength()) || // or off end of parent ++ count > LE_UINTPTR_MAX/LETableVarSizer<T>::getSize()) { // or more than would fit in memory ++ LE_DEBUG_TR("setToOffsetInParent called with bad length"); ++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR; ++ clear(); ++ return; // start would go off end of parent ++ } ++ } ++ fStart = (const le_uint8*)(fParent->getAlias()) + baseOffset; ++ //fLength = count*LETableVarSizer<T>::getSize(); - no- do not shrink fLength. ++ if(fParent->hasBounds()) { ++ fLength = (fParent->getLength() - (fStart-(const le_uint8*)fParent->getAlias())); // reduces fLength accordingly. ++ } else { ++ fLength = LE_UINTPTR_MAX; // unbounded ++ } ++ if((fStart < fParent->getAlias()) || ++ (hasBounds()&&(fStart+fLength < fStart))) { // wrapped ++ LE_DEBUG_TR("setToOffsetInParent called with bad length"); ++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR; ++ clear(); ++ return; // start would go off end of parent ++ } ++ fCount = count; ++ } ++ ++private: ++ le_uint32 fCount; ++}; ++ ++ ++template<class T> ++class LEReferenceTo : public LETableReference { ++public: ++ /** ++ * open a sub reference. ++ * @param parent parent reference ++ * @param success error status ++ * @param atPtr location of reference - if NULL, will be at offset zero (i.e. downcast of parent). Otherwise must be a pointer within parent's bounds. ++ */ ++ LEReferenceTo(const LETableReference &parent, LEErrorCode &success, const void* atPtr) ++ : LETableReference(parent, parent.ptrToOffset(atPtr, success), LE_UINTPTR_MAX, success) { ++ verifyLength(parent.ptrToOffset(atPtr,success), LETableVarSizer<T>::getSize(), success); ++ if(LE_FAILURE(success)) clear(); ++ } ++ /** ++ * ptr plus offset ++ */ ++ LEReferenceTo(const LETableReference &parent, LEErrorCode &success, const void* atPtr, size_t offset) ++ : LETableReference(parent, parent.ptrToOffset(atPtr, success)+offset, LE_UINTPTR_MAX, success) { ++ verifyLength(0, LETableVarSizer<T>::getSize(), success); ++ if(LE_FAILURE(success)) clear(); ++ } ++ LEReferenceTo(const LETableReference &parent, LEErrorCode &success, size_t offset) ++ : LETableReference(parent, offset, LE_UINTPTR_MAX, success) { ++ verifyLength(0, LETableVarSizer<T>::getSize(), success); ++ if(LE_FAILURE(success)) clear(); ++ } ++ LEReferenceTo(const LETableReference &parent, LEErrorCode &success) ++ : LETableReference(parent, 0, LE_UINTPTR_MAX, success) { ++ verifyLength(0, LETableVarSizer<T>::getSize(), success); ++ if(LE_FAILURE(success)) clear(); ++ } ++ LEReferenceTo(const LEFontInstance *font, LETag tableTag, LEErrorCode &success) ++ : LETableReference(font, tableTag, success) { ++ verifyLength(0, LETableVarSizer<T>::getSize(), success); ++ if(LE_FAILURE(success)) clear(); ++ } ++ LEReferenceTo(const le_uint8 *data, size_t length = LE_UINTPTR_MAX) : LETableReference(data, length) {} ++ LEReferenceTo(const T *data, size_t length = LE_UINTPTR_MAX) : LETableReference((const le_uint8*)data, length) {} ++ LEReferenceTo() : LETableReference(NULL) {} ++ ++ LEReferenceTo<T>& operator=(const T* other) { ++ setRaw(other); ++ return *this; ++ } ++ ++ LEReferenceTo<T> &reparent(const LETableReference &base) { ++ fParent = &base; ++ return *this; ++ } ++ ++ /** ++ * roll forward by one <T> size. ++ * same as addOffset(LETableVarSizer<T>::getSize(),success) ++ */ ++ void addObject(LEErrorCode &success) { ++ addOffset(LETableVarSizer<T>::getSize(), success); ++ } ++ void addObject(size_t count, LEErrorCode &success) { ++ addOffset(LETableVarSizer<T>::getSize()*count, success); ++ } ++ ++ const T *operator->() const { return getAlias(); } ++ const T *getAlias() const { return (const T*)fStart; } ++ const T *getAliasTODO() const { LE_DEBUG_TR("getAliasTODO<>"); return (const T*)fStart; } ++}; ++ ++ ++U_NAMESPACE_END ++ ++#endif ++ ++#endif +diff --git a/src/share/native/sun/font/layout/LETypes.h b/src/share/native/sun/font/layout/LETypes.h +--- jdk/src/share/native/sun/font/layout/LETypes.h ++++ jdk/src/share/native/sun/font/layout/LETypes.h +@@ -245,12 +245,15 @@ + /** + * Max value representable by a uintptr + */ ++ ++#ifndef UINT32_MAX ++#define LE_UINT32_MAX 0xFFFFFFFFU ++#else ++#define LE_UINT32_MAX UINT32_MAX ++#endif ++ + #ifndef UINTPTR_MAX +-#ifndef UINT32_MAX +-#define LE_UINTPTR_MAX 0xFFFFFFFFU +-#else +-#define LE_UINTPTR_MAX UINT32_MAX +-#endif ++#define LE_UINTPTR_MAX LE_UINT32_MAX + #else + #define LE_UINTPTR_MAX UINTPTR_MAX + #endif +diff --git a/src/share/native/sun/font/layout/LayoutEngine.cpp b/src/share/native/sun/font/layout/LayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/LayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/LayoutEngine.cpp +@@ -141,21 +141,21 @@ + class CanonMarkFilter : public UMemory, public LEGlyphFilter + { + private: +- const GlyphClassDefinitionTable *classDefTable; ++ const LEReferenceTo<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); ++ CanonMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success); + virtual ~CanonMarkFilter(); + + virtual le_bool accept(LEGlyphID glyph) const; + }; + +-CanonMarkFilter::CanonMarkFilter(const GlyphDefinitionTableHeader *gdefTable) ++CanonMarkFilter::CanonMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success) ++ : classDefTable(gdefTable->getMarkAttachClassDefinitionTable(gdefTable, success)) + { +- classDefTable = gdefTable->getMarkAttachClassDefinitionTable(); + } + + CanonMarkFilter::~CanonMarkFilter() +@@ -165,9 +165,10 @@ + + le_bool CanonMarkFilter::accept(LEGlyphID glyph) const + { +- le_int32 glyphClass = classDefTable->getGlyphClass(glyph); +- +- return glyphClass != 0; ++ LEErrorCode success = LE_NO_ERROR; ++ le_int32 glyphClass = classDefTable->getGlyphClass(classDefTable, glyph, success); ++ if(LE_FAILURE(success)) return false; ++ return glyphClass != 0; + } + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LayoutEngine) +@@ -252,20 +253,20 @@ + return 0; + } + +- const GlyphSubstitutionTableHeader *canonGSUBTable = (GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; ++ LEReferenceTo<GlyphSubstitutionTableHeader> canonGSUBTable((GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable); + LETag scriptTag = OpenTypeLayoutEngine::getScriptTag(fScriptCode); + LETag langSysTag = OpenTypeLayoutEngine::getLangSysTag(fLanguageCode); + le_int32 i, dir = 1, out = 0, outCharCount = count; + +- if (canonGSUBTable->coversScript(scriptTag)) { ++ if (canonGSUBTable->coversScript(canonGSUBTable,scriptTag, success) || LE_SUCCESS(success)) { + CharSubstitutionFilter *substitutionFilter = new CharSubstitutionFilter(fFontInstance); + if (substitutionFilter == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + +- const LEUnicode *inChars = &chars[offset]; +- LEUnicode *reordered = NULL; ++ const LEUnicode *inChars = &chars[offset]; ++ LEUnicode *reordered = NULL; + LEGlyphStorage fakeGlyphStorage; + + fakeGlyphStorage.allocateGlyphArray(count, rightToLeft, success); +@@ -275,20 +276,20 @@ + return 0; + } + +- // This is the cheapest way to get mark reordering only for Hebrew. +- // We could just do the mark reordering for all scripts, but most +- // of them probably don't need it... +- if (fScriptCode == hebrScriptCode) { +- reordered = LE_NEW_ARRAY(LEUnicode, count); ++ // This is the cheapest way to get mark reordering only for Hebrew. ++ // We could just do the mark reordering for all scripts, but most ++ // of them probably don't need it... ++ if (fScriptCode == hebrScriptCode) { ++ reordered = LE_NEW_ARRAY(LEUnicode, count); + +- if (reordered == NULL) { +- delete substitutionFilter; +- success = LE_MEMORY_ALLOCATION_ERROR; +- return 0; +- } ++ if (reordered == NULL) { ++ delete substitutionFilter; ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return 0; ++ } + +- CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, fakeGlyphStorage); +- inChars = reordered; ++ CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, fakeGlyphStorage); ++ inChars = reordered; + } + + fakeGlyphStorage.allocateAuxData(success); +@@ -308,11 +309,11 @@ + fakeGlyphStorage.setAuxData(out, canonFeatures, success); + } + +- if (reordered != NULL) { +- LE_DELETE_ARRAY(reordered); +- } ++ if (reordered != NULL) { ++ LE_DELETE_ARRAY(reordered); ++ } + +- outCharCount = canonGSUBTable->process(fakeGlyphStorage, rightToLeft, scriptTag, langSysTag, NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE, success); ++ outCharCount = canonGSUBTable->process(canonGSUBTable, fakeGlyphStorage, rightToLeft, scriptTag, langSysTag, (const GlyphDefinitionTableHeader*)NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE, success); + + if (LE_FAILURE(success)) { + delete substitutionFilter; +@@ -413,16 +414,16 @@ + return; + } + +- GlyphDefinitionTableHeader *gdefTable = (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; +- CanonMarkFilter filter(gdefTable); ++ LEReferenceTo<GlyphDefinitionTableHeader> gdefTable((GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable, ++ CanonShaping::glyphDefinitionTableLen); ++ CanonMarkFilter filter(gdefTable, success); + + adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); + + if (fTypoFlags & LE_Kerning_FEATURE_FLAG) { /* kerning enabled */ +- static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG; +- +- KernTable kt(fFontInstance, getFontTable(kernTableTag)); +- kt.process(glyphStorage); ++ LETableReference kernTable(fFontInstance, LE_KERN_TABLE_TAG, success); ++ KernTable kt(kernTable, success); ++ kt.process(glyphStorage, success); + } + + // default is no adjustments +@@ -507,9 +508,9 @@ + glyphStorage.adjustPosition(glyphCount, xAdjust, 0, success); + } + +-const void *LayoutEngine::getFontTable(LETag tableTag) const ++const void *LayoutEngine::getFontTable(LETag tableTag, size_t &length) const + { +- return fFontInstance->getFontTable(tableTag); ++ return fFontInstance->getFontTable(tableTag, length); + } + + void LayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, +@@ -556,7 +557,10 @@ + + void LayoutEngine::reset() + { ++ if(fGlyphStorage!=NULL) { + fGlyphStorage->reset(); ++ fGlyphStorage = NULL; ++ } + } + + LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success) +@@ -574,19 +578,19 @@ + return NULL; + } + +- const GlyphSubstitutionTableHeader *gsubTable = (const GlyphSubstitutionTableHeader *) fontInstance->getFontTable(gsubTableTag); ++ LEReferenceTo<GlyphSubstitutionTableHeader> gsubTable(fontInstance,gsubTableTag,success); + LayoutEngine *result = NULL; + LETag scriptTag = 0x00000000; + LETag languageTag = 0x00000000; +- LETag v2ScriptTag = OpenTypeLayoutEngine::getV2ScriptTag(scriptCode); ++ LETag v2ScriptTag = OpenTypeLayoutEngine::getV2ScriptTag(scriptCode); + + // Right now, only invoke V2 processing for Devanagari. TODO: Allow more V2 scripts as they are + // properly tested. + +- if ( v2ScriptTag == dev2ScriptTag && gsubTable != NULL && gsubTable->coversScript( v2ScriptTag )) { +- result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, TRUE, gsubTable, success); +- } +- else if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) { ++ if ( v2ScriptTag == dev2ScriptTag && gsubTable.isValid() && gsubTable->coversScript(gsubTable, v2ScriptTag, success )) { ++ result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, TRUE, gsubTable, success); ++ } ++ else if (gsubTable.isValid() && gsubTable->coversScript(gsubTable, scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode), success)) { + switch (scriptCode) { + case bengScriptCode: + case devaScriptCode: +@@ -617,10 +621,10 @@ + case janLanguageCode: + case zhtLanguageCode: + case zhsLanguageCode: +- if (gsubTable->coversScriptAndLanguage(scriptTag, languageTag, TRUE)) { ++ if (gsubTable->coversScriptAndLanguage(gsubTable, scriptTag, languageTag, success, TRUE)) { + result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; +- } ++ } + + // note: falling through to default case. + default: +@@ -643,10 +647,10 @@ + break; + } + } else { +- const MorphTableHeader *morphTable = (MorphTableHeader *) fontInstance->getFontTable(mortTableTag); ++ LEReferenceTo<MorphTableHeader> mortTable(fontInstance, mortTableTag, success); + +- if (morphTable != NULL && SWAPL(morphTable->version)==0x00010000) { +- result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable, success); ++ if (LE_SUCCESS(success) && mortTable.isValid() && SWAPL(mortTable->version)==0x00010000) { // mort ++ result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, mortTable, success); + } else { + switch (scriptCode) { + case bengScriptCode: +diff --git a/src/share/native/sun/font/layout/LayoutEngine.h b/src/share/native/sun/font/layout/LayoutEngine.h +--- jdk/src/share/native/sun/font/layout/LayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/LayoutEngine.h +@@ -268,12 +268,18 @@ + * some other way must override this method. + * + * @param tableTag - the four byte table tag. ++ * @param length - length to use + * + * @return the address of the table. + * + * @internal + */ +- virtual const void *getFontTable(LETag tableTag) const; ++ virtual const void *getFontTable(LETag tableTag, size_t &length) const; ++ ++ /** ++ * @deprecated ++ */ ++ virtual const void *getFontTable(LETag tableTag) const { size_t ignored; return getFontTable(tableTag, ignored); } + + /** + * This method does character to glyph mapping. The default implementation +diff --git a/src/share/native/sun/font/layout/LigatureSubstProc.cpp b/src/share/native/sun/font/layout/LigatureSubstProc.cpp +--- jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp ++++ jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp +@@ -47,15 +47,15 @@ + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LigatureSubstitutionProcessor) + +-LigatureSubstitutionProcessor::LigatureSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) +- : StateTableProcessor(morphSubtableHeader) ++ LigatureSubstitutionProcessor::LigatureSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) ++: StateTableProcessor(morphSubtableHeader, success), ligatureSubstitutionHeader(morphSubtableHeader, success) + { +- ligatureSubstitutionHeader = (const LigatureSubstitutionHeader *) morphSubtableHeader; ++ if(LE_FAILURE(success)) return; + ligatureActionTableOffset = SWAPW(ligatureSubstitutionHeader->ligatureActionTableOffset); + componentTableOffset = SWAPW(ligatureSubstitutionHeader->componentTableOffset); + ligatureTableOffset = SWAPW(ligatureSubstitutionHeader->ligatureTableOffset); + +- entryTable = (const LigatureSubstitutionStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset); ++ entryTable = LEReferenceToArrayOf<LigatureSubstitutionStateEntry>(stHeader, success, entryTableOffset, LE_UNBOUNDED_ARRAY); + } + + LigatureSubstitutionProcessor::~LigatureSubstitutionProcessor() +@@ -69,7 +69,9 @@ + + ByteOffset LigatureSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) + { +- const LigatureSubstitutionStateEntry *entry = &entryTable[index]; ++ LEErrorCode success = LE_NO_ERROR; ++ const LigatureSubstitutionStateEntry *entry = entryTable.getAlias(index, success); ++ + ByteOffset newState = SWAPW(entry->newStateOffset); + le_int16 flags = SWAPW(entry->flags); + +@@ -88,7 +90,7 @@ + ByteOffset actionOffset = flags & lsfActionOffsetMask; + + if (actionOffset != 0) { +- const LigatureActionEntry *ap = (const LigatureActionEntry *) ((char *) &ligatureSubstitutionHeader->stHeader + actionOffset); ++ LEReferenceTo<LigatureActionEntry> ap(stHeader, success, actionOffset); + LigatureActionEntry action; + le_int32 offset, i = 0; + le_int32 stack[nComponents]; +@@ -97,7 +99,8 @@ + do { + le_uint32 componentGlyph = componentStack[m--]; + +- action = SWAPL(*ap++); ++ action = SWAPL(*ap.getAlias()); ++ ap.addObject(success); // ap++ + + if (m < 0) { + m = nComponents - 1; +@@ -105,37 +108,33 @@ + + offset = action & lafComponentOffsetMask; + if (offset != 0) { +- const le_int16 *offsetTable = (const le_int16 *)((char *) &ligatureSubstitutionHeader->stHeader + 2 * SignExtend(offset, lafComponentOffsetMask)); +- const le_int16 *tableEnd = (const le_int16 *)((char *) &ligatureSubstitutionHeader + 1 * SWAPW(ligatureSubstitutionHeader->length)); ++ LEReferenceToArrayOf<le_int16> offsetTable(stHeader, success, 2 * SignExtend(offset, lafComponentOffsetMask), LE_UNBOUNDED_ARRAY); + +- // Check if the font is internally consistent +- if(tableEnd < (const le_int16*)&ligatureSubstitutionHeader // stated end wrapped around? +- || offsetTable > tableEnd) { // offset past end of stated length? ++ if(LE_FAILURE(success)) { + currGlyph++; + LE_DEBUG_BAD_FONT("off end of ligature substitution header"); + return newState; // get out! bad font +- } +- +- if(componentGlyph > glyphStorage.getGlyphCount()) { +- LE_DEBUG_BAD_FONT("preposterous componentGlyph"); +- currGlyph++; +- return newState; // get out! bad font +- } +- i += SWAPW(offsetTable[LE_GET_GLYPH(glyphStorage[componentGlyph])]); ++ } ++ if(componentGlyph > glyphStorage.getGlyphCount()) { ++ LE_DEBUG_BAD_FONT("preposterous componentGlyph"); ++ currGlyph++; ++ return newState; // get out! bad font ++ } ++ i += SWAPW(offsetTable.getObject(LE_GET_GLYPH(glyphStorage[componentGlyph]), success)); + + if (action & (lafLast | lafStore)) { +- const TTGlyphID *ligatureOffset = (const TTGlyphID *) ((char *) &ligatureSubstitutionHeader->stHeader + i); +- TTGlyphID ligatureGlyph = SWAPW(*ligatureOffset); ++ LEReferenceTo<TTGlyphID> ligatureOffset(stHeader, success, i); ++ TTGlyphID ligatureGlyph = SWAPW(*ligatureOffset.getAlias()); + +- glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], ligatureGlyph); +- if(mm==nComponents) { +- LE_DEBUG_BAD_FONT("exceeded nComponents"); +- mm--; // don't overrun the stack. +- } +- stack[++mm] = componentGlyph; +- i = 0; ++ glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], ligatureGlyph); ++ if(mm==nComponents) { ++ LE_DEBUG_BAD_FONT("exceeded nComponents"); ++ mm--; // don't overrun the stack. ++ } ++ stack[++mm] = componentGlyph; ++ i = 0; + } else { +- glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], 0xFFFF); ++ glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], 0xFFFF); + } + } + #if LE_ASSERT_BAD_FONT +@@ -146,11 +145,11 @@ + } while (!(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items + + while (mm >= 0) { +- if (++m >= nComponents) { +- m = 0; +- } ++ if (++m >= nComponents) { ++ m = 0; ++ } + +- componentStack[m] = stack[mm--]; ++ componentStack[m] = stack[mm--]; + } + } + +diff --git a/src/share/native/sun/font/layout/LigatureSubstProc.h b/src/share/native/sun/font/layout/LigatureSubstProc.h +--- jdk/src/share/native/sun/font/layout/LigatureSubstProc.h ++++ jdk/src/share/native/sun/font/layout/LigatureSubstProc.h +@@ -58,7 +58,7 @@ + + virtual void endStateTable(); + +- LigatureSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader); ++ LigatureSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); + virtual ~LigatureSubstitutionProcessor(); + + /** +@@ -83,12 +83,12 @@ + ByteOffset componentTableOffset; + ByteOffset ligatureTableOffset; + +- const LigatureSubstitutionStateEntry *entryTable; ++ LEReferenceToArrayOf<LigatureSubstitutionStateEntry> entryTable; + + le_int32 componentStack[nComponents]; + le_int16 m; + +- const LigatureSubstitutionHeader *ligatureSubstitutionHeader; ++ LEReferenceTo<LigatureSubstitutionHeader> ligatureSubstitutionHeader; + + }; + +diff --git a/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp b/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp +--- jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.cpp +@@ -40,10 +40,10 @@ + + U_NAMESPACE_BEGIN + +-le_uint32 LigatureSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const ++le_uint32 LigatureSubstitutionSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const + { + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(glyph); ++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); + + if (coverageIndex >= 0) { + Offset ligSetTableOffset = SWAPW(ligSetTableOffsetArray[coverageIndex]); +diff --git a/src/share/native/sun/font/layout/LigatureSubstSubtables.h b/src/share/native/sun/font/layout/LigatureSubstSubtables.h +--- jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.h ++++ jdk/src/share/native/sun/font/layout/LigatureSubstSubtables.h +@@ -50,6 +50,7 @@ + le_uint16 ligatureCount; + Offset ligatureTableOffsetArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(LigatureSetTable, ligatureTableOffsetArray) + + struct LigatureTable + { +@@ -57,14 +58,16 @@ + le_uint16 compCount; + TTGlyphID componentArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(LigatureTable, componentArray) + + struct LigatureSubstitutionSubtable : GlyphSubstitutionSubtable + { + le_uint16 ligSetCount; + Offset ligSetTableOffsetArray[ANY_NUMBER]; + +- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; ++ le_uint32 process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const; + }; ++LE_VAR_ARRAY(LigatureSubstitutionSubtable, ligSetTableOffsetArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/LookupProcessor.cpp b/src/share/native/sun/font/layout/LookupProcessor.cpp +--- jdk/src/share/native/sun/font/layout/LookupProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/LookupProcessor.cpp +@@ -44,7 +44,7 @@ + + U_NAMESPACE_BEGIN + +-le_uint32 LookupProcessor::applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, ++le_uint32 LookupProcessor::applyLookupTable(const LEReferenceTo<LookupTable> &lookupTable, GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, LEErrorCode& success) const + { + if (LE_FAILURE(success)) { +@@ -57,7 +57,7 @@ + le_uint32 delta; + + for (le_uint16 subtable = 0; subtable < subtableCount; subtable += 1) { +- const LookupSubtable *lookupSubtable = lookupTable->getLookupSubtable(subtable); ++ LEReferenceTo<LookupSubtable> lookupSubtable = lookupTable->getLookupSubtable(lookupTable, subtable, success); + + delta = applySubtable(lookupSubtable, lookupType, glyphIterator, fontInstance, success); + +@@ -72,7 +72,7 @@ + } + + le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, +- le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, ++ le_bool rightToLeft, const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, + const LEFontInstance *fontInstance, LEErrorCode& success) const + { + if (LE_FAILURE(success)) { +@@ -89,22 +89,21 @@ + rightToLeft, 0, 0, glyphDefinitionTableHeader); + le_int32 newGlyphCount = glyphCount; + +- for (le_uint16 order = 0; order < lookupOrderCount; order += 1) { ++ for (le_uint16 order = 0; order < lookupOrderCount && LE_SUCCESS(success); order += 1) { + le_uint16 lookup = lookupOrderArray[order]; + FeatureMask selectMask = lookupSelectArray[lookup]; + + if (selectMask != 0) { +- const LookupTable *lookupTable = lookupListTable->getLookupTable(lookup); +- +- if (!lookupTable) +- continue; +- +- le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags); ++ const LEReferenceTo<LookupTable> lookupTable = lookupListTable->getLookupTable(lookupListTable, lookup, success); ++ if (!lookupTable.isValid() ||LE_FAILURE(success) ) { ++ continue; ++ } ++ le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags); + + glyphIterator.reset(lookupFlags, selectMask); + + while (glyphIterator.findFeatureTag()) { +- applyLookupTable(lookupTable, &glyphIterator, fontInstance, success); ++ applyLookupTable(lookupTable, &glyphIterator, fontInstance, success); // TODO + if (LE_FAILURE(success)) { + return 0; + } +@@ -124,7 +123,11 @@ + return 0; + } + +- const LookupTable *lookupTable = lookupListTable->getLookupTable(lookupTableIndex); ++ const LEReferenceTo<LookupTable> lookupTable = lookupListTable->getLookupTable(lookupListTable, lookupTableIndex, success); ++ if (!lookupTable.isValid()) { ++ success = LE_INTERNAL_ERROR; ++ return 0; ++ } + le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags); + GlyphIterator tempIterator(*glyphIterator, lookupFlags); + le_uint32 delta = applyLookupTable(lookupTable, &tempIterator, fontInstance, success); +@@ -132,33 +135,35 @@ + return delta; + } + +-le_int32 LookupProcessor::selectLookups(const FeatureTable *featureTable, FeatureMask featureMask, le_int32 order) ++le_int32 LookupProcessor::selectLookups(const LEReferenceTo<FeatureTable> &featureTable, FeatureMask featureMask, le_int32 order, LEErrorCode &success) + { +- le_uint16 lookupCount = featureTable? SWAPW(featureTable->lookupCount) : 0; ++ le_uint16 lookupCount = featureTable.isValid()? SWAPW(featureTable->lookupCount) : 0; + le_int32 store = order; + +- for (le_uint16 lookup = 0; lookup < lookupCount; lookup += 1) { +- le_uint16 lookupListIndex = SWAPW(featureTable->lookupListIndexArray[lookup]); ++ LEReferenceToArrayOf<le_uint16> lookupListIndexArray(featureTable, success, featureTable->lookupListIndexArray, lookupCount); + +- if (lookupListIndex >= lookupSelectCount) +- continue; ++ for (le_uint16 lookup = 0; LE_SUCCESS(success) && lookup < lookupCount; lookup += 1) { ++ le_uint16 lookupListIndex = SWAPW(lookupListIndexArray.getObject(lookup,success)); ++ if (lookupListIndex >= lookupSelectCount) { ++ continue; ++ } + +- lookupSelectArray[lookupListIndex] |= featureMask; +- lookupOrderArray[store++] = lookupListIndex; ++ lookupSelectArray[lookupListIndex] |= featureMask; ++ lookupOrderArray[store++] = lookupListIndex; + } + + return store - order; + } + +-LookupProcessor::LookupProcessor(const char *baseAddress, ++LookupProcessor::LookupProcessor(const LETableReference &baseAddress, + Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset, + LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures, + LEErrorCode& success) +- : lookupListTable(NULL), featureListTable(NULL), lookupSelectArray(NULL), lookupSelectCount(0), +- lookupOrderArray(NULL), lookupOrderCount(0) ++ : lookupListTable(), featureListTable(), lookupSelectArray(NULL), lookupSelectCount(0), ++ lookupOrderArray(NULL), lookupOrderCount(0), fReference(baseAddress) + { +- const ScriptListTable *scriptListTable = NULL; +- const LangSysTable *langSysTable = NULL; ++ LEReferenceTo<ScriptListTable> scriptListTable; ++ LEReferenceTo<LangSysTable> langSysTable; + le_uint16 featureCount = 0; + le_uint16 lookupListCount = 0; + le_uint16 requiredFeatureIndex; +@@ -168,29 +173,33 @@ + } + + if (scriptListOffset != 0) { +- scriptListTable = (const ScriptListTable *) (baseAddress + scriptListOffset); +- langSysTable = scriptListTable->findLanguage(scriptTag, languageTag); ++ scriptListTable = LEReferenceTo<ScriptListTable>(baseAddress, success, scriptListOffset); ++ langSysTable = scriptListTable->findLanguage(scriptListTable, scriptTag, languageTag, success); + +- if (langSysTable != 0) { +- featureCount = SWAPW(langSysTable->featureCount); +- } ++ if (langSysTable.isValid() && LE_SUCCESS(success)) { ++ featureCount = SWAPW(langSysTable->featureCount); ++ } + } + + if (featureListOffset != 0) { +- featureListTable = (const FeatureListTable *) (baseAddress + featureListOffset); ++ featureListTable = LEReferenceTo<FeatureListTable>(baseAddress, success, featureListOffset); + } + + if (lookupListOffset != 0) { +- lookupListTable = (const LookupListTable *) (baseAddress + lookupListOffset); ++ lookupListTable = LEReferenceTo<LookupListTable>(baseAddress,success, lookupListOffset); ++ if(LE_SUCCESS(success) && lookupListTable.isValid()) { + lookupListCount = SWAPW(lookupListTable->lookupCount); ++ } + } + +- if (langSysTable == NULL || featureListTable == NULL || lookupListTable == NULL || ++ if (langSysTable.isEmpty() || featureListTable.isEmpty() || lookupListTable.isEmpty() || + featureCount == 0 || lookupListCount == 0) { + return; + } + +- requiredFeatureIndex = SWAPW(langSysTable->reqFeatureIndex); ++ if(langSysTable.isValid()) { ++ requiredFeatureIndex = SWAPW(langSysTable->reqFeatureIndex); ++ } + + lookupSelectArray = LE_NEW_ARRAY(FeatureMask, lookupListCount); + if (lookupSelectArray == NULL) { +@@ -206,30 +215,38 @@ + + le_int32 count, order = 0; + le_uint32 featureReferences = 0; +- const FeatureTable *featureTable = NULL; ++ LEReferenceTo<FeatureTable> featureTable; + LETag featureTag; + +- const FeatureTable *requiredFeatureTable = NULL; ++ LEReferenceTo<FeatureTable> requiredFeatureTable; + LETag requiredFeatureTag = 0x00000000U; + + // Count the total number of lookups referenced by all features. This will + // be the maximum number of entries in the lookupOrderArray. We can't use + // lookupListCount because some lookups might be referenced by more than + // one feature. +- for (le_uint32 feature = 0; feature < featureCount; feature += 1) { +- le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]); ++ if(featureListTable.isValid() && LE_SUCCESS(success)) { ++ LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount); + +- featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag); ++ for (le_uint32 feature = 0; LE_SUCCESS(success)&&(feature < featureCount); feature += 1) { ++ le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature, success)); + +- if (!featureTable) +- continue; ++ featureTable = featureListTable->getFeatureTable(featureListTable, featureIndex, &featureTag, success); ++ if (!featureTable.isValid() || LE_FAILURE(success)) { ++ continue; ++ } ++ featureReferences += SWAPW(featureTable->lookupCount); ++ } ++ } + +- featureReferences += SWAPW(featureTable->lookupCount); ++ if (!featureTable.isValid() || LE_FAILURE(success)) { ++ success = LE_INTERNAL_ERROR; ++ return; + } + + if (requiredFeatureIndex != 0xFFFF) { +- requiredFeatureTable = featureListTable->getFeatureTable(requiredFeatureIndex, &requiredFeatureTag); +- featureReferences += SWAPW(featureTable->lookupCount); ++ requiredFeatureTable = featureListTable->getFeatureTable(featureListTable, requiredFeatureIndex, &requiredFeatureTag, success); ++ featureReferences += SWAPW(featureTable->lookupCount); + } + + lookupOrderArray = LE_NEW_ARRAY(le_uint16, featureReferences); +@@ -244,7 +261,7 @@ + + // If this is the required feature, add its lookups + if (requiredFeatureTag == fm.tag) { +- count += selectLookups(requiredFeatureTable, fm.mask, order); ++ count += selectLookups(requiredFeatureTable, fm.mask, order, success); + } + + if (orderFeatures) { +@@ -254,7 +271,8 @@ + } + + for (le_uint16 feature = 0; feature < featureCount; feature += 1) { +- le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]); ++ LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount); ++ le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature,success)); + + // don't add the required feature to the list more than once... + // TODO: Do we need this check? (Spec. says required feature won't be in feature list...) +@@ -262,10 +280,10 @@ + continue; + } + +- featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag); ++ featureTable = featureListTable->getFeatureTable(featureListTable, featureIndex, &featureTag, success); + + if (featureTag == fm.tag) { +- count += selectLookups(featureTable, fm.mask, order + count); ++ count += selectLookups(featureTable, fm.mask, order + count, success); + } + } + +@@ -274,9 +292,10 @@ + } + + order += count; +- } else { +- for (le_uint16 feature = 0; feature < featureCount; feature += 1) { +- le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]); ++ } else if(langSysTable.isValid()) { ++ LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount); ++ for (le_uint16 feature = 0; LE_SUCCESS(success)&& (feature < featureCount); feature += 1) { ++ le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature,success)); + + // don't add the required feature to the list more than once... + // NOTE: This check is commented out because the spec. says that +@@ -288,10 +307,10 @@ + } + #endif + +- featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag); ++ featureTable = featureListTable->getFeatureTable(featureListTable, featureIndex, &featureTag, success); + + if (featureTag == fm.tag) { +- order += selectLookups(featureTable, fm.mask, order); ++ order += selectLookups(featureTable, fm.mask, order, success); + } + } + } +diff --git a/src/share/native/sun/font/layout/LookupProcessor.h b/src/share/native/sun/font/layout/LookupProcessor.h +--- jdk/src/share/native/sun/font/layout/LookupProcessor.h ++++ jdk/src/share/native/sun/font/layout/LookupProcessor.h +@@ -41,6 +41,7 @@ + #include "LETypes.h" + #include "LEFontInstance.h" + #include "OpenTypeTables.h" ++#include "LETableReference.h" + //#include "Lookups.h" + //#include "Features.h" + +@@ -59,19 +60,21 @@ + class LookupProcessor : public UMemory { + public: + le_int32 process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, +- le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance, LEErrorCode& success) const; ++ le_bool rightToLeft, const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, const LEFontInstance *fontInstance, LEErrorCode& success) const; + +- le_uint32 applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; ++ le_uint32 applyLookupTable(const LEReferenceTo<LookupTable> &lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + + le_uint32 applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + +- virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 subtableType, ++ virtual le_uint32 applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 subtableType, + GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const = 0; + + virtual ~LookupProcessor(); + ++ const LETableReference &getReference() const { return fReference; } ++ + protected: +- LookupProcessor(const char *baseAddress, ++ LookupProcessor(const LETableReference &baseAddress, + Offset scriptListOffset, + Offset featureListOffset, + Offset lookupListOffset, +@@ -84,10 +87,10 @@ + + LookupProcessor(); + +- le_int32 selectLookups(const FeatureTable *featureTable, FeatureMask featureMask, le_int32 order); ++ le_int32 selectLookups(const LEReferenceTo<FeatureTable> &featureTable, FeatureMask featureMask, le_int32 order, LEErrorCode &success); + +- const LookupListTable *lookupListTable; +- const FeatureListTable *featureListTable; ++ LEReferenceTo<LookupListTable> lookupListTable; ++ LEReferenceTo<FeatureListTable> featureListTable; + + FeatureMask *lookupSelectArray; + le_uint32 lookupSelectCount; +@@ -95,6 +98,8 @@ + le_uint16 *lookupOrderArray; + le_uint32 lookupOrderCount; + ++ LETableReference fReference; ++ + private: + + LookupProcessor(const LookupProcessor &other); // forbid copying of this class +diff --git a/src/share/native/sun/font/layout/LookupTables.cpp b/src/share/native/sun/font/layout/LookupTables.cpp +--- jdk/src/share/native/sun/font/layout/LookupTables.cpp ++++ jdk/src/share/native/sun/font/layout/LookupTables.cpp +@@ -49,22 +49,26 @@ + of the derived classes, and implement it in the others by casting + the "this" pointer to the type that has the implementation. + */ +-const LookupSegment *BinarySearchLookupTable::lookupSegment(const LookupSegment *segments, LEGlyphID glyph) const ++const LookupSegment *BinarySearchLookupTable::lookupSegment(const LETableReference &base, const LookupSegment *segments, LEGlyphID glyph, LEErrorCode &success) const + { ++ + le_int16 unity = SWAPW(unitSize); + le_int16 probe = SWAPW(searchRange); + le_int16 extra = SWAPW(rangeShift); + TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph); +- const LookupSegment *entry = segments; +- const LookupSegment *trial = (const LookupSegment *) ((char *) entry + extra); ++ LEReferenceTo<LookupSegment> entry(base, success, segments); ++ LEReferenceTo<LookupSegment> trial(entry, success, extra); ++ ++ if(LE_FAILURE(success)) return NULL; + + if (SWAPW(trial->lastGlyph) <= ttGlyph) { + entry = trial; + } + +- while (probe > unity) { ++ while (probe > unity && LE_SUCCESS(success)) { + probe >>= 1; +- trial = (const LookupSegment *) ((char *) entry + probe); ++ trial = entry; // copy ++ trial.addOffset(probe, success); + + if (SWAPW(trial->lastGlyph) <= ttGlyph) { + entry = trial; +@@ -72,28 +76,29 @@ + } + + if (SWAPW(entry->firstGlyph) <= ttGlyph) { +- return entry; ++ return entry.getAlias(); + } + + return NULL; + } + +-const LookupSingle *BinarySearchLookupTable::lookupSingle(const LookupSingle *entries, LEGlyphID glyph) const ++const LookupSingle *BinarySearchLookupTable::lookupSingle(const LETableReference &base, const LookupSingle *entries, LEGlyphID glyph, LEErrorCode &success) const + { + le_int16 unity = SWAPW(unitSize); + le_int16 probe = SWAPW(searchRange); + le_int16 extra = SWAPW(rangeShift); + TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph); +- const LookupSingle *entry = entries; +- const LookupSingle *trial = (const LookupSingle *) ((char *) entry + extra); ++ LEReferenceTo<LookupSingle> entry(base, success, entries); ++ LEReferenceTo<LookupSingle> trial(entry, success, extra); + + if (SWAPW(trial->glyph) <= ttGlyph) { + entry = trial; + } + +- while (probe > unity) { ++ while (probe > unity && LE_SUCCESS(success)) { + probe >>= 1; +- trial = (const LookupSingle *) ((char *) entry + probe); ++ trial = entry; ++ trial.addOffset(probe, success); + + if (SWAPW(trial->glyph) <= ttGlyph) { + entry = trial; +@@ -101,7 +106,7 @@ + } + + if (SWAPW(entry->glyph) == ttGlyph) { +- return entry; ++ return entry.getAlias(); + } + + return NULL; +diff --git a/src/share/native/sun/font/layout/LookupTables.h b/src/share/native/sun/font/layout/LookupTables.h +--- jdk/src/share/native/sun/font/layout/LookupTables.h ++++ jdk/src/share/native/sun/font/layout/LookupTables.h +@@ -39,6 +39,7 @@ + + #include "LETypes.h" + #include "LayoutTables.h" ++#include "LETableReference.h" + + U_NAMESPACE_BEGIN + +@@ -79,30 +80,34 @@ + le_int16 entrySelector; + le_int16 rangeShift; + +- const LookupSegment *lookupSegment(const LookupSegment *segments, LEGlyphID glyph) const; ++ const LookupSegment *lookupSegment(const LETableReference &base, const LookupSegment *segments, LEGlyphID glyph, LEErrorCode &success) const; + +- const LookupSingle *lookupSingle(const LookupSingle *entries, LEGlyphID glyph) const; ++ const LookupSingle *lookupSingle(const LETableReference &base, const LookupSingle *entries, LEGlyphID glyph, LEErrorCode &success) const; + }; + + struct SimpleArrayLookupTable : LookupTable + { + LookupValue valueArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(SimpleArrayLookupTable, valueArray) + + struct SegmentSingleLookupTable : BinarySearchLookupTable + { + LookupSegment segments[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(SegmentSingleLookupTable, segments) + + struct SegmentArrayLookupTable : BinarySearchLookupTable + { + LookupSegment segments[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(SegmentArrayLookupTable, segments) + + struct SingleTableLookupTable : BinarySearchLookupTable + { + LookupSingle entries[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(SingleTableLookupTable, entries) + + struct TrimmedArrayLookupTable : LookupTable + { +@@ -110,6 +115,7 @@ + TTGlyphID glyphCount; + LookupValue valueArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(TrimmedArrayLookupTable, valueArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/Lookups.cpp b/src/share/native/sun/font/layout/Lookups.cpp +--- jdk/src/share/native/sun/font/layout/Lookups.cpp ++++ jdk/src/share/native/sun/font/layout/Lookups.cpp +@@ -37,33 +37,35 @@ + + U_NAMESPACE_BEGIN + +-const LookupTable *LookupListTable::getLookupTable(le_uint16 lookupTableIndex) const ++const LEReferenceTo<LookupTable> LookupListTable::getLookupTable(const LEReferenceTo<LookupListTable> &base, le_uint16 lookupTableIndex, LEErrorCode &success) const + { +- if (lookupTableIndex >= SWAPW(lookupCount)) { +- return 0; +- } ++ LEReferenceToArrayOf<Offset> lookupTableOffsetArrayRef(base, success, (const Offset*)&lookupTableOffsetArray, SWAPW(lookupCount)); + +- Offset lookupTableOffset = lookupTableOffsetArray[lookupTableIndex]; +- +- return (const LookupTable *) ((char *) this + SWAPW(lookupTableOffset)); ++ if(LE_FAILURE(success) || lookupTableIndex>lookupTableOffsetArrayRef.getCount()) { ++ return LEReferenceTo<LookupTable>(); ++ } else { ++ return LEReferenceTo<LookupTable>(base, success, SWAPW(lookupTableOffsetArrayRef.getObject(lookupTableIndex, success))); ++ } + } + +-const LookupSubtable *LookupTable::getLookupSubtable(le_uint16 subtableIndex) const ++const LEReferenceTo<LookupSubtable> LookupTable::getLookupSubtable(const LEReferenceTo<LookupTable> &base, le_uint16 subtableIndex, LEErrorCode &success) const + { +- if (subtableIndex >= SWAPW(subTableCount)) { +- return 0; +- } ++ LEReferenceToArrayOf<Offset> subTableOffsetArrayRef(base, success, (const Offset*)&subTableOffsetArray, SWAPW(subTableCount)); + +- Offset subtableOffset = subTableOffsetArray[subtableIndex]; +- +- return (const LookupSubtable *) ((char *) this + SWAPW(subtableOffset)); ++ if(LE_FAILURE(success) || subtableIndex>subTableOffsetArrayRef.getCount()) { ++ return LEReferenceTo<LookupSubtable>(); ++ } else { ++ return LEReferenceTo<LookupSubtable>(base, success, SWAPW(subTableOffsetArrayRef.getObject(subtableIndex, success))); ++ } + } + +-le_int32 LookupSubtable::getGlyphCoverage(Offset tableOffset, LEGlyphID glyphID) const ++le_int32 LookupSubtable::getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const + { +- const CoverageTable *coverageTable = (const CoverageTable *) ((char *) this + SWAPW(tableOffset)); ++ const LEReferenceTo<CoverageTable> coverageTable(base, success, SWAPW(tableOffset)); + +- return coverageTable->getGlyphCoverage(glyphID); ++ if(LE_FAILURE(success)) return 0; ++ ++ return coverageTable->getGlyphCoverage(glyphID); + } + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/Lookups.h b/src/share/native/sun/font/layout/Lookups.h +--- jdk/src/share/native/sun/font/layout/Lookups.h ++++ jdk/src/share/native/sun/font/layout/Lookups.h +@@ -58,9 +58,14 @@ + le_uint16 subtableFormat; + Offset coverageTableOffset; + +- inline le_int32 getGlyphCoverage(LEGlyphID glyphID) const; ++ inline le_int32 getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, LEGlyphID glyphID, LEErrorCode &success) const; + +- le_int32 getGlyphCoverage(Offset tableOffset, LEGlyphID glyphID) const; ++ le_int32 getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const; ++ ++ // convenience ++ inline le_int32 getGlyphCoverage(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const; ++ ++ inline le_int32 getGlyphCoverage(const LETableReference &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const; + }; + + struct LookupTable +@@ -70,20 +75,32 @@ + le_uint16 subTableCount; + Offset subTableOffsetArray[ANY_NUMBER]; + +- const LookupSubtable *getLookupSubtable(le_uint16 subtableIndex) const; ++ const LEReferenceTo<LookupSubtable> getLookupSubtable(const LEReferenceTo<LookupTable> &base, le_uint16 subtableIndex, LEErrorCode &success) const; + }; ++LE_VAR_ARRAY(LookupTable, subTableOffsetArray) + + struct LookupListTable + { + le_uint16 lookupCount; + Offset lookupTableOffsetArray[ANY_NUMBER]; + +- const LookupTable *getLookupTable(le_uint16 lookupTableIndex) const; ++ const LEReferenceTo<LookupTable> getLookupTable(const LEReferenceTo<LookupListTable> &base, le_uint16 lookupTableIndex, LEErrorCode &success) const; + }; ++LE_VAR_ARRAY(LookupListTable, lookupTableOffsetArray) + +-inline le_int32 LookupSubtable::getGlyphCoverage(LEGlyphID glyphID) const ++inline le_int32 LookupSubtable::getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, LEGlyphID glyphID, LEErrorCode &success) const + { +- return getGlyphCoverage(coverageTableOffset, glyphID); ++ return getGlyphCoverage(base, coverageTableOffset, glyphID, success); ++} ++ ++inline le_int32 LookupSubtable::getGlyphCoverage(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const { ++ LEReferenceTo<LookupSubtable> thisRef(base, success, this); ++ return getGlyphCoverage(thisRef, glyphID, success); ++} ++ ++inline le_int32 LookupSubtable::getGlyphCoverage(const LETableReference &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const { ++ LEReferenceTo<LookupSubtable> thisRef(base, success, this); ++ return getGlyphCoverage(thisRef, tableOffset, glyphID, success); + } + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/MarkArrays.h b/src/share/native/sun/font/layout/MarkArrays.h +--- jdk/src/share/native/sun/font/layout/MarkArrays.h ++++ jdk/src/share/native/sun/font/layout/MarkArrays.h +@@ -57,6 +57,7 @@ + le_int32 getMarkClass(LEGlyphID glyphID, le_int32 coverageIndex, const LEFontInstance *fontInstance, + LEPoint &anchor) const; + }; ++LE_VAR_ARRAY(MarkArray, markRecordArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp +--- jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp +@@ -51,10 +51,10 @@ + return 0xFFFF; + } + +-le_int32 MarkToBasePositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++le_int32 MarkToBasePositioningSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const + { + LEGlyphID markGlyph = glyphIterator->getCurrGlyphID(); +- le_int32 markCoverage = getGlyphCoverage((LEGlyphID) markGlyph); ++ le_int32 markCoverage = getGlyphCoverage(base, (LEGlyphID) markGlyph, success); + + if (markCoverage < 0) { + // markGlyph isn't a covered mark glyph +@@ -75,7 +75,7 @@ + // FIXME: We probably don't want to find a base glyph before a previous ligature... + GlyphIterator baseIterator(*glyphIterator, (le_uint16) (lfIgnoreMarks /*| lfIgnoreLigatures*/)); + LEGlyphID baseGlyph = findBaseGlyph(&baseIterator); +- le_int32 baseCoverage = getBaseCoverage((LEGlyphID) baseGlyph); ++ le_int32 baseCoverage = getBaseCoverage(base, (LEGlyphID) baseGlyph, success); + const BaseArray *baseArray = (const BaseArray *) ((char *) this + SWAPW(baseArrayOffset)); + le_uint16 baseCount = SWAPW(baseArray->baseRecordCount); + +diff --git a/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h b/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h +--- jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h ++++ jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.h +@@ -48,7 +48,7 @@ + + struct MarkToBasePositioningSubtable : AttachmentPositioningSubtable + { +- le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_int32 process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; + LEGlyphID findBaseGlyph(GlyphIterator *glyphIterator) const; + }; + +@@ -56,12 +56,14 @@ + { + Offset baseAnchorTableOffsetArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(BaseRecord, baseAnchorTableOffsetArray) + + struct BaseArray + { + le_int16 baseRecordCount; + BaseRecord baseRecordArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(BaseArray, baseRecordArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp +--- jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.cpp +@@ -50,10 +50,10 @@ + return 0xFFFF; + } + +-le_int32 MarkToLigaturePositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++le_int32 MarkToLigaturePositioningSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const + { + LEGlyphID markGlyph = glyphIterator->getCurrGlyphID(); +- le_int32 markCoverage = getGlyphCoverage((LEGlyphID) markGlyph); ++ le_int32 markCoverage = getGlyphCoverage(base, (LEGlyphID) markGlyph, success); + + if (markCoverage < 0) { + // markGlyph isn't a covered mark glyph +@@ -74,7 +74,7 @@ + // FIXME: we probably don't want to find a ligature before a previous base glyph... + GlyphIterator ligatureIterator(*glyphIterator, (le_uint16) (lfIgnoreMarks /*| lfIgnoreBaseGlyphs*/)); + LEGlyphID ligatureGlyph = findLigatureGlyph(&ligatureIterator); +- le_int32 ligatureCoverage = getBaseCoverage((LEGlyphID) ligatureGlyph); ++ le_int32 ligatureCoverage = getBaseCoverage(base, (LEGlyphID) ligatureGlyph, success); + const LigatureArray *ligatureArray = (const LigatureArray *) ((char *) this + SWAPW(baseArrayOffset)); + le_uint16 ligatureCount = SWAPW(ligatureArray->ligatureCount); + +diff --git a/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h b/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h +--- jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h ++++ jdk/src/share/native/sun/font/layout/MarkToLigaturePosnSubtables.h +@@ -48,7 +48,7 @@ + + struct MarkToLigaturePositioningSubtable : AttachmentPositioningSubtable + { +- le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_int32 process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; + LEGlyphID findLigatureGlyph(GlyphIterator *glyphIterator) const; + }; + +@@ -56,18 +56,21 @@ + { + Offset ligatureAnchorTableOffsetArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(ComponentRecord, ligatureAnchorTableOffsetArray) + + struct LigatureAttachTable + { + le_uint16 componentCount; + ComponentRecord componentRecordArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(LigatureAttachTable, componentRecordArray) + + struct LigatureArray + { + le_uint16 ligatureCount; + Offset ligatureAttachTableOffsetArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(LigatureArray, ligatureAttachTableOffsetArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp b/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp +--- jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.cpp +@@ -51,10 +51,10 @@ + return 0xFFFF; + } + +-le_int32 MarkToMarkPositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++le_int32 MarkToMarkPositioningSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const + { + LEGlyphID markGlyph = glyphIterator->getCurrGlyphID(); +- le_int32 markCoverage = getGlyphCoverage((LEGlyphID) markGlyph); ++ le_int32 markCoverage = getGlyphCoverage(base, (LEGlyphID) markGlyph, success); + + if (markCoverage < 0) { + // markGlyph isn't a covered mark glyph +@@ -74,7 +74,7 @@ + + GlyphIterator mark2Iterator(*glyphIterator); + LEGlyphID mark2Glyph = findMark2Glyph(&mark2Iterator); +- le_int32 mark2Coverage = getBaseCoverage((LEGlyphID) mark2Glyph); ++ le_int32 mark2Coverage = getBaseCoverage(base, (LEGlyphID) mark2Glyph, success); + const Mark2Array *mark2Array = (const Mark2Array *) ((char *) this + SWAPW(baseArrayOffset)); + le_uint16 mark2Count = SWAPW(mark2Array->mark2RecordCount); + +diff --git a/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h b/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h +--- jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h ++++ jdk/src/share/native/sun/font/layout/MarkToMarkPosnSubtables.h +@@ -48,7 +48,7 @@ + + struct MarkToMarkPositioningSubtable : AttachmentPositioningSubtable + { +- le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_int32 process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; + LEGlyphID findMark2Glyph(GlyphIterator *glyphIterator) const; + }; + +@@ -56,12 +56,14 @@ + { + Offset mark2AnchorTableOffsetArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(Mark2Record, mark2AnchorTableOffsetArray) + + struct Mark2Array + { + le_uint16 mark2RecordCount; + Mark2Record mark2RecordArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(Mark2Array, mark2RecordArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/MorphTables.cpp b/src/share/native/sun/font/layout/MorphTables.cpp +--- jdk/src/share/native/sun/font/layout/MorphTables.cpp ++++ jdk/src/share/native/sun/font/layout/MorphTables.cpp +@@ -44,61 +44,61 @@ + + U_NAMESPACE_BEGIN + +-void MorphTableHeader::process(LEGlyphStorage &glyphStorage) const ++void MorphTableHeader::process(const LETableReference &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const + { +- const ChainHeader *chainHeader = chains; +- le_uint32 chainCount = SWAPL(this->nChains); ++ le_uint32 chainCount = SWAPL(this->nChains); ++ LEReferenceTo<ChainHeader> chainHeader(base, success, chains); // moving header ++ LEReferenceToArrayOf<ChainHeader> chainHeaderArray(base, success, chains, chainCount); + le_uint32 chain; + +- for (chain = 0; chain < chainCount; chain += 1) { ++ for (chain = 0; LE_SUCCESS(success) && (chain < chainCount); chain += 1) { + FeatureFlags defaultFlags = SWAPL(chainHeader->defaultFlags); + le_uint32 chainLength = SWAPL(chainHeader->chainLength); + le_int16 nFeatureEntries = SWAPW(chainHeader->nFeatureEntries); + le_int16 nSubtables = SWAPW(chainHeader->nSubtables); +- const MorphSubtableHeader *subtableHeader = +- (const MorphSubtableHeader *)&chainHeader->featureTable[nFeatureEntries]; ++ LEReferenceTo<MorphSubtableHeader> subtableHeader = ++ LEReferenceTo<MorphSubtableHeader>(chainHeader,success, &(chainHeader->featureTable[nFeatureEntries])); + le_int16 subtable; + +- for (subtable = 0; subtable < nSubtables; subtable += 1) { ++ for (subtable = 0; LE_SUCCESS(success) && (subtable < nSubtables); subtable += 1) { + le_int16 length = SWAPW(subtableHeader->length); + SubtableCoverage coverage = SWAPW(subtableHeader->coverage); + FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures); + + // should check coverage more carefully... +- if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0) { +- subtableHeader->process(glyphStorage); ++ if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0 && LE_SUCCESS(success)) { ++ subtableHeader->process(subtableHeader, glyphStorage, success); + } + +- subtableHeader = (const MorphSubtableHeader *) ((char *)subtableHeader + length); ++ subtableHeader.addOffset(length, success); + } +- +- chainHeader = (const ChainHeader *)((char *)chainHeader + chainLength); ++ chainHeader.addOffset(chainLength, success); + } + } + +-void MorphSubtableHeader::process(LEGlyphStorage &glyphStorage) const ++void MorphSubtableHeader::process(const LEReferenceTo<MorphSubtableHeader> &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const + { + SubtableProcessor *processor = NULL; + + switch (SWAPW(coverage) & scfTypeMask) + { + case mstIndicRearrangement: +- processor = new IndicRearrangementProcessor(this); ++ processor = new IndicRearrangementProcessor(base, success); + break; + + case mstContextualGlyphSubstitution: +- processor = new ContextualGlyphSubstitutionProcessor(this); ++ processor = new ContextualGlyphSubstitutionProcessor(base, success); + break; + + case mstLigatureSubstitution: +- processor = new LigatureSubstitutionProcessor(this); ++ processor = new LigatureSubstitutionProcessor(base, success); + break; + + case mstReservedUnused: + break; + + case mstNonContextualGlyphSubstitution: +- processor = NonContextualGlyphSubstitutionProcessor::createInstance(this); ++ processor = NonContextualGlyphSubstitutionProcessor::createInstance(base, success); + break; + + /* +@@ -112,8 +112,10 @@ + } + + if (processor != NULL) { +- processor->process(glyphStorage); +- delete processor; ++ if(LE_SUCCESS(success)) { ++ processor->process(glyphStorage, success); ++ } ++ delete processor; + } + } + +diff --git a/src/share/native/sun/font/layout/MorphTables.h b/src/share/native/sun/font/layout/MorphTables.h +--- jdk/src/share/native/sun/font/layout/MorphTables.h ++++ jdk/src/share/native/sun/font/layout/MorphTables.h +@@ -39,6 +39,7 @@ + + #include "LETypes.h" + #include "LayoutTables.h" ++#include "LETableReference.h" + + U_NAMESPACE_BEGIN + +@@ -65,6 +66,7 @@ + le_int16 nSubtables; + FeatureTableEntry featureTable[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(ChainHeader, featureTable) + + struct MorphTableHeader + { +@@ -72,8 +74,9 @@ + le_uint32 nChains; + ChainHeader chains[ANY_NUMBER]; + +- void process(LEGlyphStorage &glyphStorage) const; ++ void process(const LETableReference& base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const; + }; ++LE_VAR_ARRAY(MorphTableHeader, chains) + + typedef le_int16 SubtableCoverage; + +@@ -102,7 +105,7 @@ + SubtableCoverage coverage; + FeatureFlags subtableFeatures; + +- void process(LEGlyphStorage &glyphStorage) const; ++ void process(const LEReferenceTo<MorphSubtableHeader> &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const; + }; + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp b/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp +--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.cpp +@@ -39,7 +39,7 @@ + + U_NAMESPACE_BEGIN + +-le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter) const ++le_uint32 MultipleSubstitutionSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter) const + { + if (LE_FAILURE(success)) { + return 0; +@@ -58,7 +58,7 @@ + return 0; + } + +- le_int32 coverageIndex = getGlyphCoverage(glyph); ++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); + le_uint16 seqCount = SWAPW(sequenceCount); + + if (coverageIndex >= 0 && coverageIndex < seqCount) { +diff --git a/src/share/native/sun/font/layout/MultipleSubstSubtables.h b/src/share/native/sun/font/layout/MultipleSubstSubtables.h +--- jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h ++++ jdk/src/share/native/sun/font/layout/MultipleSubstSubtables.h +@@ -50,14 +50,16 @@ + le_uint16 glyphCount; + TTGlyphID substituteArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(SequenceTable, substituteArray) + + struct MultipleSubstitutionSubtable : GlyphSubstitutionSubtable + { + le_uint16 sequenceCount; + Offset sequenceTableOffsetArray[ANY_NUMBER]; + +- le_uint32 process(GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter = NULL) const; ++ le_uint32 process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter = NULL) const; + }; ++LE_VAR_ARRAY(MultipleSubstitutionSubtable, sequenceTableOffsetArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp b/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp +--- jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp ++++ jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.cpp +@@ -47,8 +47,8 @@ + { + } + +-NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) +- : SubtableProcessor(morphSubtableHeader) ++NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) ++ : SubtableProcessor(morphSubtableHeader, success) + { + } + +@@ -56,26 +56,27 @@ + { + } + +-SubtableProcessor *NonContextualGlyphSubstitutionProcessor::createInstance(const MorphSubtableHeader *morphSubtableHeader) ++SubtableProcessor *NonContextualGlyphSubstitutionProcessor::createInstance(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) + { +- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader; ++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); + +- switch (SWAPW(header->table.format)) +- { ++ if(LE_FAILURE(success)) return NULL; ++ ++ switch (SWAPW(header->table.format)) { + case ltfSimpleArray: +- return new SimpleArrayProcessor(morphSubtableHeader); ++ return new SimpleArrayProcessor(morphSubtableHeader, success); + + case ltfSegmentSingle: +- return new SegmentSingleProcessor(morphSubtableHeader); ++ return new SegmentSingleProcessor(morphSubtableHeader, success); + + case ltfSegmentArray: +- return new SegmentArrayProcessor(morphSubtableHeader); ++ return new SegmentArrayProcessor(morphSubtableHeader, success); + + case ltfSingleTable: +- return new SingleTableProcessor(morphSubtableHeader); ++ return new SingleTableProcessor(morphSubtableHeader, success); + + case ltfTrimmedArray: +- return new TrimmedArrayProcessor(morphSubtableHeader); ++ return new TrimmedArrayProcessor(morphSubtableHeader, success); + + default: + return NULL; +diff --git a/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h b/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h +--- jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h ++++ jdk/src/share/native/sun/font/layout/NonContextualGlyphSubstProc.h +@@ -49,13 +49,13 @@ + class NonContextualGlyphSubstitutionProcessor : public SubtableProcessor + { + public: +- virtual void process(LEGlyphStorage &glyphStorage) = 0; ++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success) = 0; + +- static SubtableProcessor *createInstance(const MorphSubtableHeader *morphSubtableHeader); ++ static SubtableProcessor *createInstance(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); + + protected: + NonContextualGlyphSubstitutionProcessor(); +- NonContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader); ++ NonContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &status); + + virtual ~NonContextualGlyphSubstitutionProcessor(); + +diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp +@@ -101,25 +101,21 @@ + static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); + + OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) + : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureMask(minimalFeatures), + fFeatureMap(featureMap), fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE), +- fGSUBTable(gsubTable), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL) ++ fGSUBTable(gsubTable), ++ fGDEFTable(fontInstance, LE_GDEF_TABLE_TAG, success), ++ fGPOSTable(fontInstance, LE_GPOS_TABLE_TAG, success), fSubstitutionFilter(NULL) + { +- static const le_uint32 gdefTableTag = LE_GDEF_TABLE_TAG; +- static const le_uint32 gposTableTag = LE_GPOS_TABLE_TAG; +- const GlyphPositioningTableHeader *gposTable = (const GlyphPositioningTableHeader *) getFontTable(gposTableTag); +- + applyTypoFlags(); + + setScriptAndLanguageTags(); + +- fGDEFTable = (const GlyphDefinitionTableHeader *) getFontTable(gdefTableTag); +- + // JK patch, 2008-05-30 - see Sinhala bug report and LKLUG font + // if (gposTable != NULL && gposTable->coversScriptAndLanguage(fScriptTag, fLangSysTag)) { +- if (gposTable != NULL && gposTable->coversScript(fScriptTag)) { +- fGPOSTable = gposTable; ++ if (!fGPOSTable.isEmpty()&& !fGPOSTable->coversScript(fGPOSTable, fScriptTag, success)) { ++ fGPOSTable.clear(); // already loaded + } + } + +@@ -154,7 +150,7 @@ + OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success) + : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureOrder(FALSE), +- fGSUBTable(NULL), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL) ++ fGSUBTable(), fGDEFTable(), fGPOSTable(), fSubstitutionFilter(NULL) + { + applyTypoFlags(); + setScriptAndLanguageTags(); +@@ -276,13 +272,13 @@ + return 0; + } + +- if (fGSUBTable != NULL) { +- if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) { +- count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter, ++ if (fGSUBTable.isValid()) { ++ if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fGSUBTable, fScriptTagV2, fLangSysTag, success)) { ++ count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter, + fFeatureMap, fFeatureMapCount, fFeatureOrder, success); + + } else { +- count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, ++ count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, + fFeatureMap, fFeatureMapCount, fFeatureOrder, success); + } + } +@@ -303,13 +299,13 @@ + return 0; + } + +- if (fGSUBTable != NULL) { +- if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) { +- count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter, ++ if (fGSUBTable.isValid()) { ++ if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fGSUBTable,fScriptTagV2,fLangSysTag,success)) { ++ count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter, + fFeatureMap, fFeatureMapCount, fFeatureOrder, success); + + } else { +- count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, ++ count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, + fFeatureMap, fFeatureMapCount, fFeatureOrder, success); + } + } +@@ -387,7 +383,7 @@ + return; + } + +- if (fGPOSTable != NULL) { ++ if (!fGPOSTable.isEmpty()) { + GlyphPositionAdjustments *adjustments = new GlyphPositionAdjustments(glyphCount); + le_int32 i; + +@@ -410,19 +406,20 @@ + } + #endif + +- if (fGPOSTable != NULL) { +- if (fScriptTagV2 != nullScriptTag && fGPOSTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) { +- fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTagV2, fLangSysTag, fGDEFTable, success, fFontInstance, +- fFeatureMap, fFeatureMapCount, fFeatureOrder); ++ if (!fGPOSTable.isEmpty()) { ++ if (fScriptTagV2 != nullScriptTag && ++ fGPOSTable->coversScriptAndLanguage(fGPOSTable, fScriptTagV2,fLangSysTag,success)) { ++ fGPOSTable->process(fGPOSTable, glyphStorage, adjustments, reverse, fScriptTagV2, fLangSysTag, ++ fGDEFTable, success, fFontInstance, fFeatureMap, fFeatureMapCount, fFeatureOrder); + + } else { +- fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, fGDEFTable, success, fFontInstance, +- fFeatureMap, fFeatureMapCount, fFeatureOrder); ++ fGPOSTable->process(fGPOSTable, glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, ++ fGDEFTable, success, fFontInstance, fFeatureMap, fFeatureMapCount, fFeatureOrder); + } +- } else if ( fTypoFlags & 0x1 ) { +- static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG; +- KernTable kt(fFontInstance, getFontTable(kernTableTag)); +- kt.process(glyphStorage); ++ } else if (fTypoFlags & LE_Kerning_FEATURE_FLAG) { /* kerning enabled */ ++ LETableReference kernTable(fFontInstance, LE_KERN_TABLE_TAG, success); ++ KernTable kt(kernTable, success); ++ kt.process(glyphStorage, success); + } + + float xAdjust = 0, yAdjust = 0; +diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h +@@ -35,6 +35,7 @@ + #include "LEGlyphFilter.h" + #include "LEFontInstance.h" + #include "LayoutEngine.h" ++#include "LETableReference.h" + + #include "GlyphSubstitutionTables.h" + #include "GlyphDefinitionTables.h" +@@ -88,7 +89,7 @@ + * @internal + */ + OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); ++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +@@ -228,21 +229,21 @@ + * + * @internal + */ +- const GlyphSubstitutionTableHeader *fGSUBTable; ++ LEReferenceTo<GlyphSubstitutionTableHeader> fGSUBTable; + + /** + * The address of the GDEF table. + * + * @internal + */ +- const GlyphDefinitionTableHeader *fGDEFTable; ++ LEReferenceTo<GlyphDefinitionTableHeader> fGDEFTable; + + /** + * The address of the GPOS table. + * + * @internal + */ +- const GlyphPositioningTableHeader *fGPOSTable; ++ LEReferenceTo<GlyphPositioningTableHeader> fGPOSTable; + + /** + * An optional filter used to inhibit substitutions +diff --git a/src/share/native/sun/font/layout/OpenTypeTables.h b/src/share/native/sun/font/layout/OpenTypeTables.h +--- jdk/src/share/native/sun/font/layout/OpenTypeTables.h ++++ jdk/src/share/native/sun/font/layout/OpenTypeTables.h +@@ -38,6 +38,7 @@ + */ + + #include "LETypes.h" ++#include "LETableReference.h" + + U_NAMESPACE_BEGIN + +@@ -50,7 +51,7 @@ + #define LE_GLYPH_GROUP_MASK 0x00000001UL + typedef le_uint32 FeatureMask; + +-#define SWAPT(atag) ((LETag) ((atag[0] << 24) + (atag[1] << 16) + (atag[2] << 8) + atag[3])) ++#define SWAPT(atag) ((LETag) (((atag[0]) << 24) + ((atag[1]) << 16) + ((atag[2]) << 8) + (atag[3]))) + + struct TagAndOffsetRecord + { +diff --git a/src/share/native/sun/font/layout/OpenTypeUtilities.cpp b/src/share/native/sun/font/layout/OpenTypeUtilities.cpp +--- jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp ++++ jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp +@@ -76,58 +76,74 @@ + return bit; + } + +-Offset OpenTypeUtilities::getTagOffset(LETag tag, const TagAndOffsetRecord *records, le_int32 recordCount) ++ ++Offset OpenTypeUtilities::getTagOffset(LETag tag, const LEReferenceToArrayOf<TagAndOffsetRecord> &records, LEErrorCode &success) + { +- le_uint8 bit = highBit(recordCount); +- le_int32 power = 1 << bit; +- le_int32 extra = recordCount - power; +- le_int32 probe = power; +- le_int32 index = 0; ++ if(LE_FAILURE(success)) return 0; + +- if (SWAPT(records[extra].tag) <= tag) { +- index = extra; ++ le_uint32 recordCount = records.getCount(); ++ le_uint8 bit = highBit(recordCount); ++ le_int32 power = 1 << bit; ++ le_int32 extra = recordCount - power; ++ le_int32 probe = power; ++ le_int32 index = 0; ++ ++ { ++ const ATag &aTag = records.getAlias(extra,success)->tag; ++ if (SWAPT(aTag) <= tag) { ++ index = extra; + } ++ } + +- while (probe > (1 << 0)) { +- probe >>= 1; ++ while (probe > (1 << 0) && LE_SUCCESS(success)) { ++ probe >>= 1; + +- if (SWAPT(records[index + probe].tag) <= tag) { +- index += probe; +- } ++ { ++ const ATag &aTag = records.getAlias(index+probe,success)->tag; ++ if (SWAPT(aTag) <= tag) { ++ index += probe; ++ } + } ++ } + +- if (SWAPT(records[index].tag) == tag) { +- return SWAPW(records[index].offset); ++ { ++ const ATag &aTag = records.getAlias(index,success)->tag; ++ if (SWAPT(aTag) == tag) { ++ return SWAPW(records.getAlias(index,success)->offset); + } ++ } + +- return 0; ++ return 0; + } + +-le_int32 OpenTypeUtilities::getGlyphRangeIndex(TTGlyphID glyphID, const GlyphRangeRecord *records, le_int32 recordCount) ++le_int32 OpenTypeUtilities::getGlyphRangeIndex(TTGlyphID glyphID, const LEReferenceToArrayOf<GlyphRangeRecord> &records, LEErrorCode &success) + { ++ if(LE_FAILURE(success)) return -1; ++ ++ le_uint32 recordCount = records.getCount(); + le_uint8 bit = highBit(recordCount); + le_int32 power = 1 << bit; + le_int32 extra = recordCount - power; + le_int32 probe = power; + le_int32 range = 0; + +- if (recordCount == 0) { +- return -1; +- } ++ if (recordCount == 0) { ++ return -1; ++ } + +- if (SWAPW(records[extra].firstGlyph) <= glyphID) { ++ if (SWAPW(records(extra,success).firstGlyph) <= glyphID) { + range = extra; + } + +- while (probe > (1 << 0)) { ++ while (probe > (1 << 0) && LE_SUCCESS(success)) { + probe >>= 1; + +- if (SWAPW(records[range + probe].firstGlyph) <= glyphID) { ++ if (SWAPW(records(range + probe,success).firstGlyph) <= glyphID) { + range += probe; + } + } + +- if (SWAPW(records[range].firstGlyph) <= glyphID && SWAPW(records[range].lastGlyph) >= glyphID) { ++ if (SWAPW(records(range,success).firstGlyph) <= glyphID && SWAPW(records(range,success).lastGlyph) >= glyphID) { + return range; + } + +@@ -199,6 +215,38 @@ + } + } + ++U_NAMESPACE_END + ++#if LE_ASSERT_BAD_FONT ++#include <stdio.h> + +-U_NAMESPACE_END ++static const char *letagToStr(LETag tag, char *str) { ++ str[0]= 0xFF & (tag>>24); ++ str[1]= 0xFF & (tag>>16); ++ str[2]= 0xFF & (tag>>8); ++ str[3]= 0xFF & (tag>>0); ++ str[4]= 0; ++ return str; ++} ++ ++U_CAPI void U_EXPORT2 _debug_LETableReference(const char *f, int l, const char *msg, const LETableReference *what, const void *ptr, size_t len) { ++ char tagbuf[5]; ++ ++ fprintf(stderr, "%s:%d: LETableReference@0x%p: ", f, l, what); ++ fprintf(stderr, msg, ptr, len); ++ fprintf(stderr, "\n"); ++ ++ for(int depth=0;depth<10&&(what!=NULL);depth++) { ++ for(int i=0;i<depth;i++) { ++ fprintf(stderr, " "); // indent ++ } ++ if(!what->isValid()) { ++ fprintf(stderr, "(invalid)"); ++ } ++ fprintf(stderr, "@%p: tag (%s) font (0x%p), [0x%p+0x%lx]\n", what, letagToStr(what->getTag(), tagbuf), what->getFont(), ++ what->getAlias(), what->getLength()); ++ ++ what = what->getParent(); ++ } ++} ++#endif +diff --git a/src/share/native/sun/font/layout/OpenTypeUtilities.h b/src/share/native/sun/font/layout/OpenTypeUtilities.h +--- jdk/src/share/native/sun/font/layout/OpenTypeUtilities.h ++++ jdk/src/share/native/sun/font/layout/OpenTypeUtilities.h +@@ -45,8 +45,17 @@ + class OpenTypeUtilities /* not : public UObject because all methods are static */ { + public: + static le_int8 highBit(le_int32 value); +- static Offset getTagOffset(LETag tag, const TagAndOffsetRecord *records, le_int32 recordCount); +- static le_int32 getGlyphRangeIndex(TTGlyphID glyphID, const GlyphRangeRecord *records, le_int32 recordCount); ++ static Offset getTagOffset(LETag tag, const LEReferenceToArrayOf<TagAndOffsetRecord> &records, LEErrorCode &success); ++ /** ++ * @deprecated TODO remove ++ */ ++ static le_int32 getGlyphRangeIndex(TTGlyphID glyphID, const GlyphRangeRecord *records, le_int32 recordCount) { ++ LEErrorCode success = LE_NO_ERROR; ++ LETableReference recordRef0((const le_uint8*)records); ++ LEReferenceToArrayOf<GlyphRangeRecord> recordRef(recordRef0, success, (size_t)0, recordCount); ++ return getGlyphRangeIndex(glyphID, recordRef, success); ++ } ++ static le_int32 getGlyphRangeIndex(TTGlyphID glyphID, const LEReferenceToArrayOf<GlyphRangeRecord> &records, LEErrorCode &success); + static le_int32 search(le_uint16 value, const le_uint16 array[], le_int32 count); + static le_int32 search(le_uint32 value, const le_uint32 array[], le_int32 count); + static void sort(le_uint16 *array, le_int32 count); +diff --git a/src/share/native/sun/font/layout/PairPositioningSubtables.cpp b/src/share/native/sun/font/layout/PairPositioningSubtables.cpp +--- jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/PairPositioningSubtables.cpp +@@ -41,7 +41,7 @@ + + U_NAMESPACE_BEGIN + +-le_uint32 PairPositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++le_uint32 PairPositioningSubtable::process(const LEReferenceTo<PairPositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const + { + switch(SWAPW(subtableFormat)) + { +@@ -50,27 +50,32 @@ + + case 1: + { +- const PairPositioningFormat1Subtable *subtable = (const PairPositioningFormat1Subtable *) this; ++ const LEReferenceTo<PairPositioningFormat1Subtable> subtable(base, success, (const PairPositioningFormat1Subtable *) this); + +- return subtable->process(glyphIterator, fontInstance); ++ if(LE_SUCCESS(success)) ++ return subtable->process(subtable, glyphIterator, fontInstance, success); ++ else ++ return 0; + } + + case 2: + { +- const PairPositioningFormat2Subtable *subtable = (const PairPositioningFormat2Subtable *) this; ++ const LEReferenceTo<PairPositioningFormat2Subtable> subtable(base, success, (const PairPositioningFormat2Subtable *) this); + +- return subtable->process(glyphIterator, fontInstance); ++ if(LE_SUCCESS(success)) ++ return subtable->process(subtable, glyphIterator, fontInstance, success); ++ else ++ return 0; + } +- + default: +- return 0; ++ return 0; + } + } + +-le_uint32 PairPositioningFormat1Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++le_uint32 PairPositioningFormat1Subtable::process(const LEReferenceTo<PairPositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const + { + LEGlyphID firstGlyph = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(firstGlyph); ++ le_int32 coverageIndex = getGlyphCoverage(base, firstGlyph, success); + GlyphIterator tempIterator(*glyphIterator); + + if (coverageIndex >= 0 && glyphIterator->next()) { +@@ -110,10 +115,10 @@ + return 0; + } + +-le_uint32 PairPositioningFormat2Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++le_uint32 PairPositioningFormat2Subtable::process(const LEReferenceTo<PairPositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const + { + LEGlyphID firstGlyph = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(firstGlyph); ++ le_int32 coverageIndex = getGlyphCoverage(base, firstGlyph, success); + GlyphIterator tempIterator(*glyphIterator); + + if (coverageIndex >= 0 && glyphIterator->next()) { +diff --git a/src/share/native/sun/font/layout/PairPositioningSubtables.h b/src/share/native/sun/font/layout/PairPositioningSubtables.h +--- jdk/src/share/native/sun/font/layout/PairPositioningSubtables.h ++++ jdk/src/share/native/sun/font/layout/PairPositioningSubtables.h +@@ -59,13 +59,14 @@ + le_uint16 pairValueCount; + PairValueRecord pairValueRecordArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(PairSetTable, pairValueRecordArray) + + struct PairPositioningSubtable : GlyphPositioningSubtable + { + ValueFormat valueFormat1; + ValueFormat valueFormat2; + +- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LEReferenceTo<PairPositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; + }; + + struct PairPositioningFormat1Subtable : PairPositioningSubtable +@@ -73,12 +74,13 @@ + le_uint16 pairSetCount; + Offset pairSetTableOffsetArray[ANY_NUMBER]; + +- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LEReferenceTo<PairPositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; + + private: + const PairValueRecord *findPairValueRecord(TTGlyphID glyphID, const PairValueRecord *records, + le_uint16 recordCount, le_uint16 recordSize) const; + }; ++LE_VAR_ARRAY(PairPositioningFormat1Subtable, pairSetTableOffsetArray) + + // NOTE: ValueRecord has a variable size + struct Class2Record +@@ -91,6 +93,7 @@ + { + Class2Record class2RecordArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(Class1Record, class2RecordArray) + + struct PairPositioningFormat2Subtable : PairPositioningSubtable + { +@@ -100,8 +103,9 @@ + le_uint16 class2Count; + Class1Record class1RecordArray[ANY_NUMBER]; + +- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LEReferenceTo<PairPositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; + }; ++LE_VAR_ARRAY(PairPositioningFormat2Subtable, class1RecordArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/ScriptAndLanguage.cpp b/src/share/native/sun/font/layout/ScriptAndLanguage.cpp +--- jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp ++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguage.cpp +@@ -38,29 +38,33 @@ + + U_NAMESPACE_BEGIN + +-const LangSysTable *ScriptTable::findLanguage(LETag languageTag, le_bool exactMatch) const ++LEReferenceTo<LangSysTable> ScriptTable::findLanguage(const LETableReference& base, LETag languageTag, LEErrorCode &success, le_bool exactMatch) const + { + le_uint16 count = SWAPW(langSysCount); + Offset langSysTableOffset = exactMatch? 0 : SWAPW(defaultLangSysTableOffset); + + if (count > 0) { +- Offset foundOffset = +- OpenTypeUtilities::getTagOffset(languageTag, langSysRecordArray, count); ++ LEReferenceToArrayOf<TagAndOffsetRecord> langSysRecords(base, success, langSysRecordArray, count); ++ Offset foundOffset = ++ OpenTypeUtilities::getTagOffset(languageTag, langSysRecords, success); + +- if (foundOffset != 0) { +- langSysTableOffset = foundOffset; +- } ++ if (foundOffset != 0 && LE_SUCCESS(success)) { ++ langSysTableOffset = foundOffset; ++ } + } + + if (langSysTableOffset != 0) { +- return (const LangSysTable *) ((char *)this + langSysTableOffset); ++ return LEReferenceTo<LangSysTable>(base, success, langSysTableOffset); + } + +- return NULL; ++ return LEReferenceTo<LangSysTable>(); + } + +-const ScriptTable *ScriptListTable::findScript(LETag scriptTag) const ++LEReferenceTo<ScriptTable> ScriptListTable::findScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const + { ++ if (LE_FAILURE(success) ) { ++ return LEReferenceTo<ScriptTable>(); // get out ++ } + /* + * There are some fonts that have a large, bogus value for scriptCount. To try + * and protect against this, we use the offset in the first scriptRecord, +@@ -74,38 +78,53 @@ + * to be unsorted. + */ + le_uint16 count = SWAPW(scriptCount); ++ ++ if (count == 0) { ++ return LEReferenceTo<ScriptTable>(); // no items, no search ++ } ++ ++ // attempt to construct a ref with at least one element ++ LEReferenceToArrayOf<ScriptRecord> oneElementTable(base, success, &scriptRecordArray[0], 1); ++ ++ if( LE_FAILURE(success) ) { ++ return LEReferenceTo<ScriptTable>(); // couldn't even read the first record - bad font. ++ } ++ + le_uint16 limit = ((SWAPW(scriptRecordArray[0].offset) - sizeof(ScriptListTable)) / sizeof(scriptRecordArray)) + ANY_NUMBER; + Offset scriptTableOffset = 0; + ++ + if (count > limit) { + // the scriptCount value is bogus; do a linear search + // because limit may still be too large. +- for(le_int32 s = 0; s < limit; s += 1) { +- if (SWAPT(scriptRecordArray[s].tag) == scriptTag) { +- scriptTableOffset = SWAPW(scriptRecordArray[s].offset); +- break; +- } ++ LEReferenceToArrayOf<ScriptRecord> scriptRecordArrayRef(base, success, &scriptRecordArray[0], limit); ++ for(le_int32 s = 0; (s < limit)&&LE_SUCCESS(success); s += 1) { ++ if (SWAPT(scriptRecordArrayRef(s,success).tag) == scriptTag) { ++ scriptTableOffset = SWAPW(scriptRecordArrayRef(s,success).offset); ++ break; ++ } + } + } else { +- scriptTableOffset = OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArray, count); ++ LEReferenceToArrayOf<ScriptRecord> scriptRecordArrayRef(base, success, &scriptRecordArray[0], count); ++ scriptTableOffset = OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArrayRef, success); // TODO + } + + if (scriptTableOffset != 0) { +- return (const ScriptTable *) ((char *)this + scriptTableOffset); ++ return LEReferenceTo<ScriptTable>(base, success, scriptTableOffset); + } + +- return NULL; ++ return LEReferenceTo<ScriptTable>(); + } + +-const LangSysTable *ScriptListTable::findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch) const ++LEReferenceTo<LangSysTable> ScriptListTable::findLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch) const + { +- const ScriptTable *scriptTable = findScript(scriptTag); ++ const LEReferenceTo<ScriptTable> scriptTable = findScript(base, scriptTag, success); + +- if (scriptTable == 0) { +- return NULL; +- } ++ if (scriptTable.isEmpty()) { ++ return LEReferenceTo<LangSysTable>(); ++ } + +- return scriptTable->findLanguage(languageTag, exactMatch); ++ return scriptTable->findLanguage(scriptTable, languageTag, success, exactMatch).reparent(base); + } + + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/ScriptAndLanguage.h b/src/share/native/sun/font/layout/ScriptAndLanguage.h +--- jdk/src/share/native/sun/font/layout/ScriptAndLanguage.h ++++ jdk/src/share/native/sun/font/layout/ScriptAndLanguage.h +@@ -51,6 +51,7 @@ + le_uint16 featureCount; + le_uint16 featureIndexArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(LangSysTable, featureIndexArray) + + struct ScriptTable + { +@@ -58,8 +59,9 @@ + le_uint16 langSysCount; + LangSysRecord langSysRecordArray[ANY_NUMBER]; + +- const LangSysTable *findLanguage(LETag languageTag, le_bool exactMatch = FALSE) const; ++ LEReferenceTo<LangSysTable> findLanguage(const LETableReference &base, LETag languageTag, LEErrorCode &success, le_bool exactMatch = FALSE) const; + }; ++LE_VAR_ARRAY(ScriptTable, langSysRecordArray) + + typedef TagAndOffsetRecord ScriptRecord; + +@@ -68,9 +70,10 @@ + le_uint16 scriptCount; + ScriptRecord scriptRecordArray[ANY_NUMBER]; + +- const ScriptTable *findScript(LETag scriptTag) const; +- const LangSysTable *findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const; ++ LEReferenceTo<ScriptTable> findScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const; ++ LEReferenceTo<LangSysTable> findLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch = FALSE) const; + }; ++LE_VAR_ARRAY(ScriptListTable, scriptRecordArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp b/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp +--- jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp +@@ -46,19 +46,18 @@ + { + } + +-SegmentArrayProcessor::SegmentArrayProcessor(const MorphSubtableHeader *morphSubtableHeader) +- : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader) ++SegmentArrayProcessor::SegmentArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) ++ : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success) + { +- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader; +- +- segmentArrayLookupTable = (const SegmentArrayLookupTable *) &header->table; ++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); ++ segmentArrayLookupTable = LEReferenceTo<SegmentArrayLookupTable>(morphSubtableHeader, success, (const SegmentArrayLookupTable*)&header->table); + } + + SegmentArrayProcessor::~SegmentArrayProcessor() + { + } + +-void SegmentArrayProcessor::process(LEGlyphStorage &glyphStorage) ++void SegmentArrayProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + const LookupSegment *segments = segmentArrayLookupTable->segments; + le_int32 glyphCount = glyphStorage.getGlyphCount(); +@@ -66,17 +65,16 @@ + + for (glyph = 0; glyph < glyphCount; glyph += 1) { + LEGlyphID thisGlyph = glyphStorage[glyph]; +- const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segments, thisGlyph); ++ const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segmentArrayLookupTable, segments, thisGlyph, success); + + if (lookupSegment != NULL) { + TTGlyphID firstGlyph = SWAPW(lookupSegment->firstGlyph); + le_int16 offset = SWAPW(lookupSegment->value); + + if (offset != 0) { +- TTGlyphID *glyphArray = (TTGlyphID *) ((char *) subtableHeader + offset); +- TTGlyphID newGlyph = SWAPW(glyphArray[LE_GET_GLYPH(thisGlyph) - firstGlyph]); +- +- glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); ++ LEReferenceToArrayOf<TTGlyphID> glyphArray(subtableHeader, success, offset, LE_UNBOUNDED_ARRAY); ++ TTGlyphID newGlyph = SWAPW(glyphArray(LE_GET_GLYPH(thisGlyph) - firstGlyph, success)); ++ glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); + } + } + } +diff --git a/src/share/native/sun/font/layout/SegmentArrayProcessor.h b/src/share/native/sun/font/layout/SegmentArrayProcessor.h +--- jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.h ++++ jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.h +@@ -50,9 +50,9 @@ + class SegmentArrayProcessor : public NonContextualGlyphSubstitutionProcessor + { + public: +- virtual void process(LEGlyphStorage &glyphStorage); ++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); + +- SegmentArrayProcessor(const MorphSubtableHeader *morphSubtableHeader); ++ SegmentArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); + + virtual ~SegmentArrayProcessor(); + +@@ -74,7 +74,7 @@ + SegmentArrayProcessor(); + + protected: +- const SegmentArrayLookupTable *segmentArrayLookupTable; ++ LEReferenceTo<SegmentArrayLookupTable> segmentArrayLookupTable; + + }; + +diff --git a/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp b/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp +--- jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.cpp +@@ -46,29 +46,28 @@ + { + } + +-SegmentSingleProcessor::SegmentSingleProcessor(const MorphSubtableHeader *morphSubtableHeader) +- : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader) ++SegmentSingleProcessor::SegmentSingleProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) ++ : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success) + { +- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader; +- +- segmentSingleLookupTable = (const SegmentSingleLookupTable *) &header->table; ++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); ++ segmentSingleLookupTable = LEReferenceTo<SegmentSingleLookupTable>(morphSubtableHeader, success, (const SegmentSingleLookupTable*)&header->table); + } + + SegmentSingleProcessor::~SegmentSingleProcessor() + { + } + +-void SegmentSingleProcessor::process(LEGlyphStorage &glyphStorage) ++void SegmentSingleProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + const LookupSegment *segments = segmentSingleLookupTable->segments; + le_int32 glyphCount = glyphStorage.getGlyphCount(); + le_int32 glyph; + +- for (glyph = 0; glyph < glyphCount; glyph += 1) { ++ for (glyph = 0; glyph < glyphCount && LE_SUCCESS(success); glyph += 1) { + LEGlyphID thisGlyph = glyphStorage[glyph]; +- const LookupSegment *lookupSegment = segmentSingleLookupTable->lookupSegment(segments, thisGlyph); ++ const LookupSegment *lookupSegment = segmentSingleLookupTable->lookupSegment(segmentSingleLookupTable, segments, thisGlyph, success); + +- if (lookupSegment != NULL) { ++ if (lookupSegment != NULL && LE_SUCCESS(success)) { + TTGlyphID newGlyph = (TTGlyphID) LE_GET_GLYPH(thisGlyph) + SWAPW(lookupSegment->value); + + glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); +diff --git a/src/share/native/sun/font/layout/SegmentSingleProcessor.h b/src/share/native/sun/font/layout/SegmentSingleProcessor.h +--- jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.h ++++ jdk/src/share/native/sun/font/layout/SegmentSingleProcessor.h +@@ -50,9 +50,9 @@ + class SegmentSingleProcessor : public NonContextualGlyphSubstitutionProcessor + { + public: +- virtual void process(LEGlyphStorage &glyphStorage); ++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); + +- SegmentSingleProcessor(const MorphSubtableHeader *morphSubtableHeader); ++ SegmentSingleProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); + + virtual ~SegmentSingleProcessor(); + +@@ -74,7 +74,7 @@ + SegmentSingleProcessor(); + + protected: +- const SegmentSingleLookupTable *segmentSingleLookupTable; ++ LEReferenceTo<SegmentSingleLookupTable> segmentSingleLookupTable; + + }; + +diff --git a/src/share/native/sun/font/layout/ShapingTypeData.cpp b/src/share/native/sun/font/layout/ShapingTypeData.cpp +--- jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp ++++ jdk/src/share/native/sun/font/layout/ShapingTypeData.cpp +@@ -122,4 +122,6 @@ + 0x00, 0x05, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x05, 0xFF, 0xF9, 0xFF, 0xFB, 0x00, 0x05 + }; + ++const size_t ArabicShaping::shapingTypeTableLen = sizeof(shapingTypeTable)/sizeof(shapingTypeTable[0]); ++ + U_NAMESPACE_END +diff --git a/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp b/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp +--- jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.cpp +@@ -46,29 +46,29 @@ + { + } + +-SimpleArrayProcessor::SimpleArrayProcessor(const MorphSubtableHeader *morphSubtableHeader) +- : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader) ++SimpleArrayProcessor::SimpleArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) ++ : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success) + { +- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader; +- +- simpleArrayLookupTable = (const SimpleArrayLookupTable *) &header->table; ++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); ++ simpleArrayLookupTable = LEReferenceTo<SimpleArrayLookupTable>(morphSubtableHeader, success, (const SimpleArrayLookupTable*)&header->table); + } + + SimpleArrayProcessor::~SimpleArrayProcessor() + { + } + +-void SimpleArrayProcessor::process(LEGlyphStorage &glyphStorage) ++void SimpleArrayProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + le_int32 glyphCount = glyphStorage.getGlyphCount(); + le_int32 glyph; + +- for (glyph = 0; glyph < glyphCount; glyph += 1) { ++ LEReferenceToArrayOf<LookupValue> valueArray(simpleArrayLookupTable, success, (const LookupValue*)&simpleArrayLookupTable->valueArray, LE_UNBOUNDED_ARRAY); ++ ++ for (glyph = 0; LE_SUCCESS(success) && (glyph < glyphCount); glyph += 1) { + LEGlyphID thisGlyph = glyphStorage[glyph]; + if (LE_GET_GLYPH(thisGlyph) < 0xFFFF) { +- TTGlyphID newGlyph = SWAPW(simpleArrayLookupTable->valueArray[LE_GET_GLYPH(thisGlyph)]); +- +- glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); ++ TTGlyphID newGlyph = SWAPW(valueArray.getObject(LE_GET_GLYPH(thisGlyph),success)); ++ glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); + } + } + } +diff --git a/src/share/native/sun/font/layout/SimpleArrayProcessor.h b/src/share/native/sun/font/layout/SimpleArrayProcessor.h +--- jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.h ++++ jdk/src/share/native/sun/font/layout/SimpleArrayProcessor.h +@@ -50,9 +50,9 @@ + class SimpleArrayProcessor : public NonContextualGlyphSubstitutionProcessor + { + public: +- virtual void process(LEGlyphStorage &glyphStorage); ++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); + +- SimpleArrayProcessor(const MorphSubtableHeader *morphSubtableHeader); ++ SimpleArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); + + virtual ~SimpleArrayProcessor(); + +@@ -74,7 +74,7 @@ + SimpleArrayProcessor(); + + protected: +- const SimpleArrayLookupTable *simpleArrayLookupTable; ++ LEReferenceTo<SimpleArrayLookupTable> simpleArrayLookupTable; + + }; + +diff --git a/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp b/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp +--- jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.cpp +@@ -40,7 +40,7 @@ + + U_NAMESPACE_BEGIN + +-le_uint32 SinglePositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++le_uint32 SinglePositioningSubtable::process(const LEReferenceTo<SinglePositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const + { + switch(SWAPW(subtableFormat)) + { +@@ -49,16 +49,16 @@ + + case 1: + { +- const SinglePositioningFormat1Subtable *subtable = (const SinglePositioningFormat1Subtable *) this; ++ const LEReferenceTo<SinglePositioningFormat1Subtable> subtable(base, success, (const SinglePositioningFormat1Subtable *) this); + +- return subtable->process(glyphIterator, fontInstance); ++ return subtable->process(subtable, glyphIterator, fontInstance, success); + } + + case 2: + { +- const SinglePositioningFormat2Subtable *subtable = (const SinglePositioningFormat2Subtable *) this; ++ const LEReferenceTo<SinglePositioningFormat2Subtable> subtable(base, success, (const SinglePositioningFormat2Subtable *) this); + +- return subtable->process(glyphIterator, fontInstance); ++ return subtable->process(subtable, glyphIterator, fontInstance, success); + } + + default: +@@ -66,10 +66,10 @@ + } + } + +-le_uint32 SinglePositioningFormat1Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++le_uint32 SinglePositioningFormat1Subtable::process(const LEReferenceTo<SinglePositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const + { + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(glyph); ++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); + + if (coverageIndex >= 0) { + valueRecord.adjustPosition(SWAPW(valueFormat), (const char *) this, *glyphIterator, fontInstance); +@@ -80,10 +80,10 @@ + return 0; + } + +-le_uint32 SinglePositioningFormat2Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const ++le_uint32 SinglePositioningFormat2Subtable::process(const LEReferenceTo<SinglePositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const + { + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +- le_int16 coverageIndex = (le_int16) getGlyphCoverage(glyph); ++ le_int16 coverageIndex = (le_int16) getGlyphCoverage(base, glyph, success); + + if (coverageIndex >= 0) { + valueRecordArray[0].adjustPosition(coverageIndex, SWAPW(valueFormat), (const char *) this, *glyphIterator, fontInstance); +diff --git a/src/share/native/sun/font/layout/SinglePositioningSubtables.h b/src/share/native/sun/font/layout/SinglePositioningSubtables.h +--- jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.h ++++ jdk/src/share/native/sun/font/layout/SinglePositioningSubtables.h +@@ -48,7 +48,7 @@ + + struct SinglePositioningSubtable : GlyphPositioningSubtable + { +- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LEReferenceTo<SinglePositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; + }; + + struct SinglePositioningFormat1Subtable : SinglePositioningSubtable +@@ -56,7 +56,7 @@ + ValueFormat valueFormat; + ValueRecord valueRecord; + +- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LEReferenceTo<SinglePositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; + }; + + struct SinglePositioningFormat2Subtable : SinglePositioningSubtable +@@ -65,8 +65,9 @@ + le_uint16 valueCount; + ValueRecord valueRecordArray[ANY_NUMBER]; + +- le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; ++ le_uint32 process(const LEReferenceTo<SinglePositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; + }; ++LE_VAR_ARRAY(SinglePositioningFormat2Subtable, valueRecordArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp b/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp +--- jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp ++++ jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.cpp +@@ -39,7 +39,7 @@ + + U_NAMESPACE_BEGIN + +-le_uint32 SingleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const ++le_uint32 SingleSubstitutionSubtable::process(const LEReferenceTo<SingleSubstitutionSubtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const + { + switch(SWAPW(subtableFormat)) + { +@@ -48,16 +48,16 @@ + + case 1: + { +- const SingleSubstitutionFormat1Subtable *subtable = (const SingleSubstitutionFormat1Subtable *) this; ++ const LEReferenceTo<SingleSubstitutionFormat1Subtable> subtable(base, success, (const SingleSubstitutionFormat1Subtable *) this); + +- return subtable->process(glyphIterator, filter); ++ return subtable->process(subtable, glyphIterator, success, filter); + } + + case 2: + { +- const SingleSubstitutionFormat2Subtable *subtable = (const SingleSubstitutionFormat2Subtable *) this; ++ const LEReferenceTo<SingleSubstitutionFormat2Subtable> subtable(base, success, (const SingleSubstitutionFormat2Subtable *) this); + +- return subtable->process(glyphIterator, filter); ++ return subtable->process(subtable, glyphIterator, success, filter); + } + + default: +@@ -65,10 +65,10 @@ + } + } + +-le_uint32 SingleSubstitutionFormat1Subtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const ++le_uint32 SingleSubstitutionFormat1Subtable::process(const LEReferenceTo<SingleSubstitutionFormat1Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const + { + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(glyph); ++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); + + if (coverageIndex >= 0) { + TTGlyphID substitute = ((TTGlyphID) LE_GET_GLYPH(glyph)) + SWAPW(deltaGlyphID); +@@ -83,10 +83,10 @@ + return 0; + } + +-le_uint32 SingleSubstitutionFormat2Subtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const ++le_uint32 SingleSubstitutionFormat2Subtable::process(const LEReferenceTo<SingleSubstitutionFormat2Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const + { + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); +- le_int32 coverageIndex = getGlyphCoverage(glyph); ++ le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); + + if (coverageIndex >= 0) { + TTGlyphID substitute = SWAPW(substituteArray[coverageIndex]); +diff --git a/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h b/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h +--- jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h ++++ jdk/src/share/native/sun/font/layout/SingleSubstitutionSubtables.h +@@ -47,14 +47,14 @@ + + struct SingleSubstitutionSubtable : GlyphSubstitutionSubtable + { +- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; ++ le_uint32 process(const LEReferenceTo<SingleSubstitutionSubtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const; + }; + + struct SingleSubstitutionFormat1Subtable : SingleSubstitutionSubtable + { + le_int16 deltaGlyphID; + +- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; ++ le_uint32 process(const LEReferenceTo<SingleSubstitutionFormat1Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const; + }; + + struct SingleSubstitutionFormat2Subtable : SingleSubstitutionSubtable +@@ -62,8 +62,9 @@ + le_uint16 glyphCount; + TTGlyphID substituteArray[ANY_NUMBER]; + +- le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; ++ le_uint32 process(const LEReferenceTo<SingleSubstitutionFormat2Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const; + }; ++LE_VAR_ARRAY(SingleSubstitutionFormat2Subtable, substituteArray) + + U_NAMESPACE_END + #endif +diff --git a/src/share/native/sun/font/layout/SingleTableProcessor.cpp b/src/share/native/sun/font/layout/SingleTableProcessor.cpp +--- jdk/src/share/native/sun/font/layout/SingleTableProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/SingleTableProcessor.cpp +@@ -46,26 +46,25 @@ + { + } + +-SingleTableProcessor::SingleTableProcessor(const MorphSubtableHeader *moprhSubtableHeader) +- : NonContextualGlyphSubstitutionProcessor(moprhSubtableHeader) ++SingleTableProcessor::SingleTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) ++ : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success) + { +- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) moprhSubtableHeader; +- +- singleTableLookupTable = (const SingleTableLookupTable *) &header->table; ++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); ++ singleTableLookupTable = LEReferenceTo<SingleTableLookupTable>(morphSubtableHeader, success, (const SingleTableLookupTable*)&header->table); + } + + SingleTableProcessor::~SingleTableProcessor() + { + } + +-void SingleTableProcessor::process(LEGlyphStorage &glyphStorage) ++void SingleTableProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) + { + const LookupSingle *entries = singleTableLookupTable->entries; + le_int32 glyph; + le_int32 glyphCount = glyphStorage.getGlyphCount(); + + for (glyph = 0; glyph < glyphCount; glyph += 1) { +- const LookupSingle *lookupSingle = singleTableLookupTable->lookupSingle(entries, glyphStorage[glyph]); ++ const LookupSingle *lookupSingle = singleTableLookupTable->lookupSingle(singleTableLookupTable, entries, glyphStorage[glyph], success); + + if (lookupSingle != NULL) { + glyphStorage[glyph] = SWAPW(lookupSingle->value); +diff --git a/src/share/native/sun/font/layout/SingleTableProcessor.h b/src/share/native/sun/font/layout/SingleTableProcessor.h +--- jdk/src/share/native/sun/font/layout/SingleTableProcessor.h ++++ jdk/src/share/native/sun/font/layout/SingleTableProcessor.h +@@ -50,9 +50,9 @@ + class SingleTableProcessor : public NonContextualGlyphSubstitutionProcessor + { + public: +- virtual void process(LEGlyphStorage &glyphStorage); ++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); + +- SingleTableProcessor(const MorphSubtableHeader *morphSubtableHeader); ++ SingleTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); + + virtual ~SingleTableProcessor(); + +@@ -74,7 +74,7 @@ + SingleTableProcessor(); + + protected: +- const SingleTableLookupTable *singleTableLookupTable; ++ LEReferenceTo<SingleTableLookupTable> singleTableLookupTable; + + }; + +diff --git a/src/share/native/sun/font/layout/StateTableProcessor.cpp b/src/share/native/sun/font/layout/StateTableProcessor.cpp +--- jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp +@@ -44,17 +44,18 @@ + { + } + +-StateTableProcessor::StateTableProcessor(const MorphSubtableHeader *morphSubtableHeader) +- : SubtableProcessor(morphSubtableHeader) ++StateTableProcessor::StateTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) ++ : SubtableProcessor(morphSubtableHeader, success), stateTableHeader(morphSubtableHeader, success), ++ stHeader(stateTableHeader, success, (const StateTableHeader*)&stateTableHeader->stHeader) + { +- stateTableHeader = (const MorphStateTableHeader *) morphSubtableHeader; +- ++ if(LE_FAILURE(success)) return; + stateSize = SWAPW(stateTableHeader->stHeader.stateSize); + classTableOffset = SWAPW(stateTableHeader->stHeader.classTableOffset); + stateArrayOffset = SWAPW(stateTableHeader->stHeader.stateArrayOffset); + entryTableOffset = SWAPW(stateTableHeader->stHeader.entryTableOffset); + +- classTable = (const ClassTable *) ((char *) &stateTableHeader->stHeader + classTableOffset); ++ classTable = LEReferenceTo<ClassTable>(stateTableHeader, success, ((char *) &stateTableHeader->stHeader + classTableOffset)); ++ if(LE_FAILURE(success)) return; + firstGlyph = SWAPW(classTable->firstGlyph); + lastGlyph = firstGlyph + SWAPW(classTable->nGlyphs); + } +@@ -63,9 +64,9 @@ + { + } + +-void StateTableProcessor::process(LEGlyphStorage &glyphStorage) ++void StateTableProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) + { +- ++ if (LE_FAILURE(success)) return; + LE_STATE_PATIENCE_INIT(); + + // Start at state 0 +@@ -94,8 +95,8 @@ + } + } + +- const EntryTableIndex *stateArray = (const EntryTableIndex *) ((char *) &stateTableHeader->stHeader + currentState); +- EntryTableIndex entryTableIndex = stateArray[(le_uint8)classCode]; ++ LEReferenceToArrayOf<EntryTableIndex> stateArray(stHeader, success, currentState, LE_UNBOUNDED_ARRAY); ++ EntryTableIndex entryTableIndex = stateArray.getObject((le_uint8)classCode, success); + LE_STATE_PATIENCE_CURR(le_int32, currGlyph); + currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex); + LE_STATE_PATIENCE_INCR(currGlyph); +diff --git a/src/share/native/sun/font/layout/StateTableProcessor.h b/src/share/native/sun/font/layout/StateTableProcessor.h +--- jdk/src/share/native/sun/font/layout/StateTableProcessor.h ++++ jdk/src/share/native/sun/font/layout/StateTableProcessor.h +@@ -49,7 +49,7 @@ + class StateTableProcessor : public SubtableProcessor + { + public: +- void process(LEGlyphStorage &glyphStorage); ++ void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); + + virtual void beginStateTable() = 0; + +@@ -58,7 +58,7 @@ + virtual void endStateTable() = 0; + + protected: +- StateTableProcessor(const MorphSubtableHeader *morphSubtableHeader); ++ StateTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); + virtual ~StateTableProcessor(); + + StateTableProcessor(); +@@ -68,11 +68,12 @@ + ByteOffset stateArrayOffset; + ByteOffset entryTableOffset; + +- const ClassTable *classTable; ++ LEReferenceTo<ClassTable> classTable; + TTGlyphID firstGlyph; + TTGlyphID lastGlyph; + +- const MorphStateTableHeader *stateTableHeader; ++ LEReferenceTo<MorphStateTableHeader> stateTableHeader; ++ LEReferenceTo<StateTableHeader> stHeader; // for convenience + + private: + StateTableProcessor(const StateTableProcessor &other); // forbid copying of this class +diff --git a/src/share/native/sun/font/layout/StateTables.h b/src/share/native/sun/font/layout/StateTables.h +--- jdk/src/share/native/sun/font/layout/StateTables.h ++++ jdk/src/share/native/sun/font/layout/StateTables.h +@@ -103,6 +103,7 @@ + le_uint16 nGlyphs; + ClassCode classArray[ANY_NUMBER]; + }; ++LE_VAR_ARRAY(ClassTable, classArray) + + enum StateNumber + { +diff --git a/src/share/native/sun/font/layout/SubtableProcessor.cpp b/src/share/native/sun/font/layout/SubtableProcessor.cpp +--- jdk/src/share/native/sun/font/layout/SubtableProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/SubtableProcessor.cpp +@@ -40,10 +40,10 @@ + { + } + +-SubtableProcessor::SubtableProcessor(const MorphSubtableHeader *morphSubtableHeader) ++SubtableProcessor::SubtableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) ++ : length(0), coverage(0), subtableFeatures(0L), subtableHeader(morphSubtableHeader) + { +- subtableHeader = morphSubtableHeader; +- ++ if(LE_FAILURE(success)) return; + length = SWAPW(subtableHeader->length); + coverage = SWAPW(subtableHeader->coverage); + subtableFeatures = SWAPL(subtableHeader->subtableFeatures); +diff --git a/src/share/native/sun/font/layout/SubtableProcessor.h b/src/share/native/sun/font/layout/SubtableProcessor.h +--- jdk/src/share/native/sun/font/layout/SubtableProcessor.h ++++ jdk/src/share/native/sun/font/layout/SubtableProcessor.h +@@ -46,11 +46,11 @@ + + class SubtableProcessor : public UMemory { + public: +- virtual void process(LEGlyphStorage &glyphStorage) = 0; ++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success) = 0; + virtual ~SubtableProcessor(); + + protected: +- SubtableProcessor(const MorphSubtableHeader *morphSubtableHeader); ++ SubtableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); + + SubtableProcessor(); + +@@ -58,7 +58,7 @@ + SubtableCoverage coverage; + FeatureFlags subtableFeatures; + +- const MorphSubtableHeader *subtableHeader; ++ const LEReferenceTo<MorphSubtableHeader> subtableHeader; + + private: + +diff --git a/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp b/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/ThaiLayoutEngine.cpp +@@ -134,11 +134,10 @@ + return; + } + +- if (fTypoFlags & 0x1) { /* kerning enabled */ +- static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG; +- +- KernTable kt(fFontInstance, getFontTable(kernTableTag)); +- kt.process(glyphStorage); ++ if (fTypoFlags & LE_Kerning_FEATURE_FLAG) { /* kerning enabled */ ++ LETableReference kernTable(fFontInstance, LE_KERN_TABLE_TAG, success); ++ KernTable kt(kernTable, success); ++ kt.process(glyphStorage, success); + } + + // default is no adjustments +diff --git a/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp b/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.cpp +@@ -49,7 +49,7 @@ + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TibetanOpenTypeLayoutEngine) + + TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) ++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) + { + fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount); +diff --git a/src/share/native/sun/font/layout/TibetanLayoutEngine.h b/src/share/native/sun/font/layout/TibetanLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/TibetanLayoutEngine.h +@@ -83,7 +83,7 @@ + * @internal + */ + TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, +- le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); ++ le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known +diff --git a/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp b/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp +--- jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.cpp +@@ -46,22 +46,28 @@ + { + } + +-TrimmedArrayProcessor::TrimmedArrayProcessor(const MorphSubtableHeader *morphSubtableHeader) +- : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader) ++TrimmedArrayProcessor::TrimmedArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) ++ : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success), firstGlyph(0), lastGlyph(0) + { +- const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader; ++ LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); + +- trimmedArrayLookupTable = (const TrimmedArrayLookupTable *) &header->table; +- firstGlyph = SWAPW(trimmedArrayLookupTable->firstGlyph); +- lastGlyph = firstGlyph + SWAPW(trimmedArrayLookupTable->glyphCount); ++ if(LE_FAILURE(success)) return; ++ ++ trimmedArrayLookupTable = LEReferenceTo<TrimmedArrayLookupTable>(morphSubtableHeader, success, (const TrimmedArrayLookupTable*)&header->table); ++ ++ if(LE_FAILURE(success)) return; ++ ++ firstGlyph = SWAPW(trimmedArrayLookupTable->firstGlyph); ++ lastGlyph = firstGlyph + SWAPW(trimmedArrayLookupTable->glyphCount); + } + + TrimmedArrayProcessor::~TrimmedArrayProcessor() + { + } + +-void TrimmedArrayProcessor::process(LEGlyphStorage &glyphStorage) ++void TrimmedArrayProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) + { ++ if(LE_FAILURE(success)) return; + le_int32 glyphCount = glyphStorage.getGlyphCount(); + le_int32 glyph; + +diff --git a/src/share/native/sun/font/layout/TrimmedArrayProcessor.h b/src/share/native/sun/font/layout/TrimmedArrayProcessor.h +--- jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.h ++++ jdk/src/share/native/sun/font/layout/TrimmedArrayProcessor.h +@@ -50,9 +50,9 @@ + class TrimmedArrayProcessor : public NonContextualGlyphSubstitutionProcessor + { + public: +- virtual void process(LEGlyphStorage &glyphStorage); ++ virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); + +- TrimmedArrayProcessor(const MorphSubtableHeader *morphSubtableHeader); ++ TrimmedArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); + + virtual ~TrimmedArrayProcessor(); + +@@ -76,7 +76,7 @@ + protected: + TTGlyphID firstGlyph; + TTGlyphID lastGlyph; +- const TrimmedArrayLookupTable *trimmedArrayLookupTable; ++ LEReferenceTo<TrimmedArrayLookupTable> trimmedArrayLookupTable; + + }; + +diff --git a/src/share/native/sun/font/layout/ValueRecords.h b/src/share/native/sun/font/layout/ValueRecords.h +--- jdk/src/share/native/sun/font/layout/ValueRecords.h ++++ jdk/src/share/native/sun/font/layout/ValueRecords.h +@@ -64,6 +64,7 @@ + static le_int16 getFieldCount(ValueFormat valueFormat); + static le_int16 getFieldIndex(ValueFormat valueFormat, ValueRecordField field); + }; ++LE_VAR_ARRAY(ValueRecord, values) + + enum ValueRecordFields + { +diff --git a/src/share/native/sun/font/sunFont.c b/src/share/native/sun/font/sunFont.c +--- jdk/src/share/native/sun/font/sunFont.c ++++ jdk/src/share/native/sun/font/sunFont.c +@@ -376,22 +376,20 @@ + JNIEXPORT TTLayoutTableCache* newLayoutTableCache() { + TTLayoutTableCache* ltc = calloc(1, sizeof(TTLayoutTableCache)); + if (ltc) { +- ltc->gsub_len = -1; +- ltc->gpos_len = -1; +- ltc->gdef_len = -1; +- ltc->mort_len = -1; +- ltc->kern_len = -1; ++ int i; ++ for(i=0;i<LAYOUTCACHE_ENTRIES;i++) { ++ ltc->entries[i].len = -1; ++ } + } + return ltc; + } + + JNIEXPORT void freeLayoutTableCache(TTLayoutTableCache* ltc) { + if (ltc) { +- if (ltc->gsub) free(ltc->gsub); +- if (ltc->gpos) free(ltc->gpos); +- if (ltc->gdef) free(ltc->gdef); +- if (ltc->mort) free(ltc->mort); +- if (ltc->kern) free(ltc->kern); ++ int i; ++ for(i=0;i<LAYOUTCACHE_ENTRIES;i++) { ++ if(ltc->entries[i].ptr) free (ltc->entries[i].ptr); ++ } + if (ltc->kernPairs) free(ltc->kernPairs); + free(ltc); + } diff --git a/java/openjdk6/files/icedtea/security/20130416/8001040.patch b/java/openjdk6/files/icedtea/security/20130416/8001040.patch new file mode 100644 index 000000000000..56da89c9f3ff --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8001040.patch @@ -0,0 +1,113 @@ +# HG changeset patch +# User andrew +# Date 1365766584 -3600 +# Node ID ac0858a12d62c384c53a048a634d25dc1f8f1b72 +# Parent 5ed9acc1f6be298713f10ad71c33564d48f46555 +8001040: Rework RMI model +Reviewed-by: alanb, ahgross, coffeys, dmocek + +diff --git a/src/share/classes/sun/rmi/server/MarshalInputStream.java b/src/share/classes/sun/rmi/server/MarshalInputStream.java +--- jdk/src/share/classes/sun/rmi/server/MarshalInputStream.java ++++ jdk/src/share/classes/sun/rmi/server/MarshalInputStream.java +@@ -55,13 +55,19 @@ + public class MarshalInputStream extends ObjectInputStream { + + /** +- * value of "java.rmi.server.useCodebaseOnly" property, ++ * Value of "java.rmi.server.useCodebaseOnly" property, + * as cached at class initialization time. ++ * ++ * The default value is true. That is, the value is true ++ * if the property is absent or is not equal to "false". ++ * The value is only false when the property is present ++ * and is equal to "false". + */ + private static final boolean useCodebaseOnlyProperty = +- ((Boolean) java.security.AccessController.doPrivileged( +- new sun.security.action.GetBooleanAction( +- "java.rmi.server.useCodebaseOnly"))).booleanValue(); ++ ! java.security.AccessController.doPrivileged( ++ new sun.security.action.GetPropertyAction( ++ "java.rmi.server.useCodebaseOnly", "true")) ++ .equalsIgnoreCase("false"); + + /** table to hold sun classes to which access is explicitly permitted */ + protected static Map permittedSunClasses = new HashMap(3); +diff --git a/test/java/rmi/registry/classPathCodebase/ClassPathCodebase.java b/test/java/rmi/registry/classPathCodebase/ClassPathCodebase.java +--- jdk/test/java/rmi/registry/classPathCodebase/ClassPathCodebase.java ++++ jdk/test/java/rmi/registry/classPathCodebase/ClassPathCodebase.java +@@ -31,7 +31,8 @@ + * + * @library ../../testlibrary + * @build ClassPathCodebase Dummy +- * @run main/othervm/policy=security.policy ClassPathCodebase ++ * @run main/othervm/policy=security.policy ++ * -Djava.rmi.server.useCodebaseOnly=false ClassPathCodebase + */ + + import java.io.*; +diff --git a/test/java/rmi/registry/readTest/readTest.sh b/test/java/rmi/registry/readTest/readTest.sh +--- jdk/test/java/rmi/registry/readTest/readTest.sh ++++ jdk/test/java/rmi/registry/readTest/readTest.sh +@@ -52,7 +52,8 @@ + RMIREG_OUT=rmi.out + #start rmiregistry without any local classes on classpath + cd rmi_tmp +-${TESTJAVA}${FS}bin${FS}rmiregistry 7491 > ..${FS}${RMIREG_OUT} 2>&1 & ++${TESTJAVA}${FS}bin${FS}rmiregistry -J-Djava.rmi.server.useCodebaseOnly=false \ ++ ${TESTTOOLVMOPTS} 64005 > ..${FS}${RMIREG_OUT} 2>&1 & + RMIREG_PID=$! + # allow some time to start + sleep 3 +diff --git a/test/java/rmi/server/RMIClassLoader/downloadArrayClass/DownloadArrayClass.java b/test/java/rmi/server/RMIClassLoader/downloadArrayClass/DownloadArrayClass.java +--- jdk/test/java/rmi/server/RMIClassLoader/downloadArrayClass/DownloadArrayClass.java ++++ jdk/test/java/rmi/server/RMIClassLoader/downloadArrayClass/DownloadArrayClass.java +@@ -68,6 +68,10 @@ + TestLibrary.bomb(e); + } + ++ System.err.println("Setting codebase property to: " + remoteCodebase); ++ System.setProperty("java.rmi.server.codebase", ++ remoteCodebase.toString()); ++ + /* + * Load Foo from a non-RMI class loader so that it won't be already + * loaded by an RMI class loader in this VM (for whatever that's +diff --git a/test/java/rmi/server/RMIClassLoader/downloadArrayClass/security.policy b/test/java/rmi/server/RMIClassLoader/downloadArrayClass/security.policy +--- jdk/test/java/rmi/server/RMIClassLoader/downloadArrayClass/security.policy ++++ jdk/test/java/rmi/server/RMIClassLoader/downloadArrayClass/security.policy +@@ -7,6 +7,8 @@ + }; + + grant { ++ permission java.util.PropertyPermission ++ "java.rmi.server.codebase", "read,write"; + + // permissions needed to move classes into separate codebase directories + permission java.io.FilePermission +diff --git a/test/java/rmi/server/RMIClassLoader/loadProxyClasses/LoadProxyClasses.java b/test/java/rmi/server/RMIClassLoader/loadProxyClasses/LoadProxyClasses.java +--- jdk/test/java/rmi/server/RMIClassLoader/loadProxyClasses/LoadProxyClasses.java ++++ jdk/test/java/rmi/server/RMIClassLoader/loadProxyClasses/LoadProxyClasses.java +@@ -32,7 +32,8 @@ + * @library ../../../testlibrary + * @build TestLibrary FnnClass FnnUnmarshal LoadProxyClasses NonpublicInterface + * @build NonpublicInterface1 PublicInterface PublicInterface1 +- * @run main/othervm/policy=security.policy LoadProxyClasses ++ * @run main/othervm/policy=security.policy ++ * -Djava.rmi.server.useCodebaseOnly=false LoadProxyClasses + */ + + import java.rmi.server.RMIClassLoader; +diff --git a/test/java/rmi/testlibrary/RMID.java b/test/java/rmi/testlibrary/RMID.java +--- jdk/test/java/rmi/testlibrary/RMID.java ++++ jdk/test/java/rmi/testlibrary/RMID.java +@@ -109,6 +109,9 @@ + if (!TestParams.testClasses.equals("")) { + args += " -C-Dtest.classes=" + TestParams.testClasses; + } ++ ++ args += " -C-Djava.rmi.server.useCodebaseOnly=false "; ++ + args += " " + getCodeCoverageArgs(); + return args; + } diff --git a/java/openjdk6/files/icedtea/security/20130416/8001322.patch b/java/openjdk6/files/icedtea/security/20130416/8001322.patch new file mode 100644 index 000000000000..766d7270a1ab --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8001322.patch @@ -0,0 +1,61 @@ +# HG changeset patch +# User dfuchs +# Date 1363010839 -3600 +# Node ID 4a3260353853c3590ceb915337e21fe17aa07dbd +# Parent ac0858a12d62c384c53a048a634d25dc1f8f1b72 +8001322: Refactor deserialization +Reviewed-by: mchung, skoivu, smarks + +diff --git a/src/share/classes/java/io/ObjectInputStream.java b/src/share/classes/java/io/ObjectInputStream.java +--- jdk/src/share/classes/java/io/ObjectInputStream.java ++++ jdk/src/share/classes/java/io/ObjectInputStream.java +@@ -41,6 +41,7 @@ + import java.util.concurrent.ConcurrentMap; + import java.util.concurrent.atomic.AtomicBoolean; + import static java.io.ObjectStreamClass.processQueue; ++import sun.reflect.misc.ReflectUtil; + + /** + * An ObjectInputStream deserializes primitive data and objects previously +@@ -1518,6 +1519,12 @@ + } + } + ++ private boolean isCustomSubclass() { ++ // Return true if this class is a custom subclass of ObjectInputStream ++ return getClass().getClassLoader() ++ != ObjectInputStream.class.getClassLoader(); ++ } ++ + /** + * Reads in and returns class descriptor for a dynamic proxy class. Sets + * passHandle to proxy class descriptor's assigned handle. If proxy class +@@ -1547,6 +1554,15 @@ + try { + if ((cl = resolveProxyClass(ifaces)) == null) { + resolveEx = new ClassNotFoundException("null class"); ++ } else if (!Proxy.isProxyClass(cl)) { ++ throw new InvalidClassException("Not a proxy"); ++ } else { ++ // ReflectUtil.checkProxyPackageAccess makes a test ++ // equivalent to isCustomSubclass so there's no need ++ // to condition this call to isCustomSubclass == true here. ++ ReflectUtil.checkProxyPackageAccess( ++ getClass().getClassLoader(), ++ cl.getInterfaces()); + } + } catch (ClassNotFoundException ex) { + resolveEx = ex; +@@ -1588,9 +1604,12 @@ + Class cl = null; + ClassNotFoundException resolveEx = null; + bin.setBlockDataMode(true); ++ final boolean checksRequired = isCustomSubclass(); + try { + if ((cl = resolveClass(readDesc)) == null) { + resolveEx = new ClassNotFoundException("null class"); ++ } else if (checksRequired) { ++ ReflectUtil.checkPackageAccess(cl); + } + } catch (ClassNotFoundException ex) { + resolveEx = ex; diff --git a/java/openjdk6/files/icedtea/security/20130416/8001329.patch b/java/openjdk6/files/icedtea/security/20130416/8001329.patch new file mode 100644 index 000000000000..592c665a3be5 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8001329.patch @@ -0,0 +1,32 @@ +# HG changeset patch +# User dmocek +# Date 1360111105 28800 +# Node ID a0e51ed355c9ae1256f8d344df34babb87a1edce +# Parent 4a3260353853c3590ceb915337e21fe17aa07dbd +8001329: Augment RMI logging +Reviewed-by: smarks, hawtin, alanb + +diff --git a/src/share/classes/java/rmi/server/LogStream.java b/src/share/classes/java/rmi/server/LogStream.java +--- jdk/src/share/classes/java/rmi/server/LogStream.java ++++ jdk/src/share/classes/java/rmi/server/LogStream.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -120,6 +120,13 @@ + */ + @Deprecated + public static synchronized void setDefaultStream(PrintStream newDefault) { ++ SecurityManager sm = System.getSecurityManager(); ++ ++ if (sm != null) { ++ sm.checkPermission( ++ new java.util.logging.LoggingPermission("control", null)); ++ } ++ + defaultStream = newDefault; + } + diff --git a/java/openjdk6/files/icedtea/security/20130416/8003335.patch b/java/openjdk6/files/icedtea/security/20130416/8003335.patch new file mode 100644 index 000000000000..ae733a018f2a --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8003335.patch @@ -0,0 +1,63 @@ +# HG changeset patch +# User chegar +# Date 1356010827 0 +# Node ID 3c7eb39c811464c98847a4f1a167636c1db80f17 +# Parent a0e51ed355c9ae1256f8d344df34babb87a1edce +8003335: Better handling of Finalizer thread +Reviewed-by: alanb, ahgross + +diff --git a/src/share/classes/java/lang/ref/Finalizer.java b/src/share/classes/java/lang/ref/Finalizer.java +--- jdk/src/share/classes/java/lang/ref/Finalizer.java ++++ jdk/src/share/classes/java/lang/ref/Finalizer.java +@@ -38,9 +38,9 @@ + */ + static native void invokeFinalizeMethod(Object o) throws Throwable; + +- static private ReferenceQueue queue = new ReferenceQueue(); +- static private Finalizer unfinalized = null; +- static private Object lock = new Object(); ++ private static ReferenceQueue queue = new ReferenceQueue(); ++ private static Finalizer unfinalized = null; ++ private static final Object lock = new Object(); + + private Finalizer + next = null, +@@ -142,7 +142,11 @@ + /* Called by Runtime.runFinalization() */ + static void runFinalization() { + forkSecondaryFinalizer(new Runnable() { ++ private volatile boolean running; + public void run() { ++ if (running) ++ return; ++ running = true; + for (;;) { + Finalizer f = (Finalizer)queue.poll(); + if (f == null) break; +@@ -155,7 +159,11 @@ + /* Invoked by java.lang.Shutdown */ + static void runAllFinalizers() { + forkSecondaryFinalizer(new Runnable() { ++ private volatile boolean running; + public void run() { ++ if (running) ++ return; ++ running = true; + for (;;) { + Finalizer f; + synchronized (lock) { +@@ -168,10 +176,14 @@ + } + + private static class FinalizerThread extends Thread { ++ private volatile boolean running; + FinalizerThread(ThreadGroup g) { + super(g, "Finalizer"); + } + public void run() { ++ if (running) ++ return; ++ running = true; + for (;;) { + try { + Finalizer f = (Finalizer)queue.remove(); diff --git a/java/openjdk6/files/icedtea/security/20130416/8003445.patch b/java/openjdk6/files/icedtea/security/20130416/8003445.patch new file mode 100644 index 000000000000..2d53b2959e65 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8003445.patch @@ -0,0 +1,77 @@ +# HG changeset patch +# User andrew +# Date 1365768981 -3600 +# Node ID 8f5ad2cacf6fff8efd817c5373469037d945f3dc +# Parent 3c7eb39c811464c98847a4f1a167636c1db80f17 +8003445: Adjust JAX-WS to focus on API +Reviewed-by: vinnie, ahgross, mgrebac + +diff --git a/src/share/lib/security/java.security b/src/share/lib/security/java.security +--- jdk/src/share/lib/security/java.security ++++ jdk/src/share/lib/security/java.security +@@ -150,7 +150,8 @@ + com.sun.org.apache.xalan.internal.xsltc.util.,\ + com.sun.org.apache.xml.internal.res.,\ + com.sun.org.apache.xml.internal.serializer.utils.,\ +- com.sun.org.apache.xml.internal.utils. ++ com.sun.org.apache.xml.internal.utils.,\ ++ com.sun.org.glassfish. + + # + # List of comma-separated packages that start with or equal this string +@@ -185,7 +186,8 @@ + com.sun.org.apache.xalan.internal.xsltc.util.,\ + com.sun.org.apache.xml.internal.res.,\ + com.sun.org.apache.xml.internal.serializer.utils.,\ +- com.sun.org.apache.xml.internal.utils. ++ com.sun.org.apache.xml.internal.utils.,\ ++ com.sun.org.glassfish. + + # + # Determines whether this properties file can be appended to +diff --git a/src/share/lib/security/java.security-solaris b/src/share/lib/security/java.security-solaris +--- jdk/src/share/lib/security/java.security-solaris ++++ jdk/src/share/lib/security/java.security-solaris +@@ -151,7 +151,8 @@ + com.sun.org.apache.xalan.internal.xsltc.util.,\ + com.sun.org.apache.xml.internal.res.,\ + com.sun.org.apache.xml.internal.serializer.utils.,\ +- com.sun.org.apache.xml.internal.utils. ++ com.sun.org.apache.xml.internal.utils.,\ ++ com.sun.org.glassfish. + + # + # List of comma-separated packages that start with or equal this string +@@ -186,7 +187,8 @@ + com.sun.org.apache.xalan.internal.xsltc.util.,\ + com.sun.org.apache.xml.internal.res.,\ + com.sun.org.apache.xml.internal.serializer.utils.,\ +- com.sun.org.apache.xml.internal.utils. ++ com.sun.org.apache.xml.internal.utils.,\ ++ com.sun.org.glassfish. + + # + # Determines whether this properties file can be appended to +diff --git a/src/share/lib/security/java.security-windows b/src/share/lib/security/java.security-windows +--- jdk/src/share/lib/security/java.security-windows ++++ jdk/src/share/lib/security/java.security-windows +@@ -151,7 +151,8 @@ + com.sun.org.apache.xalan.internal.xsltc.util.,\ + com.sun.org.apache.xml.internal.res.,\ + com.sun.org.apache.xml.internal.serializer.utils.,\ +- com.sun.org.apache.xml.internal.utils. ++ com.sun.org.apache.xml.internal.utils.,\ ++ com.sun.org.glassfish. + + # + # List of comma-separated packages that start with or equal this string +@@ -186,7 +187,8 @@ + com.sun.org.apache.xalan.internal.xsltc.util.,\ + com.sun.org.apache.xml.internal.res.,\ + com.sun.org.apache.xml.internal.serializer.utils.,\ +- com.sun.org.apache.xml.internal.utils. ++ com.sun.org.apache.xml.internal.utils.,\ ++ com.sun.org.glassfish. + + # + # Determines whether this properties file can be appended to diff --git a/java/openjdk6/files/icedtea/security/20130416/8003543.patch b/java/openjdk6/files/icedtea/security/20130416/8003543.patch new file mode 100644 index 000000000000..8178f0b5eee6 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8003543.patch @@ -0,0 +1,227 @@ +--- /dev/null 2013-04-25 15:02:13.000000000 -0400 ++++ jaxws/patches/jaxws_src/8003543.patch 2013-04-25 15:03:47.000000000 -0400 +@@ -0,0 +1,224 @@ ++--- src/com/sun/xml/internal/org/jvnet/mimepull/MemoryData.java +++++ src/com/sun/xml/internal/org/jvnet/mimepull/MemoryData.java ++@@ -1,5 +1,5 @@ ++ /* ++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * 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,7 @@ ++ import java.nio.ByteBuffer; ++ import java.io.File; ++ import java.io.IOException; +++import java.util.logging.Level; ++ import java.util.logging.Logger; ++ ++ /** ++@@ -49,41 +50,45 @@ ++ } ++ ++ // size of the chunk given by the parser +++ @Override ++ public int size() { ++ return len; ++ } ++ +++ @Override ++ public byte[] read() { ++ return data; ++ } ++ +++ @Override ++ public long writeTo(DataFile file) { ++ return file.writeTo(data, 0, len); ++ } ++ ++ /** ++- * ++ * @param dataHead ++ * @param buf ++ * @return ++ */ +++ @Override ++ public Data createNext(DataHead dataHead, ByteBuffer buf) { ++ if (!config.isOnlyMemory() && dataHead.inMemory >= config.memoryThreshold) { ++ try { ++ String prefix = config.getTempFilePrefix(); ++ String suffix = config.getTempFileSuffix(); ++- File dir = config.getTempDir(); ++- File tempFile = (dir == null) ++- ? File.createTempFile(prefix, suffix) ++- : File.createTempFile(prefix, suffix, dir); ++- LOGGER.fine("Created temp file = "+tempFile); +++ File tempFile = TempFiles.createTempFile(prefix, suffix, config.getTempDir()); +++ // delete the temp file when VM exits as a last resort for file clean up +++ tempFile.deleteOnExit(); +++ if (LOGGER.isLoggable(Level.FINE)) { +++ LOGGER.log(Level.FINE, "Created temp file = {0}", tempFile); +++ } ++ dataHead.dataFile = new DataFile(tempFile); ++- } catch(IOException ioe) { +++ } catch (IOException ioe) { ++ throw new MIMEParsingException(ioe); ++ } ++ ++ if (dataHead.head != null) { ++- for(Chunk c=dataHead.head; c != null; c=c.next) { +++ for (Chunk c = dataHead.head; c != null; c = c.next) { ++ long pointer = c.data.writeTo(dataHead.dataFile); ++ c.data = new FileData(dataHead.dataFile, pointer, len); ++ } ++@@ -93,4 +98,5 @@ ++ return new MemoryData(buf, config); ++ } ++ } +++ ++ } ++--- /dev/null +++++ src/com/sun/xml/internal/org/jvnet/mimepull/TempFiles.java ++@@ -0,0 +1,144 @@ +++/* +++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +++ * +++ * This code is free software; you can redistribute it and/or modify it +++ * under the terms of the GNU General Public License version 2 only, as +++ * published by the Free Software Foundation. Oracle designates this +++ * particular file as subject to the "Classpath" exception as provided +++ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +++ * or visit www.oracle.com if you need additional information or have any +++ * questions. +++ */ +++ +++package com.sun.xml.internal.org.jvnet.mimepull; +++ +++import java.io.File; +++import java.io.IOException; +++import java.lang.reflect.Array; +++import java.lang.reflect.InvocationTargetException; +++import java.lang.reflect.Method; +++import java.util.logging.Level; +++import java.util.logging.Logger; +++ +++/** +++ * Helper utility to support jdk <= jdk1.6. After jdk1.6 EOL reflection can be removed and API can be used directly. +++ */ +++class TempFiles { +++ +++ private static final Logger LOGGER = Logger.getLogger(TempFiles.class.getName()); +++ +++ private static final Class<?> CLASS_FILES; +++ private static final Class<?> CLASS_PATH; +++ private static final Class<?> CLASS_FILE_ATTRIBUTE; +++ private static final Class<?> CLASS_FILE_ATTRIBUTES; +++ private static final Method METHOD_FILE_TO_PATH; +++ private static final Method METHOD_FILES_CREATE_TEMP_FILE; +++ private static final Method METHOD_FILES_CREATE_TEMP_FILE_WITHPATH; +++ +++ private static final Method METHOD_PATH_TO_FILE; +++ +++ private static boolean useJdk6API; +++ +++ static { +++ useJdk6API = isJdk6(); +++ +++ CLASS_FILES = safeGetClass("java.nio.file.Files"); +++ CLASS_PATH = safeGetClass("java.nio.file.Path"); +++ CLASS_FILE_ATTRIBUTE = safeGetClass("java.nio.file.attribute.FileAttribute"); +++ CLASS_FILE_ATTRIBUTES = safeGetClass("[Ljava.nio.file.attribute.FileAttribute;"); +++ METHOD_FILE_TO_PATH = safeGetMethod(File.class, "toPath"); +++ METHOD_FILES_CREATE_TEMP_FILE = safeGetMethod(CLASS_FILES, "createTempFile", String.class, String.class, CLASS_FILE_ATTRIBUTES); +++ METHOD_FILES_CREATE_TEMP_FILE_WITHPATH = safeGetMethod(CLASS_FILES, "createTempFile", CLASS_PATH, String.class, String.class, CLASS_FILE_ATTRIBUTES); +++ METHOD_PATH_TO_FILE = safeGetMethod(CLASS_PATH, "toFile"); +++ } +++ +++ private static boolean isJdk6() { +++ String javaVersion = System.getProperty("java.version"); +++ LOGGER.log(Level.FINEST, "Detected java version = {0}", javaVersion); +++ return javaVersion.startsWith("1.6."); +++ } +++ +++ private static Class<?> safeGetClass(String className) { +++ // it is jdk 6 or something failed already before +++ if (useJdk6API) return null; +++ try { +++ return Class.forName(className); +++ } catch (ClassNotFoundException e) { +++ LOGGER.log(Level.SEVERE, "Exception cought", e); +++ LOGGER.log(Level.WARNING, "Class {0} not found. Temp files will be created using old java.io API.", className); +++ useJdk6API = true; +++ return null; +++ } +++ } +++ +++ private static Method safeGetMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes) { +++ // it is jdk 6 or something failed already before +++ if (useJdk6API) return null; +++ try { +++ return clazz.getMethod(methodName, parameterTypes); +++ } catch (NoSuchMethodException e) { +++ LOGGER.log(Level.SEVERE, "Exception cought", e); +++ LOGGER.log(Level.WARNING, "Method {0} not found. Temp files will be created using old java.io API.", methodName); +++ useJdk6API = true; +++ return null; +++ } +++ } +++ +++ +++ static Object toPath(File f) throws InvocationTargetException, IllegalAccessException { +++ return METHOD_FILE_TO_PATH.invoke(f); +++ } +++ +++ static File toFile(Object path) throws InvocationTargetException, IllegalAccessException { +++ return (File) METHOD_PATH_TO_FILE.invoke(path); +++ } +++ +++ static File createTempFile(String prefix, String suffix, File dir) throws IOException { +++ +++ if (useJdk6API) { +++ LOGGER.log(Level.FINEST, "Jdk6 detected, temp file (prefix:{0}, suffix:{1}) being created using old java.io API.", new Object[]{prefix, suffix}); +++ return File.createTempFile(prefix, suffix, dir); +++ +++ } else { +++ +++ try { +++ if (dir != null) { +++ Object path = toPath(dir); +++ LOGGER.log(Level.FINEST, "Temp file (path: {0}, prefix:{1}, suffix:{2}) being created using NIO API.", new Object[]{dir.getAbsolutePath(), prefix, suffix}); +++ return toFile(METHOD_FILES_CREATE_TEMP_FILE_WITHPATH.invoke(null, path, prefix, suffix, Array.newInstance(CLASS_FILE_ATTRIBUTE, 0))); +++ } else { +++ LOGGER.log(Level.FINEST, "Temp file (prefix:{0}, suffix:{1}) being created using NIO API.", new Object[]{prefix, suffix}); +++ return toFile(METHOD_FILES_CREATE_TEMP_FILE.invoke(null, prefix, suffix, Array.newInstance(CLASS_FILE_ATTRIBUTE, 0))); +++ } +++ +++ } catch (IllegalAccessException e) { +++ LOGGER.log(Level.SEVERE, "Exception caught", e); +++ LOGGER.log(Level.WARNING, "Error invoking java.nio API, temp file (path: {0}, prefix:{1}, suffix:{2}) being created using old java.io API.", +++ new Object[]{dir != null ? dir.getAbsolutePath() : null, prefix, suffix}); +++ return File.createTempFile(prefix, suffix, dir); +++ +++ } catch (InvocationTargetException e) { +++ LOGGER.log(Level.SEVERE, "Exception caught", e); +++ LOGGER.log(Level.WARNING, "Error invoking java.nio API, temp file (path: {0}, prefix:{1}, suffix:{2}) being created using old java.io API.", +++ new Object[]{dir != null ? dir.getAbsolutePath() : null, prefix, suffix}); +++ return File.createTempFile(prefix, suffix, dir); +++ } +++ } +++ +++ } +++ +++ +++} diff --git a/java/openjdk6/files/icedtea/security/20130416/8004261.patch b/java/openjdk6/files/icedtea/security/20130416/8004261.patch new file mode 100644 index 000000000000..245d49e34c5f --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8004261.patch @@ -0,0 +1,142 @@ +# HG changeset patch +# User andrew +# Date 1365774039 -3600 +# Node ID 0236ab95a0f15e35aef6edd91f58a5072784dccd +# Parent 8f5ad2cacf6fff8efd817c5373469037d945f3dc +8004261: Improve input validation +Reviewed-by: art, mschoene, amenkov + +diff --git a/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java b/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java +--- jdk/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java ++++ jdk/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java +@@ -56,7 +56,7 @@ + // from simultaneous creation and destruction + // reduces possibility of deadlock, compared to + // synchronizing to the class instance +- private Object traRecLock = new Object(); ++ private final Object traRecLock = new Object(); + + // DEVICE ATTRIBUTES + +@@ -474,7 +474,7 @@ + This is necessary for Receivers retrieved via MidiSystem.getReceiver() + (which opens the device implicitely). + */ +- protected abstract class AbstractReceiver implements Receiver { ++ abstract class AbstractReceiver implements Receiver { + private boolean open = true; + + +@@ -483,24 +483,24 @@ + Receiver. Therefore, subclasses should not override this method. + Instead, they should implement implSend(). + */ +- public synchronized void send(MidiMessage message, long timeStamp) { +- if (open) { +- implSend(message, timeStamp); +- } else { ++ @Override ++ public final synchronized void send(final MidiMessage message, ++ final long timeStamp) { ++ if (!open) { + throw new IllegalStateException("Receiver is not open"); + } ++ implSend(message, timeStamp); + } + +- +- protected abstract void implSend(MidiMessage message, long timeStamp); +- ++ abstract void implSend(MidiMessage message, long timeStamp); + + /** Close the Receiver. + * Here, the call to the magic method closeInternal() takes place. + * Therefore, subclasses that override this method must call + * 'super.close()'. + */ +- public void close() { ++ @Override ++ public final void close() { + open = false; + synchronized (AbstractMidiDevice.this.traRecLock) { + AbstractMidiDevice.this.getReceiverList().remove(this); +@@ -508,7 +508,7 @@ + AbstractMidiDevice.this.closeInternal(this); + } + +- protected boolean isOpen() { ++ final boolean isOpen() { + return open; + } + +diff --git a/src/share/classes/com/sun/media/sound/FastShortMessage.java b/src/share/classes/com/sun/media/sound/FastShortMessage.java +--- jdk/src/share/classes/com/sun/media/sound/FastShortMessage.java ++++ jdk/src/share/classes/com/sun/media/sound/FastShortMessage.java +@@ -32,7 +32,7 @@ + * + * @author Florian Bomers + */ +-class FastShortMessage extends ShortMessage { ++final class FastShortMessage extends ShortMessage { + private int packedMsg; + + public FastShortMessage(int packedMsg) throws InvalidMidiDataException { +diff --git a/src/share/classes/com/sun/media/sound/FastSysexMessage.java b/src/share/classes/com/sun/media/sound/FastSysexMessage.java +--- jdk/src/share/classes/com/sun/media/sound/FastSysexMessage.java ++++ jdk/src/share/classes/com/sun/media/sound/FastSysexMessage.java +@@ -32,7 +32,7 @@ + * + * @author Florian Bomers + */ +-class FastSysexMessage extends SysexMessage { ++final class FastSysexMessage extends SysexMessage { + + FastSysexMessage(byte[] data) throws InvalidMidiDataException { + super(data); +diff --git a/src/share/classes/com/sun/media/sound/MidiOutDevice.java b/src/share/classes/com/sun/media/sound/MidiOutDevice.java +--- jdk/src/share/classes/com/sun/media/sound/MidiOutDevice.java ++++ jdk/src/share/classes/com/sun/media/sound/MidiOutDevice.java +@@ -103,9 +103,9 @@ + + class MidiOutReceiver extends AbstractReceiver { + +- protected void implSend(MidiMessage message, long timeStamp) { +- int length = message.getLength(); +- int status = message.getStatus(); ++ void implSend(final MidiMessage message, final long timeStamp) { ++ final int length = message.getLength(); ++ final int status = message.getStatus(); + if (length <= 3 && status != 0xF0 && status != 0xF7) { + int packedMsg; + if (message instanceof ShortMessage) { +@@ -140,11 +140,15 @@ + } + nSendShortMessage(id, packedMsg, timeStamp); + } else { ++ final byte[] data; + if (message instanceof FastSysexMessage) { +- nSendLongMessage(id, ((FastSysexMessage) message).getReadOnlyMessage(), +- length, timeStamp); ++ data = ((FastSysexMessage) message).getReadOnlyMessage(); + } else { +- nSendLongMessage(id, message.getMessage(), length, timeStamp); ++ data = message.getMessage(); ++ } ++ final int dataLength = Math.min(length, data.length); ++ if (dataLength > 0) { ++ nSendLongMessage(id, data, dataLength, timeStamp); + } + } + } +diff --git a/src/share/classes/com/sun/media/sound/RealTimeSequencer.java b/src/share/classes/com/sun/media/sound/RealTimeSequencer.java +--- jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java ++++ jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java +@@ -1019,7 +1019,7 @@ + + class SequencerReceiver extends AbstractReceiver { + +- protected void implSend(MidiMessage message, long timeStamp) { ++ void implSend(MidiMessage message, long timeStamp) { + if (recording) { + long tickPos = 0; + diff --git a/java/openjdk6/files/icedtea/security/20130416/8004336.patch b/java/openjdk6/files/icedtea/security/20130416/8004336.patch new file mode 100644 index 000000000000..ca0ab35188cc --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8004336.patch @@ -0,0 +1,29 @@ +# HG changeset patch +# User twisti +# Date 1361822075 28800 +# Node ID cf2b7f0f7a2188a1421bdd033e88bf4b0aa6870c +# Parent f9d5be4340c0ab09bebfcd2dce5563a2042ccc95 +8004336: Better handling of method handle intrinsic frames +Reviewed-by: kvn, jrose, ahgross + +diff --git a/src/share/vm/opto/library_call.cpp b/src/share/vm/opto/library_call.cpp +--- hotspot/src/share/vm/opto/library_call.cpp ++++ hotspot/src/share/vm/opto/library_call.cpp +@@ -1313,7 +1313,6 @@ + push(result); + return true; + } +- + //--------------------------pop_math_arg-------------------------------- + // Pop a double argument to a math function from the stack + // rounding it if necessary. +@@ -3746,7 +3745,8 @@ + } + } + } +- else if (method->is_method_handle_adapter()) { ++ ++ if (method->is_method_handle_adapter()) { + // This is an internal adapter frame from the MethodHandleCompiler -- skip it + return true; + } diff --git a/java/openjdk6/files/icedtea/security/20130416/8004986.patch b/java/openjdk6/files/icedtea/security/20130416/8004986.patch new file mode 100644 index 000000000000..2139154d9d26 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8004986.patch @@ -0,0 +1,374 @@ +# HG changeset patch +# User andrew +# Date 1365737071 -3600 +# Node ID c7ddbf756d7f35d6e782eb91b86ce2938de44fb8 +# Parent a5bbb8808ac9a6a8e20c5f267044bb0cef0bbdc1 +8004986: Better handling of glyph table +8004987: Improve font layout +8004994: Improve checking of glyph table +Reviewed-by: bae, mschoene, jgodinez +Contributed-by: steven.loomis@oracle.com + +diff --git a/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp b/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/ArabicLayoutEngine.cpp +@@ -26,7 +26,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved + * + */ + +@@ -155,17 +155,16 @@ + UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine( + const LEFontInstance *fontInstance, + le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags) +- : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags) ++ : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG) + { + fGSUBTable = (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; + fGDEFTable = (const GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; +- +- fSubstitutionFilter = new CharSubstitutionFilter(fontInstance); ++ /* OpenTypeLayoutEngine will allocate a substitution filter */ + } + + UnicodeArabicOpenTypeLayoutEngine::~UnicodeArabicOpenTypeLayoutEngine() + { +- delete fSubstitutionFilter; ++ /* OpenTypeLayoutEngine will cleanup the substitution filter */ + } + + // "glyphs", "indices" -> glyphs, indices +diff --git a/src/share/native/sun/font/layout/LETypes.h b/src/share/native/sun/font/layout/LETypes.h +--- jdk/src/share/native/sun/font/layout/LETypes.h ++++ jdk/src/share/native/sun/font/layout/LETypes.h +@@ -208,6 +208,35 @@ + #define LE_CLIENT_SHIFT 24 + + ++#ifndef LE_ASSERT_BAD_FONT ++#define LE_ASSERT_BAD_FONT 0 ++#endif ++ ++#if LE_ASSERT_BAD_FONT ++#include <stdio.h> ++#define LE_DEBUG_BAD_FONT(x) fprintf(stderr,"%s:%d: BAD FONT: %s\n", __FILE__, __LINE__, (x)); ++#else ++#define LE_DEBUG_BAD_FONT(x) ++#endif ++ ++/** ++ * Max value representable by a uintptr ++ */ ++#ifndef UINTPTR_MAX ++#ifndef UINT32_MAX ++#define LE_UINTPTR_MAX 0xFFFFFFFFU ++#else ++#define LE_UINTPTR_MAX UINT32_MAX ++#endif ++#else ++#define LE_UINTPTR_MAX UINTPTR_MAX ++#endif ++ ++/** ++ * Range check for overflow ++ */ ++#define LE_RANGE_CHECK(type, count, ptrfn) (( (LE_UINTPTR_MAX / sizeof(type)) < count ) ? NULL : (ptrfn)) ++ + /** + * A convenience macro to get the Glyph ID part of an LEGlyphID. + * +@@ -599,6 +628,21 @@ + */ + #define LE_SUCCESS(code) ((code)<=LE_NO_ERROR) + ++enum LEFeatureENUMs { ++ LE_Kerning_FEATURE_ENUM = 0, ++ LE_Ligatures_FEATURE_ENUM = 1, ++ LE_CHAR_FILTER_FEATURE_ENUM = 31, ++}; ++ ++#define LE_Kerning_FEATURE_FLAG (1 << LE_Kerning_FEATURE_ENUM) ++#define LE_Ligatures_FEATURE_FLAG (1 << LE_Ligatures_FEATURE_ENUM) ++ ++#define LE_CHAR_FILTER_FEATURE_ENUM 31 ++ ++#define LE_CHAR_FILTER_FEATURE_FLAG (1 << LE_CHAR_FILTER_FEATURE_ENUM) ++ ++#define LE_DEFAULT_FEATURE_FLAG (LE_Kerning_FEATURE_FLAG | LE_Ligatures_FEATURE_FLAG) /**< default features */ ++ + /** + * A convenience macro to test for the failure of a LayoutEngine call. + * +diff --git a/src/share/native/sun/font/layout/LayoutEngine.cpp b/src/share/native/sun/font/layout/LayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/LayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/LayoutEngine.cpp +@@ -31,6 +31,7 @@ + + #include "LETypes.h" + #include "LEScripts.h" ++#include "LESwaps.h" + #include "LELanguages.h" + + #include "LayoutEngine.h" +@@ -387,7 +388,7 @@ + + adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); + +- if (fTypoFlags & 0x1) { /* kerning enabled */ ++ if (fTypoFlags & LE_Kerning_FEATURE_FLAG) { /* kerning enabled */ + static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG; + + KernTable kt(fFontInstance, getFontTable(kernTableTag)); +@@ -538,7 +539,7 @@ + { + // 3 -> kerning and ligatures + return LayoutEngine::layoutEngineFactory(fontInstance, scriptCode, +- languageCode, 3, success); ++ languageCode, LE_DEFAULT_FEATURE_FLAG, success); + } + + LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, +@@ -621,7 +622,7 @@ + const MorphTableHeader *morphTable = + (MorphTableHeader *) fontInstance->getFontTable(mortTableTag); + +- if (morphTable != NULL) { ++ if (morphTable != NULL && SWAPL(morphTable->version)==0x00010000) { + result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable); + } else { + switch (scriptCode) { +diff --git a/src/share/native/sun/font/layout/LigatureSubstProc.cpp b/src/share/native/sun/font/layout/LigatureSubstProc.cpp +--- jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp ++++ jdk/src/share/native/sun/font/layout/LigatureSubstProc.cpp +@@ -25,7 +25,7 @@ + + /* + * +- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved ++ * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved + * + */ + +@@ -76,6 +76,10 @@ + } + + componentStack[m] = currGlyph; ++ } else if ( m == -1) { ++ // bad font- skip this glyph. ++ currGlyph++; ++ return newState; + } + + ByteOffset actionOffset = flags & lsfActionOffsetMask; +@@ -99,7 +103,21 @@ + offset = action & lafComponentOffsetMask; + if (offset != 0) { + const le_int16 *offsetTable = (const le_int16 *)((char *) &ligatureSubstitutionHeader->stHeader + 2 * SignExtend(offset, lafComponentOffsetMask)); ++ const le_int16 *tableEnd = (const le_int16 *)((char *) &ligatureSubstitutionHeader + 1 * SWAPW(ligatureSubstitutionHeader->length)); + ++ // Check if the font is internally consistent ++ if(tableEnd < (const le_int16*)&ligatureSubstitutionHeader // stated end wrapped around? ++ || offsetTable > tableEnd) { // offset past end of stated length? ++ currGlyph++; ++ LE_DEBUG_BAD_FONT("off end of ligature substitution header"); ++ return newState; // get out! bad font ++ } ++ ++ if(componentGlyph > glyphStorage.getGlyphCount()) { ++ LE_DEBUG_BAD_FONT("preposterous componentGlyph"); ++ currGlyph++; ++ return newState; // get out! bad font ++ } + i += SWAPW(offsetTable[LE_GET_GLYPH(glyphStorage[componentGlyph])]); + + if (action & (lafLast | lafStore)) { +@@ -107,13 +125,22 @@ + TTGlyphID ligatureGlyph = SWAPW(*ligatureOffset); + + glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], ligatureGlyph); ++ if(mm==nComponents) { ++ LE_DEBUG_BAD_FONT("exceeded nComponents"); ++ mm--; // don't overrun the stack. ++ } + stack[++mm] = componentGlyph; + i = 0; + } else { + glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], 0xFFFF); + } + } +- } while (!(action & lafLast)); ++#if LE_ASSERT_BAD_FONT ++ if(m<0) { ++ LE_DEBUG_BAD_FONT("m<0") ++ } ++#endif ++ } while (!(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items + + while (mm >= 0) { + if (++m >= nComponents) { +diff --git a/src/share/native/sun/font/layout/LookupProcessor.cpp b/src/share/native/sun/font/layout/LookupProcessor.cpp +--- jdk/src/share/native/sun/font/layout/LookupProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/LookupProcessor.cpp +@@ -185,7 +185,7 @@ + lookupSelectCount = lookupListCount; + + le_int32 count, order = 0; +- le_int32 featureReferences = 0; ++ le_uint32 featureReferences = 0; + const FeatureTable *featureTable = NULL; + LETag featureTag; + +@@ -196,7 +196,7 @@ + // be the maximum number of entries in the lookupOrderArray. We can't use + // lookupListCount because some lookups might be referenced by more than + // one feature. +- for (le_int32 feature = 0; feature < featureCount; feature += 1) { ++ for (le_uint32 feature = 0; feature < featureCount; feature += 1) { + le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]); + + featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag); +diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp +--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp ++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.cpp +@@ -100,6 +100,14 @@ + const GlyphPositioningTableHeader *gposTable = + (const GlyphPositioningTableHeader *) getFontTable(gposTableTag); + ++ applyTypoFlags(); ++ ++} ++ ++void OpenTypeLayoutEngine::applyTypoFlags() { ++ const le_int32& typoFlags = fTypoFlags; ++ const LEFontInstance *fontInstance = fFontInstance; ++ + // todo: switch to more flags and bitfield rather than list of feature tags? + switch (typoFlags) { + case 0: break; // default +@@ -109,13 +117,6 @@ + default: break; + } + +- setScriptAndLanguageTags(); +- +- fGDEFTable = (const GlyphDefinitionTableHeader *) getFontTable(gdefTableTag); +- +- if (gposTable != NULL && gposTable->coversScriptAndLanguage(fScriptTag, fLangSysTag)) { +- fGPOSTable = gposTable; +- } + } + + void OpenTypeLayoutEngine::reset() +@@ -133,11 +134,16 @@ + fFeatureOrder(FALSE), fGSUBTable(NULL), fGDEFTable(NULL), + fGPOSTable(NULL), fSubstitutionFilter(NULL) + { ++ applyTypoFlags(); + setScriptAndLanguageTags(); + } + + OpenTypeLayoutEngine::~OpenTypeLayoutEngine() + { ++ if (fTypoFlags & LE_CHAR_FILTER_FEATURE_FLAG) { ++ delete fSubstitutionFilter; ++ fSubstitutionFilter = NULL; ++ } + reset(); + } + +diff --git a/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h b/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h +--- jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h ++++ jdk/src/share/native/sun/font/layout/OpenTypeLayoutEngine.h +@@ -150,6 +150,11 @@ + */ + static const LETag languageTags[]; + ++ /** ++ * apply the typoflags. Only called by the c'tors. ++ */ ++ void applyTypoFlags(); ++ + protected: + /** + * A set of "default" features. The default characterProcessing method +diff --git a/src/share/native/sun/font/layout/StateTableProcessor.cpp b/src/share/native/sun/font/layout/StateTableProcessor.cpp +--- jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp ++++ jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp +@@ -63,6 +63,9 @@ + + void StateTableProcessor::process(LEGlyphStorage &glyphStorage) + { ++ ++ LE_STATE_PATIENCE_INIT(); ++ + // Start at state 0 + // XXX: How do we know when to start at state 1? + ByteOffset currentState = stateArrayOffset; +@@ -74,6 +77,7 @@ + beginStateTable(); + + while (currGlyph <= glyphCount) { ++ if(LE_STATE_PATIENCE_DECR()) break; // patience exceeded. + ClassCode classCode = classCodeOOB; + if (currGlyph == glyphCount) { + // XXX: How do we handle EOT vs. EOL? +@@ -90,8 +94,9 @@ + + const EntryTableIndex *stateArray = (const EntryTableIndex *) ((char *) &stateTableHeader->stHeader + currentState); + EntryTableIndex entryTableIndex = stateArray[(le_uint8)classCode]; +- ++ LE_STATE_PATIENCE_CURR(le_int32, currGlyph); + currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex); ++ LE_STATE_PATIENCE_INCR(currGlyph); + } + + endStateTable(); +diff --git a/src/share/native/sun/font/layout/StateTables.h b/src/share/native/sun/font/layout/StateTables.h +--- jdk/src/share/native/sun/font/layout/StateTables.h ++++ jdk/src/share/native/sun/font/layout/StateTables.h +@@ -35,6 +35,41 @@ + #include "LETypes.h" + #include "LayoutTables.h" + ++ ++ ++ ++/* ++ * State table loop detection. ++ * Detects if too many ( LE_STATE_PATIENCE_COUNT ) state changes occur without moving the glyph index 'g'. ++ * ++ * Usage (pseudocode): ++ * ++ * { ++ * LE_STATE_PATIENCE_INIT(); ++ * ++ * int g=0; // the glyph index - expect it to be moving ++ * ++ * for(;;) { ++ * if(LE_STATE_PATIENCE_DECR()) { // decrements the patience counter ++ * // ran out of patience, get out. ++ * break; ++ * } ++ * ++ * LE_STATE_PATIENCE_CURR(int, g); // store the 'current' ++ * state = newState(state,g); ++ * g+= <something, could be zero>; ++ * LE_STATE_PATIENCE_INCR(g); // if g has moved, increment the patience counter. Otherwise leave it. ++ * } ++ * ++ */ ++ ++#define LE_STATE_PATIENCE_COUNT 4096 /**< give up if a state table doesn't move the glyph after this many iterations */ ++#define LE_STATE_PATIENCE_INIT() le_uint32 le_patience_count = LE_STATE_PATIENCE_COUNT ++#define LE_STATE_PATIENCE_DECR() --le_patience_count==0 ++#define LE_STATE_PATIENCE_CURR(type,x) type le_patience_curr=(x) ++#define LE_STATE_PATIENCE_INCR(x) if((x)!=le_patience_curr) ++le_patience_count; ++ ++ + struct StateTableHeader + { + le_int16 stateSize; diff --git a/java/openjdk6/files/icedtea/security/20130416/8005432.patch b/java/openjdk6/files/icedtea/security/20130416/8005432.patch new file mode 100644 index 000000000000..ccb6093bdbfc --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8005432.patch @@ -0,0 +1,511 @@ +--- jdk/src/share/lib/security/java.security 2013-04-16 14:57:04.075141879 +0100 ++++ jdk/src/share/lib/security/java.security 2013-04-16 14:58:37.884647607 +0100 +@@ -128,10 +128,7 @@ + # corresponding RuntimePermission ("accessClassInPackage."+package) has + # been granted. + package.access=sun.,\ +- com.sun.xml.internal.bind.,\ +- com.sun.xml.internal.org.jvnet.staxex.,\ +- com.sun.xml.internal.stream.,\ +- com.sun.xml.internal.ws.,\ ++ com.sun.xml.internal.,\ + com.sun.imageio.,\ + com.sun.istack.internal.,\ + com.sun.jmx.,\ +@@ -164,10 +161,7 @@ + # checkPackageDefinition. + # + package.definition=sun.,\ +- com.sun.xml.internal.bind.,\ +- com.sun.xml.internal.org.jvnet.staxex.,\ +- com.sun.xml.internal.stream.,\ +- com.sun.xml.internal.ws.,\ ++ com.sun.xml.internal.,\ + com.sun.imageio.,\ + com.sun.istack.internal.,\ + com.sun.jmx.,\ +--- jdk/src/share/lib/security/java.security-solaris 2013-04-16 14:57:04.075141879 +0100 ++++ jdk/src/share/lib/security/java.security-solaris 2013-04-16 15:00:01.509990145 +0100 +@@ -129,10 +129,7 @@ + # corresponding RuntimePermission ("accessClassInPackage."+package) has + # been granted. + package.access=sun.,\ +- com.sun.xml.internal.bind.,\ +- com.sun.xml.internal.org.jvnet.staxex.,\ +- com.sun.xml.internal.stream.,\ +- com.sun.xml.internal.ws.,\ ++ com.sun.xml.internal.,\ + com.sun.imageio. + com.sun.istack.internal.,\ + com.sun.jmx.,\ +@@ -165,10 +162,7 @@ + # checkPackageDefinition. + # + package.definition=sun.,\ +- com.sun.xml.internal.bind.,\ +- com.sun.xml.internal.org.jvnet.staxex.,\ +- com.sun.xml.internal.stream.,\ +- com.sun.xml.internal.ws.,\ ++ com.sun.xml.internal.,\ + com.sun.imageio. + com.sun.istack.internal.,\ + com.sun.jmx.,\ +--- jdk/src/share/lib/security/java.security-windows 2013-04-16 14:57:04.075141879 +0100 ++++ jdk/src/share/lib/security/java.security-windows 2013-04-16 15:00:24.790356811 +0100 +@@ -129,10 +129,7 @@ + # corresponding RuntimePermission ("accessClassInPackage."+package) has + # been granted. + package.access=sun.,\ +- com.sun.xml.internal.bind.,\ +- com.sun.xml.internal.org.jvnet.staxex.,\ +- com.sun.xml.internal.stream.,\ +- com.sun.xml.internal.ws.,\ ++ com.sun.xml.internal.,\ + com.sun.imageio. + com.sun.istack.internal.,\ + com.sun.jmx.,\ +@@ -165,10 +162,7 @@ + # checkPackageDefinition. + # + package.definition=sun.,\ +- com.sun.xml.internal.bind.,\ +- com.sun.xml.internal.org.jvnet.staxex.,\ +- com.sun.xml.internal.stream.,\ +- com.sun.xml.internal.ws.,\ ++ com.sun.xml.internal.,\ + com.sun.imageio. + com.sun.istack.internal.,\ + com.sun.jmx.,\ +--- /dev/null 2013-04-25 15:02:13.000000000 -0400 ++++ jaxws/patches/jaxws_src/8005432.patch 2013-04-25 15:09:37.000000000 -0400 +@@ -0,0 +1,430 @@ ++--- src/com/sun/xml/internal/bind/v2/model/impl/ModelBuilder.java 2013-04-16 14:56:58.235048158 +0100 +++++ src/com/sun/xml/internal/bind/v2/model/impl/ModelBuilder.java 2013-04-16 14:58:37.884647607 +0100 ++@@ -1,5 +1,5 @@ ++ /* ++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++@@ -235,7 +235,7 @@ ++ String pkg = nav.getPackageName(ci.getClazz()); ++ if(!registries.containsKey(pkg)) { ++ // insert the package's object factory ++- C c = nav.findClass(pkg + ".ObjectFactory",ci.getClazz()); +++ C c = loadObjectFactory(ci, pkg); ++ if(c!=null) ++ addRegistry(c,(Locatable)p); ++ } ++@@ -264,6 +264,15 @@ ++ return r; ++ } ++ +++ private C loadObjectFactory(ClassInfoImpl<T, C, F, M> ci, String pkg) { +++ try { +++ return nav.findClass(pkg + ".ObjectFactory", ci.getClazz()); +++ } catch (SecurityException ignored) { +++ // treat SecurityException in same way as ClassNotFoundException in this case +++ return null; +++ } +++ } +++ ++ /** ++ * Checks the uniqueness of the type name. ++ */ ++--- src/com/sun/xml/internal/ws/client/WSServiceDelegate.java 2013-04-16 14:56:58.419051111 +0100 +++++ src/com/sun/xml/internal/ws/client/WSServiceDelegate.java 2013-04-16 14:58:37.884647607 +0100 ++@@ -1,5 +1,5 @@ ++ /* ++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++@@ -22,7 +22,6 @@ ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++- ++ package com.sun.xml.internal.ws.client; ++ ++ import com.sun.istack.internal.NotNull; ++@@ -45,8 +44,8 @@ ++ import com.sun.xml.internal.ws.client.HandlerConfigurator.AnnotationConfigurator; ++ import com.sun.xml.internal.ws.client.HandlerConfigurator.HandlerResolverImpl; ++ import com.sun.xml.internal.ws.client.sei.SEIStub; ++-import com.sun.xml.internal.ws.developer.WSBindingProvider; ++ import com.sun.xml.internal.ws.developer.UsesJAXBContextFeature; +++import com.sun.xml.internal.ws.developer.WSBindingProvider; ++ import com.sun.xml.internal.ws.model.AbstractSEIModelImpl; ++ import com.sun.xml.internal.ws.model.RuntimeModeler; ++ import com.sun.xml.internal.ws.model.SOAPSEIModel; ++@@ -59,7 +58,6 @@ ++ import com.sun.xml.internal.ws.util.JAXWSUtils; ++ import com.sun.xml.internal.ws.util.ServiceConfigurationError; ++ import com.sun.xml.internal.ws.util.ServiceFinder; ++-import static com.sun.xml.internal.ws.util.xml.XmlUtil.createDefaultCatalogResolver; ++ import com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser; ++ import org.xml.sax.SAXException; ++ ++@@ -74,16 +72,18 @@ ++ import javax.xml.ws.handler.HandlerResolver; ++ import javax.xml.ws.soap.AddressingFeature; ++ import java.io.IOException; +++import java.lang.RuntimePermission; ++ import java.lang.reflect.Proxy; ++ import java.net.MalformedURLException; ++ import java.net.URL; ++-import java.security.AccessController; ++-import java.security.PrivilegedAction; +++import java.security.*; ++ import java.util.*; ++ import java.util.concurrent.Executor; ++ import java.util.concurrent.Executors; ++ import java.util.concurrent.ThreadFactory; ++ +++import static com.sun.xml.internal.ws.util.xml.XmlUtil.createDefaultCatalogResolver; +++ ++ /** ++ * <code>Service</code> objects provide the client view of a Web service. ++ * ++@@ -613,7 +613,7 @@ ++ } ++ } ++ ++- private <T> T createEndpointIFBaseProxy(@Nullable WSEndpointReference epr,QName portName, Class<T> portInterface, +++ private <T> T createEndpointIFBaseProxy(@Nullable WSEndpointReference epr,QName portName, final Class<T> portInterface, ++ WebServiceFeature[] webServiceFeatures, SEIPortInfo eif) { ++ //fail if service doesnt have WSDL ++ if (wsdlService == null) ++@@ -627,14 +627,37 @@ ++ BindingImpl binding = eif.createBinding(webServiceFeatures,portInterface); ++ SEIStub pis = new SEIStub(this, binding, eif.model, createPipeline(eif, binding), epr); ++ ++- T proxy = portInterface.cast(Proxy.newProxyInstance(portInterface.getClassLoader(), ++- new Class[]{portInterface, WSBindingProvider.class, Closeable.class}, pis)); +++ T proxy = createProxy(portInterface, pis); +++ ++ if (serviceInterceptor != null) { ++ serviceInterceptor.postCreateProxy((WSBindingProvider)proxy, portInterface); ++ } ++ return proxy; ++ } ++ +++ private <T> T createProxy(final Class<T> portInterface, final SEIStub pis) { +++ +++ // accessClassInPackage privilege needs to be granted ... +++ RuntimePermission perm = new RuntimePermission("accessClassInPackage.com.sun." + "xml.internal.*"); +++ PermissionCollection perms = perm.newPermissionCollection(); +++ perms.add(perm); +++ +++ return AccessController.doPrivileged( +++ new PrivilegedAction<T>() { +++ @Override +++ public T run() { +++ Object proxy = Proxy.newProxyInstance(portInterface.getClassLoader(), +++ new Class[]{portInterface, WSBindingProvider.class, Closeable.class}, pis); +++ return portInterface.cast(proxy); +++ } +++ }, +++ new AccessControlContext( +++ new ProtectionDomain[]{ +++ new ProtectionDomain(null, perms) +++ }) +++ ); +++ } +++ ++ /** ++ * Lists up the port names in WSDL. For error diagnostics. ++ */ ++--- src/javax/xml/soap/FactoryFinder.java 2013-04-16 14:56:58.667055090 +0100 +++++ src/javax/xml/soap/FactoryFinder.java 2013-04-16 14:58:37.888647671 +0100 ++@@ -1,5 +1,5 @@ ++ /* ++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +++ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++@@ -50,20 +50,12 @@ ++ throws SOAPException ++ { ++ try { ++- Class spiClass; ++- if (classLoader == null) { ++- spiClass = Class.forName(className); ++- } else { ++- spiClass = classLoader.loadClass(className); ++- } +++ Class spiClass = safeLoadClass(className, classLoader); ++ return spiClass.newInstance(); ++ } catch (ClassNotFoundException x) { ++- throw new SOAPException( ++- "Provider " + className + " not found", x); +++ throw new SOAPException("Provider " + className + " not found", x); ++ } catch (Exception x) { ++- throw new SOAPException( ++- "Provider " + className + " could not be instantiated: " + x, ++- x); +++ throw new SOAPException("Provider " + className + " could not be instantiated: " + x, x); ++ } ++ } ++ ++@@ -83,6 +75,61 @@ ++ static Object find(String factoryId) ++ throws SOAPException ++ { +++ return find(factoryId, null, false); +++ } +++ +++ /** +++ * Finds the implementation <code>Class</code> object for the given +++ * factory name, or if that fails, finds the <code>Class</code> object +++ * for the given fallback class name. The arguments supplied must be +++ * used in order. If using the first argument is successful, the second +++ * one will not be used. +++ * <P> +++ * This method is package private so that this code can be shared. +++ * +++ * @return the <code>Class</code> object of the specified message factory; +++ * may be <code>null</code> +++ * +++ * @param factoryId the name of the factory to find, which is +++ * a system property +++ * @param fallbackClassName the implementation class name, which is +++ * to be used only if nothing else +++ * is found; <code>null</code> to indicate that +++ * there is no fallback class name +++ * @exception SOAPException if there is a SOAP error +++ */ +++ static Object find(String factoryId, String fallbackClassName) +++ throws SOAPException +++ { +++ return find(factoryId, fallbackClassName, true); +++ } +++ +++ /** +++ * Finds the implementation <code>Class</code> object for the given +++ * factory name, or if that fails, finds the <code>Class</code> object +++ * for the given default class name, but only if <code>tryFallback</code> +++ * is <code>true</code>. The arguments supplied must be used in order +++ * If using the first argument is successful, the second one will not +++ * be used. Note the default class name may be needed even if fallback +++ * is not to be attempted, so certain error conditions can be handled. +++ * <P> +++ * This method is package private so that this code can be shared. +++ * +++ * @return the <code>Class</code> object of the specified message factory; +++ * may not be <code>null</code> +++ * +++ * @param factoryId the name of the factory to find, which is +++ * a system property +++ * @param defaultClassName the implementation class name, which is +++ * to be used only if nothing else +++ * is found; <code>null</code> to indicate +++ * that there is no default class name +++ * @param tryFallback whether to try the default class as a +++ * fallback +++ * @exception SOAPException if there is a SOAP error +++ */ +++ static Object find(String factoryId, String defaultClassName, +++ boolean tryFallback) throws SOAPException { ++ ClassLoader classLoader; ++ try { ++ classLoader = Thread.currentThread().getContextClassLoader(); ++@@ -140,49 +187,56 @@ ++ } catch( Exception ex ) { ++ } ++ ++- return null; +++ // If not found and fallback should not be tried, return a null result. +++ if (!tryFallback) +++ return null; +++ +++ // We didn't find the class through the usual means so try the default +++ // (built in) factory if specified. +++ if (defaultClassName == null) { +++ throw new SOAPException( +++ "Provider for " + factoryId + " cannot be found", null); +++ } +++ return newInstance(defaultClassName, classLoader); ++ } ++ ++ /** ++- * Finds the implementation <code>Class</code> object for the given ++- * factory name, or if that fails, finds the <code>Class</code> object ++- * for the given fallback class name. The arguments supplied must be ++- * used in order. If using the first argument is successful, the second ++- * one will not be used. ++- * <P> ++- * This method is package private so that this code can be shared. ++- * ++- * @return the <code>Class</code> object of the specified message factory; ++- * may not be <code>null</code> ++- * ++- * @param factoryId the name of the factory to find, which is ++- * a system property ++- * @param fallbackClassName the implementation class name, which is ++- * to be used only if nothing else ++- * is found; <code>null</code> to indicate that ++- * there is no fallback class name ++- * @exception SOAPException if there is a SOAP error +++ * Loads the class, provided that the calling thread has an access to the +++ * class being loaded. If this is the specified default factory class and it +++ * is restricted by package.access we get a SecurityException and can do a +++ * Class.forName() on it so it will be loaded by the bootstrap class loader. ++ */ ++- static Object find(String factoryId, String fallbackClassName) ++- throws SOAPException ++- { ++- ++- Object obj = find(factoryId); ++- if (obj != null) ++- return obj; +++ private static Class safeLoadClass(String className, +++ ClassLoader classLoader) +++ throws ClassNotFoundException { +++ try { +++ // make sure that the current thread has an access to the package of the given name. +++ SecurityManager s = System.getSecurityManager(); +++ if (s != null) { +++ int i = className.lastIndexOf('.'); +++ if (i != -1) { +++ s.checkPackageAccess(className.substring(0, i)); +++ } +++ } ++ ++- ClassLoader classLoader; ++- try { ++- classLoader = Thread.currentThread().getContextClassLoader(); ++- } catch (Exception x) { ++- throw new SOAPException(x.toString(), x); ++- } +++ if (classLoader == null) +++ return Class.forName(className); +++ else +++ return classLoader.loadClass(className); +++ } catch (SecurityException se) { +++ // (only) default implementation can be loaded +++ // using bootstrap class loader ... +++ if (isDefaultImplementation(className)) +++ return Class.forName(className); ++ ++- if (fallbackClassName == null) { ++- throw new SOAPException( ++- "Provider for " + factoryId + " cannot be found", null); +++ throw se; ++ } +++ } ++ ++- return newInstance(fallbackClassName, classLoader); +++ private static boolean isDefaultImplementation(String className) { +++ return MessageFactory.DEFAULT_MESSAGE_FACTORY.equals(className) || +++ SOAPFactory.DEFAULT_SOAP_FACTORY.equals(className) || +++ SOAPConnectionFactory.DEFAULT_SOAP_CONNECTION_FACTORY.equals(className) || +++ SAAJMetaFactory.DEFAULT_META_FACTORY_CLASS.equals(className); ++ } ++ } ++--- src/javax/xml/soap/MessageFactory.java 2013-04-16 14:56:58.667055090 +0100 +++++ src/javax/xml/soap/MessageFactory.java 2013-04-16 14:58:37.888647671 +0100 ++@@ -1,5 +1,5 @@ ++ /* ++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +++ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++@@ -72,7 +72,7 @@ ++ */ ++ public abstract class MessageFactory { ++ ++- static private final String DEFAULT_MESSAGE_FACTORY +++ static final String DEFAULT_MESSAGE_FACTORY ++ = "com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl"; ++ ++ static private final String MESSAGE_FACTORY_PROPERTY ++@@ -105,11 +105,14 @@ ++ public static MessageFactory newInstance() ++ throws SOAPException { ++ try { ++- MessageFactory factory = (MessageFactory) ++- FactoryFinder.find(MESSAGE_FACTORY_PROPERTY); +++ MessageFactory factory = (MessageFactory) FactoryFinder.find( +++ MESSAGE_FACTORY_PROPERTY, +++ DEFAULT_MESSAGE_FACTORY, +++ false); ++ ++- if (factory != null) +++ if (factory != null) { ++ return factory; +++ } ++ ++ return newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); ++ } catch (Exception ex) { ++--- src/javax/xml/soap/SAAJMetaFactory.java 2013-04-16 14:56:58.667055090 +0100 +++++ src/javax/xml/soap/SAAJMetaFactory.java 2013-04-16 14:58:37.888647671 +0100 ++@@ -1,5 +1,5 @@ ++ /* ++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +++ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++@@ -50,7 +50,7 @@ ++ public abstract class SAAJMetaFactory { ++ static private final String META_FACTORY_CLASS_PROPERTY = ++ "javax.xml.soap.MetaFactory"; ++- static private final String DEFAULT_META_FACTORY_CLASS = +++ static final String DEFAULT_META_FACTORY_CLASS = ++ "com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl"; ++ ++ /** ++--- src/javax/xml/soap/SOAPConnectionFactory.java 2013-04-16 14:56:58.667055090 +0100 +++++ src/javax/xml/soap/SOAPConnectionFactory.java 2013-04-16 14:58:37.888647671 +0100 ++@@ -1,5 +1,5 @@ ++ /* ++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +++ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++@@ -44,7 +44,7 @@ ++ * A constant representing the default value for a <code>SOAPConnection</code> ++ * object. The default is the point-to-point SOAP connection. ++ */ ++- static private final String DEFAULT_SOAP_CONNECTION_FACTORY +++ static final String DEFAULT_SOAP_CONNECTION_FACTORY ++ = "com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnectionFactory"; ++ ++ /** ++--- src/javax/xml/soap/SOAPFactory.java 2013-04-16 14:56:58.671055155 +0100 +++++ src/javax/xml/soap/SOAPFactory.java 2013-04-16 14:58:37.888647671 +0100 ++@@ -1,5 +1,5 @@ ++ /* ++- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +++ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++@@ -61,6 +61,12 @@ ++ "javax.xml.soap.SOAPFactory"; ++ ++ /** +++ * Class name of default <code>SOAPFactory</code> implementation. +++ */ +++ static final String DEFAULT_SOAP_FACTORY +++ = "com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPFactory1_1Impl"; +++ +++ /** ++ * Creates a <code>SOAPElement</code> object from an existing DOM ++ * <code>Element</code>. If the DOM <code>Element</code> that is passed in ++ * as an argument is already a <code>SOAPElement</code> then this method ++@@ -262,7 +268,7 @@ ++ throws SOAPException ++ { ++ try { ++- SOAPFactory factory = (SOAPFactory) FactoryFinder.find(SOAP_FACTORY_PROPERTY); +++ SOAPFactory factory = (SOAPFactory) FactoryFinder.find(SOAP_FACTORY_PROPERTY, DEFAULT_SOAP_FACTORY, false); ++ if (factory != null) ++ return factory; ++ return newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); diff --git a/java/openjdk6/files/icedtea/security/20130416/8005943.patch b/java/openjdk6/files/icedtea/security/20130416/8005943.patch new file mode 100644 index 000000000000..02188fb6f551 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8005943.patch @@ -0,0 +1,202 @@ +# HG changeset patch +# User andrew +# Date 1365784383 -3600 +# Node ID dfa1c658a62a54dbcfa02e96c51af21a3cc71907 +# Parent 0938f449476b5c89ccb68f0c195a57a0e72e9dc4 +8005943: (process) Improved Runtime.exec +Reviewed-by: alanb, ahgross + +diff --git a/src/share/classes/java/lang/ProcessBuilder.java b/src/share/classes/java/lang/ProcessBuilder.java +--- jdk/src/share/classes/java/lang/ProcessBuilder.java ++++ jdk/src/share/classes/java/lang/ProcessBuilder.java +@@ -27,6 +27,7 @@ + + import java.io.File; + import java.io.IOException; ++import java.security.AccessControlException; + import java.util.ArrayList; + import java.util.List; + import java.util.Map; +@@ -459,8 +460,9 @@ + String prog = cmdarray[0]; + + SecurityManager security = System.getSecurityManager(); +- if (security != null) ++ if (security != null) { + security.checkExec(prog); ++ } + + String dir = directory == null ? null : directory.toString(); + +@@ -470,13 +472,24 @@ + dir, + redirectErrorStream); + } catch (IOException e) { ++ String exceptionInfo = ": " + e.getMessage(); ++ Throwable cause = e; ++ if (security != null) { ++ // Can not disclose the fail reason for read-protected files. ++ try { ++ security.checkRead(prog); ++ } catch (AccessControlException ace) { ++ exceptionInfo = ""; ++ cause = ace; ++ } ++ } + // It's much easier for us to create a high-quality error + // message than the low-level C code which found the problem. + throw new IOException( + "Cannot run program \"" + prog + "\"" + + (dir == null ? "" : " (in directory \"" + dir + "\")") +- + ": " + e.getMessage(), +- e); ++ + exceptionInfo, ++ cause); + } + } + } +diff --git a/src/windows/classes/java/lang/ProcessImpl.java b/src/windows/classes/java/lang/ProcessImpl.java +--- jdk/src/windows/classes/java/lang/ProcessImpl.java ++++ jdk/src/windows/classes/java/lang/ProcessImpl.java +@@ -47,6 +47,88 @@ + return new ProcessImpl(cmdarray, envblock, dir, redirectErrorStream); + } + ++ // We guarantee the only command file execution for implicit [cmd.exe] run. ++ // http://technet.microsoft.com/en-us/library/bb490954.aspx ++ private static final char CMD_BAT_ESCAPE[] = {' ', '\t', '<', '>', '&', '|', '^'}; ++ private static final char WIN32_EXECUTABLE_ESCAPE[] = {' ', '\t', '<', '>'}; ++ ++ private static boolean isQuoted(boolean noQuotesInside, String arg, ++ String errorMessage) { ++ int lastPos = arg.length() - 1; ++ if (lastPos >=1 && arg.charAt(0) == '"' && arg.charAt(lastPos) == '"') { ++ // The argument has already been quoted. ++ if (noQuotesInside) { ++ if (arg.indexOf('"', 1) != lastPos) { ++ // There is ["] inside. ++ throw new IllegalArgumentException(errorMessage); ++ } ++ } ++ return true; ++ } ++ if (noQuotesInside) { ++ if (arg.indexOf('"') >= 0) { ++ // There is ["] inside. ++ throw new IllegalArgumentException(errorMessage); ++ } ++ } ++ return false; ++ } ++ ++ private static boolean needsEscaping(boolean isCmdFile, String arg) { ++ // Switch off MS heuristic for internal ["]. ++ // Please, use the explicit [cmd.exe] call ++ // if you need the internal ["]. ++ // Example: "cmd.exe", "/C", "Extended_MS_Syntax" ++ ++ // For [.exe] or [.com] file the unpaired/internal ["] ++ // in the argument is not a problem. ++ boolean argIsQuoted = isQuoted(isCmdFile, arg, ++ "Argument has embedded quote, use the explicit CMD.EXE call."); ++ ++ if (!argIsQuoted) { ++ char testEscape[] = isCmdFile ++ ? CMD_BAT_ESCAPE ++ : WIN32_EXECUTABLE_ESCAPE; ++ for (int i = 0; i < testEscape.length; ++i) { ++ if (arg.indexOf(testEscape[i]) >= 0) { ++ return true; ++ } ++ } ++ } ++ return false; ++ } ++ ++ private static String getExecutablePath(String path) ++ throws IOException ++ { ++ boolean pathIsQuoted = isQuoted(true, path, ++ "Executable name has embedded quote, split the arguments"); ++ ++ // Win32 CreateProcess requires path to be normalized ++ File fileToRun = new File(pathIsQuoted ++ ? path.substring(1, path.length() - 1) ++ : path); ++ ++ // From the [CreateProcess] function documentation: ++ // ++ // "If the file name does not contain an extension, .exe is appended. ++ // Therefore, if the file name extension is .com, this parameter ++ // must include the .com extension. If the file name ends in ++ // a period (.) with no extension, or if the file name contains a path, ++ // .exe is not appended." ++ // ++ // "If the file name !does not contain a directory path!, ++ // the system searches for the executable file in the following ++ // sequence:..." ++ // ++ // In practice ANY non-existent path is extended by [.exe] extension ++ // in the [CreateProcess] funcion with the only exception: ++ // the path ends by (.) ++ ++ return fileToRun.getPath(); ++ } ++ ++ + private long handle = 0; + private FileDescriptor stdin_fd; + private FileDescriptor stdout_fd; +@@ -61,30 +143,31 @@ + boolean redirectErrorStream) + throws IOException + { +- // Win32 CreateProcess requires cmd[0] to be normalized +- cmd[0] = new File(cmd[0]).getPath(); ++ // The [executablePath] is not quoted for any case. ++ String executablePath = getExecutablePath(cmd[0]); ++ ++ // We need to extend the argument verification procedure ++ // to guarantee the only command file execution for implicit [cmd.exe] ++ // run. ++ String upPath = executablePath.toUpperCase(); ++ boolean isCmdFile = (upPath.endsWith(".CMD") || upPath.endsWith(".BAT")); + + StringBuilder cmdbuf = new StringBuilder(80); +- for (int i = 0; i < cmd.length; i++) { +- if (i > 0) { +- cmdbuf.append(' '); +- } ++ ++ // Quotation protects from interpretation of the [path] argument as ++ // start of longer path with spaces. Quotation has no influence to ++ // [.exe] extension heuristic. ++ cmdbuf.append('"'); ++ cmdbuf.append(executablePath); ++ cmdbuf.append('"'); ++ ++ for (int i = 1; i < cmd.length; i++) { ++ cmdbuf.append(' '); + String s = cmd[i]; +- if (s.indexOf(' ') >= 0 || s.indexOf('\t') >= 0) { +- if (s.charAt(0) != '"') { +- cmdbuf.append('"'); +- cmdbuf.append(s); +- if (s.endsWith("\\")) { +- cmdbuf.append("\\"); +- } +- cmdbuf.append('"'); +- } else if (s.endsWith("\"")) { +- /* The argument has already been quoted. */ +- cmdbuf.append(s); +- } else { +- /* Unmatched quote for the argument. */ +- throw new IllegalArgumentException(); +- } ++ if (needsEscaping(isCmdFile, s)) { ++ cmdbuf.append('"'); ++ cmdbuf.append(s); ++ cmdbuf.append('"'); + } else { + cmdbuf.append(s); + } diff --git a/java/openjdk6/files/icedtea/security/20130416/8006309.patch b/java/openjdk6/files/icedtea/security/20130416/8006309.patch new file mode 100644 index 000000000000..26c2ac56cb7f --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8006309.patch @@ -0,0 +1,22 @@ +# HG changeset patch +# User poonam +# Date 1362616238 28800 +# Node ID ef36be1ae9bc7d061721f8890797e5d89c901846 +# Parent cf2b7f0f7a2188a1421bdd033e88bf4b0aa6870c +8006309: More reliable control panel operation +Summary: Added a comment in the dead Kernel code +Reviewed-by: ahgross, sla, coleenp + +diff --git a/src/share/vm/runtime/thread.cpp b/src/share/vm/runtime/thread.cpp +--- hotspot/src/share/vm/runtime/thread.cpp ++++ hotspot/src/share/vm/runtime/thread.cpp +@@ -3416,6 +3416,9 @@ + os::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(), name); + library = os::dll_load(buffer, ebuf, sizeof ebuf); + #ifdef KERNEL ++ ++ // Dead code, KERNEL is never built in JDK7 or later. This code will be removed in a future update release. ++ + // Download instrument dll + if (library == NULL && strcmp(name, "instrument") == 0) { + char *props = Arguments::get_kernel_properties(); diff --git a/java/openjdk6/files/icedtea/security/20130416/8006435.patch b/java/openjdk6/files/icedtea/security/20130416/8006435.patch new file mode 100644 index 000000000000..fc2aa8d125c2 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8006435.patch @@ -0,0 +1,76 @@ +# HG changeset patch +# User andrew +# Date 1365784460 -3600 +# Node ID e0803f17f824df0bbedf0dd03aa06938389b1b9f +# Parent dfa1c658a62a54dbcfa02e96c51af21a3cc71907 +8006435: Improvements in JMX +Summary: Improvements in JMX +Reviewed-by: dfuchs, skoivu + +diff --git a/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java b/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java +--- jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java ++++ jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -213,7 +213,6 @@ + + Object moi = null; + +- + // ------------------------------ + // ------------------------------ + Constructor cons = findConstructor(theClass, null); +@@ -224,6 +223,7 @@ + // Instantiate the new object + try { + ReflectUtil.checkPackageAccess(theClass); ++ ReflectUtil.ensureClassAccess(theClass); + moi= cons.newInstance(); + } catch (InvocationTargetException e) { + // Wrap the exception. +@@ -270,7 +270,6 @@ + checkMBeanPermission(theClass, null, null, "instantiate"); + + // Instantiate the new object +- + // ------------------------------ + // ------------------------------ + final Class[] tab; +@@ -301,6 +300,7 @@ + } + try { + ReflectUtil.checkPackageAccess(theClass); ++ ReflectUtil.ensureClassAccess(theClass); + moi = cons.newInstance(params); + } + catch (NoSuchMethodError error) { +diff --git a/src/share/classes/sun/reflect/misc/ReflectUtil.java b/src/share/classes/sun/reflect/misc/ReflectUtil.java +--- jdk/src/share/classes/sun/reflect/misc/ReflectUtil.java ++++ jdk/src/share/classes/sun/reflect/misc/ReflectUtil.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -46,6 +46,14 @@ + return cls.newInstance(); + } + ++ public static void ensureClassAccess(Class clazz) ++ throws IllegalAccessException ++ { ++ int mod = clazz.getModifiers(); ++ if ( ! Modifier.isPublic(mod) ){ ++ throw new IllegalAccessException("Class is not public and can't be instantiated"); ++ } ++ } + /* + * Reflection.ensureMemberAccess is overly-restrictive + * due to a bug. We awkwardly work around it for now. diff --git a/java/openjdk6/files/icedtea/security/20130416/8006790.patch b/java/openjdk6/files/icedtea/security/20130416/8006790.patch new file mode 100644 index 000000000000..b54d5230136c --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8006790.patch @@ -0,0 +1,166 @@ +# HG changeset patch +# User andrew +# Date 1365784684 -3600 +# Node ID 08f7ab5f86a27c17b648f3b47f800393d939140c +# Parent e0803f17f824df0bbedf0dd03aa06938389b1b9f +8006790: Improve checking for windows +Reviewed-by: art, mschoene + +diff --git a/src/share/classes/java/awt/Window.java b/src/share/classes/java/awt/Window.java +--- jdk/src/share/classes/java/awt/Window.java ++++ jdk/src/share/classes/java/awt/Window.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -2055,7 +2055,7 @@ + WindowPeer peer = (WindowPeer)this.peer; + synchronized(getTreeLock()) { + if (peer != null) { +- peer.setAlwaysOnTop(alwaysOnTop); ++ peer.updateAlwaysOnTopState(); + } + } + } +diff --git a/src/share/classes/java/awt/peer/WindowPeer.java b/src/share/classes/java/awt/peer/WindowPeer.java +--- jdk/src/share/classes/java/awt/peer/WindowPeer.java ++++ jdk/src/share/classes/java/awt/peer/WindowPeer.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. + * 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,7 +37,7 @@ + public interface WindowPeer extends ContainerPeer { + void toFront(); + void toBack(); +- void setAlwaysOnTop(boolean alwaysOnTop); ++ void updateAlwaysOnTopState(); + void updateFocusableWindowState(); + boolean requestWindowFocus(); + void setModalBlocked(Dialog blocker, boolean blocked); +diff --git a/src/share/classes/sun/awt/EmbeddedFrame.java b/src/share/classes/sun/awt/EmbeddedFrame.java +--- jdk/src/share/classes/sun/awt/EmbeddedFrame.java ++++ jdk/src/share/classes/sun/awt/EmbeddedFrame.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -551,7 +551,7 @@ + public void toBack() {} + public void updateFocusableWindowState() {} + public void updateAlwaysOnTop() {} +- public void setAlwaysOnTop(boolean alwaysOnTop) {} ++ public void updateAlwaysOnTopState() {} + public Component getGlobalHeavyweightFocusOwner() { return null; } + public void setBoundsPrivate(int x, int y, int width, int height) { + setBounds(x, y, width, height, SET_BOUNDS); +diff --git a/src/solaris/classes/sun/awt/X11/XWindowPeer.java b/src/solaris/classes/sun/awt/X11/XWindowPeer.java +--- jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java ++++ jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -1018,8 +1018,8 @@ + XLayerProtocol.LAYER_NORMAL); + } + +- public void setAlwaysOnTop(boolean alwaysOnTop) { +- this.alwaysOnTop = alwaysOnTop; ++ public void updateAlwaysOnTopState() { ++ this.alwaysOnTop = ((Window) this.target).isAlwaysOnTop(); + updateAlwaysOnTop(); + } + +diff --git a/src/windows/classes/sun/awt/windows/WFileDialogPeer.java b/src/windows/classes/sun/awt/windows/WFileDialogPeer.java +--- jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java ++++ jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -199,7 +199,7 @@ + + // unused methods. Overridden to disable this functionality as + // it requires HWND which is not available for FileDialog +- public void setAlwaysOnTop(boolean value) {} ++ public void updateAlwaysOnTopState() {} + public void setDirectory(String dir) {} + public void setFile(String file) {} + public void setTitle(String title) {} +diff --git a/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java b/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java +--- jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java ++++ jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -115,7 +115,7 @@ + // unused methods. Overridden to disable this functionality as + // it requires HWND which is not available for FileDialog + void initialize() {} +- public void setAlwaysOnTop(boolean b) {} ++ public void updateAlwaysOnTopState() {} + public void setResizable(boolean resizable) {} + public void hide() {} + public void enable() {} +diff --git a/src/windows/classes/sun/awt/windows/WWindowPeer.java b/src/windows/classes/sun/awt/windows/WWindowPeer.java +--- jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java ++++ jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -112,6 +112,10 @@ + } + } + ++ public void updateAlwaysOnTopState() { ++ setAlwaysOnTop(((Window)target).isAlwaysOnTop()); ++ } ++ + public void updateFocusableWindowState() { + setFocusableWindow(((Window)target).isFocusableWindow()); + } +# HG changeset patch +# User andrew +# Date 1365787780 -3600 +# Node ID f135ac267a382a052f563d7dd8fb001cd27827be +# Parent 014d4beffa044a4ae8f7f82618bdf9bc659056a7 +Extend 8006790 to cover the Motif peer + +diff --git a/src/solaris/classes/sun/awt/motif/MWindowPeer.java b/src/solaris/classes/sun/awt/motif/MWindowPeer.java +--- jdk/src/solaris/classes/sun/awt/motif/MWindowPeer.java ++++ jdk/src/solaris/classes/sun/awt/motif/MWindowPeer.java +@@ -183,6 +183,10 @@ + updateAlwaysOnTop(alwaysOnTop); + } + ++ public void updateAlwaysOnTopState() { ++ setAlwaysOnTop(((Window)target).isAlwaysOnTop()); ++ } ++ + public void toFront() { + if (target.isVisible()) { + updateFocusableWindowState(); diff --git a/java/openjdk6/files/icedtea/security/20130416/8006795.patch b/java/openjdk6/files/icedtea/security/20130416/8006795.patch new file mode 100644 index 000000000000..ec0d6bda9ac6 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8006795.patch @@ -0,0 +1,35 @@ +# HG changeset patch +# User prr +# Date 1360268071 28800 +# Node ID 2da00862b3dba3b690f5e212a00fe984e9f648ed +# Parent 08f7ab5f86a27c17b648f3b47f800393d939140c +8006795: Improve font warning messages +Reviewed-by: bae, jgodinez, mschoene + +diff --git a/src/share/classes/sun/font/CMap.java b/src/share/classes/sun/font/CMap.java +--- jdk/src/share/classes/sun/font/CMap.java ++++ jdk/src/share/classes/sun/font/CMap.java +@@ -841,7 +841,6 @@ + + CMapFormat6(ByteBuffer bbuffer, int offset, char[] xlat) { + +- System.err.println("WARNING: CMapFormat8 is untested."); + bbuffer.position(offset+6); + CharBuffer buffer = bbuffer.asCharBuffer(); + firstCode = buffer.get(); +@@ -884,7 +883,6 @@ + + CMapFormat8(ByteBuffer bbuffer, int offset, char[] xlat) { + +- System.err.println("WARNING: CMapFormat8 is untested."); + bbuffer.position(12); + bbuffer.get(is32); + nGroups = bbuffer.getInt(); +@@ -915,7 +913,6 @@ + + CMapFormat10(ByteBuffer bbuffer, int offset, char[] xlat) { + +- System.err.println("WARNING: CMapFormat10 is untested."); + firstCode = bbuffer.getInt() & INTMASK; + entryCount = bbuffer.getInt() & INTMASK; + bbuffer.position(offset+20); diff --git a/java/openjdk6/files/icedtea/security/20130416/8007406.patch b/java/openjdk6/files/icedtea/security/20130416/8007406.patch new file mode 100644 index 000000000000..4d4ff7df7537 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8007406.patch @@ -0,0 +1,31 @@ +# HG changeset patch +# User raginip +# Date 1362146770 0 +# Node ID 014d4beffa044a4ae8f7f82618bdf9bc659056a7 +# Parent 2da00862b3dba3b690f5e212a00fe984e9f648ed +8007406: Improve accessibility of AccessBridge +Reviewed-by: skoivu, mullan, ptbrunet + +diff --git a/src/share/lib/security/java.security-windows b/src/share/lib/security/java.security-windows +--- jdk/src/share/lib/security/java.security-windows ++++ jdk/src/share/lib/security/java.security-windows +@@ -149,7 +149,8 @@ + com.sun.org.apache.xml.internal.res.,\ + com.sun.org.apache.xml.internal.serializer.utils.,\ + com.sun.org.apache.xml.internal.utils.,\ +- com.sun.org.glassfish. ++ com.sun.org.glassfish.,\ ++ com.sun.java.accessibility. + + # + # List of comma-separated packages that start with or equal this string +@@ -182,7 +183,8 @@ + com.sun.org.apache.xml.internal.res.,\ + com.sun.org.apache.xml.internal.serializer.utils.,\ + com.sun.org.apache.xml.internal.utils.,\ +- com.sun.org.glassfish. ++ com.sun.org.glassfish.,\ ++ com.sun.java.accessibility. + + # + # Determines whether this properties file can be appended to diff --git a/java/openjdk6/files/icedtea/security/20130416/8007617.patch b/java/openjdk6/files/icedtea/security/20130416/8007617.patch new file mode 100644 index 000000000000..452ef78c09ff --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8007617.patch @@ -0,0 +1,376 @@ +# HG changeset patch +# User bae +# Date 1361531665 -14400 +# Node ID cf93d3828aa8f85003f3668f069646205c39c087 +# Parent ddd9e6df700fa59366b4560e58a3b7b0a16b4746 +8007617: Better validation of images +Reviewed-by: prr, jgodinez + +diff --git openjdk/jdk/src/share/classes/sun/awt/image/ImageRepresentation.java openjdk/jdk/src/share/classes/sun/awt/image/ImageRepresentation.java +--- jdk/src/share/classes/sun/awt/image/ImageRepresentation.java ++++ jdk/src/share/classes/sun/awt/image/ImageRepresentation.java +@@ -333,10 +333,10 @@ public class ImageRepresentation extends + hints = h; + } + +- private native void setICMpixels(int x, int y, int w, int h, int[] lut, ++ private native boolean setICMpixels(int x, int y, int w, int h, int[] lut, + byte[] pix, int off, int scansize, + IntegerComponentRaster ict); +- private native int setDiffICM(int x, int y, int w, int h, int[] lut, ++ private native boolean setDiffICM(int x, int y, int w, int h, int[] lut, + int transPix, int numLut, IndexColorModel icm, + byte[] pix, int off, int scansize, + ByteComponentRaster bct, int chanOff); +@@ -426,10 +426,10 @@ public class ImageRepresentation extends + IndexColorModel icm = (IndexColorModel) model; + ByteComponentRaster bct = (ByteComponentRaster) biRaster; + int numlut = numSrcLUT; +- if (setDiffICM(x, y, w, h, srcLUT, srcLUTtransIndex, ++ if (!setDiffICM(x, y, w, h, srcLUT, srcLUTtransIndex, + numSrcLUT, icm, + pix, off, scansize, bct, +- bct.getDataOffset(0)) == 0) { ++ bct.getDataOffset(0))) { + convertToRGB(); + } + else { +@@ -470,9 +470,14 @@ public class ImageRepresentation extends + if (s_useNative) { + // Note that setICMpixels modifies the raster directly + // so we must mark it as changed afterwards +- setICMpixels(x, y, w, h, srcLUT, pix, off, scansize, +- iraster); +- iraster.markDirty(); ++ if (setICMpixels(x, y, w, h, srcLUT, pix, off, scansize, ++ iraster)) ++ { ++ iraster.markDirty(); ++ } else { ++ abort(); ++ return; ++ } + } + else { + int[] storage = new int[w*h]; +diff --git openjdk/jdk/src/share/native/sun/awt/image/awt_ImageRep.c openjdk/jdk/src/share/native/sun/awt/image/awt_ImageRep.c +--- jdk/src/share/native/sun/awt/image/awt_ImageRep.c ++++ jdk/src/share/native/sun/awt/image/awt_ImageRep.c +@@ -45,6 +45,53 @@ static int findIdx(unsigned int rgb, uns + # define TRUE 1 + #endif + ++#define CHECK_STRIDE(yy, hh, ss) \ ++ if ((ss) != 0) { \ ++ int limit = 0x7fffffff / ((ss) > 0 ? (ss) : -(ss)); \ ++ if (limit < (yy) || limit < ((yy) + (hh) - 1)) { \ ++ /* integer oveflow */ \ ++ return JNI_FALSE; \ ++ } \ ++ } \ ++ ++#define CHECK_SRC() \ ++ do { \ ++ int pixeloffset; \ ++ if (off < 0 || off >= srcDataLength) { \ ++ return JNI_FALSE; \ ++ } \ ++ CHECK_STRIDE(0, h, scansize); \ ++ \ ++ /* check scansize */ \ ++ pixeloffset = scansize * (h - 1); \ ++ if ((w - 1) > (0x7fffffff - pixeloffset)) { \ ++ return JNI_FALSE; \ ++ } \ ++ pixeloffset += (w - 1); \ ++ \ ++ if (off > (0x7fffffff - pixeloffset)) { \ ++ return JNI_FALSE; \ ++ } \ ++ } while (0) \ ++ ++#define CHECK_DST(xx, yy) \ ++ do { \ ++ int soffset = (yy) * sStride; \ ++ int poffset = (xx) * pixelStride; \ ++ if (poffset > (0x7fffffff - soffset)) { \ ++ return JNI_FALSE; \ ++ } \ ++ poffset += soffset; \ ++ if (dstDataOff > (0x7fffffff - poffset)) { \ ++ return JNI_FALSE; \ ++ } \ ++ poffset += dstDataOff; \ ++ \ ++ if (poffset < 0 || poffset >= dstDataLength) { \ ++ return JNI_FALSE; \ ++ } \ ++ } while (0) \ ++ + static jfieldID s_JnumSrcLUTID; + static jfieldID s_JsrcLUTtransIndexID; + +@@ -58,7 +105,7 @@ Java_sun_awt_image_ImageRepresentation_i + /* + * This routine is used to draw ICM pixels into a default color model + */ +-JNIEXPORT void JNICALL ++JNIEXPORT jboolean JNICALL + Java_sun_awt_image_ImageRepresentation_setICMpixels(JNIEnv *env, jclass cls, + jint x, jint y, jint w, + jint h, jintArray jlut, +@@ -67,7 +114,10 @@ Java_sun_awt_image_ImageRepresentation_s + jobject jict) + { + unsigned char *srcData = NULL; ++ jint srcDataLength; + int *dstData; ++ jint dstDataLength; ++ jint dstDataOff; + int *dstP, *dstyP; + unsigned char *srcyP, *srcP; + int *srcLUT = NULL; +@@ -80,12 +130,20 @@ Java_sun_awt_image_ImageRepresentation_s + + if (JNU_IsNull(env, jlut)) { + JNU_ThrowNullPointerException(env, "NullPointerException"); +- return; ++ return JNI_FALSE; + } + + if (JNU_IsNull(env, jpix)) { + JNU_ThrowNullPointerException(env, "NullPointerException"); +- return; ++ return JNI_FALSE; ++ } ++ ++ if (x < 0 || w < 1 || (0x7fffffff - x) < w) { ++ return JNI_FALSE; ++ } ++ ++ if (y < 0 || h < 1 || (0x7fffffff - y) < h) { ++ return JNI_FALSE; + } + + sStride = (*env)->GetIntField(env, jict, g_ICRscanstrID); +@@ -93,10 +151,47 @@ Java_sun_awt_image_ImageRepresentation_s + joffs = (*env)->GetObjectField(env, jict, g_ICRdataOffsetsID); + jdata = (*env)->GetObjectField(env, jict, g_ICRdataID); + ++ if (JNU_IsNull(env, jdata)) { ++ /* no destination buffer */ ++ return JNI_FALSE; ++ } ++ ++ if (JNU_IsNull(env, joffs) || (*env)->GetArrayLength(env, joffs) < 1) { ++ /* invalid data offstes in raster */ ++ return JNI_FALSE; ++ } ++ ++ srcDataLength = (*env)->GetArrayLength(env, jpix); ++ dstDataLength = (*env)->GetArrayLength(env, jdata); ++ ++ cOffs = (int *) (*env)->GetPrimitiveArrayCritical(env, joffs, NULL); ++ if (cOffs == NULL) { ++ JNU_ThrowNullPointerException(env, "Null channel offset array"); ++ return JNI_FALSE; ++ } ++ ++ dstDataOff = cOffs[0]; ++ ++ /* the offset array is not needed anymore and can be released */ ++ (*env)->ReleasePrimitiveArrayCritical(env, joffs, cOffs, JNI_ABORT); ++ joffs = NULL; ++ cOffs = NULL; ++ ++ /* do basic validation: make sure that offsets for ++ * first pixel and for last pixel are safe to calculate and use */ ++ CHECK_STRIDE(y, h, sStride); ++ CHECK_STRIDE(x, w, pixelStride); ++ ++ CHECK_DST(x, y); ++ CHECK_DST(x + w -1, y + h - 1); ++ ++ /* check source array */ ++ CHECK_SRC(); ++ + srcLUT = (int *) (*env)->GetPrimitiveArrayCritical(env, jlut, NULL); + if (srcLUT == NULL) { + JNU_ThrowNullPointerException(env, "Null IndexColorModel LUT"); +- return; ++ return JNI_FALSE; + } + + srcData = (unsigned char *) (*env)->GetPrimitiveArrayCritical(env, jpix, +@@ -104,27 +199,18 @@ Java_sun_awt_image_ImageRepresentation_s + if (srcData == NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, JNI_ABORT); + JNU_ThrowNullPointerException(env, "Null data array"); +- return; +- } +- +- cOffs = (int *) (*env)->GetPrimitiveArrayCritical(env, joffs, NULL); +- if (cOffs == NULL) { +- (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, JNI_ABORT); +- (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT); +- JNU_ThrowNullPointerException(env, "Null channel offset array"); +- return; ++ return JNI_FALSE; + } + + dstData = (int *) (*env)->GetPrimitiveArrayCritical(env, jdata, NULL); + if (dstData == NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, JNI_ABORT); + (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT); +- (*env)->ReleasePrimitiveArrayCritical(env, joffs, cOffs, JNI_ABORT); + JNU_ThrowNullPointerException(env, "Null tile data array"); +- return; ++ return JNI_FALSE; + } + +- dstyP = dstData + cOffs[0] + y*sStride + x*pixelStride; ++ dstyP = dstData + dstDataOff + y*sStride + x*pixelStride; + srcyP = srcData + off; + for (yIdx = 0; yIdx < h; yIdx++, srcyP += scansize, dstyP+=sStride) { + srcP = srcyP; +@@ -137,12 +223,12 @@ Java_sun_awt_image_ImageRepresentation_s + /* Release the locked arrays */ + (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, JNI_ABORT); + (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT); +- (*env)->ReleasePrimitiveArrayCritical(env, joffs, cOffs, JNI_ABORT); + (*env)->ReleasePrimitiveArrayCritical(env, jdata, dstData, JNI_ABORT); + ++ return JNI_TRUE; + } + +-JNIEXPORT jint JNICALL ++JNIEXPORT jboolean JNICALL + Java_sun_awt_image_ImageRepresentation_setDiffICM(JNIEnv *env, jclass cls, + jint x, jint y, jint w, + jint h, jintArray jlut, +@@ -150,7 +236,7 @@ Java_sun_awt_image_ImageRepresentation_s + jobject jicm, + jbyteArray jpix, jint off, + jint scansize, +- jobject jbct, jint chanOff) ++ jobject jbct, jint dstDataOff) + { + unsigned int *srcLUT = NULL; + unsigned int *newLUT = NULL; +@@ -159,6 +245,8 @@ Java_sun_awt_image_ImageRepresentation_s + int mapSize; + jobject jdata = NULL; + jobject jnewlut = NULL; ++ jint srcDataLength; ++ jint dstDataLength; + unsigned char *srcData; + unsigned char *dstData; + unsigned char *dataP; +@@ -174,13 +262,22 @@ Java_sun_awt_image_ImageRepresentation_s + + if (JNU_IsNull(env, jlut)) { + JNU_ThrowNullPointerException(env, "NullPointerException"); +- return 0; ++ return JNI_FALSE; + } + + if (JNU_IsNull(env, jpix)) { + JNU_ThrowNullPointerException(env, "NullPointerException"); +- return 0; ++ return JNI_FALSE; + } ++ ++ if (x < 0 || w < 1 || (0x7fffffff - x) < w) { ++ return JNI_FALSE; ++ } ++ ++ if (y < 0 || h < 1 || (0x7fffffff - y) < h) { ++ return JNI_FALSE; ++ } ++ + + sStride = (*env)->GetIntField(env, jbct, g_BCRscanstrID); + pixelStride =(*env)->GetIntField(env, jbct, g_BCRpixstrID); +@@ -193,14 +290,31 @@ Java_sun_awt_image_ImageRepresentation_s + of byte data type, so we have to convert the image data + to default representation. + */ +- return 0; ++ return JNI_FALSE; + } + ++ if (JNU_IsNull(env, jdata)) { ++ /* no destination buffer */ ++ return JNI_FALSE; ++ } ++ ++ srcDataLength = (*env)->GetArrayLength(env, jpix); ++ dstDataLength = (*env)->GetArrayLength(env, jdata); ++ ++ CHECK_STRIDE(y, h, sStride); ++ CHECK_STRIDE(x, w, pixelStride); ++ ++ CHECK_DST(x, y); ++ CHECK_DST(x + w -1, y + h - 1); ++ ++ /* check source array */ ++ CHECK_SRC(); ++ + srcLUT = (unsigned int *) (*env)->GetPrimitiveArrayCritical(env, jlut, + NULL); + if (srcLUT == NULL) { + /* out of memory error already thrown */ +- return 0; ++ return JNI_FALSE; + } + + newLUT = (unsigned int *) (*env)->GetPrimitiveArrayCritical(env, jnewlut, +@@ -208,7 +323,7 @@ Java_sun_awt_image_ImageRepresentation_s + (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, + JNI_ABORT); + /* out of memory error already thrown */ +- return 0; ++ return JNI_FALSE; + } + + newNumLut = numLut; +@@ -219,7 +334,7 @@ Java_sun_awt_image_ImageRepresentation_s + (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, + JNI_ABORT); + (*env)->ReleasePrimitiveArrayCritical(env, jnewlut, newLUT, JNI_ABORT); +- return 0; ++ return JNI_FALSE; + } + + /* Don't need these any more */ +@@ -239,7 +354,7 @@ Java_sun_awt_image_ImageRepresentation_s + NULL); + if (srcData == NULL) { + /* out of memory error already thrown */ +- return 0; ++ return JNI_FALSE; + } + + dstData = (unsigned char *) (*env)->GetPrimitiveArrayCritical(env, jdata, +@@ -247,10 +362,10 @@ Java_sun_awt_image_ImageRepresentation_s + if (dstData == NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT); + /* out of memory error already thrown */ +- return 0; ++ return JNI_FALSE; + } + +- ydataP = dstData + chanOff + y*sStride + x*pixelStride; ++ ydataP = dstData + dstDataOff + y*sStride + x*pixelStride; + ypixP = srcData + off; + + for (i=0; i < h; i++) { +@@ -268,7 +383,7 @@ Java_sun_awt_image_ImageRepresentation_s + (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT); + (*env)->ReleasePrimitiveArrayCritical(env, jdata, dstData, JNI_ABORT); + +- return 1; ++ return JNI_TRUE; + } + + static int compareLUTs(unsigned int *lut1, int numLut1, int transIdx, diff --git a/java/openjdk6/files/icedtea/security/20130416/8007667.patch b/java/openjdk6/files/icedtea/security/20130416/8007667.patch new file mode 100644 index 000000000000..132760bf08ea --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8007667.patch @@ -0,0 +1,579 @@ +# HG changeset patch +# User bae +# Date 1361823317 -14400 +# Node ID d868fe7c7618e5b55eea8dd69ee5d099c71816e0 +# Parent 6784c9903db7f65a93279ac12b7fc00c57dbaaa5 +8007667: Better image reading +Reviewed-by: prr, jgodinez + +diff --git openjdk/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java openjdk/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java +--- jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java ++++ jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java +@@ -281,12 +281,17 @@ + * sending warnings to listeners. + */ + protected void warningOccurred(int code) { +- if ((code < 0) || (code > MAX_WARNING)){ +- throw new InternalError("Invalid warning index"); +- } +- processWarningOccurred +- ("com.sun.imageio.plugins.jpeg.JPEGImageReaderResources", +- Integer.toString(code)); ++ cbLock.lock(); ++ try { ++ if ((code < 0) || (code > MAX_WARNING)){ ++ throw new InternalError("Invalid warning index"); ++ } ++ processWarningOccurred ++ ("com.sun.imageio.plugins.jpeg.JPEGImageReaderResources", ++ Integer.toString(code)); ++ } finally { ++ cbLock.unlock(); ++ } + } + + /** +@@ -303,7 +308,12 @@ + * library warnings from being printed to stderr. + */ + protected void warningWithMessage(String msg) { +- processWarningOccurred(msg); ++ cbLock.lock(); ++ try { ++ processWarningOccurred(msg); ++ } finally { ++ cbLock.unlock(); ++ } + } + + public void setInput(Object input, +@@ -312,18 +322,55 @@ + { + setThreadLock(); + try { ++ cbLock.check(); ++ + super.setInput(input, seekForwardOnly, ignoreMetadata); + this.ignoreMetadata = ignoreMetadata; + resetInternalState(); + iis = (ImageInputStream) input; // Always works +- setSource(structPointer, iis); ++ setSource(structPointer); + } finally { + clearThreadLock(); + } + } + +- private native void setSource(long structPointer, +- ImageInputStream source); ++ /** ++ * This method is called from native code in order to fill ++ * native input buffer. ++ * ++ * We block any attempt to change the reading state during this ++ * method, in order to prevent a corruption of the native decoder ++ * state. ++ * ++ * @return number of bytes read from the stream. ++ */ ++ private int readInputData(byte[] buf, int off, int len) throws IOException { ++ cbLock.lock(); ++ try { ++ return iis.read(buf, off, len); ++ } finally { ++ cbLock.unlock(); ++ } ++ } ++ ++ /** ++ * This method is called from the native code in order to ++ * skip requested number of bytes in the input stream. ++ * ++ * @param n ++ * @return ++ * @throws IOException ++ */ ++ private long skipInputBytes(long n) throws IOException { ++ cbLock.lock(); ++ try { ++ return iis.skipBytes(n); ++ } finally { ++ cbLock.unlock(); ++ } ++ } ++ ++ private native void setSource(long structPointer); + + private void checkTablesOnly() throws IOException { + if (debug) { +@@ -375,6 +422,8 @@ + public int getNumImages(boolean allowSearch) throws IOException { + setThreadLock(); + try { // locked thread ++ cbLock.check(); ++ + return getNumImagesOnThread(allowSearch); + } finally { + clearThreadLock(); +@@ -574,8 +623,13 @@ + if (debug) { + System.out.println("pushing back " + num + " bytes"); + } +- iis.seek(iis.getStreamPosition()-num); +- // The buffer is clear after this, so no need to set haveSeeked. ++ cbLock.lock(); ++ try { ++ iis.seek(iis.getStreamPosition()-num); ++ // The buffer is clear after this, so no need to set haveSeeked. ++ } finally { ++ cbLock.unlock(); ++ } + } + + /** +@@ -645,7 +699,12 @@ + * Ignore this profile. + */ + iccCS = null; +- warningOccurred(WARNING_IGNORE_INVALID_ICC); ++ cbLock.lock(); ++ try { ++ warningOccurred(WARNING_IGNORE_INVALID_ICC); ++ } finally { ++ cbLock.unlock(); ++ } + + return; + } +@@ -680,6 +739,7 @@ + setThreadLock(); + try { + if (currentImage != imageIndex) { ++ cbLock.check(); + readHeader(imageIndex, true); + } + return width; +@@ -692,6 +752,7 @@ + setThreadLock(); + try { + if (currentImage != imageIndex) { ++ cbLock.check(); + readHeader(imageIndex, true); + } + return height; +@@ -720,6 +781,8 @@ + setThreadLock(); + try { + if (currentImage != imageIndex) { ++ cbLock.check(); ++ + readHeader(imageIndex, true); + } + +@@ -743,6 +806,7 @@ + private Iterator getImageTypesOnThread(int imageIndex) + throws IOException { + if (currentImage != imageIndex) { ++ cbLock.check(); + readHeader(imageIndex, true); + } + +@@ -944,6 +1008,7 @@ + setThreadLock(); + try { + if (!tablesOnlyChecked) { ++ cbLock.check(); + checkTablesOnly(); + } + return streamMetadata; +@@ -964,6 +1029,8 @@ + return imageMetadata; + } + ++ cbLock.check(); ++ + gotoImage(imageIndex); + + imageMetadata = new JPEGMetadata(false, false, iis, this); +@@ -980,6 +1047,7 @@ + throws IOException { + setThreadLock(); + try { ++ cbLock.check(); + try { + readInternal(imageIndex, param, false); + } catch (RuntimeException e) { +@@ -1209,58 +1277,63 @@ + } + target.setRect(destROI.x, destROI.y + y, raster); + +- processImageUpdate(image, +- destROI.x, destROI.y+y, +- raster.getWidth(), 1, +- 1, 1, +- destinationBands); +- if ((y > 0) && (y%progInterval == 0)) { +- int height = target.getHeight()-1; +- float percentOfPass = ((float)y)/height; +- if (progressive) { +- if (knownPassCount != UNKNOWN) { +- processImageProgress((pass + percentOfPass)*100.0F +- / knownPassCount); +- } else if (maxProgressivePass != Integer.MAX_VALUE) { +- // Use the range of allowed progressive passes +- processImageProgress((pass + percentOfPass)*100.0F +- / (maxProgressivePass - minProgressivePass + 1)); ++ cbLock.lock(); ++ try { ++ processImageUpdate(image, ++ destROI.x, destROI.y+y, ++ raster.getWidth(), 1, ++ 1, 1, ++ destinationBands); ++ if ((y > 0) && (y%progInterval == 0)) { ++ int height = target.getHeight()-1; ++ float percentOfPass = ((float)y)/height; ++ if (progressive) { ++ if (knownPassCount != UNKNOWN) { ++ processImageProgress((pass + percentOfPass)*100.0F ++ / knownPassCount); ++ } else if (maxProgressivePass != Integer.MAX_VALUE) { ++ // Use the range of allowed progressive passes ++ processImageProgress((pass + percentOfPass)*100.0F ++ / (maxProgressivePass - minProgressivePass + 1)); ++ } else { ++ // Assume there are a minimum of MIN_ESTIMATED_PASSES ++ // and that there is always one more pass ++ // Compute the percentage as the percentage at the end ++ // of the previous pass, plus the percentage of this ++ // pass scaled to be the percentage of the total remaining, ++ // assuming a minimum of MIN_ESTIMATED_PASSES passes and ++ // that there is always one more pass. This is monotonic ++ // and asymptotic to 1.0, which is what we need. ++ int remainingPasses = // including this one ++ Math.max(2, MIN_ESTIMATED_PASSES-pass); ++ int totalPasses = pass + remainingPasses-1; ++ progInterval = Math.max(height/20*totalPasses, ++ totalPasses); ++ if (y%progInterval == 0) { ++ percentToDate = previousPassPercentage + ++ (1.0F - previousPassPercentage) ++ * (percentOfPass)/remainingPasses; ++ if (debug) { ++ System.out.print("pass= " + pass); ++ System.out.print(", y= " + y); ++ System.out.print(", progInt= " + progInterval); ++ System.out.print(", % of pass: " + percentOfPass); ++ System.out.print(", rem. passes: " ++ + remainingPasses); ++ System.out.print(", prev%: " ++ + previousPassPercentage); ++ System.out.print(", %ToDate: " + percentToDate); ++ System.out.print(" "); ++ } ++ processImageProgress(percentToDate*100.0F); ++ } ++ } + } else { +- // Assume there are a minimum of MIN_ESTIMATED_PASSES +- // and that there is always one more pass +- // Compute the percentage as the percentage at the end +- // of the previous pass, plus the percentage of this +- // pass scaled to be the percentage of the total remaining, +- // assuming a minimum of MIN_ESTIMATED_PASSES passes and +- // that there is always one more pass. This is monotonic +- // and asymptotic to 1.0, which is what we need. +- int remainingPasses = // including this one +- Math.max(2, MIN_ESTIMATED_PASSES-pass); +- int totalPasses = pass + remainingPasses-1; +- progInterval = Math.max(height/20*totalPasses, +- totalPasses); +- if (y%progInterval == 0) { +- percentToDate = previousPassPercentage + +- (1.0F - previousPassPercentage) +- * (percentOfPass)/remainingPasses; +- if (debug) { +- System.out.print("pass= " + pass); +- System.out.print(", y= " + y); +- System.out.print(", progInt= " + progInterval); +- System.out.print(", % of pass: " + percentOfPass); +- System.out.print(", rem. passes: " +- + remainingPasses); +- System.out.print(", prev%: " +- + previousPassPercentage); +- System.out.print(", %ToDate: " + percentToDate); +- System.out.print(" "); +- } +- processImageProgress(percentToDate*100.0F); +- } ++ processImageProgress(percentOfPass * 100.0F); + } +- } else { +- processImageProgress(percentOfPass * 100.0F); +- } ++ } ++ } finally { ++ cbLock.unlock(); + } + } + +@@ -1273,33 +1346,58 @@ + } + + private void passStarted (int pass) { +- this.pass = pass; +- previousPassPercentage = percentToDate; +- processPassStarted(image, +- pass, +- minProgressivePass, +- maxProgressivePass, +- 0, 0, +- 1,1, +- destinationBands); ++ cbLock.lock(); ++ try { ++ this.pass = pass; ++ previousPassPercentage = percentToDate; ++ processPassStarted(image, ++ pass, ++ minProgressivePass, ++ maxProgressivePass, ++ 0, 0, ++ 1,1, ++ destinationBands); ++ } finally { ++ cbLock.unlock(); ++ } + } + + private void passComplete () { +- processPassComplete(image); ++ cbLock.lock(); ++ try { ++ processPassComplete(image); ++ } finally { ++ cbLock.unlock(); ++ } + } + + void thumbnailStarted(int thumbnailIndex) { +- processThumbnailStarted(currentImage, thumbnailIndex); ++ cbLock.lock(); ++ try { ++ processThumbnailStarted(currentImage, thumbnailIndex); ++ } finally { ++ cbLock.unlock(); ++ } + } + + // Provide access to protected superclass method + void thumbnailProgress(float percentageDone) { +- processThumbnailProgress(percentageDone); ++ cbLock.lock(); ++ try { ++ processThumbnailProgress(percentageDone); ++ } finally { ++ cbLock.unlock(); ++ } + } + + // Provide access to protected superclass method + void thumbnailComplete() { +- processThumbnailComplete(); ++ cbLock.lock(); ++ try { ++ processThumbnailComplete(); ++ } finally { ++ cbLock.unlock(); ++ } + } + + /** +@@ -1323,6 +1421,11 @@ + public void abort() { + setThreadLock(); + try { ++ /** ++ * NB: we do not check the call back lock here, ++ * we allow to abort the reader any time. ++ */ ++ + super.abort(); + abortRead(structPointer); + } finally { +@@ -1345,6 +1448,7 @@ + setThreadLock(); + Raster retval = null; + try { ++ cbLock.check(); + /* + * This could be further optimized by not resetting the dest. + * offset and creating a translated raster in readInternal() +@@ -1384,6 +1488,8 @@ + public int getNumThumbnails(int imageIndex) throws IOException { + setThreadLock(); + try { ++ cbLock.check(); ++ + getImageMetadata(imageIndex); // checks iis state for us + // Now check the jfif segments + JFIFMarkerSegment jfif = +@@ -1404,6 +1510,8 @@ + throws IOException { + setThreadLock(); + try { ++ cbLock.check(); ++ + if ((thumbnailIndex < 0) + || (thumbnailIndex >= getNumThumbnails(imageIndex))) { + throw new IndexOutOfBoundsException("No such thumbnail"); +@@ -1422,6 +1530,8 @@ + throws IOException { + setThreadLock(); + try { ++ cbLock.check(); ++ + if ((thumbnailIndex < 0) + || (thumbnailIndex >= getNumThumbnails(imageIndex))) { + throw new IndexOutOfBoundsException("No such thumbnail"); +@@ -1441,6 +1551,8 @@ + throws IOException { + setThreadLock(); + try { ++ cbLock.check(); ++ + if ((thumbnailIndex < 0) + || (thumbnailIndex >= getNumThumbnails(imageIndex))) { + throw new IndexOutOfBoundsException("No such thumbnail"); +@@ -1481,6 +1593,7 @@ + public void reset() { + setThreadLock(); + try { ++ cbLock.check(); + super.reset(); + } finally { + clearThreadLock(); +@@ -1492,6 +1605,8 @@ + public void dispose() { + setThreadLock(); + try { ++ cbLock.check(); ++ + if (structPointer != 0) { + disposerRecord.dispose(); + structPointer = 0; +@@ -1553,4 +1668,34 @@ + theThread = null; + } + } ++ ++ private CallBackLock cbLock = new CallBackLock(); ++ ++ private static class CallBackLock { ++ ++ private State lockState; ++ ++ CallBackLock() { ++ lockState = State.Unlocked; ++ } ++ ++ void check() { ++ if (lockState != State.Unlocked) { ++ throw new IllegalStateException("Access to the reader is not allowed"); ++ } ++ } ++ ++ private void lock() { ++ lockState = State.Locked; ++ } ++ ++ private void unlock() { ++ lockState = State.Unlocked; ++ } ++ ++ private static enum State { ++ Unlocked, ++ Locked ++ } ++ } + } +diff --git openjdk/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c openjdk/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c +--- jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c ++++ jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c +@@ -57,8 +57,8 @@ + #define MAX(a,b) ((a) > (b) ? (a) : (b)) + + /* Cached Java method ids */ +-static jmethodID ImageInputStream_readID; +-static jmethodID ImageInputStream_skipBytesID; ++static jmethodID JPEGImageReader_readInputDataID; ++static jmethodID JPEGImageReader_skipInputBytesID; + static jmethodID JPEGImageReader_warningOccurredID; + static jmethodID JPEGImageReader_warningWithMessageID; + static jmethodID JPEGImageReader_setImageDataID; +@@ -923,7 +923,7 @@ imageio_fill_input_buffer(j_decompress_p + RELEASE_ARRAYS(env, data, src->next_input_byte); + ret = (*env)->CallIntMethod(env, + sb->stream, +- ImageInputStream_readID, ++ JPEGImageReader_readInputDataID, + sb->hstreamBuffer, 0, + sb->bufferLength); + if ((*env)->ExceptionOccurred(env) +@@ -1013,7 +1013,7 @@ imageio_fill_suspended_buffer(j_decompre + } + + ret = (*env)->CallIntMethod(env, sb->stream, +- ImageInputStream_readID, ++ JPEGImageReader_readInputDataID, + sb->hstreamBuffer, + offset, buflen); + if ((*env)->ExceptionOccurred(env) +@@ -1107,7 +1107,7 @@ imageio_skip_input_data(j_decompress_ptr + RELEASE_ARRAYS(env, data, src->next_input_byte); + ret = (*env)->CallLongMethod(env, + sb->stream, +- ImageInputStream_skipBytesID, ++ JPEGImageReader_skipInputBytesID, + (jlong) num_bytes); + if ((*env)->ExceptionOccurred(env) + || !GET_ARRAYS(env, data, &(src->next_input_byte))) { +@@ -1382,13 +1382,13 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm + jclass qTableClass, + jclass huffClass) { + +- ImageInputStream_readID = (*env)->GetMethodID(env, +- ImageInputStreamClass, +- "read", ++ JPEGImageReader_readInputDataID = (*env)->GetMethodID(env, ++ cls, ++ "readInputData", + "([BII)I"); +- ImageInputStream_skipBytesID = (*env)->GetMethodID(env, +- ImageInputStreamClass, +- "skipBytes", ++ JPEGImageReader_skipInputBytesID = (*env)->GetMethodID(env, ++ cls, ++ "skipInputBytes", + "(J)J"); + JPEGImageReader_warningOccurredID = (*env)->GetMethodID(env, + cls, +@@ -1531,8 +1531,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm + Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_setSource + (JNIEnv *env, + jobject this, +- jlong ptr, +- jobject source) { ++ jlong ptr) { + + imageIODataPtr data = (imageIODataPtr)jlong_to_ptr(ptr); + j_common_ptr cinfo; +@@ -1546,7 +1545,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm + + cinfo = data->jpegObj; + +- imageio_set_stream(env, cinfo, data, source); ++ imageio_set_stream(env, cinfo, data, this); + + imageio_init_source((j_decompress_ptr) cinfo); + } diff --git a/java/openjdk6/files/icedtea/security/20130416/8007918.patch b/java/openjdk6/files/icedtea/security/20130416/8007918.patch new file mode 100644 index 000000000000..35ee96352ef9 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8007918.patch @@ -0,0 +1,357 @@ +# HG changeset patch +# User bae +# Date 1361827637 -14400 +# Node ID 90c9f1577a0b09128174b4d26404b438585428c5 +# Parent d868fe7c7618e5b55eea8dd69ee5d099c71816e0 +8007918: Better image writing +Reviewed-by: prr, jgodinez + +diff --git openjdk/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java openjdk/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java +--- jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java ++++ jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java +@@ -178,8 +178,7 @@ public class JPEGImageWriter extends Ima + static { + java.security.AccessController.doPrivileged( + new sun.security.action.LoadLibraryAction("jpeg")); +- initWriterIDs(ImageOutputStream.class, +- JPEGQTable.class, ++ initWriterIDs(JPEGQTable.class, + JPEGHuffmanTable.class); + } + +@@ -195,11 +194,13 @@ public class JPEGImageWriter extends Ima + public void setOutput(Object output) { + setThreadLock(); + try { ++ cbLock.check(); ++ + super.setOutput(output); // validates output + resetInternalState(); + ios = (ImageOutputStream) output; // so this will always work + // Set the native destination +- setDest(structPointer, ios); ++ setDest(structPointer); + } finally { + clearThreadLock(); + } +@@ -354,6 +355,8 @@ public class JPEGImageWriter extends Ima + ImageWriteParam param) throws IOException { + setThreadLock(); + try { ++ cbLock.check(); ++ + writeOnThread(streamMetadata, image, param); + } finally { + clearThreadLock(); +@@ -1077,13 +1080,18 @@ public class JPEGImageWriter extends Ima + haveMetadata, + restartInterval); + +- if (aborted) { +- processWriteAborted(); +- } else { +- processImageComplete(); ++ cbLock.lock(); ++ try { ++ if (aborted) { ++ processWriteAborted(); ++ } else { ++ processImageComplete(); ++ } ++ ++ ios.flush(); ++ } finally { ++ cbLock.unlock(); + } +- +- ios.flush(); + currentImage++; // After a successful write + } + +@@ -1091,6 +1099,8 @@ public class JPEGImageWriter extends Ima + throws IOException { + setThreadLock(); + try { ++ cbLock.check(); ++ + prepareWriteSequenceOnThread(streamMetadata); + } finally { + clearThreadLock(); +@@ -1170,6 +1180,8 @@ public class JPEGImageWriter extends Ima + throws IOException { + setThreadLock(); + try { ++ cbLock.check(); ++ + if (sequencePrepared == false) { + throw new IllegalStateException("sequencePrepared not called!"); + } +@@ -1183,6 +1195,8 @@ public class JPEGImageWriter extends Ima + public void endWriteSequence() throws IOException { + setThreadLock(); + try { ++ cbLock.check(); ++ + if (sequencePrepared == false) { + throw new IllegalStateException("sequencePrepared not called!"); + } +@@ -1195,6 +1209,10 @@ public class JPEGImageWriter extends Ima + public synchronized void abort() { + setThreadLock(); + try { ++ /** ++ * NB: we do not check the call back lock here, we allow to abort ++ * the reader any time. ++ */ + super.abort(); + abortWrite(structPointer); + } finally { +@@ -1218,6 +1236,8 @@ public class JPEGImageWriter extends Ima + public void reset() { + setThreadLock(); + try { ++ cbLock.check(); ++ + super.reset(); + } finally { + clearThreadLock(); +@@ -1227,6 +1247,8 @@ public class JPEGImageWriter extends Ima + public void dispose() { + setThreadLock(); + try { ++ cbLock.check(); ++ + if (structPointer != 0) { + disposerRecord.dispose(); + structPointer = 0; +@@ -1246,13 +1268,18 @@ public class JPEGImageWriter extends Ima + * sending warnings to listeners. + */ + void warningOccurred(int code) { +- if ((code < 0) || (code > MAX_WARNING)){ +- throw new InternalError("Invalid warning index"); ++ cbLock.lock(); ++ try { ++ if ((code < 0) || (code > MAX_WARNING)){ ++ throw new InternalError("Invalid warning index"); ++ } ++ processWarningOccurred ++ (currentImage, ++ "com.sun.imageio.plugins.jpeg.JPEGImageWriterResources", ++ Integer.toString(code)); ++ } finally { ++ cbLock.unlock(); + } +- processWarningOccurred +- (currentImage, +- "com.sun.imageio.plugins.jpeg.JPEGImageWriterResources", +- Integer.toString(code)); + } + + /** +@@ -1269,21 +1296,41 @@ public class JPEGImageWriter extends Ima + * library warnings from being printed to stderr. + */ + void warningWithMessage(String msg) { +- processWarningOccurred(currentImage, msg); ++ cbLock.lock(); ++ try { ++ processWarningOccurred(currentImage, msg); ++ } finally { ++ cbLock.unlock(); ++ } + } + + void thumbnailStarted(int thumbnailIndex) { +- processThumbnailStarted(currentImage, thumbnailIndex); ++ cbLock.lock(); ++ try { ++ processThumbnailStarted(currentImage, thumbnailIndex); ++ } finally { ++ cbLock.unlock(); ++ } + } + + // Provide access to protected superclass method + void thumbnailProgress(float percentageDone) { +- processThumbnailProgress(percentageDone); ++ cbLock.lock(); ++ try { ++ processThumbnailProgress(percentageDone); ++ } finally { ++ cbLock.unlock(); ++ } + } + + // Provide access to protected superclass method + void thumbnailComplete() { +- processThumbnailComplete(); ++ cbLock.lock(); ++ try { ++ processThumbnailComplete(); ++ } finally { ++ cbLock.unlock(); ++ } + } + + ///////// End of Package-access API +@@ -1610,16 +1657,14 @@ public class JPEGImageWriter extends Ima + ////////////// Native methods and callbacks + + /** Sets up static native structures. */ +- private static native void initWriterIDs(Class iosClass, +- Class qTableClass, ++ private static native void initWriterIDs(Class qTableClass, + Class huffClass); + + /** Sets up per-writer native structure and returns a pointer to it. */ + private native long initJPEGImageWriter(); + + /** Sets up native structures for output stream */ +- private native void setDest(long structPointer, +- ImageOutputStream ios); ++ private native void setDest(long structPointer); + + /** + * Returns <code>true</code> if the write was aborted. +@@ -1744,7 +1789,12 @@ public class JPEGImageWriter extends Ima + } + raster.setRect(sourceLine); + if ((y > 7) && (y%8 == 0)) { // Every 8 scanlines +- processImageProgress((float) y / (float) sourceHeight * 100.0F); ++ cbLock.lock(); ++ try { ++ processImageProgress((float) y / (float) sourceHeight * 100.0F); ++ } finally { ++ cbLock.unlock(); ++ } + } + } + +@@ -1769,6 +1819,25 @@ public class JPEGImageWriter extends Ima + disposeWriter(pData); + pData = 0; + } ++ } ++ } ++ ++ /** ++ * This method is called from native code in order to write encoder ++ * output to the destination. ++ * ++ * We block any attempt to change the writer state during this ++ * method, in order to prevent a corruption of the native encoder ++ * state. ++ */ ++ private void writeOutputData(byte[] data, int offset, int len) ++ throws IOException ++ { ++ cbLock.lock(); ++ try { ++ ios.write(data, offset, len); ++ } finally { ++ cbLock.unlock(); + } + } + +@@ -1806,4 +1875,34 @@ public class JPEGImageWriter extends Ima + theThread = null; + } + } ++ ++ private CallBackLock cbLock = new CallBackLock(); ++ ++ private static class CallBackLock { ++ ++ private State lockState; ++ ++ CallBackLock() { ++ lockState = State.Unlocked; ++ } ++ ++ void check() { ++ if (lockState != State.Unlocked) { ++ throw new IllegalStateException("Access to the writer is not allowed"); ++ } ++ } ++ ++ private void lock() { ++ lockState = State.Locked; ++ } ++ ++ private void unlock() { ++ lockState = State.Unlocked; ++ } ++ ++ private static enum State { ++ Unlocked, ++ Locked ++ } ++ } + } +diff --git openjdk/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c openjdk/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c +--- jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c ++++ jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c +@@ -66,7 +66,7 @@ static jmethodID JPEGImageReader_pushBac + static jmethodID JPEGImageReader_pushBackID; + static jmethodID JPEGImageReader_passStartedID; + static jmethodID JPEGImageReader_passCompleteID; +-static jmethodID ImageOutputStream_writeID; ++static jmethodID JPEGImageWriter_writeOutputDataID; + static jmethodID JPEGImageWriter_warningOccurredID; + static jmethodID JPEGImageWriter_warningWithMessageID; + static jmethodID JPEGImageWriter_writeMetadataID; +@@ -2290,7 +2290,7 @@ imageio_empty_output_buffer (j_compress_ + + (*env)->CallVoidMethod(env, + sb->stream, +- ImageOutputStream_writeID, ++ JPEGImageWriter_writeOutputDataID, + sb->hstreamBuffer, + 0, + sb->bufferLength); +@@ -2327,7 +2327,7 @@ imageio_term_destination (j_compress_ptr + + (*env)->CallVoidMethod(env, + sb->stream, +- ImageOutputStream_writeID, ++ JPEGImageWriter_writeOutputDataID, + sb->hstreamBuffer, + 0, + datacount); +@@ -2365,13 +2365,12 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm + Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initWriterIDs + (JNIEnv *env, + jclass cls, +- jclass IOSClass, + jclass qTableClass, + jclass huffClass) { + +- ImageOutputStream_writeID = (*env)->GetMethodID(env, +- IOSClass, +- "write", ++ JPEGImageWriter_writeOutputDataID = (*env)->GetMethodID(env, ++ cls, ++ "writeOutputData", + "([BII)V"); + + JPEGImageWriter_warningOccurredID = (*env)->GetMethodID(env, +@@ -2495,8 +2494,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm + Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_setDest + (JNIEnv *env, + jobject this, +- jlong ptr, +- jobject destination) { ++ jlong ptr) { + + imageIODataPtr data = (imageIODataPtr)jlong_to_ptr(ptr); + j_compress_ptr cinfo; +@@ -2510,7 +2508,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm + + cinfo = (j_compress_ptr) data->jpegObj; + +- imageio_set_stream(env, data->jpegObj, data, destination); ++ imageio_set_stream(env, data->jpegObj, data, this); + + + // Don't call the init method, as that depends on pinned arrays diff --git a/java/openjdk6/files/icedtea/security/20130416/8009063.patch b/java/openjdk6/files/icedtea/security/20130416/8009063.patch new file mode 100644 index 000000000000..a15331af4bbc --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8009063.patch @@ -0,0 +1,67 @@ +# HG changeset patch +# User chegar +# Date 1362305505 0 +# Node ID 98ad2f1e25d13aca196ad77b2f227f85072c9b16 +# Parent 17ac71e7b72087f0f7b7ac793ae93a816ef22d96 +8009063: Improve reliability of ConcurrentHashMap +Reviewed-by: alanb, ahgross + +diff --git a/src/share/classes/java/util/concurrent/ConcurrentHashMap.java b/src/share/classes/java/util/concurrent/ConcurrentHashMap.java +--- jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java ++++ jdk/src/share/classes/java/util/concurrent/ConcurrentHashMap.java +@@ -40,6 +40,7 @@ import java.io.IOException; + import java.io.IOException; + import java.io.ObjectInputStream; + import java.io.ObjectOutputStream; ++import java.io.ObjectStreamField; + + /** + * A hash table supporting full concurrency of retrievals and +@@ -1535,7 +1536,23 @@ public class ConcurrentHashMap<K, V> ext + @SuppressWarnings("unchecked") + private void readObject(java.io.ObjectInputStream s) + throws IOException, ClassNotFoundException { +- s.defaultReadObject(); ++ // Don't call defaultReadObject() ++ ObjectInputStream.GetField oisFields = s.readFields(); ++ final Segment<K,V>[] oisSegments = (Segment<K,V>[])oisFields.get("segments", null); ++ ++ final int ssize = oisSegments.length; ++ if (ssize < 1 || ssize > MAX_SEGMENTS ++ || (ssize & (ssize-1)) != 0 ) // ssize not power of two ++ throw new java.io.InvalidObjectException("Bad number of segments:" ++ + ssize); ++ int sshift = 0, ssizeTmp = ssize; ++ while (ssizeTmp > 1) { ++ ++sshift; ++ ssizeTmp >>>= 1; ++ } ++ UNSAFE.putIntVolatile(this, SEGSHIFT_OFFSET, 32 - sshift); ++ UNSAFE.putIntVolatile(this, SEGMASK_OFFSET, ssize - 1); ++ UNSAFE.putObjectVolatile(this, SEGMENTS_OFFSET, oisSegments); + + // set hashMask + UNSAFE.putIntVolatile(this, HASHSEED_OFFSET, randomHashSeed(this)); +@@ -1568,6 +1585,9 @@ public class ConcurrentHashMap<K, V> ext + private static final int SSHIFT; + private static final long TBASE; + private static final int TSHIFT; ++ private static final long SEGSHIFT_OFFSET; ++ private static final long SEGMASK_OFFSET; ++ private static final long SEGMENTS_OFFSET; + + static { + int ss, ts; +@@ -1581,6 +1601,12 @@ public class ConcurrentHashMap<K, V> ext + SBASE = UNSAFE.arrayBaseOffset(sc); + ts = UNSAFE.arrayIndexScale(tc); + ss = UNSAFE.arrayIndexScale(sc); ++ SEGSHIFT_OFFSET = UNSAFE.objectFieldOffset( ++ ConcurrentHashMap.class.getDeclaredField("segmentShift")); ++ SEGMASK_OFFSET = UNSAFE.objectFieldOffset( ++ ConcurrentHashMap.class.getDeclaredField("segmentMask")); ++ SEGMENTS_OFFSET = UNSAFE.objectFieldOffset( ++ ConcurrentHashMap.class.getDeclaredField("segments")); + } catch (Exception e) { + throw new Error(e); + } diff --git a/java/openjdk6/files/icedtea/security/20130416/8009305.patch b/java/openjdk6/files/icedtea/security/20130416/8009305.patch new file mode 100644 index 000000000000..d469d5748708 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8009305.patch @@ -0,0 +1,68 @@ +# HG changeset patch +# User dfuchs +# Date 1363278452 -3600 +# Node ID 31c782610044b0f04f981c2b97355804a1c57407 +# Parent 87bacc5ee8e430aadd200ae13a2d15fe9c8f4350 +8009305: Improve AWT data transfer +Reviewed-by: art, skoivu, smarks, ant + +diff --git openjdk/jdk/src/share/classes/sun/awt/datatransfer/TransferableProxy.java openjdk/jdk/src/share/classes/sun/awt/datatransfer/TransferableProxy.java +--- jdk/src/share/classes/sun/awt/datatransfer/TransferableProxy.java ++++ jdk/src/share/classes/sun/awt/datatransfer/TransferableProxy.java +@@ -102,11 +102,11 @@ public class TransferableProxy implement + protected final boolean isLocal; + } + +-class ClassLoaderObjectOutputStream extends ObjectOutputStream { ++final class ClassLoaderObjectOutputStream extends ObjectOutputStream { + private final Map<Set<String>, ClassLoader> map = + new HashMap<Set<String>, ClassLoader>(); + +- public ClassLoaderObjectOutputStream(OutputStream os) throws IOException { ++ ClassLoaderObjectOutputStream(OutputStream os) throws IOException { + super(os); + } + +@@ -140,15 +140,15 @@ class ClassLoaderObjectOutputStream exte + map.put(s, classLoader); + } + +- public Map<Set<String>, ClassLoader> getClassLoaderMap() { ++ Map<Set<String>, ClassLoader> getClassLoaderMap() { + return new HashMap(map); + } + } + +-class ClassLoaderObjectInputStream extends ObjectInputStream { ++final class ClassLoaderObjectInputStream extends ObjectInputStream { + private final Map<Set<String>, ClassLoader> map; + +- public ClassLoaderObjectInputStream(InputStream is, ++ ClassLoaderObjectInputStream(InputStream is, + Map<Set<String>, ClassLoader> map) + throws IOException { + super(is); +@@ -166,8 +166,11 @@ class ClassLoaderObjectInputStream exten + s.add(className); + + ClassLoader classLoader = map.get(s); +- +- return Class.forName(className, false, classLoader); ++ if (classLoader != null) { ++ return Class.forName(className, false, classLoader); ++ } else { ++ return super.resolveClass(classDesc); ++ } + } + + protected Class<?> resolveProxyClass(String[] interfaces) +@@ -179,6 +182,9 @@ class ClassLoaderObjectInputStream exten + } + + ClassLoader classLoader = map.get(s); ++ if (classLoader == null) { ++ return super.resolveProxyClass(interfaces); ++ } + + // The code below is mostly copied from the superclass. + ClassLoader nonPublicLoader = null; diff --git a/java/openjdk6/files/icedtea/security/20130416/8009699.patch b/java/openjdk6/files/icedtea/security/20130416/8009699.patch new file mode 100644 index 000000000000..f4a15a33693f --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8009699.patch @@ -0,0 +1,25 @@ +# HG changeset patch +# User andrew +# Date 1365790031 -3600 +# Node ID e95f24ac8e1e3c54e389b55c6992a8fc0266a698 +# Parent ef36be1ae9bc7d061721f8890797e5d89c901846 +8009699: Methodhandle lookup +Reviewed-by: ahgross, jrose, jdn + +diff --git a/src/share/vm/prims/methodHandles.cpp b/src/share/vm/prims/methodHandles.cpp +--- hotspot/src/share/vm/prims/methodHandles.cpp ++++ hotspot/src/share/vm/prims/methodHandles.cpp +@@ -536,6 +536,13 @@ + } + } + methodHandle m = result.resolved_method(); ++ KlassHandle mklass = m->method_holder(); ++ KlassHandle receiver_limit = result.resolved_klass(); ++ if (receiver_limit.is_null() || ++ // ignore passed-in limit; interfaces are interconvertible ++ receiver_limit->is_interface() && mklass->is_interface()) { ++ receiver_limit = mklass; ++ } + oop vmtarget = NULL; + int vmindex = methodOopDesc::nonvirtual_vtable_index; + if (defc->is_interface()) { diff --git a/java/openjdk6/files/icedtea/security/20130416/8009814.patch b/java/openjdk6/files/icedtea/security/20130416/8009814.patch new file mode 100644 index 000000000000..322b4c1f5f87 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8009814.patch @@ -0,0 +1,27 @@ +# HG changeset patch +# User lancea +# Date 1363442894 14400 +# Node ID a19614a3dabb1754f4e8b3f0eaf29053debce05f +# Parent 0cf73f53c7e1236286ea600d766a0651fdf9b660 +8009814: Better driver management +Reviewed-by: alanb, skoivu + +diff --git openjdk/jdk/src/share/classes/java/sql/DriverManager.java openjdk/jdk/src/share/classes/java/sql/DriverManager.java +--- jdk/src/share/classes/java/sql/DriverManager.java ++++ jdk/src/share/classes/java/sql/DriverManager.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -516,7 +516,7 @@ public class DriverManager { + */ + try{ + while(driversIterator.hasNext()) { +- println(" Loading done by the java.util.ServiceLoader : "+driversIterator.next()); ++ driversIterator.next(); + } + } catch(Throwable t) { + // Do nothing diff --git a/java/openjdk6/files/icedtea/security/20130416/8009857.patch b/java/openjdk6/files/icedtea/security/20130416/8009857.patch new file mode 100644 index 000000000000..7e042c905ba5 --- /dev/null +++ b/java/openjdk6/files/icedtea/security/20130416/8009857.patch @@ -0,0 +1,66 @@ +# HG changeset patch +# User smarks +# Date 1363655131 25200 +# Node ID 2899c3dbf5e8791b559c39a75a820c17c729c20f +# Parent b453d9be6b3f5496aa217ade7478d3b7fa32b13b +8009857: Problem with plugin +Reviewed-by: jdn, mchung + +diff --git openjdk/jdk/src/share/classes/sun/reflect/misc/MethodUtil.java openjdk/jdk/src/share/classes/sun/reflect/misc/MethodUtil.java +--- jdk/src/share/classes/sun/reflect/misc/MethodUtil.java ++++ jdk/src/share/classes/sun/reflect/misc/MethodUtil.java +@@ -50,8 +50,27 @@ import sun.security.util.SecurityConstan + + + class Trampoline { ++ static { ++ if (Trampoline.class.getClassLoader() == null) { ++ throw new Error( ++ "Trampoline must not be defined by the bootstrap classloader"); ++ } ++ } ++ ++ private static void ensureInvocableMethod(Method m) ++ throws InvocationTargetException ++ { ++ Class<?> clazz = m.getDeclaringClass(); ++ if (clazz.equals(AccessController.class) || ++ clazz.equals(Method.class)) ++ throw new InvocationTargetException( ++ new UnsupportedOperationException("invocation not supported")); ++ } ++ + private static Object invoke(Method m, Object obj, Object[] params) +- throws InvocationTargetException, IllegalAccessException { ++ throws InvocationTargetException, IllegalAccessException ++ { ++ ensureInvocableMethod(m); + return m.invoke(obj, params); + } + } +@@ -255,10 +275,6 @@ public final class MethodUtil extends Se + */ + public static Object invoke(Method m, Object obj, Object[] params) + throws InvocationTargetException, IllegalAccessException { +- if (m.getDeclaringClass().equals(AccessController.class) || +- m.getDeclaringClass().equals(Method.class)) +- throw new InvocationTargetException( +- new UnsupportedOperationException("invocation not supported")); + try { + return bounce.invoke(null, new Object[] {m, obj, params}); + } catch (InvocationTargetException ie) { +@@ -292,10 +307,10 @@ public final class MethodUtil extends Se + + types = new Class[] {Method.class, Object.class, Object[].class}; + b = t.getDeclaredMethod("invoke", types); +- ((AccessibleObject)b).setAccessible(true); +- return b; +- } +- }); ++ b.setAccessible(true); ++ return b; ++ } ++ }); + } catch (Exception e) { + throw new InternalError("bouncer cannot be found"); + } diff --git a/java/openjdk6/files/patch-set b/java/openjdk6/files/patch-set index 0fabe80c09e8..c7316fb811e1 100644 --- a/java/openjdk6/files/patch-set +++ b/java/openjdk6/files/patch-set @@ -8831,6 +8831,19 @@ // Forward declarations of classes defined here +--- jaxp/jaxp.properties ++++ jaxp/jaxp.properties +@@ -25,8 +25,8 @@ + + drops.master.copy.base=${drops.dir} + +-jaxp_src.bundle.name=jaxp144_04.zip +-jaxp_src.bundle.md5.checksum=0ace787aa12177d201947e8ba0ba9bdd ++jaxp_src.bundle.name=jaxp144_05.zip ++jaxp_src.bundle.md5.checksum=03be10db6ee87a8163316a87a3d3cba5 + jaxp_src.master.bundle.dir=${drops.master.copy.base} + jaxp_src.master.bundle.url.base=http://download.java.net/jaxp/openjdk/jdk6 + --- jdk/make/com/sun/java/pack/Makefile +++ jdk/make/com/sun/java/pack/Makefile @@ -61,6 +61,7 @@ |