diff --git a/mta-mono/vendor/mono/arch/amd64/amd64-codegen.h b/mta-mono/vendor/mono/arch/amd64/amd64-codegen.h index 3c40d9d..d3c1b42 100644 --- a/mta-mono/vendor/mono/arch/amd64/amd64-codegen.h +++ b/mta-mono/vendor/mono/arch/amd64/amd64-codegen.h @@ -1029,6 +1029,7 @@ typedef union { #define amd64_sse_andpd_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst),(dreg),(basereg), (disp), 0x66, 0x0f, 0x54) #define amd64_sse_movsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x10) +#define amd64_sse_movss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x10) #define amd64_sse_movsd_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst), (dreg), (basereg), (disp), 0xf2, 0x0f, 0x10) @@ -1039,14 +1040,17 @@ typedef union { #define amd64_sse_movss_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst), (dreg), (basereg), (disp), 0xf3, 0x0f, 0x10) #define amd64_sse_comisd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst),(dreg),(reg),0x66,0x0f,0x2f) +#define amd64_sse_comiss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst),(dreg),(reg),0x67,0x0f,0x2f) #define amd64_sse_comisd_reg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase ((inst), (dreg), (basereg), (disp), 0x66, 0x0f, 0x2f) #define amd64_sse_ucomisd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst),(dreg),(reg),0x66,0x0f,0x2e) #define amd64_sse_cvtsd2si_reg_reg(inst,dreg,reg) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf2, 0x0f, 0x2d, 8) +#define amd64_sse_cvtss2si_reg_reg(inst,dreg,reg) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf3, 0x0f, 0x2d, 8) #define amd64_sse_cvttsd2si_reg_reg_size(inst,dreg,reg,size) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf2, 0x0f, 0x2c, (size)) +#define amd64_sse_cvtss2si_reg_reg_size(inst,dreg,reg,size) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf3, 0x0f, 0x2c, (size)) #define amd64_sse_cvttsd2si_reg_reg(inst,dreg,reg) amd64_sse_cvttsd2si_reg_reg_size ((inst), (dreg), (reg), 8) @@ -1063,12 +1067,16 @@ typedef union { #define amd64_sse_cvtss2sd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x5a) #define amd64_sse_addsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x58) +#define amd64_sse_addss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x58) #define amd64_sse_subsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x5c) +#define amd64_sse_subss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x5c) #define amd64_sse_mulsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x59) +#define amd64_sse_mulss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x59) #define amd64_sse_divsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x5e) +#define amd64_sse_divss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x5e) #define amd64_sse_sqrtsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf2, 0x0f, 0x51) diff --git a/mta-mono/vendor/mono/arch/ppc/ppc-codegen.h b/mta-mono/vendor/mono/arch/ppc/ppc-codegen.h index 55b5060..d4d25a2 100644 --- a/mta-mono/vendor/mono/arch/ppc/ppc-codegen.h +++ b/mta-mono/vendor/mono/arch/ppc/ppc-codegen.h @@ -123,7 +123,7 @@ enum { PPC_TRAP_GE_UN = 16 + PPC_TRAP_EQ }; -#define ppc_emit32(c,x) do { *((guint32 *) (c)) = GUINT32_TO_BE (x); (c) = (gpointer)((guint8 *)(c) + sizeof (guint32));} while (0) +#define ppc_emit32(c,x) do { *((guint32 *) (c)) = (guint32) (x); (c) = (gpointer)((guint8 *)(c) + sizeof (guint32));} while (0) #define ppc_is_imm16(val) ((((val)>> 15) == 0) || (((val)>> 15) == -1)) #define ppc_is_uimm16(val) ((glong)(val) >= 0L && (glong)(val) <= 65535L) @@ -806,11 +806,15 @@ my and Ximian's copyright to this code. ;) } \ } G_STMT_END +#if _CALL_ELF == 2 +#define ppc_load_func(c,D,V) ppc_load_sequence ((c), (D), (V)) +#else #define ppc_load_func(c,D,v) G_STMT_START { \ - ppc_load_sequence ((c), ppc_r11, (guint64)(gsize)(v)); \ - ppc_ldptr ((c), ppc_r2, sizeof (gpointer), ppc_r11); \ - ppc_ldptr ((c), (D), 0, ppc_r11); \ + ppc_load_sequence ((c), ppc_r12, (guint64)(gsize)(v)); \ + ppc_ldptr ((c), ppc_r2, sizeof (gpointer), ppc_r12); \ + ppc_ldptr ((c), (D), 0, ppc_r12); \ } G_STMT_END +#endif #define ppc_load_multiple_regs(c,D,d,A) G_STMT_START { \ int __i, __o = (d); \ diff --git a/mta-mono/vendor/mono/arch/s390x/s390x-codegen.h b/mta-mono/vendor/mono/arch/s390x/s390x-codegen.h index 47e6564..ae4bcdd 100644 --- a/mta-mono/vendor/mono/arch/s390x/s390x-codegen.h +++ b/mta-mono/vendor/mono/arch/s390x/s390x-codegen.h @@ -921,6 +921,7 @@ typedef struct { #define s390_nill(c, r, v) S390_RI(c, 0xa57, r, v) #define s390_niy(c, b, d, v) S390_SIY(c, 0xeb54, b, d, v) #define s390_nop(c) S390_RR(c, 0x07, 0x0, 0) +#define s390_mem(c) S390_RR(c, 0x07, 0xe, 0) #define s390_nr(c, r1, r2) S390_RR(c, 0x14, r1, r2) #define s390_nrk(c, r1, r2) S390_RRF_1(c, 0xb9f4, r1, r2) #define s390_ny(c, r, x, b, d) S390_RRY(c, 0xe354, r1, r2) diff --git a/mta-mono/vendor/mono/arch/sparc/Makefile.am b/mta-mono/vendor/mono/arch/sparc/Makefile.am index a888904..272d0c5 100644 --- a/mta-mono/vendor/mono/arch/sparc/Makefile.am +++ b/mta-mono/vendor/mono/arch/sparc/Makefile.am @@ -1,7 +1,2 @@ - -AM_CPPFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir) - -noinst_LTLIBRARIES = libmonoarch-sparc.la - -libmonoarch_sparc_la_SOURCES = tramp.c sparc-codegen.h +EXTRA_DIST = sparc-codegen.h diff --git a/mta-mono/vendor/mono/arch/x86/x86-codegen.h b/mta-mono/vendor/mono/arch/x86/x86-codegen.h index ad6282f..ff3fe32 100644 --- a/mta-mono/vendor/mono/arch/x86/x86-codegen.h +++ b/mta-mono/vendor/mono/arch/x86/x86-codegen.h @@ -522,6 +522,14 @@ typedef union { #endif /* __native_client_codegen__ */ +#define x86_mfence(inst) \ + do { \ + x86_codegen_pre(&(inst), 3); \ + *(inst)++ = 0x0f; \ + *(inst)++ = 0xae; \ + *(inst)++ = 0xf0; \ + } while (0) + #define x86_rdtsc(inst) \ do { \ x86_codegen_pre(&(inst), 2); \ diff --git a/mta-mono/vendor/mono/dis/Makefile.am b/mta-mono/vendor/mono/dis/Makefile.am index 0a6e86d..6d6875b 100644 --- a/mta-mono/vendor/mono/dis/Makefile.am +++ b/mta-mono/vendor/mono/dis/Makefile.am @@ -4,18 +4,19 @@ if HOST_WIN32 export HOST_CC endif -if !SHARED_MONO -static_libs= \ - $(top_builddir)/mono/metadata/libmonoruntime-static.la \ +if SUPPORT_SGEN +metadata_lib=$(top_builddir)/mono/metadata/libmonoruntimesgen-static.la +else +metadata_lib=$(top_builddir)/mono/metadata/libmonoruntime-static.a +gc_lib=$(LIBGC_STATIC_LIBS) +endif + +runtime_lib= \ + $(metadata_lib) \ $(top_builddir)/mono/io-layer/libwapi.la \ $(top_builddir)/mono/utils/libmonoutils.la \ $(GLIB_LIBS) $(LIBICONV) \ - $(LIBGC_STATIC_LIBS) - -runtime_lib=../mini/$(LIBMONO_LA) $(static_libs) -else -runtime_lib=../mini/$(LIBMONO_LA) -endif + $(gc_lib) if DISABLE_EXECUTABLES bin_PROGRAMS = @@ -23,11 +24,9 @@ else if DISABLE_LIBRARIES bin_PROGRAMS = else -if SUPPORT_BOEHM bin_PROGRAMS = monodis endif endif -endif noinst_LIBRARIES = libmonodis.a @@ -51,11 +50,12 @@ monodis_LDADD = \ libmonodis.a \ $(runtime_lib) \ $(LLVM_LIBS) \ + $(LLVM_LDFLAGS) \ $(GLIB_LIBS) \ $(LIBICONV) if PLATFORM_DARWIN -monodis_LDFLAGS=-framework CoreFoundation +monodis_LDFLAGS=-framework CoreFoundation -framework Foundation endif man_MANS = monodis.1 diff --git a/mta-mono/vendor/mono/dis/dump.c b/mta-mono/vendor/mono/dis/dump.c index 391ec7f..3611603 100644 --- a/mta-mono/vendor/mono/dis/dump.c +++ b/mta-mono/vendor/mono/dis/dump.c @@ -598,7 +598,8 @@ dump_table_method (MonoImage *m) mono_metadata_decode_table_row (m, MONO_TABLE_METHOD, i - 1, cols, MONO_METHOD_SIZE); sigblob = mono_metadata_blob_heap (m, cols [MONO_METHOD_SIGNATURE]); mono_metadata_decode_blob_size (sigblob, &sigblob); - method = mono_metadata_parse_method_signature_full (m, method_container ? method_container : type_container, i, sigblob, &sigblob); + method = mono_metadata_parse_method_signature_full (m, method_container ? method_container : type_container, i, sigblob, &sigblob, &error); + g_assert (mono_error_ok (&error)); /*FIXME don't swallow the error message*/ sig = dis_stringify_method_signature (m, method, i, method_container ? method_container : type_container, FALSE); impl_flags = get_method_impl_flags (cols [MONO_METHOD_IMPLFLAGS]); fprintf (output, "%d: %s (param: %d impl_flags: %s)\n", i, sig, cols [MONO_METHOD_PARAMLIST], impl_flags); diff --git a/mta-mono/vendor/mono/dis/get.c b/mta-mono/vendor/mono/dis/get.c index a3f2e7b..c19cf04 100644 --- a/mta-mono/vendor/mono/dis/get.c +++ b/mta-mono/vendor/mono/dis/get.c @@ -215,14 +215,16 @@ get_typespec (MonoImage *m, guint32 idx, gboolean is_def, MonoGenericContainer * g_string_append (res, "*"); break; - case MONO_TYPE_FNPTR: - sig = mono_metadata_parse_method_signature_full (m, container, 0, ptr, &ptr); + case MONO_TYPE_FNPTR: { + MonoError error; + sig = mono_metadata_parse_method_signature_full (m, container, 0, ptr, &ptr, &error); + g_assert (mono_error_ok (&error)); /*FIXME don't swallow the error message*/ s = dis_stringify_function_ptr (m, sig); g_string_append (res, "method "); g_string_append (res, s); g_free (s); break; - + } case MONO_TYPE_ARRAY: ptr = get_type (m, ptr, &s, is_def, container); g_string_append (res, s); @@ -899,7 +901,8 @@ dis_stringify_method_signature_full (MonoImage *m, MonoMethodSignature *method, } mono_metadata_decode_blob_size (sig, &sig); - method = mono_metadata_parse_method_signature_full (m, container, methoddef_row, sig, &sig); + method = mono_metadata_parse_method_signature_full (m, container, methoddef_row, sig, &sig, &error); + g_assert (mono_error_ok (&error)); /*FIXME don't swallow the error message*/ free_method = 1; } diff --git a/mta-mono/vendor/mono/dis/main.c b/mta-mono/vendor/mono/dis/main.c index b56da24..e1fa7a1 100644 --- a/mta-mono/vendor/mono/dis/main.c +++ b/mta-mono/vendor/mono/dis/main.c @@ -836,6 +836,7 @@ dis_method_list (const char *klass_name, MonoImage *m, guint32 start, guint32 en } for (i = start; i < end; i++){ + MonoError error; MonoMethodSignature *ms; MonoGenericContainer *container; char *flags, *impl_flags; @@ -862,13 +863,14 @@ dis_method_list (const char *klass_name, MonoImage *m, guint32 start, guint32 en container = type_container; } - ms = mono_metadata_parse_method_signature_full (m, container, i + 1, sig, &sig); + ms = mono_metadata_parse_method_signature_full (m, container, i + 1, sig, &sig, &error); if (ms != NULL){ sig_str = dis_stringify_method_signature (m, ms, i + 1, container, FALSE); method_name = mono_metadata_string_heap (m, cols [MONO_METHOD_NAME]); } else { sig_str = NULL; method_name = g_strdup (""); + mono_error_cleanup (&error); } fprintf (output, " // method line %d\n", i + 1); diff --git a/mta-mono/vendor/mono/dis/tests/Changelog b/mta-mono/vendor/mono/dis/tests/Changelog new file mode 100644 index 0000000..664a1ce --- /dev/null +++ b/mta-mono/vendor/mono/dis/tests/Changelog @@ -0,0 +1,26 @@ +2006-01-25 Ankit Jain + + * ambiguous-gen-params.il: New test case for type/method with + ambiguous generic parameters. + +2006-01-16 Ankit Jain + + * gen-type.cs: New test case for handling a MemberRef with + a TypeSpec parent. + +2005-11-23 Ankit Jain + + * gen-cattr.cs: New test case for custom attributes on + type parameters. + +2005-11-15 Ankit Jain + + * test1.cs, test2.cs, test3.cs: New test cases for Bug #76671. + +2005-11-08 Ankit Jain + + * gen-dump-table.cs: New test case (for r52695). + +2005-10-28 Ankit Jain + + * gen-prop.cs: New test case (for r52316). diff --git a/mta-mono/vendor/mono/dis/tests/ambiguous-gen-params.il b/mta-mono/vendor/mono/dis/tests/ambiguous-gen-params.il new file mode 100644 index 0000000..808fac6 --- /dev/null +++ b/mta-mono/vendor/mono/dis/tests/ambiguous-gen-params.il @@ -0,0 +1,53 @@ +// Test for type/method having type parameters with identical names +// +// Roundtrip with ilasm2/monodis should yield same +// meth (!!0 _a1, !!1 _a2, !1 _t, !!B _b) + +.assembly extern mscorlib +{ + .ver 2:0:0:0 +} +.assembly 'ambiguous-gen-params' +{ + .custom instance void class [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( + 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx + 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. + + .ver 0:0:0:0 +} +.module 'ambiguous-gen-params.dll' + + + .class private auto ansi beforefieldinit g`1 + extends [mscorlib]System.Object + { + + .method public hidebysig specialname rtspecialname + instance default void .ctor () cil managed + { + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: call instance void object::.ctor() + IL_0006: ret + } + + .method public static hidebysig + default void meth (!!0 _a1, !!1 _a2, !1 _t, !!B _b) cil managed + { + ret + } + + .method public static hidebysig + default !!A foo (!!B _b, !1 _t, !!A _a) cil managed + { + .maxstack 1 + .locals init ( + !!A V_0) + IL_0000: ldloca.s 0 + IL_0002: initobj !!0 + IL_0008: ldloc.0 + IL_0009: ret + } + + } + diff --git a/mta-mono/vendor/mono/dis/tests/gen-cattr.cs b/mta-mono/vendor/mono/dis/tests/gen-cattr.cs new file mode 100644 index 0000000..adc7ef5 --- /dev/null +++ b/mta-mono/vendor/mono/dis/tests/gen-cattr.cs @@ -0,0 +1,17 @@ +/* Custom attributes for type parameters */ +using System; + +[AttributeUsage(AttributeTargets.GenericParameter)] +class GenParAttribute : Attribute { +} + +class cons <[GenPar] A> { + public void abc <[GenPar] M> () { + } +} + +class Test { + public static void Main () + { + } +} diff --git a/mta-mono/vendor/mono/dis/tests/gen-dump-method.cs b/mta-mono/vendor/mono/dis/tests/gen-dump-method.cs new file mode 100644 index 0000000..d49e323 --- /dev/null +++ b/mta-mono/vendor/mono/dis/tests/gen-dump-method.cs @@ -0,0 +1,21 @@ +//Test for dumping method table for generic types and generic methods +//monodis --method +class a +{ + void a_foo (U u) + { + } +} + +class g +{ + T foo2 (int i, T t) + { + return default (T); + } + + T foo (U u, int i) + { + return default (T); + } +} diff --git a/mta-mono/vendor/mono/dis/tests/gen-prop.cs b/mta-mono/vendor/mono/dis/tests/gen-prop.cs new file mode 100644 index 0000000..b6f9b70 --- /dev/null +++ b/mta-mono/vendor/mono/dis/tests/gen-prop.cs @@ -0,0 +1,7 @@ +//Property using a generic param +class g +{ + public T abc { + get { return default (T); } + } +} diff --git a/mta-mono/vendor/mono/dis/tests/gen-type.cs b/mta-mono/vendor/mono/dis/tests/gen-type.cs new file mode 100644 index 0000000..b3fdbbe --- /dev/null +++ b/mta-mono/vendor/mono/dis/tests/gen-type.cs @@ -0,0 +1,16 @@ +// Test for a MemberRef with a TypeSpec parent + +class g +{ + public void foo (A _a) + { + } +} + +class test { + public static void Main () + { + g _g = new g (); + _g.foo ("abc"); + } +} diff --git a/mta-mono/vendor/mono/dis/tests/test1.cs b/mta-mono/vendor/mono/dis/tests/test1.cs new file mode 100644 index 0000000..b28fe8b --- /dev/null +++ b/mta-mono/vendor/mono/dis/tests/test1.cs @@ -0,0 +1,23 @@ +/* Bug #76671 + Note: gmcs currently emits duplicate TypeSpecs, so this + case doesn't get exposed, so use csc compiled + assemblies till gmcs is fixed. +*/ + +class X { + public static void Xfoo () { + X.Xfoo(); + } +} + +class Y { + public static void Yfoo () { + X.Xfoo(); + } +} + +class Test { + static void Main () + { + } +} diff --git a/mta-mono/vendor/mono/dis/tests/test2.cs b/mta-mono/vendor/mono/dis/tests/test2.cs new file mode 100644 index 0000000..0d19757 --- /dev/null +++ b/mta-mono/vendor/mono/dis/tests/test2.cs @@ -0,0 +1,50 @@ +/* Bug #76671 + Note: gmcs currently emits duplicate TypeSpecs, so this + case doesn't get exposed, so use csc compiled + assemblies till gmcs is fixed. + + Array of type params +*/ +using System; + +class list { + public static void bar () + { + gen.foo (); + gen.foo (); + gen.foo (); + gen.foo (); + } +} + +class list_two { + public static void bar () + { + gen.foo (); + gen.foo (); + gen.foo (); + gen.foo (); + } +} + +class list_three { + public static void bar () + { + gen.foo (); + gen.foo (); + gen.foo (); + gen.foo (); + } +} + +class gen { + public static void foo () + { + } +} + +class Test { + public static void Main () + { + } +} diff --git a/mta-mono/vendor/mono/dis/tests/test3.cs b/mta-mono/vendor/mono/dis/tests/test3.cs new file mode 100644 index 0000000..3a6a07e --- /dev/null +++ b/mta-mono/vendor/mono/dis/tests/test3.cs @@ -0,0 +1,25 @@ +/* Bug #76671 + Note: gmcs currently emits duplicate TypeSpecs, so this + case doesn't get exposed, so use csc compiled + assemblies till gmcs is fixed. +*/ + +using System; + +class X { + public static void Xfoo () { + Console.WriteLine (typeof (T1).ToString ()); + } +} + +class Y { + public static void Yfoo () { + Console.WriteLine (typeof (T2).ToString ()); + } +} + +class Test { + static void Main () + { + } +} diff --git a/mta-mono/vendor/mono/io-layer/Makefile.am b/mta-mono/vendor/mono/io-layer/Makefile.am index 6400122..bca6a11 100644 --- a/mta-mono/vendor/mono/io-layer/Makefile.am +++ b/mta-mono/vendor/mono/io-layer/Makefile.am @@ -5,7 +5,8 @@ AM_CPPFLAGS = \ $(GLIB_CFLAGS) \ $(LIBGC_CPPFLAGS) \ -DMONO_BINDIR=\""$(bindir)"\" \ - -I$(top_srcdir) + -I$(top_srcdir) \ + $(SHARED_CFLAGS) libwapiincludedir = $(includedir)/mono-$(API_VER)/mono/io-layer @@ -34,7 +35,8 @@ OTHER_H = \ uglify.h \ versioninfo.h \ wait.h \ - wapi.h + wapi.h \ + wapi-remap.h OTHER_SRC = \ access.h \ diff --git a/mta-mono/vendor/mono/io-layer/collection.c b/mta-mono/vendor/mono/io-layer/collection.c index a42bbad..e731590 100644 --- a/mta-mono/vendor/mono/io-layer/collection.c +++ b/mta-mono/vendor/mono/io-layer/collection.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include diff --git a/mta-mono/vendor/mono/io-layer/handles-private.h b/mta-mono/vendor/mono/io-layer/handles-private.h index c3f815c..c938f9e 100644 --- a/mta-mono/vendor/mono/io-layer/handles-private.h +++ b/mta-mono/vendor/mono/io-layer/handles-private.h @@ -84,7 +84,7 @@ extern int _wapi_handle_timedwait_signal (struct timespec *timeout, gboolean pol extern int _wapi_handle_wait_signal_handle (gpointer handle, gboolean alertable); extern int _wapi_handle_timedwait_signal_handle (gpointer handle, struct timespec *timeout, gboolean alertable, gboolean poll); -extern gboolean _wapi_handle_get_or_set_share (dev_t device, ino_t inode, +extern gboolean _wapi_handle_get_or_set_share (guint64 device, guint64 inode, guint32 new_sharemode, guint32 new_access, guint32 *old_sharemode, diff --git a/mta-mono/vendor/mono/io-layer/handles.c b/mta-mono/vendor/mono/io-layer/handles.c index 3173399..ac06405 100644 --- a/mta-mono/vendor/mono/io-layer/handles.c +++ b/mta-mono/vendor/mono/io-layer/handles.c @@ -13,7 +13,9 @@ #include #include #include +#ifdef HAVE_SIGNAL_H #include +#endif #include #include #ifdef HAVE_SYS_SOCKET_H @@ -220,16 +222,7 @@ static void handle_cleanup (void) int wapi_getdtablesize (void) { -#ifdef HAVE_GETRLIMIT - struct rlimit limit; - int res; - - res = getrlimit (RLIMIT_NOFILE, &limit); - g_assert (res == 0); - return limit.rlim_cur; -#else - return getdtablesize (); -#endif + return eg_getdtablesize (); } /* @@ -286,13 +279,6 @@ wapi_init (void) _wapi_global_signal_mutex = &_WAPI_PRIVATE_HANDLES (GPOINTER_TO_UINT (_wapi_global_signal_handle)).signal_mutex; wapi_processes_init (); - - /* Using atexit here instead of an explicit function call in - * a cleanup routine lets us cope when a third-party library - * calls exit (eg if an X client loses the connection to its - * server.) - */ - mono_atexit (handle_cleanup); } void @@ -305,6 +291,7 @@ wapi_cleanup (void) _wapi_error_cleanup (); _wapi_thread_cleanup (); wapi_processes_cleanup (); + handle_cleanup (); } static void _wapi_handle_init_shared (struct _WapiHandleShared *handle, @@ -1652,7 +1639,7 @@ wapi_share_info_hash (gconstpointer data) return s->inode; } -gboolean _wapi_handle_get_or_set_share (dev_t device, ino_t inode, +gboolean _wapi_handle_get_or_set_share (guint64 device, guint64 inode, guint32 new_sharemode, guint32 new_access, guint32 *old_sharemode, @@ -1819,8 +1806,6 @@ static void _wapi_handle_check_share_by_pid (struct _WapiFileShare *share_info) void _wapi_handle_check_share (struct _WapiFileShare *share_info, int fd) { gboolean found = FALSE, proc_fds = FALSE; - pid_t self = _wapi_getpid (); - int pid; int thr_ret, i; /* Prevents entries from expiring under us if we remove this diff --git a/mta-mono/vendor/mono/io-layer/io.c b/mta-mono/vendor/mono/io-layer/io.c index 03672d4..5bf6f40 100644 --- a/mta-mono/vendor/mono/io-layer/io.c +++ b/mta-mono/vendor/mono/io-layer/io.c @@ -27,8 +27,6 @@ #include #endif #include -#include -#include #include #include #ifdef __linux__ @@ -1035,8 +1033,9 @@ static void console_close (gpointer handle, gpointer data) DEBUG("%s: closing console handle %p", __func__, handle); g_free (console_handle->filename); - - close (fd); + + if (fd > 2) + close (fd); } static WapiFileType console_getfiletype(void) diff --git a/mta-mono/vendor/mono/io-layer/process-private.h b/mta-mono/vendor/mono/io-layer/process-private.h index 1da7f47..a379c1d 100644 --- a/mta-mono/vendor/mono/io-layer/process-private.h +++ b/mta-mono/vendor/mono/io-layer/process-private.h @@ -50,6 +50,7 @@ struct MonoProcess { * the process has exited, so that the information there isn't lost. */ gpointer handle; + gboolean freeable; struct MonoProcess *next; }; diff --git a/mta-mono/vendor/mono/io-layer/processes.c b/mta-mono/vendor/mono/io-layer/processes.c index 3c0531f..faf19bd 100644 --- a/mta-mono/vendor/mono/io-layer/processes.c +++ b/mta-mono/vendor/mono/io-layer/processes.c @@ -19,20 +19,31 @@ #include #include #include +#ifdef HAVE_SIGNAL_H #include -#include +#endif #include -#include #include #ifdef HAVE_SYS_PARAM_H #include #endif #include +#ifdef HAVE_SYS_WAIT_H +#include +#endif +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif + #ifdef HAVE_SYS_MKDEV_H #include #endif +#ifdef HAVE_UTIME_H +#include +#endif + /* sys/resource.h (for rusage) is required when using osx 10.3 (but not 10.4) */ #ifdef __APPLE__ #include @@ -81,7 +92,7 @@ #include /* The process' environment strings */ -#if defined(__APPLE__) && !defined (__arm__) +#if defined(__APPLE__) && !defined (__arm__) && !defined (__aarch64__) /* Apple defines this in crt_externs.h but doesn't provide that header for * arm-apple-darwin9. We'll manually define the symbol on Apple as it does * in fact exist on all implementations (so far) @@ -137,7 +148,6 @@ static void process_add_sigchld_handler (void); * signal handler) */ static struct MonoProcess *mono_processes = NULL; -static volatile gint32 mono_processes_read_lock = 0; static volatile gint32 mono_processes_cleaning_up = 0; static mono_mutex_t mono_processes_mutex; static void mono_processes_cleanup (void); @@ -489,6 +499,21 @@ CreateProcessWithLogonW (const gunichar2 *username, return CreateProcess (appname, cmdline, NULL, NULL, FALSE, create_flags, env, cwd, startup, process_info); } +static gboolean +is_readable_or_executable (const char *prog) +{ + struct stat buf; + int a = access (prog, R_OK); + int b = access (prog, X_OK); + if (a != 0 && b != 0) + return FALSE; + if (stat (prog, &buf)) + return FALSE; + if (S_ISREG (buf.st_mode)) + return TRUE; + return FALSE; +} + static gboolean is_executable (const char *prog) { @@ -621,7 +646,7 @@ gboolean CreateProcess (const gunichar2 *appname, const gunichar2 *cmdline, prog = g_strdup (unquoted); /* Executable existing ? */ - if (!is_executable (prog)) { + if (!is_readable_or_executable (prog)) { DEBUG ("%s: Couldn't find executable %s", __func__, prog); g_free (unquoted); @@ -637,8 +662,8 @@ gboolean CreateProcess (const gunichar2 *appname, const gunichar2 *cmdline, prog = g_strdup_printf ("%s/%s", curdir, unquoted); g_free (curdir); - /* And make sure it's executable */ - if (!is_executable (prog)) { + /* And make sure it's readable */ + if (!is_readable_or_executable (prog)) { DEBUG ("%s: Couldn't find executable %s", __func__, prog); g_free (unquoted); @@ -729,7 +754,7 @@ gboolean CreateProcess (const gunichar2 *appname, const gunichar2 *cmdline, prog = g_strdup (token); /* Executable existing ? */ - if (!is_executable (prog)) { + if (!is_readable_or_executable (prog)) { DEBUG ("%s: Couldn't find executable %s", __func__, token); g_free (token); @@ -750,8 +775,10 @@ gboolean CreateProcess (const gunichar2 *appname, const gunichar2 *cmdline, /* I assume X_OK is the criterion to use, * rather than F_OK + * + * X_OK is too strict *if* the target is a CLR binary */ - if (!is_executable (prog)) { + if (!is_readable_or_executable (prog)) { g_free (prog); prog = g_find_program_in_path (token); if (prog == NULL) { @@ -808,6 +835,13 @@ gboolean CreateProcess (const gunichar2 *appname, const gunichar2 *cmdline, goto free_strings; } } + } else { + if (!is_executable (prog)) { + DEBUG ("%s: Executable permisson not set on %s", __func__, prog); + g_free (prog); + SetLastError (ERROR_ACCESS_DENIED); + goto free_strings; + } } if (args_after_prog != NULL && *args_after_prog) { @@ -1240,7 +1274,12 @@ GetExitCodeProcess (gpointer process, guint32 *code) return FALSE; } - + + if (process_handle->id == _wapi_getpid ()) { + *code = STILL_ACTIVE; + return TRUE; + } + /* A process handle is only signalled if the process has exited * and has been waited for */ @@ -1317,8 +1356,8 @@ typedef struct gpointer address_end; char *perms; gpointer address_offset; - dev_t device; - ino_t inode; + guint64 device; + guint64 inode; char *filename; } WapiProcModule; @@ -1387,7 +1426,7 @@ static GSList *load_modules (void) mod->perms = g_strdup ("r--p"); mod->address_offset = 0; mod->device = makedev (0, 0); - mod->inode = (ino_t) i; + mod->inode = i; mod->filename = g_strdup (name); if (g_slist_find_custom (ret, mod, find_procmodule) == NULL) { @@ -1439,7 +1478,7 @@ static GSList *load_modules (void) info->dlpi_phdr[info->dlpi_phnum - 1].p_vaddr); mod->perms = g_strdup ("r--p"); mod->address_offset = 0; - mod->inode = (ino_t) i; + mod->inode = i; mod->filename = g_strdup (info->dlpi_name); DEBUG ("%s: inode=%d, filename=%s, address_start=%p, address_end=%p", __func__, @@ -1501,8 +1540,8 @@ static GSList *load_modules (FILE *fp) char *maj_dev_start, *min_dev_start, *inode_start, prot_buf[5]; gpointer address_start, address_end, address_offset; guint32 maj_dev, min_dev; - ino_t inode; - dev_t device; + guint64 inode; + guint64 device; while (fgets (buf, sizeof(buf), fp)) { p = buf; @@ -1575,7 +1614,7 @@ static GSList *load_modules (FILE *fp) if (!g_ascii_isxdigit (*inode_start)) { continue; } - inode = (ino_t)strtol (inode_start, &endp, 10); + inode = (guint64)strtol (inode_start, &endp, 10); p = endp; if (!g_ascii_isspace (*p)) { continue; @@ -2395,9 +2434,9 @@ mono_processes_cleanup (void) { struct MonoProcess *mp; struct MonoProcess *prev = NULL; - struct MonoProcess *candidate = NULL; + GSList *finished = NULL; + GSList *l; gpointer unref_handle; - int spin; DEBUG ("%s", __func__); @@ -2405,9 +2444,8 @@ mono_processes_cleanup (void) if (InterlockedCompareExchange (&mono_processes_cleaning_up, 1, 0) != 0) return; - mp = mono_processes; - while (mp != NULL) { - if (mp->pid == 0 && mp->handle != NULL) { + for (mp = mono_processes; mp; mp = mp->next) { + if (mp->pid == 0 && mp->handle) { /* This process has exited and we need to remove the artifical ref * on the handle */ mono_mutex_lock (&mono_processes_mutex); @@ -2416,9 +2454,7 @@ mono_processes_cleanup (void) mono_mutex_unlock (&mono_processes_mutex); if (unref_handle) _wapi_handle_unref (unref_handle); - continue; } - mp = mp->next; } /* @@ -2427,63 +2463,45 @@ mono_processes_cleanup (void) * asynchronously. The handler requires that the mono_processes list * remain valid. */ - mp = mono_processes; - spin = 0; - while (mp != NULL) { - if ((mp->handle_count == 0 && mp->pid == 0) || candidate != NULL) { - if (spin > 0) { - _wapi_handle_spin (spin); - spin <<= 1; - } + mono_mutex_lock (&mono_processes_mutex); - /* We've found a candidate */ - mono_mutex_lock (&mono_processes_mutex); + mp = mono_processes; + while (mp) { + if (mp->handle_count == 0 && mp->freeable) { /* + * Unlink the entry. * This code can run parallel with the sigchld handler, but the * modifications it makes are safe. */ - if (candidate == NULL) { - /* unlink it */ - if (mp == mono_processes) { - mono_processes = mp->next; - } else { - prev->next = mp->next; - } - candidate = mp; - } + if (mp == mono_processes) + mono_processes = mp->next; + else + prev->next = mp->next; + finished = g_slist_prepend (finished, mp); - /* It's still safe to traverse the structure.*/ - mono_memory_barrier (); - - if (mono_processes_read_lock != 0) { - /* The sigchld handler is watching us. Spin a bit and try again */ - if (spin == 0) { - spin = 1; - } else if (spin >= 8) { - /* Just give up for now */ - mono_mutex_unlock (&mono_processes_mutex); - break; - } - } else { - /* We've modified the list of processes, and we know the sigchld handler - * isn't executing, so even if it executes at any moment, it'll see the - * new version of the list. So now we can free the candidate. */ - DEBUG ("%s: freeing candidate %p", __func__, candidate); - mp = candidate->next; - MONO_SEM_DESTROY (&candidate->exit_sem); - g_free (candidate); - candidate = NULL; - } - - mono_mutex_unlock (&mono_processes_mutex); - - continue; + mp = mp->next; + } else { + prev = mp; + mp = mp->next; } - spin = 0; - prev = mp; - mp = mp->next; } + mono_memory_barrier (); + + for (l = finished; l; l = l->next) { + /* + * All the entries in the finished list are unlinked from mono_processes, and + * they have the 'finished' flag set, which means the sigchld handler is done + * accessing them. + */ + mp = l->data; + MONO_SEM_DESTROY (&mp->exit_sem); + g_free (mp); + } + g_slist_free (finished); + + mono_mutex_unlock (&mono_processes_mutex); + DEBUG ("%s done", __func__); InterlockedDecrement (&mono_processes_cleaning_up); @@ -2513,8 +2531,6 @@ MONO_SIGNAL_HANDLER_FUNC (static, mono_sigchld_signal_handler, (int _dummy, sigi DEBUG ("SIG CHILD handler for pid: %i\n", info->si_pid); - InterlockedIncrement (&mono_processes_read_lock); - do { do { pid = waitpid (-1, &status, WNOHANG); @@ -2524,20 +2540,25 @@ MONO_SIGNAL_HANDLER_FUNC (static, mono_sigchld_signal_handler, (int _dummy, sigi break; DEBUG ("child ended: %i", pid); - p = mono_processes; - while (p != NULL) { + + /* + * This can run concurrently with the code in the rest of this module. + */ + for (p = mono_processes; p; p = p->next) { if (p->pid == pid) { - p->pid = 0; /* this pid doesn't exist anymore, clear it */ - p->status = status; - MONO_SEM_POST (&p->exit_sem); break; } - p = p->next; + } + if (p) { + p->pid = 0; /* this pid doesn't exist anymore, clear it */ + p->status = status; + MONO_SEM_POST (&p->exit_sem); + mono_memory_barrier (); + /* Mark this as freeable, the pointer becomes invalid afterwards */ + p->freeable = TRUE; } } while (1); - InterlockedDecrement (&mono_processes_read_lock); - DEBUG ("SIG CHILD handler: done looping."); } diff --git a/mta-mono/vendor/mono/io-layer/socket-wrappers.h b/mta-mono/vendor/mono/io-layer/socket-wrappers.h index b6700f3..a532ce9 100644 --- a/mta-mono/vendor/mono/io-layer/socket-wrappers.h +++ b/mta-mono/vendor/mono/io-layer/socket-wrappers.h @@ -35,7 +35,6 @@ #define _wapi_setsockopt setsockopt #define _wapi_shutdown shutdown #define _wapi_socket WSASocket -#define _wapi_gethostbyname gethostbyname #define _wapi_select select /* No need to wrap FD_ZERO because it doesnt involve file @@ -45,6 +44,7 @@ #define _wapi_FD_ISSET FD_ISSET #define _wapi_FD_SET FD_SET +#define _wapi_cleanup_networking() ; #else #define WSA_FLAG_OVERLAPPED 0x01 @@ -76,7 +76,6 @@ extern int _wapi_setsockopt(guint32 handle, int level, int optname, extern int _wapi_shutdown(guint32 handle, int how); extern guint32 _wapi_socket(int domain, int type, int protocol, void *unused, guint32 unused2, guint32 flags); -extern struct hostent *_wapi_gethostbyname(const char *hostname); #ifdef HAVE_SYS_SELECT_H extern int _wapi_select(int nfds, fd_set *readfds, fd_set *writefds, @@ -87,5 +86,6 @@ extern int _wapi_FD_ISSET(guint32 handle, fd_set *set); extern void _wapi_FD_SET(guint32 handle, fd_set *set); #endif +extern void _wapi_cleanup_networking (void); #endif /* HOST_WIN32 */ diff --git a/mta-mono/vendor/mono/io-layer/sockets.c b/mta-mono/vendor/mono/io-layer/sockets.c index 6f8fdd5..ac03899 100644 --- a/mta-mono/vendor/mono/io-layer/sockets.c +++ b/mta-mono/vendor/mono/io-layer/sockets.c @@ -45,11 +45,13 @@ #include #include -#include #include #ifdef HAVE_SYS_SENDFILE_H #include #endif +#ifdef HAVE_NETDB_H +#include +#endif #if 0 #define DEBUG(...) g_message(__VA_ARGS__) @@ -57,7 +59,6 @@ #define DEBUG(...) #endif -static guint32 startup_count=0; static guint32 in_cleanup = 0; static void socket_close (gpointer handle, gpointer data); @@ -85,11 +86,6 @@ static void socket_close (gpointer handle, gpointer data) DEBUG ("%s: closing socket handle %p", __func__, handle); - if (startup_count == 0 && !in_cleanup) { - WSASetLastError (WSANOTINITIALISED); - return; - } - /* Shutdown the socket for reading, to interrupt any potential * receives that may be blocking for data. See bug 75705. */ @@ -112,33 +108,6 @@ static void socket_close (gpointer handle, gpointer data) socket_handle->saved_error = 0; } -int WSAStartup(guint32 requested, WapiWSAData *data) -{ - if (data == NULL) { - return(WSAEFAULT); - } - - /* Insist on v2.0+ */ - if (requested < MAKEWORD(2,0)) { - return(WSAVERNOTSUPPORTED); - } - - startup_count++; - - /* I've no idea what is the minor version of the spec I read */ - data->wHighVersion = MAKEWORD(2,2); - - data->wVersion = requested < data->wHighVersion? requested: - data->wHighVersion; - - DEBUG ("%s: high version 0x%x", __func__, data->wHighVersion); - - strncpy (data->szDescription, "WAPI", WSADESCRIPTION_LEN); - strncpy (data->szSystemStatus, "groovy", WSASYS_STATUS_LEN); - - return(0); -} - static gboolean cleanup_close (gpointer handle, gpointer data) { @@ -146,19 +115,13 @@ cleanup_close (gpointer handle, gpointer data) return TRUE; } -int WSACleanup(void) +void _wapi_cleanup_networking(void) { DEBUG ("%s: cleaning up", __func__); - if (--startup_count) { - /* Do nothing */ - return(0); - } - in_cleanup = 1; _wapi_handle_foreach (WAPI_HANDLE_SOCKET, cleanup_close, NULL); in_cleanup = 0; - return(0); } void WSASetLastError(int error) @@ -192,11 +155,6 @@ guint32 _wapi_accept(guint32 fd, struct sockaddr *addr, socklen_t *addrlen) struct _WapiHandle_socket new_socket_handle = {0}; gboolean ok; int new_fd; - - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(INVALID_SOCKET); - } if (addr != NULL && *addrlen < sizeof(struct sockaddr)) { WSASetLastError (WSAEFAULT); @@ -266,11 +224,6 @@ int _wapi_bind(guint32 fd, struct sockaddr *my_addr, socklen_t addrlen) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -296,11 +249,6 @@ int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, gboolean ok; gint errnum; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -346,7 +294,7 @@ int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, } fds.fd = fd; - fds.events = POLLOUT; + fds.events = MONO_POLLOUT; while (mono_poll (&fds, 1, -1) == -1 && !_wapi_thread_cur_apc_pending ()) { if (errno != EINTR) { @@ -400,11 +348,6 @@ int _wapi_getpeername(guint32 fd, struct sockaddr *name, socklen_t *namelen) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -430,11 +373,6 @@ int _wapi_getsockname(guint32 fd, struct sockaddr *name, socklen_t *namelen) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -465,11 +403,6 @@ int _wapi_getsockopt(guint32 fd, int level, int optname, void *optval, struct _WapiHandle_socket *socket_handle; gboolean ok; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -529,11 +462,6 @@ int _wapi_listen(guint32 fd, int backlog) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -566,11 +494,6 @@ int _wapi_recvfrom(guint32 fd, void *buf, size_t len, int recv_flags, gboolean ok; int ret; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -628,11 +551,6 @@ _wapi_recvmsg(guint32 fd, struct msghdr *msg, int recv_flags) gboolean ok; int ret; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -670,11 +588,6 @@ int _wapi_send(guint32 fd, const void *msg, size_t len, int send_flags) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -712,11 +625,6 @@ int _wapi_sendto(guint32 fd, const void *msg, size_t len, int send_flags, gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -745,11 +653,6 @@ _wapi_sendmsg(guint32 fd, const struct msghdr *msg, int send_flags) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -784,11 +687,6 @@ int _wapi_setsockopt(guint32 fd, int level, int optname, #endif struct timeval tv; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -850,12 +748,7 @@ int _wapi_shutdown(guint32 fd, int how) gboolean ok; gpointer handle = GUINT_TO_POINTER (fd); int ret; - - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - + if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -980,45 +873,6 @@ guint32 _wapi_socket(int domain, int type, int protocol, void *unused, return(fd); } -struct hostent *_wapi_gethostbyname(const char *hostname) -{ - struct hostent *he; - - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(NULL); - } - - he = gethostbyname (hostname); - if (he == NULL) { - DEBUG ("%s: gethostbyname error: %s", __func__, - strerror (h_errno)); - - switch(h_errno) { - case HOST_NOT_FOUND: - WSASetLastError (WSAHOST_NOT_FOUND); - break; -#if NO_ADDRESS != NO_DATA - case NO_ADDRESS: -#endif - case NO_DATA: - WSASetLastError (WSANO_DATA); - break; - case NO_RECOVERY: - WSASetLastError (WSANO_RECOVERY); - break; - case TRY_AGAIN: - WSASetLastError (WSATRY_AGAIN); - break; - default: - g_warning ("%s: Need to translate %d into winsock error", __func__, h_errno); - break; - } - } - - return(he); -} - static gboolean socket_disconnect (guint32 fd) { struct _WapiHandle_socket *socket_handle; @@ -1164,12 +1018,7 @@ TransmitFile (guint32 socket, gpointer file, guint32 bytes_to_write, guint32 byt { gpointer sock = GUINT_TO_POINTER (socket); gint ret; - - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return FALSE; - } - + if (_wapi_handle_type (sock) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return FALSE; @@ -1219,11 +1068,6 @@ WSAIoctl (guint32 fd, gint32 command, int ret; gchar *buffer = NULL; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return SOCKET_ERROR; @@ -1362,11 +1206,6 @@ int ioctlsocket(guint32 fd, gint32 command, gpointer arg) gpointer handle = GUINT_TO_POINTER (fd); int ret; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) { WSASetLastError (WSAENOTSOCK); return(SOCKET_ERROR); @@ -1439,11 +1278,6 @@ int _wapi_select(int nfds G_GNUC_UNUSED, fd_set *readfds, fd_set *writefds, { int ret, maxfd; - if (startup_count == 0) { - WSASetLastError (WSANOTINITIALISED); - return(SOCKET_ERROR); - } - for (maxfd = FD_SETSIZE-1; maxfd >= 0; maxfd--) { if ((readfds && FD_ISSET (maxfd, readfds)) || (writefds && FD_ISSET (maxfd, writefds)) || diff --git a/mta-mono/vendor/mono/io-layer/sockets.h b/mta-mono/vendor/mono/io-layer/sockets.h index 45490b0..39668ae 100644 --- a/mta-mono/vendor/mono/io-layer/sockets.h +++ b/mta-mono/vendor/mono/io-layer/sockets.h @@ -78,9 +78,6 @@ typedef gboolean (*WapiTransmitFileFn)(guint32, gpointer, guint32, guint32, WapiTransmitFileBuffers *, WapiTransmitFileFlags); - -extern int WSAStartup(guint32 requested, WapiWSAData *data); -extern int WSACleanup(void); extern void WSASetLastError(int error); extern int WSAGetLastError(void); extern int closesocket(guint32 handle); diff --git a/mta-mono/vendor/mono/io-layer/wapi-private.h b/mta-mono/vendor/mono/io-layer/wapi-private.h index 34de2f0..ee228b0 100644 --- a/mta-mono/vendor/mono/io-layer/wapi-private.h +++ b/mta-mono/vendor/mono/io-layer/wapi-private.h @@ -178,8 +178,8 @@ struct _WapiFileShare #ifdef WAPI_FILE_SHARE_PLATFORM_EXTRA_DATA WAPI_FILE_SHARE_PLATFORM_EXTRA_DATA #endif - dev_t device; - ino_t inode; + guint64 device; + guint64 inode; pid_t opened_by_pid; guint32 sharemode; guint32 access; diff --git a/mta-mono/vendor/mono/io-layer/wapi-remap.h b/mta-mono/vendor/mono/io-layer/wapi-remap.h new file mode 100644 index 0000000..6b4467a --- /dev/null +++ b/mta-mono/vendor/mono/io-layer/wapi-remap.h @@ -0,0 +1,107 @@ +/* + * wapi-remap.h: io-layer symbol remapping support + * + * (C) 2014 Xamarin, Inc. + */ + +#ifndef __WAPI_REMAP_H__ +#define __WAPI_REMAP_H__ + +/* + * The windows function names used by the io-layer can collide with symbols in system and 3rd party libs, esp. on osx/ios. So remap them to + * wapi_. + */ + +#define GetThreadContext wapi_GetThreadContext +#define CreateEvent wapi_CreateEvent +#define PulseEvent wapi_PulseEvent +#define ResetEvent wapi_ResetEvent +#define SetEvent wapi_SetEvent +#define OpenEvent wapi_OpenEvent +#define CloseHandle wapi_CloseHandle +#define DuplicateHandle wapi_DuplicateHandle +#define CreateFile wapi_CreateFile +#define DeleteFile wapi_DeleteFile +#define GetStdHandle wapi_GetStdHandle +#define ReadFile wapi_ReadFile +#define WriteFile wapi_WriteFile +#define FlushFileBuffers wapi_FlushFileBuffers +#define SetEndOfFile wapi_SetEndOfFile +#define SetFilePointer wapi_SetFilePointer +#define GetFileType wapi_GetFileType +#define GetFileSize wapi_GetFileSize +#define GetFileTime wapi_GetFileTime +#define SetFileTime wapi_SetFileTime +#define FileTimeToSystemTime wapi_FileTimeToSystemTime +#define FindFirstFile wapi_FindFirstFile +#define FindNextFile wapi_FindNextFile +#define FindClose wapi_FindClose +#define CreateDirectory wapi_CreateDirectory +#define RemoveDirectory wapi_RemoveDirectory +#define MoveFile wapi_MoveFile +#define CopyFile wapi_CopyFile +#define ReplaceFile wapi_ReplaceFile +#define GetFileAttributes wapi_GetFileAttributes +#define GetFileAttributesEx wapi_GetFileAttributesEx +#define SetFileAttributes wapi_SetFileAttributes +#define GetCurrentDirectory wapi_GetCurrentDirectory +#define SetCurrentDirectory wapi_SetCurrentDirectory +#define CreatePipe wapi_CreatePipe +#define GetTempPath wapi_GetTempPath +#define GetLogicalDriveStrings wapi_GetLogicalDriveStrings +#define GetDiskFreeSpaceEx wapi_GetDiskFreeSpaceEx +#define GetDriveType wapi_GetDriveType +#define LockFile wapi_LockFile +#define UnlockFile wapi_UnlockFile +#define GetVolumeInformation wapi_GetVolumeInformation +#define FormatMessage wapi_FormatMessage +#define CreateMutex wapi_CreateMutex +#define ReleaseMutex wapi_ReleaseMutex +#define OpenMutex wapi_OpenMutex +#define ShellExecuteEx wapi_ShellExecuteEx +#define CreateProcess wapi_CreateProcess +#define CreateProcessWithLogonW wapi_CreateProcessWithLogonW +#define GetCurrentProcess wapi_GetCurrentProcess +#define GetProcessId wapi_GetProcessId +#define CloseProcess wapi_CloseProcess +#define OpenProcess wapi_OpenProcess +#define GetExitCodeProcess wapi_GetExitCodeProcess +#define GetProcessTimes wapi_GetProcessTimes +#define EnumProcessModules wapi_EnumProcessModules +#define GetModuleBaseName wapi_GetModuleBaseName +#define GetModuleFileNameEx wapi_GetModuleFileNameEx +#define GetModuleInformation wapi_GetModuleInformation +#define GetProcessWorkingSetSize wapi_GetProcessWorkingSetSize +#define SetProcessWorkingSetSize wapi_SetProcessWorkingSetSize +#define TerminateProcess wapi_TerminateProcess +#define GetPriorityClass wapi_GetPriorityClass +#define SetPriorityClass wapi_SetPriorityClass +#define ImpersonateLoggedOnUser wapi_ImpersonateLoggedOnUser +#define RevertToSelf wapi_RevertToSelf +#define CreateSemaphore wapi_CreateSemaphore +#define ReleaseSemaphore wapi_ReleaseSemaphore +#define OpenSemaphore wapi_OpenSemaphore +#define WSASetLastError wapi_WSASetLastError +#define WSAGetLastError wapi_WSAGetLastError +#define WSAIoctl wapi_WSAIoctl +#define WSARecv wapi_WSARecv +#define WSASend wapi_WSASend +#define GetSystemInfo wapi_GetSystemInfo +#define GetCurrentThreadId wapi_GetCurrentThreadId +#define Sleep wapi_Sleep +#define SleepEx wapi_SleepEx +#define QueryPerformanceCounter wapi_QueryPerformanceCounter +#define QueryPerformanceFrequency wapi_QueryPerformanceFrequency +#define GetTickCount wapi_GetTickCount +#define GetFileVersionInfoSize wapi_GetFileVersionInfoSize +#define GetFileVersionInfo wapi_GetFileVersionInfo +#define VerQueryValue wapi_VerQueryValue +#define VerLanguageName wapi_VerLanguageName +#define WaitForSingleObject wapi_WaitForSingleObject +#define WaitForSingleObjectEx wapi_WaitForSingleObjectEx +#define SignalObjectAndWait wapi_SignalObjectAndWait +#define WaitForMultipleObjects wapi_WaitForMultipleObjects +#define WaitForMultipleObjectsEx wapi_WaitForMultipleObjectsEx +#define WaitForInputIdle wapi_WaitForInputIdle + +#endif /* __WAPI_REMAP_H__ */ diff --git a/mta-mono/vendor/mono/io-layer/wapi.h b/mta-mono/vendor/mono/io-layer/wapi.h index 86054fd..e2c9639 100644 --- a/mta-mono/vendor/mono/io-layer/wapi.h +++ b/mta-mono/vendor/mono/io-layer/wapi.h @@ -10,6 +10,7 @@ #ifndef _WAPI_WAPI_H_ #define _WAPI_WAPI_H_ +#include #include #include #include diff --git a/mta-mono/vendor/mono/io-layer/wapi_glob.c b/mta-mono/vendor/mono/io-layer/wapi_glob.c index 7889ad8..31c7f6d 100644 --- a/mta-mono/vendor/mono/io-layer/wapi_glob.c +++ b/mta-mono/vendor/mono/io-layer/wapi_glob.c @@ -44,7 +44,6 @@ #include #include -#include #include #include #include diff --git a/mta-mono/vendor/mono/io-layer/wthreads.c b/mta-mono/vendor/mono/io-layer/wthreads.c index af867db..d001da2 100644 --- a/mta-mono/vendor/mono/io-layer/wthreads.c +++ b/mta-mono/vendor/mono/io-layer/wthreads.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include diff --git a/mta-mono/vendor/mono/metadata/abi-details.h b/mta-mono/vendor/mono/metadata/abi-details.h index 01c741b..d4d00de 100644 --- a/mta-mono/vendor/mono/metadata/abi-details.h +++ b/mta-mono/vendor/mono/metadata/abi-details.h @@ -25,7 +25,11 @@ enum { #ifdef USED_CROSS_COMPILER_OFFSETS #define MONO_STRUCT_OFFSET(struct,field) MONO_OFFSET_ ## struct ## _ ## field #else +#if defined(HAS_CROSS_COMPILER_OFFSETS) || defined(MONO_CROSS_COMPILE) #define MONO_STRUCT_OFFSET(struct,field) (MONO_OFFSET_ ## struct ## _ ## field == -1, G_STRUCT_OFFSET (struct,field)) +#else +#define MONO_STRUCT_OFFSET(struct,field) G_STRUCT_OFFSET (struct,field) +#endif #endif #endif diff --git a/mta-mono/vendor/mono/metadata/appdomain.c b/mta-mono/vendor/mono/metadata/appdomain.c index c46bdfa..1944b7e 100644 --- a/mta-mono/vendor/mono/metadata/appdomain.c +++ b/mta-mono/vendor/mono/metadata/appdomain.c @@ -78,7 +78,7 @@ * Changes which are already detected at runtime, like the addition * of icalls, do not require an increment. */ -#define MONO_CORLIB_VERSION 111 +#define MONO_CORLIB_VERSION 117 typedef struct { @@ -106,10 +106,6 @@ static MonoAssembly * mono_domain_assembly_search (MonoAssemblyName *aname, gpointer user_data); -static MonoAssembly * -mono_domain_assembly_postload_search (MonoAssemblyName *aname, - gpointer user_data); - static void mono_domain_fire_assembly_load (MonoAssembly *assembly, gpointer user_data); @@ -234,8 +230,8 @@ mono_runtime_init (MonoDomain *domain, MonoThreadStartCB start_cb, mono_install_assembly_refonly_preload_hook (mono_domain_assembly_preload, GUINT_TO_POINTER (TRUE)); mono_install_assembly_search_hook (mono_domain_assembly_search, GUINT_TO_POINTER (FALSE)); mono_install_assembly_refonly_search_hook (mono_domain_assembly_search, GUINT_TO_POINTER (TRUE)); - mono_install_assembly_postload_search_hook (mono_domain_assembly_postload_search, GUINT_TO_POINTER (FALSE)); - mono_install_assembly_postload_refonly_search_hook (mono_domain_assembly_postload_search, GUINT_TO_POINTER (TRUE)); + mono_install_assembly_postload_search_hook ((void*)mono_domain_assembly_postload_search, GUINT_TO_POINTER (FALSE)); + mono_install_assembly_postload_refonly_search_hook ((void*)mono_domain_assembly_postload_search, GUINT_TO_POINTER (TRUE)); mono_install_assembly_load_hook (mono_domain_fire_assembly_load, NULL); mono_install_lookup_dynamic_token (mono_reflection_lookup_dynamic_token); @@ -466,8 +462,6 @@ mono_domain_create_appdomain_internal (char *friendly_name, MonoAppDomainSetup * MonoDomain *data; char *shadow_location; - MONO_ARCH_SAVE_REGS; - adclass = mono_class_from_name (mono_defaults.corlib, "System", "AppDomain"); /* FIXME: pin all those objects */ @@ -616,15 +610,12 @@ ves_icall_System_AppDomain_GetData (MonoAppDomain *ad, MonoString *name) MonoObject *o; char *str; - MONO_ARCH_SAVE_REGS; + MONO_CHECK_ARG_NULL (name, NULL); g_assert (ad != NULL); add = ad->data; g_assert (add != NULL); - if (name == NULL) - mono_raise_exception (mono_get_exception_argument_null ("name")); - str = mono_string_to_utf8 (name); mono_domain_lock (add); @@ -664,15 +655,12 @@ ves_icall_System_AppDomain_SetData (MonoAppDomain *ad, MonoString *name, MonoObj { MonoDomain *add; - MONO_ARCH_SAVE_REGS; + MONO_CHECK_ARG_NULL (name,); g_assert (ad != NULL); add = ad->data; g_assert (add != NULL); - if (name == NULL) - mono_raise_exception (mono_get_exception_argument_null ("name")); - mono_domain_lock (add); mono_g_hash_table_insert (add->env, name, data); @@ -683,8 +671,6 @@ ves_icall_System_AppDomain_SetData (MonoAppDomain *ad, MonoString *name, MonoObj MonoAppDomainSetup * ves_icall_System_AppDomain_getSetup (MonoAppDomain *ad) { - MONO_ARCH_SAVE_REGS; - g_assert (ad != NULL); g_assert (ad->data != NULL); @@ -694,8 +680,6 @@ ves_icall_System_AppDomain_getSetup (MonoAppDomain *ad) MonoString * ves_icall_System_AppDomain_getFriendlyName (MonoAppDomain *ad) { - MONO_ARCH_SAVE_REGS; - g_assert (ad != NULL); g_assert (ad->data != NULL); @@ -707,8 +691,6 @@ ves_icall_System_AppDomain_getCurDomain () { MonoDomain *add = mono_domain_get (); - MONO_ARCH_SAVE_REGS; - return add->domain; } @@ -717,8 +699,6 @@ ves_icall_System_AppDomain_getRootDomain () { MonoDomain *root = mono_get_root_domain (); - MONO_ARCH_SAVE_REGS; - return root->domain; } @@ -855,7 +835,7 @@ MonoAppDomain * ves_icall_System_AppDomain_createDomain (MonoString *friendly_name, MonoAppDomainSetup *setup) { #ifdef DISABLE_APPDOMAINS - mono_raise_exception (mono_get_exception_not_supported ("AppDomain creation is not supported on this runtime.")); + mono_set_pending_exception (mono_get_exception_not_supported ("AppDomain creation is not supported on this runtime.")); return NULL; #else char *fname = mono_string_to_utf8 (friendly_name); @@ -878,8 +858,6 @@ ves_icall_System_AppDomain_GetAssemblies (MonoAppDomain *ad, MonoBoolean refonly int i; GPtrArray *assemblies; - MONO_ARCH_SAVE_REGS; - if (!System_Reflection_Assembly) System_Reflection_Assembly = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "Assembly"); @@ -913,12 +891,12 @@ ves_icall_System_AppDomain_GetAssemblies (MonoAppDomain *ad, MonoBoolean refonly } MonoReflectionAssembly * -mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, gboolean refonly) +mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, MonoAssembly *requesting, gboolean refonly) { MonoClass *klass; MonoMethod *method; MonoBoolean isrefonly; - gpointer params [2]; + gpointer params [3]; if (mono_runtime_get_no_exec ()) return NULL; @@ -936,15 +914,15 @@ mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, gboolean refon isrefonly = refonly ? 1 : 0; params [0] = fname; - params [1] = &isrefonly; + params [1] = (requesting) ? mono_assembly_get_object (domain, requesting) : NULL; + params [2] = &isrefonly; return (MonoReflectionAssembly *) mono_runtime_invoke (method, domain->domain, params, NULL); } -static MonoAssembly * -mono_domain_assembly_postload_search (MonoAssemblyName *aname, - gpointer user_data) +MonoAssembly * +mono_domain_assembly_postload_search (MonoAssemblyName *aname, MonoAssembly *requesting, + gboolean refonly) { - gboolean refonly = GPOINTER_TO_UINT (user_data); MonoReflectionAssembly *assembly; MonoDomain *domain = mono_domain_get (); char *aname_str; @@ -958,7 +936,7 @@ mono_domain_assembly_postload_search (MonoAssemblyName *aname, g_free (aname_str); return NULL; } - assembly = mono_try_assembly_resolve (domain, str, refonly); + assembly = mono_try_assembly_resolve (domain, str, requesting, refonly); g_free (aname_str); if (assembly) @@ -1899,18 +1877,17 @@ ves_icall_System_Reflection_Assembly_LoadFrom (MonoString *fname, MonoBoolean re MonoImageOpenStatus status = MONO_IMAGE_OK; MonoAssembly *ass; - MONO_ARCH_SAVE_REGS; - if (fname == NULL) { MonoException *exc = mono_get_exception_argument_null ("assemblyFile"); - mono_raise_exception (exc); + mono_set_pending_exception (exc); + return NULL; } name = filename = mono_string_to_utf8 (fname); ass = mono_assembly_open_full (filename, &status, refOnly); - if (!ass){ + if (!ass) { MonoException *exc; if (status == MONO_IMAGE_IMAGE_INVALID) @@ -1918,7 +1895,8 @@ ves_icall_System_Reflection_Assembly_LoadFrom (MonoString *fname, MonoBoolean re else exc = mono_get_exception_file_not_found2 (NULL, fname); g_free (name); - mono_raise_exception (exc); + mono_set_pending_exception (exc); + return NULL; } g_free (name); @@ -1940,7 +1918,7 @@ ves_icall_System_AppDomain_LoadAssemblyRaw (MonoAppDomain *ad, MonoImage *image = mono_image_open_from_data_full (mono_array_addr (raw_assembly, gchar, 0), raw_assembly_len, TRUE, NULL, refonly); if (!image) { - mono_raise_exception (mono_get_exception_bad_image_format ("")); + mono_set_pending_exception (mono_get_exception_bad_image_format ("")); return NULL; } @@ -1952,7 +1930,7 @@ ves_icall_System_AppDomain_LoadAssemblyRaw (MonoAppDomain *ad, if (!ass) { mono_image_close (image); - mono_raise_exception (mono_get_exception_bad_image_format ("")); + mono_set_pending_exception (mono_get_exception_bad_image_format ("")); return NULL; } @@ -1972,8 +1950,6 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad, MonoString *assRef, gchar *name; gboolean parsed; - MONO_ARCH_SAVE_REGS; - g_assert (assRef != NULL); name = mono_string_to_utf8 (assRef); @@ -1983,7 +1959,7 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad, MonoString *assRef, if (!parsed) { /* This is a parse error... */ if (!refOnly) - refass = mono_try_assembly_resolve (domain, assRef, refOnly); + refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly); return refass; } @@ -1993,7 +1969,7 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad, MonoString *assRef, if (!ass) { /* MS.NET doesn't seem to call the assembly resolve handler for refonly assemblies */ if (!refOnly) - refass = mono_try_assembly_resolve (domain, assRef, refOnly); + refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly); else refass = NULL; if (!refass) { @@ -2013,15 +1989,14 @@ ves_icall_System_AppDomain_InternalUnload (gint32 domain_id) { MonoDomain * domain = mono_domain_get_by_id (domain_id); - MONO_ARCH_SAVE_REGS; - if (NULL == domain) { MonoException *exc = mono_get_exception_execution_engine ("Failed to unload domain, domain id not found"); - mono_raise_exception (exc); + mono_set_pending_exception (exc); + return; } if (domain == mono_get_root_domain ()) { - mono_raise_exception (mono_get_exception_cannot_unload_appdomain ("The default appdomain can not be unloaded.")); + mono_set_pending_exception (mono_get_exception_cannot_unload_appdomain ("The default appdomain can not be unloaded.")); return; } @@ -2053,19 +2028,18 @@ gint32 ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomain *ad, MonoReflectionAssembly *refass, MonoArray *args) { + MonoError error; MonoImage *image; MonoMethod *method; - MONO_ARCH_SAVE_REGS; - g_assert (refass); image = refass->assembly->image; g_assert (image); - method = mono_get_method (image, mono_image_get_entry_point (image), NULL); + method = mono_get_method_checked (image, mono_image_get_entry_point (image), NULL, NULL, &error); if (!method) - g_error ("No entry point method found in %s", image->name); + g_error ("No entry point method found in %s due to %s", image->name, mono_error_get_message (&error)); if (!args) args = (MonoArray *) mono_array_new (ad->data, mono_defaults.string_class, 0); @@ -2076,8 +2050,6 @@ ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomain *ad, gint32 ves_icall_System_AppDomain_GetIDFromDomain (MonoAppDomain * ad) { - MONO_ARCH_SAVE_REGS; - return ad->data->domain_id; } @@ -2086,10 +2058,10 @@ ves_icall_System_AppDomain_InternalSetDomain (MonoAppDomain *ad) { MonoDomain *old_domain = mono_domain_get(); - MONO_ARCH_SAVE_REGS; - - if (!mono_domain_set (ad->data, FALSE)) - mono_raise_exception (mono_get_exception_appdomain_unloaded ()); + if (!mono_domain_set (ad->data, FALSE)) { + mono_set_pending_exception (mono_get_exception_appdomain_unloaded ()); + return NULL; + } return old_domain->domain; } @@ -2100,10 +2072,10 @@ ves_icall_System_AppDomain_InternalSetDomainByID (gint32 domainid) MonoDomain *current_domain = mono_domain_get (); MonoDomain *domain = mono_domain_get_by_id (domainid); - MONO_ARCH_SAVE_REGS; - - if (!domain || !mono_domain_set (domain, FALSE)) - mono_raise_exception (mono_get_exception_appdomain_unloaded ()); + if (!domain || !mono_domain_set (domain, FALSE)) { + mono_set_pending_exception (mono_get_exception_appdomain_unloaded ()); + return NULL; + } return current_domain->domain; } @@ -2111,8 +2083,6 @@ ves_icall_System_AppDomain_InternalSetDomainByID (gint32 domainid) void ves_icall_System_AppDomain_InternalPushDomainRef (MonoAppDomain *ad) { - MONO_ARCH_SAVE_REGS; - mono_thread_push_appdomain_ref (ad->data); } @@ -2121,14 +2091,14 @@ ves_icall_System_AppDomain_InternalPushDomainRefByID (gint32 domain_id) { MonoDomain *domain = mono_domain_get_by_id (domain_id); - MONO_ARCH_SAVE_REGS; - - if (!domain) + if (!domain) { /* * Raise an exception to prevent the managed code from executing a pop * later. */ - mono_raise_exception (mono_get_exception_appdomain_unloaded ()); + mono_set_pending_exception (mono_get_exception_appdomain_unloaded ()); + return; + } mono_thread_push_appdomain_ref (domain); } @@ -2136,24 +2106,18 @@ ves_icall_System_AppDomain_InternalPushDomainRefByID (gint32 domain_id) void ves_icall_System_AppDomain_InternalPopDomainRef (void) { - MONO_ARCH_SAVE_REGS; - mono_thread_pop_appdomain_ref (); } MonoAppContext * ves_icall_System_AppDomain_InternalGetContext () { - MONO_ARCH_SAVE_REGS; - return mono_context_get (); } MonoAppContext * ves_icall_System_AppDomain_InternalGetDefaultContext () { - MONO_ARCH_SAVE_REGS; - return mono_domain_get ()->default_context; } @@ -2162,8 +2126,6 @@ ves_icall_System_AppDomain_InternalSetContext (MonoAppContext *mc) { MonoAppContext *old_context = mono_context_get (); - MONO_ARCH_SAVE_REGS; - mono_context_set (mc); return old_context; @@ -2321,7 +2283,7 @@ unload_thread_main (void *arg) * class->runtime_info. */ - mono_loader_lock (); + mono_loader_lock (); //FIXME why do we need the loader lock here? mono_domain_lock (domain); #ifdef HAVE_SGEN_GC /* diff --git a/mta-mono/vendor/mono/metadata/assembly.c b/mta-mono/vendor/mono/metadata/assembly.c index afda4dd..b385575 100644 --- a/mta-mono/vendor/mono/metadata/assembly.c +++ b/mta-mono/vendor/mono/metadata/assembly.c @@ -183,7 +183,9 @@ static mono_mutex_t assembly_binding_mutex; static GSList *loaded_assembly_bindings = NULL; static MonoAssembly* -mono_assembly_invoke_search_hook_internal (MonoAssemblyName *aname, gboolean refonly, gboolean postload); +mono_assembly_invoke_search_hook_internal (MonoAssemblyName *aname, MonoAssembly *requesting, gboolean refonly, gboolean postload); +static MonoAssembly* +mono_assembly_load_full_internal (MonoAssemblyName *aname, MonoAssembly *requesting, const char *basedir, MonoImageOpenStatus *status, gboolean refonly); static MonoBoolean mono_assembly_is_in_gac (const gchar *filanem); @@ -1090,12 +1092,12 @@ mono_assembly_load_reference (MonoImage *image, int index) if (image->assembly && image->assembly->ref_only) { /* We use the loaded corlib */ if (!strcmp (aname.name, "mscorlib")) - reference = mono_assembly_load_full (&aname, image->assembly->basedir, &status, FALSE); + reference = mono_assembly_load_full_internal (&aname, image->assembly, image->assembly->basedir, &status, FALSE); else { reference = mono_assembly_loaded_full (&aname, TRUE); if (!reference) /* Try a postload search hook */ - reference = mono_assembly_invoke_search_hook_internal (&aname, TRUE, TRUE); + reference = mono_assembly_invoke_search_hook_internal (&aname, image->assembly, TRUE, TRUE); } /* @@ -1111,9 +1113,9 @@ mono_assembly_load_reference (MonoImage *image, int index) * The second load attempt has the basedir set to keep compatibility with the old mono behavior, for * example bug-349190.2.cs and who knows how much more code in the wild. */ - reference = mono_assembly_load (&aname, NULL, &status); + reference = mono_assembly_load_full_internal (&aname, image->assembly, NULL, &status, FALSE); if (!reference && image->assembly) - reference = mono_assembly_load (&aname, image->assembly->basedir, &status); + reference = mono_assembly_load_full_internal (&aname, image->assembly, image->assembly->basedir, &status, FALSE); } if (reference == NULL){ @@ -1232,13 +1234,36 @@ struct AssemblySearchHook { AssemblySearchHook *assembly_search_hook = NULL; static MonoAssembly* -mono_assembly_invoke_search_hook_internal (MonoAssemblyName *aname, gboolean refonly, gboolean postload) +mono_assembly_invoke_search_hook_internal (MonoAssemblyName *aname, MonoAssembly *requesting, gboolean refonly, gboolean postload) { AssemblySearchHook *hook; for (hook = assembly_search_hook; hook; hook = hook->next) { if ((hook->refonly == refonly) && (hook->postload == postload)) { - MonoAssembly *ass = hook->func (aname, hook->user_data); + MonoAssembly *ass; + /** + * A little explanation is in order here. + * + * The default postload search hook needs to know the requesting assembly to report it to managed code. + * The embedding API exposes a search hook that doesn't take such argument. + * + * The original fix would call the default search hook before all the registered ones and pass + * the requesting assembly to it. It works but broke a very suddle embedding API aspect that some users + * rely on. Which is the ordering between user hooks and the default runtime hook. + * + * Registering the hook after mono_jit_init would let your hook run before the default one and + * when using it to handle non standard app layouts this could save your app from a massive amount + * of syscalls that the default hook does when probing all sorts of places. Slow targets with horrible IO + * are all using this trick and if we broke this assumption they would be very disapointed at us. + * + * So what's the fix? We register the default hook using regular means and special case it when iterating + * over the registered hooks. This preserves ordering and enables managed resolve hooks to get the requesting + * assembly. + */ + if (hook->func == (void*)mono_domain_assembly_postload_search) + ass = mono_domain_assembly_postload_search (aname, requesting, refonly); + else + ass = hook->func (aname, hook->user_data); if (ass) return ass; } @@ -1250,7 +1275,7 @@ mono_assembly_invoke_search_hook_internal (MonoAssemblyName *aname, gboolean ref MonoAssembly* mono_assembly_invoke_search_hook (MonoAssemblyName *aname) { - return mono_assembly_invoke_search_hook_internal (aname, FALSE, FALSE); + return mono_assembly_invoke_search_hook_internal (aname, NULL, FALSE, FALSE); } static void @@ -1764,7 +1789,7 @@ mono_assembly_load_from_full (MonoImage *image, const char*fname, * assemblies lock. */ if (ass->aname.name) { - ass2 = mono_assembly_invoke_search_hook_internal (&ass->aname, refonly, FALSE); + ass2 = mono_assembly_invoke_search_hook_internal (&ass->aname, NULL, refonly, FALSE); if (ass2) { g_free (ass); g_free (base_dir); @@ -2367,7 +2392,7 @@ mono_assembly_load_with_partial_name (const char *name, MonoImageOpenStatus *sta res->in_gac = TRUE; else { MonoDomain *domain = mono_domain_get (); - MonoReflectionAssembly *refasm = mono_try_assembly_resolve (domain, mono_string_new (domain, name), FALSE); + MonoReflectionAssembly *refasm = mono_try_assembly_resolve (domain, mono_string_new (domain, name), NULL, FALSE); if (refasm) res = refasm->assembly; } @@ -2947,6 +2972,17 @@ mono_assembly_load_full_nosearch (MonoAssemblyName *aname, return result; } +MonoAssembly* +mono_assembly_load_full_internal (MonoAssemblyName *aname, MonoAssembly *requesting, const char *basedir, MonoImageOpenStatus *status, gboolean refonly) +{ + MonoAssembly *result = mono_assembly_load_full_nosearch (aname, basedir, status, refonly); + + if (!result) + /* Try a postload search hook */ + result = mono_assembly_invoke_search_hook_internal (aname, requesting, refonly, TRUE); + return result; +} + /** * mono_assembly_load_full: * @aname: A MonoAssemblyName with the assembly name to load. @@ -2966,12 +3002,7 @@ mono_assembly_load_full_nosearch (MonoAssemblyName *aname, MonoAssembly* mono_assembly_load_full (MonoAssemblyName *aname, const char *basedir, MonoImageOpenStatus *status, gboolean refonly) { - MonoAssembly *result = mono_assembly_load_full_nosearch (aname, basedir, status, refonly); - - if (!result) - /* Try a postload search hook */ - result = mono_assembly_invoke_search_hook_internal (aname, refonly, TRUE); - return result; + return mono_assembly_load_full_internal (aname, NULL, basedir, status, refonly); } /** @@ -2989,9 +3020,9 @@ mono_assembly_load_full (MonoAssemblyName *aname, const char *basedir, MonoImage MonoAssembly* mono_assembly_load (MonoAssemblyName *aname, const char *basedir, MonoImageOpenStatus *status) { - return mono_assembly_load_full (aname, basedir, status, FALSE); + return mono_assembly_load_full_internal (aname, NULL, basedir, status, FALSE); } - + MonoAssembly* mono_assembly_loaded_full (MonoAssemblyName *aname, gboolean refonly) { @@ -3000,7 +3031,7 @@ mono_assembly_loaded_full (MonoAssemblyName *aname, gboolean refonly) aname = mono_assembly_remap_version (aname, &maped_aname); - res = mono_assembly_invoke_search_hook_internal (aname, refonly, FALSE); + res = mono_assembly_invoke_search_hook_internal (aname, NULL, refonly, FALSE); return res; } diff --git a/mta-mono/vendor/mono/metadata/boehm-gc.c b/mta-mono/vendor/mono/metadata/boehm-gc.c index f6c9cc8..5c84757 100644 --- a/mta-mono/vendor/mono/metadata/boehm-gc.c +++ b/mta-mono/vendor/mono/metadata/boehm-gc.c @@ -30,6 +30,7 @@ #include #include #include +#include #if HAVE_BOEHM_GC @@ -78,6 +79,8 @@ mono_gc_base_init (void) if (gc_initialized) return; + mono_counters_init (); + /* * Handle the case when we are called from a thread different from the main thread, * confusing libgc. @@ -744,16 +747,17 @@ create_allocator (int atype, int tls_key) csig->params [0] = &mono_defaults.int_class->byval_arg; csig->params [1] = &mono_defaults.int32_class->byval_arg; } else { - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 1); + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 2); csig->ret = &mono_defaults.object_class->byval_arg; csig->params [0] = &mono_defaults.int_class->byval_arg; + csig->params [1] = &mono_defaults.int32_class->byval_arg; } mb = mono_mb_new (mono_defaults.object_class, "Alloc", MONO_WRAPPER_ALLOC); bytes_var = mono_mb_add_local (mb, &mono_defaults.int32_class->byval_arg); if (atype == ATYPE_STRING) { /* a string alloator method takes the args: (vtable, len) */ - /* bytes = (sizeof (MonoString) + ((len + 1) * 2)); */ + /* bytes = (offsetof (MonoString, chars) + ((len + 1) * 2)); */ mono_mb_emit_ldarg (mb, 1); mono_mb_emit_icon (mb, 1); mono_mb_emit_byte (mb, MONO_CEE_ADD); @@ -764,15 +768,7 @@ create_allocator (int atype, int tls_key) mono_mb_emit_byte (mb, MONO_CEE_ADD); mono_mb_emit_stloc (mb, bytes_var); } else { - /* bytes = vtable->klass->instance_size */ - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoVTable, klass)); - mono_mb_emit_byte (mb, MONO_CEE_ADD); - mono_mb_emit_byte (mb, MONO_CEE_LDIND_I); - mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoClass, instance_size)); - mono_mb_emit_byte (mb, MONO_CEE_ADD); - /* FIXME: assert instance_size stays a 4 byte integer */ - mono_mb_emit_byte (mb, MONO_CEE_LDIND_U4); + mono_mb_emit_ldarg (mb, 1); mono_mb_emit_stloc (mb, bytes_var); } @@ -958,7 +954,7 @@ mono_gc_is_critical_method (MonoMethod *method) */ MonoMethod* -mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box) +mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box, gboolean known_instance_size) { int offset = -1; int atype; @@ -1055,7 +1051,7 @@ mono_gc_is_critical_method (MonoMethod *method) } MonoMethod* -mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box) +mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box, gboolean known_instance_size) { return NULL; } @@ -1087,6 +1083,12 @@ mono_gc_get_write_barrier (void) #endif +int +mono_gc_get_aligned_size_for_allocator (int size) +{ + return size; +} + const char * mono_gc_get_gc_name (void) { diff --git a/mta-mono/vendor/mono/metadata/char-conversions.h b/mta-mono/vendor/mono/metadata/char-conversions.h index 5628ce7..8cc5ae7 100644 --- a/mta-mono/vendor/mono/metadata/char-conversions.h +++ b/mta-mono/vendor/mono/metadata/char-conversions.h @@ -3,26246 +3,6 @@ #include -/* - * The CategoryData_v2* tables below are automatically generated - * by create-category-table(.cs), available in the mcs - * sources. DO NOT EDIT! - */ - -/* - * Value bits: 8, Page size: 256 - * Packed table: 71168 bytes - * Index astral_index: 8192 bytes - * Total: 79360 bytes - */ -static const guint8 CategoryData_v2 [71168] = -{ - /* Page 0, 0 indirect uses */ - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 11,24,24,24,26,24,24,24,20,21,24,25,24,19,24,24, - 8,8,8,8,8,8,8,8,8,8,24,24,25,25,25,24, - 24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,20,24,21,27,18, - 27,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,20,25,21,25,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 11,24,26,26,26,26,28,28,27,28,1,22,25,19,28,27, - 28,25,10,10,27,1,28,24,27,10,1,23,10,10,10,24, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,25,1,1,1,1,1,1,1,1, - /* Page 1, 0 indirect uses */ - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0, - 1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,1, - 1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,0, - 0,0,1,0,0,1,0,0,0,1,1,1,0,0,1,0, - 0,1,0,1,0,1,0,0,1,0,1,1,0,1,0,0, - 1,0,0,0,1,0,1,0,0,1,1,4,0,1,1,1, - 4,4,4,4,0,2,1,0,2,1,0,2,1,0,1,0, - 1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 1,0,2,1,0,1,0,0,0,1,0,1,0,1,0,1, - /* Page 2, 0 indirect uses */ - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,1,1,1,1,1,1,0,0,1,0,0,1, - 1,0,1,0,0,0,0,1,0,1,0,1,0,1,0,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,27,27,27,27,3,3,3,3,3,3,3,3,3,3, - 3,3,27,27,27,27,27,27,27,27,27,27,27,27,27,27, - 3,3,3,3,3,27,27,27,27,27,27,27,27,27,3,27, - 27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, - /* Page 3, 0 indirect uses */ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 29,29,29,29,27,27,29,29,29,29,3,1,1,1,24,29, - 29,29,29,29,27,27,0,24,0,0,0,29,0,29,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,29,0,0,0,0,0,0,0,0,0,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,29, - 1,1,0,0,0,1,1,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 1,1,1,1,0,1,25,0,1,0,0,1,1,0,0,0, - /* Page 4, 0 indirect uses */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,28,5,5,5,5,29,7,7,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - /* Page 5, 0 indirect uses */ - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,29,29,3,24,24,24,24,24,24, - 29,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,29,24,19,29,29,29,29,29, - 29,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,24,5, - 24,5,5,24,5,5,24,5,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,29,29,29,29, - 4,4,4,24,24,29,29,29,29,29,29,29,29,29,29,29, - /* Page 6, 0 indirect uses */ - 15,15,15,15,29,29,29,29,29,29,29,26,24,24,28,28, - 5,5,5,5,5,5,29,29,29,29,29,24,29,29,24,24, - 29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,29,29,29,29, - 3,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,29, - 8,8,8,8,8,8,8,8,8,8,24,24,24,24,4,4, - 5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,24,4,5,5,5,5,5,5,5,15,7,5, - 5,5,5,5,5,3,3,5,5,28,5,5,5,5,4,4, - 8,8,8,8,8,8,8,8,8,8,4,4,4,28,28,4, - /* Page 7, 0 indirect uses */ - 24,24,24,24,24,24,24,24,24,24,24,24,24,24,29,15, - 4,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,29,29,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5, - 5,4,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 8,8,8,8,8,8,8,8,8,8,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5, - 5,5,5,5,3,3,28,24,24,24,3,29,29,29,29,29, - /* - * Page 8, 3392 indirect uses: - * 10200-102FF (astral_index), - * 10500-107FF (astral_index), - * 10B00-11FFF (astral_index), - * 12500-1CFFF (astral_index), - * 1D800-1FFFF (astral_index), - * 2A700-2F7FF (astral_index), - * 2FB00-DFFFF (astral_index), - * E0200-EFFFF (astral_index) - */ - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 9, 0 indirect uses */ - 29,5,5,6,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,5,4,6,6, - 6,5,5,5,5,5,5,5,5,6,6,6,6,5,29,29, - 4,5,5,5,5,29,29,29,4,4,4,4,4,4,4,4, - 4,4,5,5,24,24,8,8,8,8,8,8,8,8,8,8, - 24,29,29,29,29,29,29,29,29,29,29,4,4,4,4,4, - 29,5,6,6,29,4,4,4,4,4,4,4,4,29,29,4, - 4,29,29,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,29,4,29,29,29,4,4,4,4,29,29,5,4,6,6, - 6,5,5,5,5,29,29,6,6,29,29,6,6,5,4,29, - 29,29,29,29,29,29,29,6,29,29,29,29,4,4,29,4, - 4,4,5,5,29,29,8,8,8,8,8,8,8,8,8,8, - 4,4,26,26,10,10,10,10,10,10,28,29,29,29,29,29, - /* Page 10, 0 indirect uses */ - 29,5,5,6,29,4,4,4,4,4,4,29,29,29,29,4, - 4,29,29,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,29,4,4,29,4,4,29,4,4,29,29,5,29,6,6, - 6,5,5,29,29,29,29,5,5,29,29,5,5,5,29,29, - 29,29,29,29,29,29,29,29,29,4,4,4,4,29,4,29, - 29,29,29,29,29,29,8,8,8,8,8,8,8,8,8,8, - 5,5,4,4,4,29,29,29,29,29,29,29,29,29,29,29, - 29,5,5,6,29,4,4,4,4,4,4,4,4,4,29,4, - 4,4,29,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,29,4,4,29,4,4,4,4,4,29,29,5,4,6,6, - 6,5,5,5,5,5,29,5,5,6,29,6,6,5,29,29, - 4,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,5,5,29,29,8,8,8,8,8,8,8,8,8,8, - 29,26,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 11, 0 indirect uses */ - 29,5,6,6,29,4,4,4,4,4,4,4,4,29,29,4, - 4,29,29,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,29,4,4,29,4,4,4,4,4,29,29,5,4,6,5, - 6,5,5,5,29,29,29,6,6,29,29,6,6,5,29,29, - 29,29,29,29,29,29,5,6,29,29,29,29,4,4,29,4, - 4,4,29,29,29,29,8,8,8,8,8,8,8,8,8,8, - 28,4,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,5,4,29,4,4,4,4,4,4,29,29,29,4,4, - 4,29,4,4,4,4,29,29,29,4,4,29,4,29,4,4, - 29,29,29,4,4,29,29,29,4,4,4,29,29,29,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,6,6, - 5,6,6,29,29,29,6,6,6,29,6,6,6,5,29,29, - 29,29,29,29,29,29,29,6,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,8,8,8,8,8,8,8,8,8,8, - 10,10,10,28,28,28,28,28,28,26,28,29,29,29,29,29, - /* Page 12, 0 indirect uses */ - 29,6,6,6,29,4,4,4,4,4,4,4,4,29,4,4, - 4,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,4,4,4,29,4,4,4,4,4,29,29,29,29,5,5, - 5,6,6,6,6,29,5,5,5,29,5,5,5,5,29,29, - 29,29,29,29,29,5,5,29,29,29,29,29,29,29,29,29, - 4,4,29,29,29,29,8,8,8,8,8,8,8,8,8,8, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,6,6,29,4,4,4,4,4,4,4,4,29,4,4, - 4,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,4,4,4,29,4,4,4,4,4,29,29,5,4,6,5, - 6,6,6,6,6,29,5,6,6,29,6,6,5,5,29,29, - 29,29,29,29,29,6,6,29,29,29,29,29,29,29,4,29, - 4,4,5,5,29,29,8,8,8,8,8,8,8,8,8,8, - 29,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 13, 0 indirect uses */ - 29,29,6,6,29,4,4,4,4,4,4,4,4,29,4,4, - 4,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,6,6, - 6,5,5,5,29,29,6,6,6,29,6,6,6,5,29,29, - 29,29,29,29,29,29,29,6,29,29,29,29,29,29,29,29, - 4,4,29,29,29,29,8,8,8,8,8,8,8,8,8,8, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,6,6,29,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,29,29,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,29,4,4,4,4,4,4,4,4,4,29,4,29,29, - 4,4,4,4,4,4,4,29,29,29,5,29,29,29,29,6, - 6,6,5,5,5,29,5,29,6,6,6,6,6,6,6,6, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,6,6,24,29,29,29,29,29,29,29,29,29,29,29, - /* Page 14, 0 indirect uses */ - 29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,5,4,4,5,5,5,5,5,5,5,29,29,29,29,26, - 4,4,4,4,4,4,3,5,5,5,5,5,5,5,5,24, - 8,8,8,8,8,8,8,8,8,8,24,24,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,4,4,29,4,29,29,4,4,29,4,29,29,4,29,29, - 29,29,29,29,4,4,4,4,29,4,4,4,4,4,4,4, - 29,4,4,4,29,4,29,4,29,29,4,4,29,4,4,4, - 4,5,4,4,5,5,5,5,5,5,29,5,5,4,29,29, - 4,4,4,4,4,29,3,29,5,5,5,5,5,5,29,29, - 8,8,8,8,8,8,8,8,8,8,29,29,4,4,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 15, 0 indirect uses */ - 4,28,28,28,24,24,24,24,24,24,24,24,24,24,24,24, - 24,24,24,28,28,28,28,28,5,5,28,28,28,28,28,28, - 8,8,8,8,8,8,8,8,8,8,10,10,10,10,10,10, - 10,10,10,10,28,5,28,5,28,5,20,21,20,21,6,6, - 4,4,4,4,4,4,4,4,29,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,29,29,29,29, - 29,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, - 5,5,5,5,5,24,5,5,4,4,4,4,29,29,29,29, - 5,5,5,5,5,5,5,5,29,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,29,28,28, - 28,28,28,28,28,28,5,28,28,28,28,28,28,29,29,28, - 24,24,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 16, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,29,4,4,4,4,4,29,4,4,29,6,5,5,5, - 5,6,5,29,29,29,5,5,6,5,29,29,29,29,29,29, - 8,8,8,8,8,8,8,8,8,8,24,24,24,24,24,24, - 4,4,4,4,4,4,6,6,5,5,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,24,3,29,29,29, - /* Page 17, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,29,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,29,29,29,29,29,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,29,29, - /* Page 18, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,29,29, - 4,4,4,4,4,4,4,29,4,29,4,4,4,4,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,29,4,4,4,4,29,29,4,4,4,4,4,4,4,29, - 4,29,4,4,4,4,29,29,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 19, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,29,4,4,4,4,29,29,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,29,29,29,5, - 28,24,24,24,24,24,24,24,24,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 28,28,28,28,28,28,28,28,28,28,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,29,29,29,29,29,29,29,29,29,29,29, - /* Page 20, 0 indirect uses */ - 29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* - * Page 21, 171 indirect uses: - * 12000-122FF (astral_index), - * 20000-2A5FF (astral_index), - * 2F800-2F9FF (astral_index) - */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 22, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,24,24,4, - 4,4,4,4,4,4,4,29,29,29,29,29,29,29,29,29, - 11,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,20,21,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,24,24,24,9,9, - 9,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 23, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,4,4, - 4,4,5,5,5,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,5,5,5,24,24,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,5,5,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,4,4, - 4,29,5,5,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,15,15,6,5,5,5,5,5,5,5,6,6, - 6,6,6,6,6,6,5,6,6,5,5,5,5,5,5,5, - 5,5,5,5,24,24,24,3,24,24,24,26,4,5,29,29, - 8,8,8,8,8,8,8,8,8,8,29,29,29,29,29,29, - 10,10,10,10,10,10,10,10,10,10,29,29,29,29,29,29, - /* Page 24, 0 indirect uses */ - 24,24,24,24,24,24,19,24,24,24,24,5,5,5,11,29, - 8,8,8,8,8,8,8,8,8,8,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,3,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,5,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 25, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,29,29, - 5,5,5,6,6,6,6,5,5,6,6,6,29,29,29,29, - 6,6,5,6,6,6,6,6,6,5,5,5,29,29,29,29, - 28,29,29,29,24,24,8,8,8,8,8,8,8,8,8,8, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 4,4,4,4,4,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,29,29, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,4,4,4,4,4,4,4,6,6,29,29,29,29,29,29, - 8,8,8,8,8,8,8,8,8,8,29,29,29,29,24,24, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - /* Page 26, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,5,5,6,6,6,29,29,24,24, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 27, 0 indirect uses */ - 5,5,5,5,6,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,5,6,5,5,5,5,5,6,5,6,6,6, - 6,6,5,6,6,4,4,4,4,4,4,4,29,29,29,29, - 8,8,8,8,8,8,8,8,8,8,24,24,24,24,24,24, - 24,28,28,28,28,28,28,28,28,28,28,5,5,5,5,5, - 5,5,5,5,28,28,28,28,28,28,28,28,28,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 28, 0 indirect uses */ - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 29, 0 indirect uses */ - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 5,5,5,5,5,5,5,5,5,5,5,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,5,5, - /* Page 30, 0 indirect uses */ - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,1,1,1,1,1,1,29,29,29,29, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,29,29,29,29,29,29, - /* Page 31, 0 indirect uses */ - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,29,29,0,0,0,0,0,0,29,29, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,29,29,0,0,0,0,0,0,29,29, - 1,1,1,1,1,1,1,1,29,0,29,0,29,0,29,0, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,29,29, - 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, - 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, - 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, - 1,1,1,1,1,29,1,1,0,0,0,0,2,27,1,27, - 27,27,1,1,1,29,1,1,0,0,0,0,2,27,27,27, - 1,1,1,1,29,29,1,1,0,0,0,0,29,27,27,27, - 1,1,1,1,1,1,1,1,0,0,0,0,0,27,27,27, - 29,29,1,1,1,29,1,1,0,0,0,0,2,27,27,29, - /* Page 32, 0 indirect uses */ - 11,11,11,11,11,11,11,11,11,11,11,15,15,15,15,15, - 19,19,19,19,19,19,24,24,22,23,20,22,22,23,20,22, - 24,24,24,24,24,24,24,24,12,13,15,15,15,15,15,11, - 24,24,24,24,24,24,24,24,24,22,23,24,24,24,24,18, - 18,24,24,24,25,20,21,24,24,24,24,24,24,24,24,24, - 24,24,25,24,18,24,24,24,24,24,24,24,24,24,24,11, - 15,15,15,15,29,29,29,29,29,29,15,15,15,15,15,15, - 10,1,29,29,10,10,10,10,10,10,25,25,25,20,21,1, - 10,10,10,10,10,10,10,10,10,10,25,25,25,20,21,29, - 3,3,3,3,3,29,29,29,29,29,29,29,29,29,29,29, - 26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, - 26,26,26,26,26,26,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 5,5,5,5,5,5,5,5,5,5,5,5,5,7,7,7, - 7,5,7,7,7,5,5,5,5,5,5,5,5,5,5,5, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 33, 0 indirect uses */ - 28,28,0,28,28,28,28,0,28,28,1,0,0,0,1,1, - 0,0,0,1,28,0,28,28,28,0,0,0,0,0,28,28, - 28,28,28,28,0,28,0,28,0,28,0,0,0,0,28,1, - 0,0,0,0,1,4,4,4,4,1,28,28,1,1,0,0, - 25,25,25,25,25,0,1,1,1,1,28,25,28,28,1,29, - 29,29,29,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,0,1,29,29,29,29,29,29,29,29,29,29,29, - 25,25,25,25,25,28,28,28,28,28,25,25,28,28,28,28, - 25,28,28,25,28,28,25,28,28,28,28,28,28,28,25,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,25,25, - 28,28,25,28,25,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,25,25,25,25,25,25,25,25,25,25,25,25, - /* Page 34, 0 indirect uses */ - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - /* Page 35, 0 indirect uses */ - 28,28,28,28,28,28,28,28,25,25,25,25,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 25,25,28,28,28,28,28,28,28,20,21,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,25,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,25,25,25,25, - 25,25,28,28,28,28,28,28,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 36, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - /* Page 37, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,25,28,28,28,28,28,28,28,28, - 28,25,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,25,25,25,25,25,25,25,25, - /* Page 38, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,25, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 39, 0 indirect uses */ - 29,28,28,28,28,29,28,28,28,28,29,29,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,29,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,29,28,29,28, - 28,28,28,29,29,29,28,29,28,28,28,28,28,28,28,29, - 29,28,28,28,28,28,28,28,20,21,20,21,20,21,20,21, - 20,21,20,21,20,21,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,28,29,29,29,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 29,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29, - 25,25,25,25,25,20,21,25,25,25,25,29,29,29,29,29, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,20,21,20,21,20,21,29,29,29,29, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - /* Page 40, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - /* Page 41, 0 indirect uses */ - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,20,21,20,21,20,21,20,21,20,21,20,21,20, - 21,20,21,20,21,20,21,20,21,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,20,21,20,21,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,20,21,25,25, - /* Page 42, 0 indirect uses */ - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - /* Page 43, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,29,29,29,29,29, - 28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 44, 0 indirect uses */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,29, - 0,1,0,0,0,1,1,0,1,0,1,0,1,29,29,29, - 29,29,29,29,1,0,1,1,29,29,29,29,29,29,29,29, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,1,28,28,28,28,28,28,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,24,24,24,24,10,24,24, - /* Page 45, 0 indirect uses */ - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,29,29,29,29,29,29,29,29,29,3, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,29, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,29, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,29, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 46, 0 indirect uses */ - 24,24,22,23,22,23,24,24,24,22,23,24,22,23,24,24, - 24,24,24,24,24,24,24,19,29,29,29,29,22,23,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,29,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 47, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,29,29,29,29, - /* Page 48, 0 indirect uses */ - 11,24,24,24,28,3,4,9,20,21,20,21,20,21,20,21, - 20,21,28,28,20,21,20,21,20,21,20,21,19,20,21,21, - 28,9,9,9,9,9,9,9,9,9,5,5,5,5,5,5, - 19,3,3,3,3,3,28,28,9,9,9,3,4,24,28,28, - 29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,29,5,5,27,27,3,3,4, - 19,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,24,3,3,3,4, - /* Page 49, 0 indirect uses */ - 29,29,29,29,29,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,29,29, - 29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29, - 28,28,10,10,10,10,28,28,28,28,28,28,28,28,28,28, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,29,29,29,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 50, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29, - 10,10,10,10,10,10,10,10,10,10,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29, - 28,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 10,10,10,10,10,10,10,10,10,10,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29, - /* Page 51, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - /* Page 52, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 53, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 54, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 55, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 56, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 57, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 58, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 59, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 60, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 61, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 62, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 63, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 64, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 65, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 66, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 67, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 68, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 69, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 70, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 71, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 72, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 73, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 74, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 75, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 76, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 77, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,29,29,29,29,29,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - /* Page 78, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 79, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 80, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 81, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 82, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 83, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 84, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 85, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 86, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 87, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 88, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 89, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 90, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 91, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 92, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 93, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 94, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 95, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 96, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 97, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 98, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 99, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 100, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 101, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 102, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 103, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 104, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 105, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 106, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 107, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 108, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 109, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 110, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 111, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 112, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 113, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 114, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 115, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 116, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 117, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 118, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 119, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 120, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 121, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 122, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 123, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 124, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 125, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 126, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 127, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 128, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 129, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 130, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 131, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 132, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 133, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 134, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 135, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 136, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 137, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 138, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 139, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 140, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 141, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 142, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 143, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 144, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 145, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 146, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 147, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 148, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 149, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 150, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 151, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 152, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 153, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 154, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 155, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 156, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 157, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 158, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 159, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 160, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,3,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 161, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 162, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 163, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 164, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 165, 0 indirect uses */ - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 166, 0 indirect uses */ - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 167, 0 indirect uses */ - 27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, - 27,27,27,27,27,27,27,3,3,3,3,29,29,29,29,29, - 27,27,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 168, 0 indirect uses */ - 4,4,6,4,4,4,5,4,4,4,4,5,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,6,6,5,5,6,28,28,28,28,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,24,24,24,24,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 169, 0 indirect uses */ - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 170, 0 indirect uses */ - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 171, 0 indirect uses */ - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 172, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 173, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 174, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 175, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 176, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 177, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 178, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 179, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 180, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 181, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 182, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 183, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 184, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 185, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 186, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 187, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 188, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 189, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 190, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 191, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 192, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 193, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 194, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 195, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 196, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 197, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 198, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 199, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 200, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 201, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 202, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 203, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 204, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 205, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 206, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 207, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 208, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 209, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 210, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 211, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 212, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 213, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 214, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 215, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 216, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 217, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 218, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 219, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 220, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 221, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 222, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 223, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* - * Page 224, 510 indirect uses: - * F0000-FFEFF (astral_index), - * 100000-10FEFF (astral_index) - */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 225, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 226, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 227, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 228, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 229, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 230, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 231, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 232, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 233, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 234, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 235, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 236, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 237, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 238, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 239, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 240, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 241, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 242, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 243, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 244, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 245, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 246, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 247, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 248, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 249, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 250, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 251, 0 indirect uses */ - 1,1,1,1,1,1,1,29,29,29,29,29,29,29,29,29, - 29,29,29,1,1,1,1,1,29,29,29,29,29,4,5,4, - 4,4,4,4,4,4,4,4,4,25,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,4,4,4,4,4,29,4,29, - 4,4,29,4,4,29,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 252, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 253, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,20,21, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 29,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,26,28,29,29, - /* Page 254, 0 indirect uses */ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 24,24,24,24,24,24,24,20,21,24,29,29,29,29,29,29, - 5,5,5,5,29,29,29,29,29,29,29,29,29,29,29,29, - 24,19,19,18,18,20,21,20,21,20,21,20,21,20,21,20, - 21,20,21,20,21,24,24,20,21,24,24,24,24,18,18,18, - 24,24,24,29,24,24,24,24,19,20,21,20,21,20,21,24, - 24,24,25,19,25,25,25,29,24,26,24,24,29,29,29,29, - 4,4,4,4,4,29,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,29,15, - /* Page 255, 0 indirect uses */ - 29,24,24,24,26,24,24,24,20,21,24,25,24,19,24,24, - 8,8,8,8,8,8,8,8,8,8,24,24,25,25,25,24, - 24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,20,24,21,27,18, - 27,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,20,25,21,25,20, - 21,24,20,21,24,24,4,4,4,4,4,4,4,4,4,4, - 3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29, - 29,29,4,4,4,4,4,4,29,29,4,4,4,4,4,4, - 29,29,4,4,4,4,4,4,29,29,4,4,4,29,29,29, - 26,26,25,27,28,26,26,29,28,25,25,25,25,28,28,29, - 29,29,29,29,29,29,29,29,29,15,15,15,28,28,29,29 -#ifndef DISABLE_ASTRAL - , - /* Page 256, 1 indirect use: 10000-100FF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,29,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,4,4,29,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,29,29,29,29, - /* Page 257, 1 indirect use: 10100-101FF (astral_index) */ - 24,24,28,29,29,29,29,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,29,29,29,28,28,28,28,28,28,28,28,28, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,10,10,10,10,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,10,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 258, 1 indirect use: 10300-103FF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29, - 10,10,10,10,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,9,4,4,4,4,4,4,4,4,9,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,24, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,29,29,29,29,4,4,4,4,4,4,4,4, - 24,9,9,9,9,9,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 259, 1 indirect use: 10400-104FF (astral_index) */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 8,8,8,8,8,8,8,8,8,8,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 260, 1 indirect use: 10800-108FF (astral_index) */ - 4,4,4,4,4,4,29,29,4,29,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,29,4,4,29,29,29,4,29,29,4, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 261, 1 indirect use: 10900-109FF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,10,10,10,10,29,29,29,29,29,24, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 262, 1 indirect use: 10A00-10AFF (astral_index) */ - 4,5,5,5,29,5,5,29,29,29,29,29,5,5,5,5, - 4,4,4,4,29,4,4,4,29,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,29,29,29,29,5,5,5,29,29,29,29,5, - 10,10,10,10,10,10,10,10,29,29,29,29,29,29,29,29, - 24,24,24,24,24,24,24,24,24,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 263, 1 indirect use: 12300-123FF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 264, 1 indirect use: 12400-124FF (astral_index) */ - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,29,29,29,29,29,29,29,29,29,29,29,29,29, - 24,24,24,24,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 265, 1 indirect use: 1D000-1D0FF (astral_index) */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29, - /* Page 266, 1 indirect use: 1D100-1D1FF (astral_index) */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,29,29,29,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,6,6,5,5,5,28,28,28,6,6,6, - 6,6,6,15,15,15,15,15,15,15,15,5,5,5,5,5, - 5,5,5,28,28,5,5,5,5,5,5,5,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,5,5,5,5,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 267, 1 indirect use: 1D200-1D2FF (astral_index) */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,5,5,5,28,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 268, 1 indirect use: 1D300-1D3FF (astral_index) */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 269, 1 indirect use: 1D400-1D4FF (astral_index) */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, - 1,1,1,1,1,29,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,0,29,0,0, - 29,29,0,29,29,0,0,29,29,0,0,0,0,29,0,0, - 0,0,0,0,0,0,1,1,1,1,29,1,29,1,1,1, - 1,1,1,1,29,1,1,1,1,1,1,1,1,1,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - /* Page 270, 1 indirect use: 1D500-1D5FF (astral_index) */ - 1,1,1,1,0,0,29,0,0,0,0,29,29,0,0,0, - 0,0,0,0,0,29,0,0,0,0,0,0,0,29,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,0,0,29,0,0,0,0,29, - 0,0,0,0,0,29,0,29,29,29,0,0,0,0,0,0, - 0,29,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - /* Page 271, 1 indirect use: 1D600-1D6FF (astral_index) */ - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,29,29,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,25,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,25,1,1,1,1, - 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,25,1,1,1,1, - /* Page 272, 1 indirect use: 1D700-1D7FF (astral_index) */ - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,25,1,1,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,25,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,25, - 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,25,1,1,1,1,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,25,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,25,1,1,1,1,1,1,0,1,29,29,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - /* Page 273, 1 indirect use: 2A600-2A6FF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 274, 1 indirect use: 2FA00-2FAFF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 275, 1 indirect use: E0000-E00FF (astral_index) */ - 29,15,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 276, 1 indirect use: E0100-E01FF (astral_index) */ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* - * Page 277, 2 indirect uses: - * FFF00-FFFFF (astral_index), - * 10FF00-10FFFF (astral_index) - */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,29,29 -#endif -}; - -#ifndef DISABLE_ASTRAL -static const guint16 CategoryData_v2_astral_index [4096] = -{ - /* 10000-100FF: page 256 */ - 0x100, - /* 10100-101FF: page 257 */ - 0x101, - /* 10200-102FF: page 8 */ - 0x8, - /* 10300-103FF: page 258 */ - 0x102, - /* 10400-104FF: page 259 */ - 0x103, - /* 10500-105FF: page 8 */ - 0x8, - /* 10600-106FF: page 8 */ - 0x8, - /* 10700-107FF: page 8 */ - 0x8, - /* 10800-108FF: page 260 */ - 0x104, - /* 10900-109FF: page 261 */ - 0x105, - /* 10A00-10AFF: page 262 */ - 0x106, - /* 10B00-10BFF: page 8 */ - 0x8, - /* 10C00-10CFF: page 8 */ - 0x8, - /* 10D00-10DFF: page 8 */ - 0x8, - /* 10E00-10EFF: page 8 */ - 0x8, - /* 10F00-10FFF: page 8 */ - 0x8, - /* 11000-110FF: page 8 */ - 0x8, - /* 11100-111FF: page 8 */ - 0x8, - /* 11200-112FF: page 8 */ - 0x8, - /* 11300-113FF: page 8 */ - 0x8, - /* 11400-114FF: page 8 */ - 0x8, - /* 11500-115FF: page 8 */ - 0x8, - /* 11600-116FF: page 8 */ - 0x8, - /* 11700-117FF: page 8 */ - 0x8, - /* 11800-118FF: page 8 */ - 0x8, - /* 11900-119FF: page 8 */ - 0x8, - /* 11A00-11AFF: page 8 */ - 0x8, - /* 11B00-11BFF: page 8 */ - 0x8, - /* 11C00-11CFF: page 8 */ - 0x8, - /* 11D00-11DFF: page 8 */ - 0x8, - /* 11E00-11EFF: page 8 */ - 0x8, - /* 11F00-11FFF: page 8 */ - 0x8, - /* 12000-120FF: page 21 */ - 0x15, - /* 12100-121FF: page 21 */ - 0x15, - /* 12200-122FF: page 21 */ - 0x15, - /* 12300-123FF: page 263 */ - 0x107, - /* 12400-124FF: page 264 */ - 0x108, - /* 12500-125FF: page 8 */ - 0x8, - /* 12600-126FF: page 8 */ - 0x8, - /* 12700-127FF: page 8 */ - 0x8, - /* 12800-128FF: page 8 */ - 0x8, - /* 12900-129FF: page 8 */ - 0x8, - /* 12A00-12AFF: page 8 */ - 0x8, - /* 12B00-12BFF: page 8 */ - 0x8, - /* 12C00-12CFF: page 8 */ - 0x8, - /* 12D00-12DFF: page 8 */ - 0x8, - /* 12E00-12EFF: page 8 */ - 0x8, - /* 12F00-12FFF: page 8 */ - 0x8, - /* 13000-130FF: page 8 */ - 0x8, - /* 13100-131FF: page 8 */ - 0x8, - /* 13200-132FF: page 8 */ - 0x8, - /* 13300-133FF: page 8 */ - 0x8, - /* 13400-134FF: page 8 */ - 0x8, - /* 13500-135FF: page 8 */ - 0x8, - /* 13600-136FF: page 8 */ - 0x8, - /* 13700-137FF: page 8 */ - 0x8, - /* 13800-138FF: page 8 */ - 0x8, - /* 13900-139FF: page 8 */ - 0x8, - /* 13A00-13AFF: page 8 */ - 0x8, - /* 13B00-13BFF: page 8 */ - 0x8, - /* 13C00-13CFF: page 8 */ - 0x8, - /* 13D00-13DFF: page 8 */ - 0x8, - /* 13E00-13EFF: page 8 */ - 0x8, - /* 13F00-13FFF: page 8 */ - 0x8, - /* 14000-140FF: page 8 */ - 0x8, - /* 14100-141FF: page 8 */ - 0x8, - /* 14200-142FF: page 8 */ - 0x8, - /* 14300-143FF: page 8 */ - 0x8, - /* 14400-144FF: page 8 */ - 0x8, - /* 14500-145FF: page 8 */ - 0x8, - /* 14600-146FF: page 8 */ - 0x8, - /* 14700-147FF: page 8 */ - 0x8, - /* 14800-148FF: page 8 */ - 0x8, - /* 14900-149FF: page 8 */ - 0x8, - /* 14A00-14AFF: page 8 */ - 0x8, - /* 14B00-14BFF: page 8 */ - 0x8, - /* 14C00-14CFF: page 8 */ - 0x8, - /* 14D00-14DFF: page 8 */ - 0x8, - /* 14E00-14EFF: page 8 */ - 0x8, - /* 14F00-14FFF: page 8 */ - 0x8, - /* 15000-150FF: page 8 */ - 0x8, - /* 15100-151FF: page 8 */ - 0x8, - /* 15200-152FF: page 8 */ - 0x8, - /* 15300-153FF: page 8 */ - 0x8, - /* 15400-154FF: page 8 */ - 0x8, - /* 15500-155FF: page 8 */ - 0x8, - /* 15600-156FF: page 8 */ - 0x8, - /* 15700-157FF: page 8 */ - 0x8, - /* 15800-158FF: page 8 */ - 0x8, - /* 15900-159FF: page 8 */ - 0x8, - /* 15A00-15AFF: page 8 */ - 0x8, - /* 15B00-15BFF: page 8 */ - 0x8, - /* 15C00-15CFF: page 8 */ - 0x8, - /* 15D00-15DFF: page 8 */ - 0x8, - /* 15E00-15EFF: page 8 */ - 0x8, - /* 15F00-15FFF: page 8 */ - 0x8, - /* 16000-160FF: page 8 */ - 0x8, - /* 16100-161FF: page 8 */ - 0x8, - /* 16200-162FF: page 8 */ - 0x8, - /* 16300-163FF: page 8 */ - 0x8, - /* 16400-164FF: page 8 */ - 0x8, - /* 16500-165FF: page 8 */ - 0x8, - /* 16600-166FF: page 8 */ - 0x8, - /* 16700-167FF: page 8 */ - 0x8, - /* 16800-168FF: page 8 */ - 0x8, - /* 16900-169FF: page 8 */ - 0x8, - /* 16A00-16AFF: page 8 */ - 0x8, - /* 16B00-16BFF: page 8 */ - 0x8, - /* 16C00-16CFF: page 8 */ - 0x8, - /* 16D00-16DFF: page 8 */ - 0x8, - /* 16E00-16EFF: page 8 */ - 0x8, - /* 16F00-16FFF: page 8 */ - 0x8, - /* 17000-170FF: page 8 */ - 0x8, - /* 17100-171FF: page 8 */ - 0x8, - /* 17200-172FF: page 8 */ - 0x8, - /* 17300-173FF: page 8 */ - 0x8, - /* 17400-174FF: page 8 */ - 0x8, - /* 17500-175FF: page 8 */ - 0x8, - /* 17600-176FF: page 8 */ - 0x8, - /* 17700-177FF: page 8 */ - 0x8, - /* 17800-178FF: page 8 */ - 0x8, - /* 17900-179FF: page 8 */ - 0x8, - /* 17A00-17AFF: page 8 */ - 0x8, - /* 17B00-17BFF: page 8 */ - 0x8, - /* 17C00-17CFF: page 8 */ - 0x8, - /* 17D00-17DFF: page 8 */ - 0x8, - /* 17E00-17EFF: page 8 */ - 0x8, - /* 17F00-17FFF: page 8 */ - 0x8, - /* 18000-180FF: page 8 */ - 0x8, - /* 18100-181FF: page 8 */ - 0x8, - /* 18200-182FF: page 8 */ - 0x8, - /* 18300-183FF: page 8 */ - 0x8, - /* 18400-184FF: page 8 */ - 0x8, - /* 18500-185FF: page 8 */ - 0x8, - /* 18600-186FF: page 8 */ - 0x8, - /* 18700-187FF: page 8 */ - 0x8, - /* 18800-188FF: page 8 */ - 0x8, - /* 18900-189FF: page 8 */ - 0x8, - /* 18A00-18AFF: page 8 */ - 0x8, - /* 18B00-18BFF: page 8 */ - 0x8, - /* 18C00-18CFF: page 8 */ - 0x8, - /* 18D00-18DFF: page 8 */ - 0x8, - /* 18E00-18EFF: page 8 */ - 0x8, - /* 18F00-18FFF: page 8 */ - 0x8, - /* 19000-190FF: page 8 */ - 0x8, - /* 19100-191FF: page 8 */ - 0x8, - /* 19200-192FF: page 8 */ - 0x8, - /* 19300-193FF: page 8 */ - 0x8, - /* 19400-194FF: page 8 */ - 0x8, - /* 19500-195FF: page 8 */ - 0x8, - /* 19600-196FF: page 8 */ - 0x8, - /* 19700-197FF: page 8 */ - 0x8, - /* 19800-198FF: page 8 */ - 0x8, - /* 19900-199FF: page 8 */ - 0x8, - /* 19A00-19AFF: page 8 */ - 0x8, - /* 19B00-19BFF: page 8 */ - 0x8, - /* 19C00-19CFF: page 8 */ - 0x8, - /* 19D00-19DFF: page 8 */ - 0x8, - /* 19E00-19EFF: page 8 */ - 0x8, - /* 19F00-19FFF: page 8 */ - 0x8, - /* 1A000-1A0FF: page 8 */ - 0x8, - /* 1A100-1A1FF: page 8 */ - 0x8, - /* 1A200-1A2FF: page 8 */ - 0x8, - /* 1A300-1A3FF: page 8 */ - 0x8, - /* 1A400-1A4FF: page 8 */ - 0x8, - /* 1A500-1A5FF: page 8 */ - 0x8, - /* 1A600-1A6FF: page 8 */ - 0x8, - /* 1A700-1A7FF: page 8 */ - 0x8, - /* 1A800-1A8FF: page 8 */ - 0x8, - /* 1A900-1A9FF: page 8 */ - 0x8, - /* 1AA00-1AAFF: page 8 */ - 0x8, - /* 1AB00-1ABFF: page 8 */ - 0x8, - /* 1AC00-1ACFF: page 8 */ - 0x8, - /* 1AD00-1ADFF: page 8 */ - 0x8, - /* 1AE00-1AEFF: page 8 */ - 0x8, - /* 1AF00-1AFFF: page 8 */ - 0x8, - /* 1B000-1B0FF: page 8 */ - 0x8, - /* 1B100-1B1FF: page 8 */ - 0x8, - /* 1B200-1B2FF: page 8 */ - 0x8, - /* 1B300-1B3FF: page 8 */ - 0x8, - /* 1B400-1B4FF: page 8 */ - 0x8, - /* 1B500-1B5FF: page 8 */ - 0x8, - /* 1B600-1B6FF: page 8 */ - 0x8, - /* 1B700-1B7FF: page 8 */ - 0x8, - /* 1B800-1B8FF: page 8 */ - 0x8, - /* 1B900-1B9FF: page 8 */ - 0x8, - /* 1BA00-1BAFF: page 8 */ - 0x8, - /* 1BB00-1BBFF: page 8 */ - 0x8, - /* 1BC00-1BCFF: page 8 */ - 0x8, - /* 1BD00-1BDFF: page 8 */ - 0x8, - /* 1BE00-1BEFF: page 8 */ - 0x8, - /* 1BF00-1BFFF: page 8 */ - 0x8, - /* 1C000-1C0FF: page 8 */ - 0x8, - /* 1C100-1C1FF: page 8 */ - 0x8, - /* 1C200-1C2FF: page 8 */ - 0x8, - /* 1C300-1C3FF: page 8 */ - 0x8, - /* 1C400-1C4FF: page 8 */ - 0x8, - /* 1C500-1C5FF: page 8 */ - 0x8, - /* 1C600-1C6FF: page 8 */ - 0x8, - /* 1C700-1C7FF: page 8 */ - 0x8, - /* 1C800-1C8FF: page 8 */ - 0x8, - /* 1C900-1C9FF: page 8 */ - 0x8, - /* 1CA00-1CAFF: page 8 */ - 0x8, - /* 1CB00-1CBFF: page 8 */ - 0x8, - /* 1CC00-1CCFF: page 8 */ - 0x8, - /* 1CD00-1CDFF: page 8 */ - 0x8, - /* 1CE00-1CEFF: page 8 */ - 0x8, - /* 1CF00-1CFFF: page 8 */ - 0x8, - /* 1D000-1D0FF: page 265 */ - 0x109, - /* 1D100-1D1FF: page 266 */ - 0x10A, - /* 1D200-1D2FF: page 267 */ - 0x10B, - /* 1D300-1D3FF: page 268 */ - 0x10C, - /* 1D400-1D4FF: page 269 */ - 0x10D, - /* 1D500-1D5FF: page 270 */ - 0x10E, - /* 1D600-1D6FF: page 271 */ - 0x10F, - /* 1D700-1D7FF: page 272 */ - 0x110, - /* 1D800-1D8FF: page 8 */ - 0x8, - /* 1D900-1D9FF: page 8 */ - 0x8, - /* 1DA00-1DAFF: page 8 */ - 0x8, - /* 1DB00-1DBFF: page 8 */ - 0x8, - /* 1DC00-1DCFF: page 8 */ - 0x8, - /* 1DD00-1DDFF: page 8 */ - 0x8, - /* 1DE00-1DEFF: page 8 */ - 0x8, - /* 1DF00-1DFFF: page 8 */ - 0x8, - /* 1E000-1E0FF: page 8 */ - 0x8, - /* 1E100-1E1FF: page 8 */ - 0x8, - /* 1E200-1E2FF: page 8 */ - 0x8, - /* 1E300-1E3FF: page 8 */ - 0x8, - /* 1E400-1E4FF: page 8 */ - 0x8, - /* 1E500-1E5FF: page 8 */ - 0x8, - /* 1E600-1E6FF: page 8 */ - 0x8, - /* 1E700-1E7FF: page 8 */ - 0x8, - /* 1E800-1E8FF: page 8 */ - 0x8, - /* 1E900-1E9FF: page 8 */ - 0x8, - /* 1EA00-1EAFF: page 8 */ - 0x8, - /* 1EB00-1EBFF: page 8 */ - 0x8, - /* 1EC00-1ECFF: page 8 */ - 0x8, - /* 1ED00-1EDFF: page 8 */ - 0x8, - /* 1EE00-1EEFF: page 8 */ - 0x8, - /* 1EF00-1EFFF: page 8 */ - 0x8, - /* 1F000-1F0FF: page 8 */ - 0x8, - /* 1F100-1F1FF: page 8 */ - 0x8, - /* 1F200-1F2FF: page 8 */ - 0x8, - /* 1F300-1F3FF: page 8 */ - 0x8, - /* 1F400-1F4FF: page 8 */ - 0x8, - /* 1F500-1F5FF: page 8 */ - 0x8, - /* 1F600-1F6FF: page 8 */ - 0x8, - /* 1F700-1F7FF: page 8 */ - 0x8, - /* 1F800-1F8FF: page 8 */ - 0x8, - /* 1F900-1F9FF: page 8 */ - 0x8, - /* 1FA00-1FAFF: page 8 */ - 0x8, - /* 1FB00-1FBFF: page 8 */ - 0x8, - /* 1FC00-1FCFF: page 8 */ - 0x8, - /* 1FD00-1FDFF: page 8 */ - 0x8, - /* 1FE00-1FEFF: page 8 */ - 0x8, - /* 1FF00-1FFFF: page 8 */ - 0x8, - /* 20000-200FF: page 21 */ - 0x15, - /* 20100-201FF: page 21 */ - 0x15, - /* 20200-202FF: page 21 */ - 0x15, - /* 20300-203FF: page 21 */ - 0x15, - /* 20400-204FF: page 21 */ - 0x15, - /* 20500-205FF: page 21 */ - 0x15, - /* 20600-206FF: page 21 */ - 0x15, - /* 20700-207FF: page 21 */ - 0x15, - /* 20800-208FF: page 21 */ - 0x15, - /* 20900-209FF: page 21 */ - 0x15, - /* 20A00-20AFF: page 21 */ - 0x15, - /* 20B00-20BFF: page 21 */ - 0x15, - /* 20C00-20CFF: page 21 */ - 0x15, - /* 20D00-20DFF: page 21 */ - 0x15, - /* 20E00-20EFF: page 21 */ - 0x15, - /* 20F00-20FFF: page 21 */ - 0x15, - /* 21000-210FF: page 21 */ - 0x15, - /* 21100-211FF: page 21 */ - 0x15, - /* 21200-212FF: page 21 */ - 0x15, - /* 21300-213FF: page 21 */ - 0x15, - /* 21400-214FF: page 21 */ - 0x15, - /* 21500-215FF: page 21 */ - 0x15, - /* 21600-216FF: page 21 */ - 0x15, - /* 21700-217FF: page 21 */ - 0x15, - /* 21800-218FF: page 21 */ - 0x15, - /* 21900-219FF: page 21 */ - 0x15, - /* 21A00-21AFF: page 21 */ - 0x15, - /* 21B00-21BFF: page 21 */ - 0x15, - /* 21C00-21CFF: page 21 */ - 0x15, - /* 21D00-21DFF: page 21 */ - 0x15, - /* 21E00-21EFF: page 21 */ - 0x15, - /* 21F00-21FFF: page 21 */ - 0x15, - /* 22000-220FF: page 21 */ - 0x15, - /* 22100-221FF: page 21 */ - 0x15, - /* 22200-222FF: page 21 */ - 0x15, - /* 22300-223FF: page 21 */ - 0x15, - /* 22400-224FF: page 21 */ - 0x15, - /* 22500-225FF: page 21 */ - 0x15, - /* 22600-226FF: page 21 */ - 0x15, - /* 22700-227FF: page 21 */ - 0x15, - /* 22800-228FF: page 21 */ - 0x15, - /* 22900-229FF: page 21 */ - 0x15, - /* 22A00-22AFF: page 21 */ - 0x15, - /* 22B00-22BFF: page 21 */ - 0x15, - /* 22C00-22CFF: page 21 */ - 0x15, - /* 22D00-22DFF: page 21 */ - 0x15, - /* 22E00-22EFF: page 21 */ - 0x15, - /* 22F00-22FFF: page 21 */ - 0x15, - /* 23000-230FF: page 21 */ - 0x15, - /* 23100-231FF: page 21 */ - 0x15, - /* 23200-232FF: page 21 */ - 0x15, - /* 23300-233FF: page 21 */ - 0x15, - /* 23400-234FF: page 21 */ - 0x15, - /* 23500-235FF: page 21 */ - 0x15, - /* 23600-236FF: page 21 */ - 0x15, - /* 23700-237FF: page 21 */ - 0x15, - /* 23800-238FF: page 21 */ - 0x15, - /* 23900-239FF: page 21 */ - 0x15, - /* 23A00-23AFF: page 21 */ - 0x15, - /* 23B00-23BFF: page 21 */ - 0x15, - /* 23C00-23CFF: page 21 */ - 0x15, - /* 23D00-23DFF: page 21 */ - 0x15, - /* 23E00-23EFF: page 21 */ - 0x15, - /* 23F00-23FFF: page 21 */ - 0x15, - /* 24000-240FF: page 21 */ - 0x15, - /* 24100-241FF: page 21 */ - 0x15, - /* 24200-242FF: page 21 */ - 0x15, - /* 24300-243FF: page 21 */ - 0x15, - /* 24400-244FF: page 21 */ - 0x15, - /* 24500-245FF: page 21 */ - 0x15, - /* 24600-246FF: page 21 */ - 0x15, - /* 24700-247FF: page 21 */ - 0x15, - /* 24800-248FF: page 21 */ - 0x15, - /* 24900-249FF: page 21 */ - 0x15, - /* 24A00-24AFF: page 21 */ - 0x15, - /* 24B00-24BFF: page 21 */ - 0x15, - /* 24C00-24CFF: page 21 */ - 0x15, - /* 24D00-24DFF: page 21 */ - 0x15, - /* 24E00-24EFF: page 21 */ - 0x15, - /* 24F00-24FFF: page 21 */ - 0x15, - /* 25000-250FF: page 21 */ - 0x15, - /* 25100-251FF: page 21 */ - 0x15, - /* 25200-252FF: page 21 */ - 0x15, - /* 25300-253FF: page 21 */ - 0x15, - /* 25400-254FF: page 21 */ - 0x15, - /* 25500-255FF: page 21 */ - 0x15, - /* 25600-256FF: page 21 */ - 0x15, - /* 25700-257FF: page 21 */ - 0x15, - /* 25800-258FF: page 21 */ - 0x15, - /* 25900-259FF: page 21 */ - 0x15, - /* 25A00-25AFF: page 21 */ - 0x15, - /* 25B00-25BFF: page 21 */ - 0x15, - /* 25C00-25CFF: page 21 */ - 0x15, - /* 25D00-25DFF: page 21 */ - 0x15, - /* 25E00-25EFF: page 21 */ - 0x15, - /* 25F00-25FFF: page 21 */ - 0x15, - /* 26000-260FF: page 21 */ - 0x15, - /* 26100-261FF: page 21 */ - 0x15, - /* 26200-262FF: page 21 */ - 0x15, - /* 26300-263FF: page 21 */ - 0x15, - /* 26400-264FF: page 21 */ - 0x15, - /* 26500-265FF: page 21 */ - 0x15, - /* 26600-266FF: page 21 */ - 0x15, - /* 26700-267FF: page 21 */ - 0x15, - /* 26800-268FF: page 21 */ - 0x15, - /* 26900-269FF: page 21 */ - 0x15, - /* 26A00-26AFF: page 21 */ - 0x15, - /* 26B00-26BFF: page 21 */ - 0x15, - /* 26C00-26CFF: page 21 */ - 0x15, - /* 26D00-26DFF: page 21 */ - 0x15, - /* 26E00-26EFF: page 21 */ - 0x15, - /* 26F00-26FFF: page 21 */ - 0x15, - /* 27000-270FF: page 21 */ - 0x15, - /* 27100-271FF: page 21 */ - 0x15, - /* 27200-272FF: page 21 */ - 0x15, - /* 27300-273FF: page 21 */ - 0x15, - /* 27400-274FF: page 21 */ - 0x15, - /* 27500-275FF: page 21 */ - 0x15, - /* 27600-276FF: page 21 */ - 0x15, - /* 27700-277FF: page 21 */ - 0x15, - /* 27800-278FF: page 21 */ - 0x15, - /* 27900-279FF: page 21 */ - 0x15, - /* 27A00-27AFF: page 21 */ - 0x15, - /* 27B00-27BFF: page 21 */ - 0x15, - /* 27C00-27CFF: page 21 */ - 0x15, - /* 27D00-27DFF: page 21 */ - 0x15, - /* 27E00-27EFF: page 21 */ - 0x15, - /* 27F00-27FFF: page 21 */ - 0x15, - /* 28000-280FF: page 21 */ - 0x15, - /* 28100-281FF: page 21 */ - 0x15, - /* 28200-282FF: page 21 */ - 0x15, - /* 28300-283FF: page 21 */ - 0x15, - /* 28400-284FF: page 21 */ - 0x15, - /* 28500-285FF: page 21 */ - 0x15, - /* 28600-286FF: page 21 */ - 0x15, - /* 28700-287FF: page 21 */ - 0x15, - /* 28800-288FF: page 21 */ - 0x15, - /* 28900-289FF: page 21 */ - 0x15, - /* 28A00-28AFF: page 21 */ - 0x15, - /* 28B00-28BFF: page 21 */ - 0x15, - /* 28C00-28CFF: page 21 */ - 0x15, - /* 28D00-28DFF: page 21 */ - 0x15, - /* 28E00-28EFF: page 21 */ - 0x15, - /* 28F00-28FFF: page 21 */ - 0x15, - /* 29000-290FF: page 21 */ - 0x15, - /* 29100-291FF: page 21 */ - 0x15, - /* 29200-292FF: page 21 */ - 0x15, - /* 29300-293FF: page 21 */ - 0x15, - /* 29400-294FF: page 21 */ - 0x15, - /* 29500-295FF: page 21 */ - 0x15, - /* 29600-296FF: page 21 */ - 0x15, - /* 29700-297FF: page 21 */ - 0x15, - /* 29800-298FF: page 21 */ - 0x15, - /* 29900-299FF: page 21 */ - 0x15, - /* 29A00-29AFF: page 21 */ - 0x15, - /* 29B00-29BFF: page 21 */ - 0x15, - /* 29C00-29CFF: page 21 */ - 0x15, - /* 29D00-29DFF: page 21 */ - 0x15, - /* 29E00-29EFF: page 21 */ - 0x15, - /* 29F00-29FFF: page 21 */ - 0x15, - /* 2A000-2A0FF: page 21 */ - 0x15, - /* 2A100-2A1FF: page 21 */ - 0x15, - /* 2A200-2A2FF: page 21 */ - 0x15, - /* 2A300-2A3FF: page 21 */ - 0x15, - /* 2A400-2A4FF: page 21 */ - 0x15, - /* 2A500-2A5FF: page 21 */ - 0x15, - /* 2A600-2A6FF: page 273 */ - 0x111, - /* 2A700-2A7FF: page 8 */ - 0x8, - /* 2A800-2A8FF: page 8 */ - 0x8, - /* 2A900-2A9FF: page 8 */ - 0x8, - /* 2AA00-2AAFF: page 8 */ - 0x8, - /* 2AB00-2ABFF: page 8 */ - 0x8, - /* 2AC00-2ACFF: page 8 */ - 0x8, - /* 2AD00-2ADFF: page 8 */ - 0x8, - /* 2AE00-2AEFF: page 8 */ - 0x8, - /* 2AF00-2AFFF: page 8 */ - 0x8, - /* 2B000-2B0FF: page 8 */ - 0x8, - /* 2B100-2B1FF: page 8 */ - 0x8, - /* 2B200-2B2FF: page 8 */ - 0x8, - /* 2B300-2B3FF: page 8 */ - 0x8, - /* 2B400-2B4FF: page 8 */ - 0x8, - /* 2B500-2B5FF: page 8 */ - 0x8, - /* 2B600-2B6FF: page 8 */ - 0x8, - /* 2B700-2B7FF: page 8 */ - 0x8, - /* 2B800-2B8FF: page 8 */ - 0x8, - /* 2B900-2B9FF: page 8 */ - 0x8, - /* 2BA00-2BAFF: page 8 */ - 0x8, - /* 2BB00-2BBFF: page 8 */ - 0x8, - /* 2BC00-2BCFF: page 8 */ - 0x8, - /* 2BD00-2BDFF: page 8 */ - 0x8, - /* 2BE00-2BEFF: page 8 */ - 0x8, - /* 2BF00-2BFFF: page 8 */ - 0x8, - /* 2C000-2C0FF: page 8 */ - 0x8, - /* 2C100-2C1FF: page 8 */ - 0x8, - /* 2C200-2C2FF: page 8 */ - 0x8, - /* 2C300-2C3FF: page 8 */ - 0x8, - /* 2C400-2C4FF: page 8 */ - 0x8, - /* 2C500-2C5FF: page 8 */ - 0x8, - /* 2C600-2C6FF: page 8 */ - 0x8, - /* 2C700-2C7FF: page 8 */ - 0x8, - /* 2C800-2C8FF: page 8 */ - 0x8, - /* 2C900-2C9FF: page 8 */ - 0x8, - /* 2CA00-2CAFF: page 8 */ - 0x8, - /* 2CB00-2CBFF: page 8 */ - 0x8, - /* 2CC00-2CCFF: page 8 */ - 0x8, - /* 2CD00-2CDFF: page 8 */ - 0x8, - /* 2CE00-2CEFF: page 8 */ - 0x8, - /* 2CF00-2CFFF: page 8 */ - 0x8, - /* 2D000-2D0FF: page 8 */ - 0x8, - /* 2D100-2D1FF: page 8 */ - 0x8, - /* 2D200-2D2FF: page 8 */ - 0x8, - /* 2D300-2D3FF: page 8 */ - 0x8, - /* 2D400-2D4FF: page 8 */ - 0x8, - /* 2D500-2D5FF: page 8 */ - 0x8, - /* 2D600-2D6FF: page 8 */ - 0x8, - /* 2D700-2D7FF: page 8 */ - 0x8, - /* 2D800-2D8FF: page 8 */ - 0x8, - /* 2D900-2D9FF: page 8 */ - 0x8, - /* 2DA00-2DAFF: page 8 */ - 0x8, - /* 2DB00-2DBFF: page 8 */ - 0x8, - /* 2DC00-2DCFF: page 8 */ - 0x8, - /* 2DD00-2DDFF: page 8 */ - 0x8, - /* 2DE00-2DEFF: page 8 */ - 0x8, - /* 2DF00-2DFFF: page 8 */ - 0x8, - /* 2E000-2E0FF: page 8 */ - 0x8, - /* 2E100-2E1FF: page 8 */ - 0x8, - /* 2E200-2E2FF: page 8 */ - 0x8, - /* 2E300-2E3FF: page 8 */ - 0x8, - /* 2E400-2E4FF: page 8 */ - 0x8, - /* 2E500-2E5FF: page 8 */ - 0x8, - /* 2E600-2E6FF: page 8 */ - 0x8, - /* 2E700-2E7FF: page 8 */ - 0x8, - /* 2E800-2E8FF: page 8 */ - 0x8, - /* 2E900-2E9FF: page 8 */ - 0x8, - /* 2EA00-2EAFF: page 8 */ - 0x8, - /* 2EB00-2EBFF: page 8 */ - 0x8, - /* 2EC00-2ECFF: page 8 */ - 0x8, - /* 2ED00-2EDFF: page 8 */ - 0x8, - /* 2EE00-2EEFF: page 8 */ - 0x8, - /* 2EF00-2EFFF: page 8 */ - 0x8, - /* 2F000-2F0FF: page 8 */ - 0x8, - /* 2F100-2F1FF: page 8 */ - 0x8, - /* 2F200-2F2FF: page 8 */ - 0x8, - /* 2F300-2F3FF: page 8 */ - 0x8, - /* 2F400-2F4FF: page 8 */ - 0x8, - /* 2F500-2F5FF: page 8 */ - 0x8, - /* 2F600-2F6FF: page 8 */ - 0x8, - /* 2F700-2F7FF: page 8 */ - 0x8, - /* 2F800-2F8FF: page 21 */ - 0x15, - /* 2F900-2F9FF: page 21 */ - 0x15, - /* 2FA00-2FAFF: page 274 */ - 0x112, - /* 2FB00-2FBFF: page 8 */ - 0x8, - /* 2FC00-2FCFF: page 8 */ - 0x8, - /* 2FD00-2FDFF: page 8 */ - 0x8, - /* 2FE00-2FEFF: page 8 */ - 0x8, - /* 2FF00-2FFFF: page 8 */ - 0x8, - /* 30000-300FF: page 8 */ - 0x8, - /* 30100-301FF: page 8 */ - 0x8, - /* 30200-302FF: page 8 */ - 0x8, - /* 30300-303FF: page 8 */ - 0x8, - /* 30400-304FF: page 8 */ - 0x8, - /* 30500-305FF: page 8 */ - 0x8, - /* 30600-306FF: page 8 */ - 0x8, - /* 30700-307FF: page 8 */ - 0x8, - /* 30800-308FF: page 8 */ - 0x8, - /* 30900-309FF: page 8 */ - 0x8, - /* 30A00-30AFF: page 8 */ - 0x8, - /* 30B00-30BFF: page 8 */ - 0x8, - /* 30C00-30CFF: page 8 */ - 0x8, - /* 30D00-30DFF: page 8 */ - 0x8, - /* 30E00-30EFF: page 8 */ - 0x8, - /* 30F00-30FFF: page 8 */ - 0x8, - /* 31000-310FF: page 8 */ - 0x8, - /* 31100-311FF: page 8 */ - 0x8, - /* 31200-312FF: page 8 */ - 0x8, - /* 31300-313FF: page 8 */ - 0x8, - /* 31400-314FF: page 8 */ - 0x8, - /* 31500-315FF: page 8 */ - 0x8, - /* 31600-316FF: page 8 */ - 0x8, - /* 31700-317FF: page 8 */ - 0x8, - /* 31800-318FF: page 8 */ - 0x8, - /* 31900-319FF: page 8 */ - 0x8, - /* 31A00-31AFF: page 8 */ - 0x8, - /* 31B00-31BFF: page 8 */ - 0x8, - /* 31C00-31CFF: page 8 */ - 0x8, - /* 31D00-31DFF: page 8 */ - 0x8, - /* 31E00-31EFF: page 8 */ - 0x8, - /* 31F00-31FFF: page 8 */ - 0x8, - /* 32000-320FF: page 8 */ - 0x8, - /* 32100-321FF: page 8 */ - 0x8, - /* 32200-322FF: page 8 */ - 0x8, - /* 32300-323FF: page 8 */ - 0x8, - /* 32400-324FF: page 8 */ - 0x8, - /* 32500-325FF: page 8 */ - 0x8, - /* 32600-326FF: page 8 */ - 0x8, - /* 32700-327FF: page 8 */ - 0x8, - /* 32800-328FF: page 8 */ - 0x8, - /* 32900-329FF: page 8 */ - 0x8, - /* 32A00-32AFF: page 8 */ - 0x8, - /* 32B00-32BFF: page 8 */ - 0x8, - /* 32C00-32CFF: page 8 */ - 0x8, - /* 32D00-32DFF: page 8 */ - 0x8, - /* 32E00-32EFF: page 8 */ - 0x8, - /* 32F00-32FFF: page 8 */ - 0x8, - /* 33000-330FF: page 8 */ - 0x8, - /* 33100-331FF: page 8 */ - 0x8, - /* 33200-332FF: page 8 */ - 0x8, - /* 33300-333FF: page 8 */ - 0x8, - /* 33400-334FF: page 8 */ - 0x8, - /* 33500-335FF: page 8 */ - 0x8, - /* 33600-336FF: page 8 */ - 0x8, - /* 33700-337FF: page 8 */ - 0x8, - /* 33800-338FF: page 8 */ - 0x8, - /* 33900-339FF: page 8 */ - 0x8, - /* 33A00-33AFF: page 8 */ - 0x8, - /* 33B00-33BFF: page 8 */ - 0x8, - /* 33C00-33CFF: page 8 */ - 0x8, - /* 33D00-33DFF: page 8 */ - 0x8, - /* 33E00-33EFF: page 8 */ - 0x8, - /* 33F00-33FFF: page 8 */ - 0x8, - /* 34000-340FF: page 8 */ - 0x8, - /* 34100-341FF: page 8 */ - 0x8, - /* 34200-342FF: page 8 */ - 0x8, - /* 34300-343FF: page 8 */ - 0x8, - /* 34400-344FF: page 8 */ - 0x8, - /* 34500-345FF: page 8 */ - 0x8, - /* 34600-346FF: page 8 */ - 0x8, - /* 34700-347FF: page 8 */ - 0x8, - /* 34800-348FF: page 8 */ - 0x8, - /* 34900-349FF: page 8 */ - 0x8, - /* 34A00-34AFF: page 8 */ - 0x8, - /* 34B00-34BFF: page 8 */ - 0x8, - /* 34C00-34CFF: page 8 */ - 0x8, - /* 34D00-34DFF: page 8 */ - 0x8, - /* 34E00-34EFF: page 8 */ - 0x8, - /* 34F00-34FFF: page 8 */ - 0x8, - /* 35000-350FF: page 8 */ - 0x8, - /* 35100-351FF: page 8 */ - 0x8, - /* 35200-352FF: page 8 */ - 0x8, - /* 35300-353FF: page 8 */ - 0x8, - /* 35400-354FF: page 8 */ - 0x8, - /* 35500-355FF: page 8 */ - 0x8, - /* 35600-356FF: page 8 */ - 0x8, - /* 35700-357FF: page 8 */ - 0x8, - /* 35800-358FF: page 8 */ - 0x8, - /* 35900-359FF: page 8 */ - 0x8, - /* 35A00-35AFF: page 8 */ - 0x8, - /* 35B00-35BFF: page 8 */ - 0x8, - /* 35C00-35CFF: page 8 */ - 0x8, - /* 35D00-35DFF: page 8 */ - 0x8, - /* 35E00-35EFF: page 8 */ - 0x8, - /* 35F00-35FFF: page 8 */ - 0x8, - /* 36000-360FF: page 8 */ - 0x8, - /* 36100-361FF: page 8 */ - 0x8, - /* 36200-362FF: page 8 */ - 0x8, - /* 36300-363FF: page 8 */ - 0x8, - /* 36400-364FF: page 8 */ - 0x8, - /* 36500-365FF: page 8 */ - 0x8, - /* 36600-366FF: page 8 */ - 0x8, - /* 36700-367FF: page 8 */ - 0x8, - /* 36800-368FF: page 8 */ - 0x8, - /* 36900-369FF: page 8 */ - 0x8, - /* 36A00-36AFF: page 8 */ - 0x8, - /* 36B00-36BFF: page 8 */ - 0x8, - /* 36C00-36CFF: page 8 */ - 0x8, - /* 36D00-36DFF: page 8 */ - 0x8, - /* 36E00-36EFF: page 8 */ - 0x8, - /* 36F00-36FFF: page 8 */ - 0x8, - /* 37000-370FF: page 8 */ - 0x8, - /* 37100-371FF: page 8 */ - 0x8, - /* 37200-372FF: page 8 */ - 0x8, - /* 37300-373FF: page 8 */ - 0x8, - /* 37400-374FF: page 8 */ - 0x8, - /* 37500-375FF: page 8 */ - 0x8, - /* 37600-376FF: page 8 */ - 0x8, - /* 37700-377FF: page 8 */ - 0x8, - /* 37800-378FF: page 8 */ - 0x8, - /* 37900-379FF: page 8 */ - 0x8, - /* 37A00-37AFF: page 8 */ - 0x8, - /* 37B00-37BFF: page 8 */ - 0x8, - /* 37C00-37CFF: page 8 */ - 0x8, - /* 37D00-37DFF: page 8 */ - 0x8, - /* 37E00-37EFF: page 8 */ - 0x8, - /* 37F00-37FFF: page 8 */ - 0x8, - /* 38000-380FF: page 8 */ - 0x8, - /* 38100-381FF: page 8 */ - 0x8, - /* 38200-382FF: page 8 */ - 0x8, - /* 38300-383FF: page 8 */ - 0x8, - /* 38400-384FF: page 8 */ - 0x8, - /* 38500-385FF: page 8 */ - 0x8, - /* 38600-386FF: page 8 */ - 0x8, - /* 38700-387FF: page 8 */ - 0x8, - /* 38800-388FF: page 8 */ - 0x8, - /* 38900-389FF: page 8 */ - 0x8, - /* 38A00-38AFF: page 8 */ - 0x8, - /* 38B00-38BFF: page 8 */ - 0x8, - /* 38C00-38CFF: page 8 */ - 0x8, - /* 38D00-38DFF: page 8 */ - 0x8, - /* 38E00-38EFF: page 8 */ - 0x8, - /* 38F00-38FFF: page 8 */ - 0x8, - /* 39000-390FF: page 8 */ - 0x8, - /* 39100-391FF: page 8 */ - 0x8, - /* 39200-392FF: page 8 */ - 0x8, - /* 39300-393FF: page 8 */ - 0x8, - /* 39400-394FF: page 8 */ - 0x8, - /* 39500-395FF: page 8 */ - 0x8, - /* 39600-396FF: page 8 */ - 0x8, - /* 39700-397FF: page 8 */ - 0x8, - /* 39800-398FF: page 8 */ - 0x8, - /* 39900-399FF: page 8 */ - 0x8, - /* 39A00-39AFF: page 8 */ - 0x8, - /* 39B00-39BFF: page 8 */ - 0x8, - /* 39C00-39CFF: page 8 */ - 0x8, - /* 39D00-39DFF: page 8 */ - 0x8, - /* 39E00-39EFF: page 8 */ - 0x8, - /* 39F00-39FFF: page 8 */ - 0x8, - /* 3A000-3A0FF: page 8 */ - 0x8, - /* 3A100-3A1FF: page 8 */ - 0x8, - /* 3A200-3A2FF: page 8 */ - 0x8, - /* 3A300-3A3FF: page 8 */ - 0x8, - /* 3A400-3A4FF: page 8 */ - 0x8, - /* 3A500-3A5FF: page 8 */ - 0x8, - /* 3A600-3A6FF: page 8 */ - 0x8, - /* 3A700-3A7FF: page 8 */ - 0x8, - /* 3A800-3A8FF: page 8 */ - 0x8, - /* 3A900-3A9FF: page 8 */ - 0x8, - /* 3AA00-3AAFF: page 8 */ - 0x8, - /* 3AB00-3ABFF: page 8 */ - 0x8, - /* 3AC00-3ACFF: page 8 */ - 0x8, - /* 3AD00-3ADFF: page 8 */ - 0x8, - /* 3AE00-3AEFF: page 8 */ - 0x8, - /* 3AF00-3AFFF: page 8 */ - 0x8, - /* 3B000-3B0FF: page 8 */ - 0x8, - /* 3B100-3B1FF: page 8 */ - 0x8, - /* 3B200-3B2FF: page 8 */ - 0x8, - /* 3B300-3B3FF: page 8 */ - 0x8, - /* 3B400-3B4FF: page 8 */ - 0x8, - /* 3B500-3B5FF: page 8 */ - 0x8, - /* 3B600-3B6FF: page 8 */ - 0x8, - /* 3B700-3B7FF: page 8 */ - 0x8, - /* 3B800-3B8FF: page 8 */ - 0x8, - /* 3B900-3B9FF: page 8 */ - 0x8, - /* 3BA00-3BAFF: page 8 */ - 0x8, - /* 3BB00-3BBFF: page 8 */ - 0x8, - /* 3BC00-3BCFF: page 8 */ - 0x8, - /* 3BD00-3BDFF: page 8 */ - 0x8, - /* 3BE00-3BEFF: page 8 */ - 0x8, - /* 3BF00-3BFFF: page 8 */ - 0x8, - /* 3C000-3C0FF: page 8 */ - 0x8, - /* 3C100-3C1FF: page 8 */ - 0x8, - /* 3C200-3C2FF: page 8 */ - 0x8, - /* 3C300-3C3FF: page 8 */ - 0x8, - /* 3C400-3C4FF: page 8 */ - 0x8, - /* 3C500-3C5FF: page 8 */ - 0x8, - /* 3C600-3C6FF: page 8 */ - 0x8, - /* 3C700-3C7FF: page 8 */ - 0x8, - /* 3C800-3C8FF: page 8 */ - 0x8, - /* 3C900-3C9FF: page 8 */ - 0x8, - /* 3CA00-3CAFF: page 8 */ - 0x8, - /* 3CB00-3CBFF: page 8 */ - 0x8, - /* 3CC00-3CCFF: page 8 */ - 0x8, - /* 3CD00-3CDFF: page 8 */ - 0x8, - /* 3CE00-3CEFF: page 8 */ - 0x8, - /* 3CF00-3CFFF: page 8 */ - 0x8, - /* 3D000-3D0FF: page 8 */ - 0x8, - /* 3D100-3D1FF: page 8 */ - 0x8, - /* 3D200-3D2FF: page 8 */ - 0x8, - /* 3D300-3D3FF: page 8 */ - 0x8, - /* 3D400-3D4FF: page 8 */ - 0x8, - /* 3D500-3D5FF: page 8 */ - 0x8, - /* 3D600-3D6FF: page 8 */ - 0x8, - /* 3D700-3D7FF: page 8 */ - 0x8, - /* 3D800-3D8FF: page 8 */ - 0x8, - /* 3D900-3D9FF: page 8 */ - 0x8, - /* 3DA00-3DAFF: page 8 */ - 0x8, - /* 3DB00-3DBFF: page 8 */ - 0x8, - /* 3DC00-3DCFF: page 8 */ - 0x8, - /* 3DD00-3DDFF: page 8 */ - 0x8, - /* 3DE00-3DEFF: page 8 */ - 0x8, - /* 3DF00-3DFFF: page 8 */ - 0x8, - /* 3E000-3E0FF: page 8 */ - 0x8, - /* 3E100-3E1FF: page 8 */ - 0x8, - /* 3E200-3E2FF: page 8 */ - 0x8, - /* 3E300-3E3FF: page 8 */ - 0x8, - /* 3E400-3E4FF: page 8 */ - 0x8, - /* 3E500-3E5FF: page 8 */ - 0x8, - /* 3E600-3E6FF: page 8 */ - 0x8, - /* 3E700-3E7FF: page 8 */ - 0x8, - /* 3E800-3E8FF: page 8 */ - 0x8, - /* 3E900-3E9FF: page 8 */ - 0x8, - /* 3EA00-3EAFF: page 8 */ - 0x8, - /* 3EB00-3EBFF: page 8 */ - 0x8, - /* 3EC00-3ECFF: page 8 */ - 0x8, - /* 3ED00-3EDFF: page 8 */ - 0x8, - /* 3EE00-3EEFF: page 8 */ - 0x8, - /* 3EF00-3EFFF: page 8 */ - 0x8, - /* 3F000-3F0FF: page 8 */ - 0x8, - /* 3F100-3F1FF: page 8 */ - 0x8, - /* 3F200-3F2FF: page 8 */ - 0x8, - /* 3F300-3F3FF: page 8 */ - 0x8, - /* 3F400-3F4FF: page 8 */ - 0x8, - /* 3F500-3F5FF: page 8 */ - 0x8, - /* 3F600-3F6FF: page 8 */ - 0x8, - /* 3F700-3F7FF: page 8 */ - 0x8, - /* 3F800-3F8FF: page 8 */ - 0x8, - /* 3F900-3F9FF: page 8 */ - 0x8, - /* 3FA00-3FAFF: page 8 */ - 0x8, - /* 3FB00-3FBFF: page 8 */ - 0x8, - /* 3FC00-3FCFF: page 8 */ - 0x8, - /* 3FD00-3FDFF: page 8 */ - 0x8, - /* 3FE00-3FEFF: page 8 */ - 0x8, - /* 3FF00-3FFFF: page 8 */ - 0x8, - /* 40000-400FF: page 8 */ - 0x8, - /* 40100-401FF: page 8 */ - 0x8, - /* 40200-402FF: page 8 */ - 0x8, - /* 40300-403FF: page 8 */ - 0x8, - /* 40400-404FF: page 8 */ - 0x8, - /* 40500-405FF: page 8 */ - 0x8, - /* 40600-406FF: page 8 */ - 0x8, - /* 40700-407FF: page 8 */ - 0x8, - /* 40800-408FF: page 8 */ - 0x8, - /* 40900-409FF: page 8 */ - 0x8, - /* 40A00-40AFF: page 8 */ - 0x8, - /* 40B00-40BFF: page 8 */ - 0x8, - /* 40C00-40CFF: page 8 */ - 0x8, - /* 40D00-40DFF: page 8 */ - 0x8, - /* 40E00-40EFF: page 8 */ - 0x8, - /* 40F00-40FFF: page 8 */ - 0x8, - /* 41000-410FF: page 8 */ - 0x8, - /* 41100-411FF: page 8 */ - 0x8, - /* 41200-412FF: page 8 */ - 0x8, - /* 41300-413FF: page 8 */ - 0x8, - /* 41400-414FF: page 8 */ - 0x8, - /* 41500-415FF: page 8 */ - 0x8, - /* 41600-416FF: page 8 */ - 0x8, - /* 41700-417FF: page 8 */ - 0x8, - /* 41800-418FF: page 8 */ - 0x8, - /* 41900-419FF: page 8 */ - 0x8, - /* 41A00-41AFF: page 8 */ - 0x8, - /* 41B00-41BFF: page 8 */ - 0x8, - /* 41C00-41CFF: page 8 */ - 0x8, - /* 41D00-41DFF: page 8 */ - 0x8, - /* 41E00-41EFF: page 8 */ - 0x8, - /* 41F00-41FFF: page 8 */ - 0x8, - /* 42000-420FF: page 8 */ - 0x8, - /* 42100-421FF: page 8 */ - 0x8, - /* 42200-422FF: page 8 */ - 0x8, - /* 42300-423FF: page 8 */ - 0x8, - /* 42400-424FF: page 8 */ - 0x8, - /* 42500-425FF: page 8 */ - 0x8, - /* 42600-426FF: page 8 */ - 0x8, - /* 42700-427FF: page 8 */ - 0x8, - /* 42800-428FF: page 8 */ - 0x8, - /* 42900-429FF: page 8 */ - 0x8, - /* 42A00-42AFF: page 8 */ - 0x8, - /* 42B00-42BFF: page 8 */ - 0x8, - /* 42C00-42CFF: page 8 */ - 0x8, - /* 42D00-42DFF: page 8 */ - 0x8, - /* 42E00-42EFF: page 8 */ - 0x8, - /* 42F00-42FFF: page 8 */ - 0x8, - /* 43000-430FF: page 8 */ - 0x8, - /* 43100-431FF: page 8 */ - 0x8, - /* 43200-432FF: page 8 */ - 0x8, - /* 43300-433FF: page 8 */ - 0x8, - /* 43400-434FF: page 8 */ - 0x8, - /* 43500-435FF: page 8 */ - 0x8, - /* 43600-436FF: page 8 */ - 0x8, - /* 43700-437FF: page 8 */ - 0x8, - /* 43800-438FF: page 8 */ - 0x8, - /* 43900-439FF: page 8 */ - 0x8, - /* 43A00-43AFF: page 8 */ - 0x8, - /* 43B00-43BFF: page 8 */ - 0x8, - /* 43C00-43CFF: page 8 */ - 0x8, - /* 43D00-43DFF: page 8 */ - 0x8, - /* 43E00-43EFF: page 8 */ - 0x8, - /* 43F00-43FFF: page 8 */ - 0x8, - /* 44000-440FF: page 8 */ - 0x8, - /* 44100-441FF: page 8 */ - 0x8, - /* 44200-442FF: page 8 */ - 0x8, - /* 44300-443FF: page 8 */ - 0x8, - /* 44400-444FF: page 8 */ - 0x8, - /* 44500-445FF: page 8 */ - 0x8, - /* 44600-446FF: page 8 */ - 0x8, - /* 44700-447FF: page 8 */ - 0x8, - /* 44800-448FF: page 8 */ - 0x8, - /* 44900-449FF: page 8 */ - 0x8, - /* 44A00-44AFF: page 8 */ - 0x8, - /* 44B00-44BFF: page 8 */ - 0x8, - /* 44C00-44CFF: page 8 */ - 0x8, - /* 44D00-44DFF: page 8 */ - 0x8, - /* 44E00-44EFF: page 8 */ - 0x8, - /* 44F00-44FFF: page 8 */ - 0x8, - /* 45000-450FF: page 8 */ - 0x8, - /* 45100-451FF: page 8 */ - 0x8, - /* 45200-452FF: page 8 */ - 0x8, - /* 45300-453FF: page 8 */ - 0x8, - /* 45400-454FF: page 8 */ - 0x8, - /* 45500-455FF: page 8 */ - 0x8, - /* 45600-456FF: page 8 */ - 0x8, - /* 45700-457FF: page 8 */ - 0x8, - /* 45800-458FF: page 8 */ - 0x8, - /* 45900-459FF: page 8 */ - 0x8, - /* 45A00-45AFF: page 8 */ - 0x8, - /* 45B00-45BFF: page 8 */ - 0x8, - /* 45C00-45CFF: page 8 */ - 0x8, - /* 45D00-45DFF: page 8 */ - 0x8, - /* 45E00-45EFF: page 8 */ - 0x8, - /* 45F00-45FFF: page 8 */ - 0x8, - /* 46000-460FF: page 8 */ - 0x8, - /* 46100-461FF: page 8 */ - 0x8, - /* 46200-462FF: page 8 */ - 0x8, - /* 46300-463FF: page 8 */ - 0x8, - /* 46400-464FF: page 8 */ - 0x8, - /* 46500-465FF: page 8 */ - 0x8, - /* 46600-466FF: page 8 */ - 0x8, - /* 46700-467FF: page 8 */ - 0x8, - /* 46800-468FF: page 8 */ - 0x8, - /* 46900-469FF: page 8 */ - 0x8, - /* 46A00-46AFF: page 8 */ - 0x8, - /* 46B00-46BFF: page 8 */ - 0x8, - /* 46C00-46CFF: page 8 */ - 0x8, - /* 46D00-46DFF: page 8 */ - 0x8, - /* 46E00-46EFF: page 8 */ - 0x8, - /* 46F00-46FFF: page 8 */ - 0x8, - /* 47000-470FF: page 8 */ - 0x8, - /* 47100-471FF: page 8 */ - 0x8, - /* 47200-472FF: page 8 */ - 0x8, - /* 47300-473FF: page 8 */ - 0x8, - /* 47400-474FF: page 8 */ - 0x8, - /* 47500-475FF: page 8 */ - 0x8, - /* 47600-476FF: page 8 */ - 0x8, - /* 47700-477FF: page 8 */ - 0x8, - /* 47800-478FF: page 8 */ - 0x8, - /* 47900-479FF: page 8 */ - 0x8, - /* 47A00-47AFF: page 8 */ - 0x8, - /* 47B00-47BFF: page 8 */ - 0x8, - /* 47C00-47CFF: page 8 */ - 0x8, - /* 47D00-47DFF: page 8 */ - 0x8, - /* 47E00-47EFF: page 8 */ - 0x8, - /* 47F00-47FFF: page 8 */ - 0x8, - /* 48000-480FF: page 8 */ - 0x8, - /* 48100-481FF: page 8 */ - 0x8, - /* 48200-482FF: page 8 */ - 0x8, - /* 48300-483FF: page 8 */ - 0x8, - /* 48400-484FF: page 8 */ - 0x8, - /* 48500-485FF: page 8 */ - 0x8, - /* 48600-486FF: page 8 */ - 0x8, - /* 48700-487FF: page 8 */ - 0x8, - /* 48800-488FF: page 8 */ - 0x8, - /* 48900-489FF: page 8 */ - 0x8, - /* 48A00-48AFF: page 8 */ - 0x8, - /* 48B00-48BFF: page 8 */ - 0x8, - /* 48C00-48CFF: page 8 */ - 0x8, - /* 48D00-48DFF: page 8 */ - 0x8, - /* 48E00-48EFF: page 8 */ - 0x8, - /* 48F00-48FFF: page 8 */ - 0x8, - /* 49000-490FF: page 8 */ - 0x8, - /* 49100-491FF: page 8 */ - 0x8, - /* 49200-492FF: page 8 */ - 0x8, - /* 49300-493FF: page 8 */ - 0x8, - /* 49400-494FF: page 8 */ - 0x8, - /* 49500-495FF: page 8 */ - 0x8, - /* 49600-496FF: page 8 */ - 0x8, - /* 49700-497FF: page 8 */ - 0x8, - /* 49800-498FF: page 8 */ - 0x8, - /* 49900-499FF: page 8 */ - 0x8, - /* 49A00-49AFF: page 8 */ - 0x8, - /* 49B00-49BFF: page 8 */ - 0x8, - /* 49C00-49CFF: page 8 */ - 0x8, - /* 49D00-49DFF: page 8 */ - 0x8, - /* 49E00-49EFF: page 8 */ - 0x8, - /* 49F00-49FFF: page 8 */ - 0x8, - /* 4A000-4A0FF: page 8 */ - 0x8, - /* 4A100-4A1FF: page 8 */ - 0x8, - /* 4A200-4A2FF: page 8 */ - 0x8, - /* 4A300-4A3FF: page 8 */ - 0x8, - /* 4A400-4A4FF: page 8 */ - 0x8, - /* 4A500-4A5FF: page 8 */ - 0x8, - /* 4A600-4A6FF: page 8 */ - 0x8, - /* 4A700-4A7FF: page 8 */ - 0x8, - /* 4A800-4A8FF: page 8 */ - 0x8, - /* 4A900-4A9FF: page 8 */ - 0x8, - /* 4AA00-4AAFF: page 8 */ - 0x8, - /* 4AB00-4ABFF: page 8 */ - 0x8, - /* 4AC00-4ACFF: page 8 */ - 0x8, - /* 4AD00-4ADFF: page 8 */ - 0x8, - /* 4AE00-4AEFF: page 8 */ - 0x8, - /* 4AF00-4AFFF: page 8 */ - 0x8, - /* 4B000-4B0FF: page 8 */ - 0x8, - /* 4B100-4B1FF: page 8 */ - 0x8, - /* 4B200-4B2FF: page 8 */ - 0x8, - /* 4B300-4B3FF: page 8 */ - 0x8, - /* 4B400-4B4FF: page 8 */ - 0x8, - /* 4B500-4B5FF: page 8 */ - 0x8, - /* 4B600-4B6FF: page 8 */ - 0x8, - /* 4B700-4B7FF: page 8 */ - 0x8, - /* 4B800-4B8FF: page 8 */ - 0x8, - /* 4B900-4B9FF: page 8 */ - 0x8, - /* 4BA00-4BAFF: page 8 */ - 0x8, - /* 4BB00-4BBFF: page 8 */ - 0x8, - /* 4BC00-4BCFF: page 8 */ - 0x8, - /* 4BD00-4BDFF: page 8 */ - 0x8, - /* 4BE00-4BEFF: page 8 */ - 0x8, - /* 4BF00-4BFFF: page 8 */ - 0x8, - /* 4C000-4C0FF: page 8 */ - 0x8, - /* 4C100-4C1FF: page 8 */ - 0x8, - /* 4C200-4C2FF: page 8 */ - 0x8, - /* 4C300-4C3FF: page 8 */ - 0x8, - /* 4C400-4C4FF: page 8 */ - 0x8, - /* 4C500-4C5FF: page 8 */ - 0x8, - /* 4C600-4C6FF: page 8 */ - 0x8, - /* 4C700-4C7FF: page 8 */ - 0x8, - /* 4C800-4C8FF: page 8 */ - 0x8, - /* 4C900-4C9FF: page 8 */ - 0x8, - /* 4CA00-4CAFF: page 8 */ - 0x8, - /* 4CB00-4CBFF: page 8 */ - 0x8, - /* 4CC00-4CCFF: page 8 */ - 0x8, - /* 4CD00-4CDFF: page 8 */ - 0x8, - /* 4CE00-4CEFF: page 8 */ - 0x8, - /* 4CF00-4CFFF: page 8 */ - 0x8, - /* 4D000-4D0FF: page 8 */ - 0x8, - /* 4D100-4D1FF: page 8 */ - 0x8, - /* 4D200-4D2FF: page 8 */ - 0x8, - /* 4D300-4D3FF: page 8 */ - 0x8, - /* 4D400-4D4FF: page 8 */ - 0x8, - /* 4D500-4D5FF: page 8 */ - 0x8, - /* 4D600-4D6FF: page 8 */ - 0x8, - /* 4D700-4D7FF: page 8 */ - 0x8, - /* 4D800-4D8FF: page 8 */ - 0x8, - /* 4D900-4D9FF: page 8 */ - 0x8, - /* 4DA00-4DAFF: page 8 */ - 0x8, - /* 4DB00-4DBFF: page 8 */ - 0x8, - /* 4DC00-4DCFF: page 8 */ - 0x8, - /* 4DD00-4DDFF: page 8 */ - 0x8, - /* 4DE00-4DEFF: page 8 */ - 0x8, - /* 4DF00-4DFFF: page 8 */ - 0x8, - /* 4E000-4E0FF: page 8 */ - 0x8, - /* 4E100-4E1FF: page 8 */ - 0x8, - /* 4E200-4E2FF: page 8 */ - 0x8, - /* 4E300-4E3FF: page 8 */ - 0x8, - /* 4E400-4E4FF: page 8 */ - 0x8, - /* 4E500-4E5FF: page 8 */ - 0x8, - /* 4E600-4E6FF: page 8 */ - 0x8, - /* 4E700-4E7FF: page 8 */ - 0x8, - /* 4E800-4E8FF: page 8 */ - 0x8, - /* 4E900-4E9FF: page 8 */ - 0x8, - /* 4EA00-4EAFF: page 8 */ - 0x8, - /* 4EB00-4EBFF: page 8 */ - 0x8, - /* 4EC00-4ECFF: page 8 */ - 0x8, - /* 4ED00-4EDFF: page 8 */ - 0x8, - /* 4EE00-4EEFF: page 8 */ - 0x8, - /* 4EF00-4EFFF: page 8 */ - 0x8, - /* 4F000-4F0FF: page 8 */ - 0x8, - /* 4F100-4F1FF: page 8 */ - 0x8, - /* 4F200-4F2FF: page 8 */ - 0x8, - /* 4F300-4F3FF: page 8 */ - 0x8, - /* 4F400-4F4FF: page 8 */ - 0x8, - /* 4F500-4F5FF: page 8 */ - 0x8, - /* 4F600-4F6FF: page 8 */ - 0x8, - /* 4F700-4F7FF: page 8 */ - 0x8, - /* 4F800-4F8FF: page 8 */ - 0x8, - /* 4F900-4F9FF: page 8 */ - 0x8, - /* 4FA00-4FAFF: page 8 */ - 0x8, - /* 4FB00-4FBFF: page 8 */ - 0x8, - /* 4FC00-4FCFF: page 8 */ - 0x8, - /* 4FD00-4FDFF: page 8 */ - 0x8, - /* 4FE00-4FEFF: page 8 */ - 0x8, - /* 4FF00-4FFFF: page 8 */ - 0x8, - /* 50000-500FF: page 8 */ - 0x8, - /* 50100-501FF: page 8 */ - 0x8, - /* 50200-502FF: page 8 */ - 0x8, - /* 50300-503FF: page 8 */ - 0x8, - /* 50400-504FF: page 8 */ - 0x8, - /* 50500-505FF: page 8 */ - 0x8, - /* 50600-506FF: page 8 */ - 0x8, - /* 50700-507FF: page 8 */ - 0x8, - /* 50800-508FF: page 8 */ - 0x8, - /* 50900-509FF: page 8 */ - 0x8, - /* 50A00-50AFF: page 8 */ - 0x8, - /* 50B00-50BFF: page 8 */ - 0x8, - /* 50C00-50CFF: page 8 */ - 0x8, - /* 50D00-50DFF: page 8 */ - 0x8, - /* 50E00-50EFF: page 8 */ - 0x8, - /* 50F00-50FFF: page 8 */ - 0x8, - /* 51000-510FF: page 8 */ - 0x8, - /* 51100-511FF: page 8 */ - 0x8, - /* 51200-512FF: page 8 */ - 0x8, - /* 51300-513FF: page 8 */ - 0x8, - /* 51400-514FF: page 8 */ - 0x8, - /* 51500-515FF: page 8 */ - 0x8, - /* 51600-516FF: page 8 */ - 0x8, - /* 51700-517FF: page 8 */ - 0x8, - /* 51800-518FF: page 8 */ - 0x8, - /* 51900-519FF: page 8 */ - 0x8, - /* 51A00-51AFF: page 8 */ - 0x8, - /* 51B00-51BFF: page 8 */ - 0x8, - /* 51C00-51CFF: page 8 */ - 0x8, - /* 51D00-51DFF: page 8 */ - 0x8, - /* 51E00-51EFF: page 8 */ - 0x8, - /* 51F00-51FFF: page 8 */ - 0x8, - /* 52000-520FF: page 8 */ - 0x8, - /* 52100-521FF: page 8 */ - 0x8, - /* 52200-522FF: page 8 */ - 0x8, - /* 52300-523FF: page 8 */ - 0x8, - /* 52400-524FF: page 8 */ - 0x8, - /* 52500-525FF: page 8 */ - 0x8, - /* 52600-526FF: page 8 */ - 0x8, - /* 52700-527FF: page 8 */ - 0x8, - /* 52800-528FF: page 8 */ - 0x8, - /* 52900-529FF: page 8 */ - 0x8, - /* 52A00-52AFF: page 8 */ - 0x8, - /* 52B00-52BFF: page 8 */ - 0x8, - /* 52C00-52CFF: page 8 */ - 0x8, - /* 52D00-52DFF: page 8 */ - 0x8, - /* 52E00-52EFF: page 8 */ - 0x8, - /* 52F00-52FFF: page 8 */ - 0x8, - /* 53000-530FF: page 8 */ - 0x8, - /* 53100-531FF: page 8 */ - 0x8, - /* 53200-532FF: page 8 */ - 0x8, - /* 53300-533FF: page 8 */ - 0x8, - /* 53400-534FF: page 8 */ - 0x8, - /* 53500-535FF: page 8 */ - 0x8, - /* 53600-536FF: page 8 */ - 0x8, - /* 53700-537FF: page 8 */ - 0x8, - /* 53800-538FF: page 8 */ - 0x8, - /* 53900-539FF: page 8 */ - 0x8, - /* 53A00-53AFF: page 8 */ - 0x8, - /* 53B00-53BFF: page 8 */ - 0x8, - /* 53C00-53CFF: page 8 */ - 0x8, - /* 53D00-53DFF: page 8 */ - 0x8, - /* 53E00-53EFF: page 8 */ - 0x8, - /* 53F00-53FFF: page 8 */ - 0x8, - /* 54000-540FF: page 8 */ - 0x8, - /* 54100-541FF: page 8 */ - 0x8, - /* 54200-542FF: page 8 */ - 0x8, - /* 54300-543FF: page 8 */ - 0x8, - /* 54400-544FF: page 8 */ - 0x8, - /* 54500-545FF: page 8 */ - 0x8, - /* 54600-546FF: page 8 */ - 0x8, - /* 54700-547FF: page 8 */ - 0x8, - /* 54800-548FF: page 8 */ - 0x8, - /* 54900-549FF: page 8 */ - 0x8, - /* 54A00-54AFF: page 8 */ - 0x8, - /* 54B00-54BFF: page 8 */ - 0x8, - /* 54C00-54CFF: page 8 */ - 0x8, - /* 54D00-54DFF: page 8 */ - 0x8, - /* 54E00-54EFF: page 8 */ - 0x8, - /* 54F00-54FFF: page 8 */ - 0x8, - /* 55000-550FF: page 8 */ - 0x8, - /* 55100-551FF: page 8 */ - 0x8, - /* 55200-552FF: page 8 */ - 0x8, - /* 55300-553FF: page 8 */ - 0x8, - /* 55400-554FF: page 8 */ - 0x8, - /* 55500-555FF: page 8 */ - 0x8, - /* 55600-556FF: page 8 */ - 0x8, - /* 55700-557FF: page 8 */ - 0x8, - /* 55800-558FF: page 8 */ - 0x8, - /* 55900-559FF: page 8 */ - 0x8, - /* 55A00-55AFF: page 8 */ - 0x8, - /* 55B00-55BFF: page 8 */ - 0x8, - /* 55C00-55CFF: page 8 */ - 0x8, - /* 55D00-55DFF: page 8 */ - 0x8, - /* 55E00-55EFF: page 8 */ - 0x8, - /* 55F00-55FFF: page 8 */ - 0x8, - /* 56000-560FF: page 8 */ - 0x8, - /* 56100-561FF: page 8 */ - 0x8, - /* 56200-562FF: page 8 */ - 0x8, - /* 56300-563FF: page 8 */ - 0x8, - /* 56400-564FF: page 8 */ - 0x8, - /* 56500-565FF: page 8 */ - 0x8, - /* 56600-566FF: page 8 */ - 0x8, - /* 56700-567FF: page 8 */ - 0x8, - /* 56800-568FF: page 8 */ - 0x8, - /* 56900-569FF: page 8 */ - 0x8, - /* 56A00-56AFF: page 8 */ - 0x8, - /* 56B00-56BFF: page 8 */ - 0x8, - /* 56C00-56CFF: page 8 */ - 0x8, - /* 56D00-56DFF: page 8 */ - 0x8, - /* 56E00-56EFF: page 8 */ - 0x8, - /* 56F00-56FFF: page 8 */ - 0x8, - /* 57000-570FF: page 8 */ - 0x8, - /* 57100-571FF: page 8 */ - 0x8, - /* 57200-572FF: page 8 */ - 0x8, - /* 57300-573FF: page 8 */ - 0x8, - /* 57400-574FF: page 8 */ - 0x8, - /* 57500-575FF: page 8 */ - 0x8, - /* 57600-576FF: page 8 */ - 0x8, - /* 57700-577FF: page 8 */ - 0x8, - /* 57800-578FF: page 8 */ - 0x8, - /* 57900-579FF: page 8 */ - 0x8, - /* 57A00-57AFF: page 8 */ - 0x8, - /* 57B00-57BFF: page 8 */ - 0x8, - /* 57C00-57CFF: page 8 */ - 0x8, - /* 57D00-57DFF: page 8 */ - 0x8, - /* 57E00-57EFF: page 8 */ - 0x8, - /* 57F00-57FFF: page 8 */ - 0x8, - /* 58000-580FF: page 8 */ - 0x8, - /* 58100-581FF: page 8 */ - 0x8, - /* 58200-582FF: page 8 */ - 0x8, - /* 58300-583FF: page 8 */ - 0x8, - /* 58400-584FF: page 8 */ - 0x8, - /* 58500-585FF: page 8 */ - 0x8, - /* 58600-586FF: page 8 */ - 0x8, - /* 58700-587FF: page 8 */ - 0x8, - /* 58800-588FF: page 8 */ - 0x8, - /* 58900-589FF: page 8 */ - 0x8, - /* 58A00-58AFF: page 8 */ - 0x8, - /* 58B00-58BFF: page 8 */ - 0x8, - /* 58C00-58CFF: page 8 */ - 0x8, - /* 58D00-58DFF: page 8 */ - 0x8, - /* 58E00-58EFF: page 8 */ - 0x8, - /* 58F00-58FFF: page 8 */ - 0x8, - /* 59000-590FF: page 8 */ - 0x8, - /* 59100-591FF: page 8 */ - 0x8, - /* 59200-592FF: page 8 */ - 0x8, - /* 59300-593FF: page 8 */ - 0x8, - /* 59400-594FF: page 8 */ - 0x8, - /* 59500-595FF: page 8 */ - 0x8, - /* 59600-596FF: page 8 */ - 0x8, - /* 59700-597FF: page 8 */ - 0x8, - /* 59800-598FF: page 8 */ - 0x8, - /* 59900-599FF: page 8 */ - 0x8, - /* 59A00-59AFF: page 8 */ - 0x8, - /* 59B00-59BFF: page 8 */ - 0x8, - /* 59C00-59CFF: page 8 */ - 0x8, - /* 59D00-59DFF: page 8 */ - 0x8, - /* 59E00-59EFF: page 8 */ - 0x8, - /* 59F00-59FFF: page 8 */ - 0x8, - /* 5A000-5A0FF: page 8 */ - 0x8, - /* 5A100-5A1FF: page 8 */ - 0x8, - /* 5A200-5A2FF: page 8 */ - 0x8, - /* 5A300-5A3FF: page 8 */ - 0x8, - /* 5A400-5A4FF: page 8 */ - 0x8, - /* 5A500-5A5FF: page 8 */ - 0x8, - /* 5A600-5A6FF: page 8 */ - 0x8, - /* 5A700-5A7FF: page 8 */ - 0x8, - /* 5A800-5A8FF: page 8 */ - 0x8, - /* 5A900-5A9FF: page 8 */ - 0x8, - /* 5AA00-5AAFF: page 8 */ - 0x8, - /* 5AB00-5ABFF: page 8 */ - 0x8, - /* 5AC00-5ACFF: page 8 */ - 0x8, - /* 5AD00-5ADFF: page 8 */ - 0x8, - /* 5AE00-5AEFF: page 8 */ - 0x8, - /* 5AF00-5AFFF: page 8 */ - 0x8, - /* 5B000-5B0FF: page 8 */ - 0x8, - /* 5B100-5B1FF: page 8 */ - 0x8, - /* 5B200-5B2FF: page 8 */ - 0x8, - /* 5B300-5B3FF: page 8 */ - 0x8, - /* 5B400-5B4FF: page 8 */ - 0x8, - /* 5B500-5B5FF: page 8 */ - 0x8, - /* 5B600-5B6FF: page 8 */ - 0x8, - /* 5B700-5B7FF: page 8 */ - 0x8, - /* 5B800-5B8FF: page 8 */ - 0x8, - /* 5B900-5B9FF: page 8 */ - 0x8, - /* 5BA00-5BAFF: page 8 */ - 0x8, - /* 5BB00-5BBFF: page 8 */ - 0x8, - /* 5BC00-5BCFF: page 8 */ - 0x8, - /* 5BD00-5BDFF: page 8 */ - 0x8, - /* 5BE00-5BEFF: page 8 */ - 0x8, - /* 5BF00-5BFFF: page 8 */ - 0x8, - /* 5C000-5C0FF: page 8 */ - 0x8, - /* 5C100-5C1FF: page 8 */ - 0x8, - /* 5C200-5C2FF: page 8 */ - 0x8, - /* 5C300-5C3FF: page 8 */ - 0x8, - /* 5C400-5C4FF: page 8 */ - 0x8, - /* 5C500-5C5FF: page 8 */ - 0x8, - /* 5C600-5C6FF: page 8 */ - 0x8, - /* 5C700-5C7FF: page 8 */ - 0x8, - /* 5C800-5C8FF: page 8 */ - 0x8, - /* 5C900-5C9FF: page 8 */ - 0x8, - /* 5CA00-5CAFF: page 8 */ - 0x8, - /* 5CB00-5CBFF: page 8 */ - 0x8, - /* 5CC00-5CCFF: page 8 */ - 0x8, - /* 5CD00-5CDFF: page 8 */ - 0x8, - /* 5CE00-5CEFF: page 8 */ - 0x8, - /* 5CF00-5CFFF: page 8 */ - 0x8, - /* 5D000-5D0FF: page 8 */ - 0x8, - /* 5D100-5D1FF: page 8 */ - 0x8, - /* 5D200-5D2FF: page 8 */ - 0x8, - /* 5D300-5D3FF: page 8 */ - 0x8, - /* 5D400-5D4FF: page 8 */ - 0x8, - /* 5D500-5D5FF: page 8 */ - 0x8, - /* 5D600-5D6FF: page 8 */ - 0x8, - /* 5D700-5D7FF: page 8 */ - 0x8, - /* 5D800-5D8FF: page 8 */ - 0x8, - /* 5D900-5D9FF: page 8 */ - 0x8, - /* 5DA00-5DAFF: page 8 */ - 0x8, - /* 5DB00-5DBFF: page 8 */ - 0x8, - /* 5DC00-5DCFF: page 8 */ - 0x8, - /* 5DD00-5DDFF: page 8 */ - 0x8, - /* 5DE00-5DEFF: page 8 */ - 0x8, - /* 5DF00-5DFFF: page 8 */ - 0x8, - /* 5E000-5E0FF: page 8 */ - 0x8, - /* 5E100-5E1FF: page 8 */ - 0x8, - /* 5E200-5E2FF: page 8 */ - 0x8, - /* 5E300-5E3FF: page 8 */ - 0x8, - /* 5E400-5E4FF: page 8 */ - 0x8, - /* 5E500-5E5FF: page 8 */ - 0x8, - /* 5E600-5E6FF: page 8 */ - 0x8, - /* 5E700-5E7FF: page 8 */ - 0x8, - /* 5E800-5E8FF: page 8 */ - 0x8, - /* 5E900-5E9FF: page 8 */ - 0x8, - /* 5EA00-5EAFF: page 8 */ - 0x8, - /* 5EB00-5EBFF: page 8 */ - 0x8, - /* 5EC00-5ECFF: page 8 */ - 0x8, - /* 5ED00-5EDFF: page 8 */ - 0x8, - /* 5EE00-5EEFF: page 8 */ - 0x8, - /* 5EF00-5EFFF: page 8 */ - 0x8, - /* 5F000-5F0FF: page 8 */ - 0x8, - /* 5F100-5F1FF: page 8 */ - 0x8, - /* 5F200-5F2FF: page 8 */ - 0x8, - /* 5F300-5F3FF: page 8 */ - 0x8, - /* 5F400-5F4FF: page 8 */ - 0x8, - /* 5F500-5F5FF: page 8 */ - 0x8, - /* 5F600-5F6FF: page 8 */ - 0x8, - /* 5F700-5F7FF: page 8 */ - 0x8, - /* 5F800-5F8FF: page 8 */ - 0x8, - /* 5F900-5F9FF: page 8 */ - 0x8, - /* 5FA00-5FAFF: page 8 */ - 0x8, - /* 5FB00-5FBFF: page 8 */ - 0x8, - /* 5FC00-5FCFF: page 8 */ - 0x8, - /* 5FD00-5FDFF: page 8 */ - 0x8, - /* 5FE00-5FEFF: page 8 */ - 0x8, - /* 5FF00-5FFFF: page 8 */ - 0x8, - /* 60000-600FF: page 8 */ - 0x8, - /* 60100-601FF: page 8 */ - 0x8, - /* 60200-602FF: page 8 */ - 0x8, - /* 60300-603FF: page 8 */ - 0x8, - /* 60400-604FF: page 8 */ - 0x8, - /* 60500-605FF: page 8 */ - 0x8, - /* 60600-606FF: page 8 */ - 0x8, - /* 60700-607FF: page 8 */ - 0x8, - /* 60800-608FF: page 8 */ - 0x8, - /* 60900-609FF: page 8 */ - 0x8, - /* 60A00-60AFF: page 8 */ - 0x8, - /* 60B00-60BFF: page 8 */ - 0x8, - /* 60C00-60CFF: page 8 */ - 0x8, - /* 60D00-60DFF: page 8 */ - 0x8, - /* 60E00-60EFF: page 8 */ - 0x8, - /* 60F00-60FFF: page 8 */ - 0x8, - /* 61000-610FF: page 8 */ - 0x8, - /* 61100-611FF: page 8 */ - 0x8, - /* 61200-612FF: page 8 */ - 0x8, - /* 61300-613FF: page 8 */ - 0x8, - /* 61400-614FF: page 8 */ - 0x8, - /* 61500-615FF: page 8 */ - 0x8, - /* 61600-616FF: page 8 */ - 0x8, - /* 61700-617FF: page 8 */ - 0x8, - /* 61800-618FF: page 8 */ - 0x8, - /* 61900-619FF: page 8 */ - 0x8, - /* 61A00-61AFF: page 8 */ - 0x8, - /* 61B00-61BFF: page 8 */ - 0x8, - /* 61C00-61CFF: page 8 */ - 0x8, - /* 61D00-61DFF: page 8 */ - 0x8, - /* 61E00-61EFF: page 8 */ - 0x8, - /* 61F00-61FFF: page 8 */ - 0x8, - /* 62000-620FF: page 8 */ - 0x8, - /* 62100-621FF: page 8 */ - 0x8, - /* 62200-622FF: page 8 */ - 0x8, - /* 62300-623FF: page 8 */ - 0x8, - /* 62400-624FF: page 8 */ - 0x8, - /* 62500-625FF: page 8 */ - 0x8, - /* 62600-626FF: page 8 */ - 0x8, - /* 62700-627FF: page 8 */ - 0x8, - /* 62800-628FF: page 8 */ - 0x8, - /* 62900-629FF: page 8 */ - 0x8, - /* 62A00-62AFF: page 8 */ - 0x8, - /* 62B00-62BFF: page 8 */ - 0x8, - /* 62C00-62CFF: page 8 */ - 0x8, - /* 62D00-62DFF: page 8 */ - 0x8, - /* 62E00-62EFF: page 8 */ - 0x8, - /* 62F00-62FFF: page 8 */ - 0x8, - /* 63000-630FF: page 8 */ - 0x8, - /* 63100-631FF: page 8 */ - 0x8, - /* 63200-632FF: page 8 */ - 0x8, - /* 63300-633FF: page 8 */ - 0x8, - /* 63400-634FF: page 8 */ - 0x8, - /* 63500-635FF: page 8 */ - 0x8, - /* 63600-636FF: page 8 */ - 0x8, - /* 63700-637FF: page 8 */ - 0x8, - /* 63800-638FF: page 8 */ - 0x8, - /* 63900-639FF: page 8 */ - 0x8, - /* 63A00-63AFF: page 8 */ - 0x8, - /* 63B00-63BFF: page 8 */ - 0x8, - /* 63C00-63CFF: page 8 */ - 0x8, - /* 63D00-63DFF: page 8 */ - 0x8, - /* 63E00-63EFF: page 8 */ - 0x8, - /* 63F00-63FFF: page 8 */ - 0x8, - /* 64000-640FF: page 8 */ - 0x8, - /* 64100-641FF: page 8 */ - 0x8, - /* 64200-642FF: page 8 */ - 0x8, - /* 64300-643FF: page 8 */ - 0x8, - /* 64400-644FF: page 8 */ - 0x8, - /* 64500-645FF: page 8 */ - 0x8, - /* 64600-646FF: page 8 */ - 0x8, - /* 64700-647FF: page 8 */ - 0x8, - /* 64800-648FF: page 8 */ - 0x8, - /* 64900-649FF: page 8 */ - 0x8, - /* 64A00-64AFF: page 8 */ - 0x8, - /* 64B00-64BFF: page 8 */ - 0x8, - /* 64C00-64CFF: page 8 */ - 0x8, - /* 64D00-64DFF: page 8 */ - 0x8, - /* 64E00-64EFF: page 8 */ - 0x8, - /* 64F00-64FFF: page 8 */ - 0x8, - /* 65000-650FF: page 8 */ - 0x8, - /* 65100-651FF: page 8 */ - 0x8, - /* 65200-652FF: page 8 */ - 0x8, - /* 65300-653FF: page 8 */ - 0x8, - /* 65400-654FF: page 8 */ - 0x8, - /* 65500-655FF: page 8 */ - 0x8, - /* 65600-656FF: page 8 */ - 0x8, - /* 65700-657FF: page 8 */ - 0x8, - /* 65800-658FF: page 8 */ - 0x8, - /* 65900-659FF: page 8 */ - 0x8, - /* 65A00-65AFF: page 8 */ - 0x8, - /* 65B00-65BFF: page 8 */ - 0x8, - /* 65C00-65CFF: page 8 */ - 0x8, - /* 65D00-65DFF: page 8 */ - 0x8, - /* 65E00-65EFF: page 8 */ - 0x8, - /* 65F00-65FFF: page 8 */ - 0x8, - /* 66000-660FF: page 8 */ - 0x8, - /* 66100-661FF: page 8 */ - 0x8, - /* 66200-662FF: page 8 */ - 0x8, - /* 66300-663FF: page 8 */ - 0x8, - /* 66400-664FF: page 8 */ - 0x8, - /* 66500-665FF: page 8 */ - 0x8, - /* 66600-666FF: page 8 */ - 0x8, - /* 66700-667FF: page 8 */ - 0x8, - /* 66800-668FF: page 8 */ - 0x8, - /* 66900-669FF: page 8 */ - 0x8, - /* 66A00-66AFF: page 8 */ - 0x8, - /* 66B00-66BFF: page 8 */ - 0x8, - /* 66C00-66CFF: page 8 */ - 0x8, - /* 66D00-66DFF: page 8 */ - 0x8, - /* 66E00-66EFF: page 8 */ - 0x8, - /* 66F00-66FFF: page 8 */ - 0x8, - /* 67000-670FF: page 8 */ - 0x8, - /* 67100-671FF: page 8 */ - 0x8, - /* 67200-672FF: page 8 */ - 0x8, - /* 67300-673FF: page 8 */ - 0x8, - /* 67400-674FF: page 8 */ - 0x8, - /* 67500-675FF: page 8 */ - 0x8, - /* 67600-676FF: page 8 */ - 0x8, - /* 67700-677FF: page 8 */ - 0x8, - /* 67800-678FF: page 8 */ - 0x8, - /* 67900-679FF: page 8 */ - 0x8, - /* 67A00-67AFF: page 8 */ - 0x8, - /* 67B00-67BFF: page 8 */ - 0x8, - /* 67C00-67CFF: page 8 */ - 0x8, - /* 67D00-67DFF: page 8 */ - 0x8, - /* 67E00-67EFF: page 8 */ - 0x8, - /* 67F00-67FFF: page 8 */ - 0x8, - /* 68000-680FF: page 8 */ - 0x8, - /* 68100-681FF: page 8 */ - 0x8, - /* 68200-682FF: page 8 */ - 0x8, - /* 68300-683FF: page 8 */ - 0x8, - /* 68400-684FF: page 8 */ - 0x8, - /* 68500-685FF: page 8 */ - 0x8, - /* 68600-686FF: page 8 */ - 0x8, - /* 68700-687FF: page 8 */ - 0x8, - /* 68800-688FF: page 8 */ - 0x8, - /* 68900-689FF: page 8 */ - 0x8, - /* 68A00-68AFF: page 8 */ - 0x8, - /* 68B00-68BFF: page 8 */ - 0x8, - /* 68C00-68CFF: page 8 */ - 0x8, - /* 68D00-68DFF: page 8 */ - 0x8, - /* 68E00-68EFF: page 8 */ - 0x8, - /* 68F00-68FFF: page 8 */ - 0x8, - /* 69000-690FF: page 8 */ - 0x8, - /* 69100-691FF: page 8 */ - 0x8, - /* 69200-692FF: page 8 */ - 0x8, - /* 69300-693FF: page 8 */ - 0x8, - /* 69400-694FF: page 8 */ - 0x8, - /* 69500-695FF: page 8 */ - 0x8, - /* 69600-696FF: page 8 */ - 0x8, - /* 69700-697FF: page 8 */ - 0x8, - /* 69800-698FF: page 8 */ - 0x8, - /* 69900-699FF: page 8 */ - 0x8, - /* 69A00-69AFF: page 8 */ - 0x8, - /* 69B00-69BFF: page 8 */ - 0x8, - /* 69C00-69CFF: page 8 */ - 0x8, - /* 69D00-69DFF: page 8 */ - 0x8, - /* 69E00-69EFF: page 8 */ - 0x8, - /* 69F00-69FFF: page 8 */ - 0x8, - /* 6A000-6A0FF: page 8 */ - 0x8, - /* 6A100-6A1FF: page 8 */ - 0x8, - /* 6A200-6A2FF: page 8 */ - 0x8, - /* 6A300-6A3FF: page 8 */ - 0x8, - /* 6A400-6A4FF: page 8 */ - 0x8, - /* 6A500-6A5FF: page 8 */ - 0x8, - /* 6A600-6A6FF: page 8 */ - 0x8, - /* 6A700-6A7FF: page 8 */ - 0x8, - /* 6A800-6A8FF: page 8 */ - 0x8, - /* 6A900-6A9FF: page 8 */ - 0x8, - /* 6AA00-6AAFF: page 8 */ - 0x8, - /* 6AB00-6ABFF: page 8 */ - 0x8, - /* 6AC00-6ACFF: page 8 */ - 0x8, - /* 6AD00-6ADFF: page 8 */ - 0x8, - /* 6AE00-6AEFF: page 8 */ - 0x8, - /* 6AF00-6AFFF: page 8 */ - 0x8, - /* 6B000-6B0FF: page 8 */ - 0x8, - /* 6B100-6B1FF: page 8 */ - 0x8, - /* 6B200-6B2FF: page 8 */ - 0x8, - /* 6B300-6B3FF: page 8 */ - 0x8, - /* 6B400-6B4FF: page 8 */ - 0x8, - /* 6B500-6B5FF: page 8 */ - 0x8, - /* 6B600-6B6FF: page 8 */ - 0x8, - /* 6B700-6B7FF: page 8 */ - 0x8, - /* 6B800-6B8FF: page 8 */ - 0x8, - /* 6B900-6B9FF: page 8 */ - 0x8, - /* 6BA00-6BAFF: page 8 */ - 0x8, - /* 6BB00-6BBFF: page 8 */ - 0x8, - /* 6BC00-6BCFF: page 8 */ - 0x8, - /* 6BD00-6BDFF: page 8 */ - 0x8, - /* 6BE00-6BEFF: page 8 */ - 0x8, - /* 6BF00-6BFFF: page 8 */ - 0x8, - /* 6C000-6C0FF: page 8 */ - 0x8, - /* 6C100-6C1FF: page 8 */ - 0x8, - /* 6C200-6C2FF: page 8 */ - 0x8, - /* 6C300-6C3FF: page 8 */ - 0x8, - /* 6C400-6C4FF: page 8 */ - 0x8, - /* 6C500-6C5FF: page 8 */ - 0x8, - /* 6C600-6C6FF: page 8 */ - 0x8, - /* 6C700-6C7FF: page 8 */ - 0x8, - /* 6C800-6C8FF: page 8 */ - 0x8, - /* 6C900-6C9FF: page 8 */ - 0x8, - /* 6CA00-6CAFF: page 8 */ - 0x8, - /* 6CB00-6CBFF: page 8 */ - 0x8, - /* 6CC00-6CCFF: page 8 */ - 0x8, - /* 6CD00-6CDFF: page 8 */ - 0x8, - /* 6CE00-6CEFF: page 8 */ - 0x8, - /* 6CF00-6CFFF: page 8 */ - 0x8, - /* 6D000-6D0FF: page 8 */ - 0x8, - /* 6D100-6D1FF: page 8 */ - 0x8, - /* 6D200-6D2FF: page 8 */ - 0x8, - /* 6D300-6D3FF: page 8 */ - 0x8, - /* 6D400-6D4FF: page 8 */ - 0x8, - /* 6D500-6D5FF: page 8 */ - 0x8, - /* 6D600-6D6FF: page 8 */ - 0x8, - /* 6D700-6D7FF: page 8 */ - 0x8, - /* 6D800-6D8FF: page 8 */ - 0x8, - /* 6D900-6D9FF: page 8 */ - 0x8, - /* 6DA00-6DAFF: page 8 */ - 0x8, - /* 6DB00-6DBFF: page 8 */ - 0x8, - /* 6DC00-6DCFF: page 8 */ - 0x8, - /* 6DD00-6DDFF: page 8 */ - 0x8, - /* 6DE00-6DEFF: page 8 */ - 0x8, - /* 6DF00-6DFFF: page 8 */ - 0x8, - /* 6E000-6E0FF: page 8 */ - 0x8, - /* 6E100-6E1FF: page 8 */ - 0x8, - /* 6E200-6E2FF: page 8 */ - 0x8, - /* 6E300-6E3FF: page 8 */ - 0x8, - /* 6E400-6E4FF: page 8 */ - 0x8, - /* 6E500-6E5FF: page 8 */ - 0x8, - /* 6E600-6E6FF: page 8 */ - 0x8, - /* 6E700-6E7FF: page 8 */ - 0x8, - /* 6E800-6E8FF: page 8 */ - 0x8, - /* 6E900-6E9FF: page 8 */ - 0x8, - /* 6EA00-6EAFF: page 8 */ - 0x8, - /* 6EB00-6EBFF: page 8 */ - 0x8, - /* 6EC00-6ECFF: page 8 */ - 0x8, - /* 6ED00-6EDFF: page 8 */ - 0x8, - /* 6EE00-6EEFF: page 8 */ - 0x8, - /* 6EF00-6EFFF: page 8 */ - 0x8, - /* 6F000-6F0FF: page 8 */ - 0x8, - /* 6F100-6F1FF: page 8 */ - 0x8, - /* 6F200-6F2FF: page 8 */ - 0x8, - /* 6F300-6F3FF: page 8 */ - 0x8, - /* 6F400-6F4FF: page 8 */ - 0x8, - /* 6F500-6F5FF: page 8 */ - 0x8, - /* 6F600-6F6FF: page 8 */ - 0x8, - /* 6F700-6F7FF: page 8 */ - 0x8, - /* 6F800-6F8FF: page 8 */ - 0x8, - /* 6F900-6F9FF: page 8 */ - 0x8, - /* 6FA00-6FAFF: page 8 */ - 0x8, - /* 6FB00-6FBFF: page 8 */ - 0x8, - /* 6FC00-6FCFF: page 8 */ - 0x8, - /* 6FD00-6FDFF: page 8 */ - 0x8, - /* 6FE00-6FEFF: page 8 */ - 0x8, - /* 6FF00-6FFFF: page 8 */ - 0x8, - /* 70000-700FF: page 8 */ - 0x8, - /* 70100-701FF: page 8 */ - 0x8, - /* 70200-702FF: page 8 */ - 0x8, - /* 70300-703FF: page 8 */ - 0x8, - /* 70400-704FF: page 8 */ - 0x8, - /* 70500-705FF: page 8 */ - 0x8, - /* 70600-706FF: page 8 */ - 0x8, - /* 70700-707FF: page 8 */ - 0x8, - /* 70800-708FF: page 8 */ - 0x8, - /* 70900-709FF: page 8 */ - 0x8, - /* 70A00-70AFF: page 8 */ - 0x8, - /* 70B00-70BFF: page 8 */ - 0x8, - /* 70C00-70CFF: page 8 */ - 0x8, - /* 70D00-70DFF: page 8 */ - 0x8, - /* 70E00-70EFF: page 8 */ - 0x8, - /* 70F00-70FFF: page 8 */ - 0x8, - /* 71000-710FF: page 8 */ - 0x8, - /* 71100-711FF: page 8 */ - 0x8, - /* 71200-712FF: page 8 */ - 0x8, - /* 71300-713FF: page 8 */ - 0x8, - /* 71400-714FF: page 8 */ - 0x8, - /* 71500-715FF: page 8 */ - 0x8, - /* 71600-716FF: page 8 */ - 0x8, - /* 71700-717FF: page 8 */ - 0x8, - /* 71800-718FF: page 8 */ - 0x8, - /* 71900-719FF: page 8 */ - 0x8, - /* 71A00-71AFF: page 8 */ - 0x8, - /* 71B00-71BFF: page 8 */ - 0x8, - /* 71C00-71CFF: page 8 */ - 0x8, - /* 71D00-71DFF: page 8 */ - 0x8, - /* 71E00-71EFF: page 8 */ - 0x8, - /* 71F00-71FFF: page 8 */ - 0x8, - /* 72000-720FF: page 8 */ - 0x8, - /* 72100-721FF: page 8 */ - 0x8, - /* 72200-722FF: page 8 */ - 0x8, - /* 72300-723FF: page 8 */ - 0x8, - /* 72400-724FF: page 8 */ - 0x8, - /* 72500-725FF: page 8 */ - 0x8, - /* 72600-726FF: page 8 */ - 0x8, - /* 72700-727FF: page 8 */ - 0x8, - /* 72800-728FF: page 8 */ - 0x8, - /* 72900-729FF: page 8 */ - 0x8, - /* 72A00-72AFF: page 8 */ - 0x8, - /* 72B00-72BFF: page 8 */ - 0x8, - /* 72C00-72CFF: page 8 */ - 0x8, - /* 72D00-72DFF: page 8 */ - 0x8, - /* 72E00-72EFF: page 8 */ - 0x8, - /* 72F00-72FFF: page 8 */ - 0x8, - /* 73000-730FF: page 8 */ - 0x8, - /* 73100-731FF: page 8 */ - 0x8, - /* 73200-732FF: page 8 */ - 0x8, - /* 73300-733FF: page 8 */ - 0x8, - /* 73400-734FF: page 8 */ - 0x8, - /* 73500-735FF: page 8 */ - 0x8, - /* 73600-736FF: page 8 */ - 0x8, - /* 73700-737FF: page 8 */ - 0x8, - /* 73800-738FF: page 8 */ - 0x8, - /* 73900-739FF: page 8 */ - 0x8, - /* 73A00-73AFF: page 8 */ - 0x8, - /* 73B00-73BFF: page 8 */ - 0x8, - /* 73C00-73CFF: page 8 */ - 0x8, - /* 73D00-73DFF: page 8 */ - 0x8, - /* 73E00-73EFF: page 8 */ - 0x8, - /* 73F00-73FFF: page 8 */ - 0x8, - /* 74000-740FF: page 8 */ - 0x8, - /* 74100-741FF: page 8 */ - 0x8, - /* 74200-742FF: page 8 */ - 0x8, - /* 74300-743FF: page 8 */ - 0x8, - /* 74400-744FF: page 8 */ - 0x8, - /* 74500-745FF: page 8 */ - 0x8, - /* 74600-746FF: page 8 */ - 0x8, - /* 74700-747FF: page 8 */ - 0x8, - /* 74800-748FF: page 8 */ - 0x8, - /* 74900-749FF: page 8 */ - 0x8, - /* 74A00-74AFF: page 8 */ - 0x8, - /* 74B00-74BFF: page 8 */ - 0x8, - /* 74C00-74CFF: page 8 */ - 0x8, - /* 74D00-74DFF: page 8 */ - 0x8, - /* 74E00-74EFF: page 8 */ - 0x8, - /* 74F00-74FFF: page 8 */ - 0x8, - /* 75000-750FF: page 8 */ - 0x8, - /* 75100-751FF: page 8 */ - 0x8, - /* 75200-752FF: page 8 */ - 0x8, - /* 75300-753FF: page 8 */ - 0x8, - /* 75400-754FF: page 8 */ - 0x8, - /* 75500-755FF: page 8 */ - 0x8, - /* 75600-756FF: page 8 */ - 0x8, - /* 75700-757FF: page 8 */ - 0x8, - /* 75800-758FF: page 8 */ - 0x8, - /* 75900-759FF: page 8 */ - 0x8, - /* 75A00-75AFF: page 8 */ - 0x8, - /* 75B00-75BFF: page 8 */ - 0x8, - /* 75C00-75CFF: page 8 */ - 0x8, - /* 75D00-75DFF: page 8 */ - 0x8, - /* 75E00-75EFF: page 8 */ - 0x8, - /* 75F00-75FFF: page 8 */ - 0x8, - /* 76000-760FF: page 8 */ - 0x8, - /* 76100-761FF: page 8 */ - 0x8, - /* 76200-762FF: page 8 */ - 0x8, - /* 76300-763FF: page 8 */ - 0x8, - /* 76400-764FF: page 8 */ - 0x8, - /* 76500-765FF: page 8 */ - 0x8, - /* 76600-766FF: page 8 */ - 0x8, - /* 76700-767FF: page 8 */ - 0x8, - /* 76800-768FF: page 8 */ - 0x8, - /* 76900-769FF: page 8 */ - 0x8, - /* 76A00-76AFF: page 8 */ - 0x8, - /* 76B00-76BFF: page 8 */ - 0x8, - /* 76C00-76CFF: page 8 */ - 0x8, - /* 76D00-76DFF: page 8 */ - 0x8, - /* 76E00-76EFF: page 8 */ - 0x8, - /* 76F00-76FFF: page 8 */ - 0x8, - /* 77000-770FF: page 8 */ - 0x8, - /* 77100-771FF: page 8 */ - 0x8, - /* 77200-772FF: page 8 */ - 0x8, - /* 77300-773FF: page 8 */ - 0x8, - /* 77400-774FF: page 8 */ - 0x8, - /* 77500-775FF: page 8 */ - 0x8, - /* 77600-776FF: page 8 */ - 0x8, - /* 77700-777FF: page 8 */ - 0x8, - /* 77800-778FF: page 8 */ - 0x8, - /* 77900-779FF: page 8 */ - 0x8, - /* 77A00-77AFF: page 8 */ - 0x8, - /* 77B00-77BFF: page 8 */ - 0x8, - /* 77C00-77CFF: page 8 */ - 0x8, - /* 77D00-77DFF: page 8 */ - 0x8, - /* 77E00-77EFF: page 8 */ - 0x8, - /* 77F00-77FFF: page 8 */ - 0x8, - /* 78000-780FF: page 8 */ - 0x8, - /* 78100-781FF: page 8 */ - 0x8, - /* 78200-782FF: page 8 */ - 0x8, - /* 78300-783FF: page 8 */ - 0x8, - /* 78400-784FF: page 8 */ - 0x8, - /* 78500-785FF: page 8 */ - 0x8, - /* 78600-786FF: page 8 */ - 0x8, - /* 78700-787FF: page 8 */ - 0x8, - /* 78800-788FF: page 8 */ - 0x8, - /* 78900-789FF: page 8 */ - 0x8, - /* 78A00-78AFF: page 8 */ - 0x8, - /* 78B00-78BFF: page 8 */ - 0x8, - /* 78C00-78CFF: page 8 */ - 0x8, - /* 78D00-78DFF: page 8 */ - 0x8, - /* 78E00-78EFF: page 8 */ - 0x8, - /* 78F00-78FFF: page 8 */ - 0x8, - /* 79000-790FF: page 8 */ - 0x8, - /* 79100-791FF: page 8 */ - 0x8, - /* 79200-792FF: page 8 */ - 0x8, - /* 79300-793FF: page 8 */ - 0x8, - /* 79400-794FF: page 8 */ - 0x8, - /* 79500-795FF: page 8 */ - 0x8, - /* 79600-796FF: page 8 */ - 0x8, - /* 79700-797FF: page 8 */ - 0x8, - /* 79800-798FF: page 8 */ - 0x8, - /* 79900-799FF: page 8 */ - 0x8, - /* 79A00-79AFF: page 8 */ - 0x8, - /* 79B00-79BFF: page 8 */ - 0x8, - /* 79C00-79CFF: page 8 */ - 0x8, - /* 79D00-79DFF: page 8 */ - 0x8, - /* 79E00-79EFF: page 8 */ - 0x8, - /* 79F00-79FFF: page 8 */ - 0x8, - /* 7A000-7A0FF: page 8 */ - 0x8, - /* 7A100-7A1FF: page 8 */ - 0x8, - /* 7A200-7A2FF: page 8 */ - 0x8, - /* 7A300-7A3FF: page 8 */ - 0x8, - /* 7A400-7A4FF: page 8 */ - 0x8, - /* 7A500-7A5FF: page 8 */ - 0x8, - /* 7A600-7A6FF: page 8 */ - 0x8, - /* 7A700-7A7FF: page 8 */ - 0x8, - /* 7A800-7A8FF: page 8 */ - 0x8, - /* 7A900-7A9FF: page 8 */ - 0x8, - /* 7AA00-7AAFF: page 8 */ - 0x8, - /* 7AB00-7ABFF: page 8 */ - 0x8, - /* 7AC00-7ACFF: page 8 */ - 0x8, - /* 7AD00-7ADFF: page 8 */ - 0x8, - /* 7AE00-7AEFF: page 8 */ - 0x8, - /* 7AF00-7AFFF: page 8 */ - 0x8, - /* 7B000-7B0FF: page 8 */ - 0x8, - /* 7B100-7B1FF: page 8 */ - 0x8, - /* 7B200-7B2FF: page 8 */ - 0x8, - /* 7B300-7B3FF: page 8 */ - 0x8, - /* 7B400-7B4FF: page 8 */ - 0x8, - /* 7B500-7B5FF: page 8 */ - 0x8, - /* 7B600-7B6FF: page 8 */ - 0x8, - /* 7B700-7B7FF: page 8 */ - 0x8, - /* 7B800-7B8FF: page 8 */ - 0x8, - /* 7B900-7B9FF: page 8 */ - 0x8, - /* 7BA00-7BAFF: page 8 */ - 0x8, - /* 7BB00-7BBFF: page 8 */ - 0x8, - /* 7BC00-7BCFF: page 8 */ - 0x8, - /* 7BD00-7BDFF: page 8 */ - 0x8, - /* 7BE00-7BEFF: page 8 */ - 0x8, - /* 7BF00-7BFFF: page 8 */ - 0x8, - /* 7C000-7C0FF: page 8 */ - 0x8, - /* 7C100-7C1FF: page 8 */ - 0x8, - /* 7C200-7C2FF: page 8 */ - 0x8, - /* 7C300-7C3FF: page 8 */ - 0x8, - /* 7C400-7C4FF: page 8 */ - 0x8, - /* 7C500-7C5FF: page 8 */ - 0x8, - /* 7C600-7C6FF: page 8 */ - 0x8, - /* 7C700-7C7FF: page 8 */ - 0x8, - /* 7C800-7C8FF: page 8 */ - 0x8, - /* 7C900-7C9FF: page 8 */ - 0x8, - /* 7CA00-7CAFF: page 8 */ - 0x8, - /* 7CB00-7CBFF: page 8 */ - 0x8, - /* 7CC00-7CCFF: page 8 */ - 0x8, - /* 7CD00-7CDFF: page 8 */ - 0x8, - /* 7CE00-7CEFF: page 8 */ - 0x8, - /* 7CF00-7CFFF: page 8 */ - 0x8, - /* 7D000-7D0FF: page 8 */ - 0x8, - /* 7D100-7D1FF: page 8 */ - 0x8, - /* 7D200-7D2FF: page 8 */ - 0x8, - /* 7D300-7D3FF: page 8 */ - 0x8, - /* 7D400-7D4FF: page 8 */ - 0x8, - /* 7D500-7D5FF: page 8 */ - 0x8, - /* 7D600-7D6FF: page 8 */ - 0x8, - /* 7D700-7D7FF: page 8 */ - 0x8, - /* 7D800-7D8FF: page 8 */ - 0x8, - /* 7D900-7D9FF: page 8 */ - 0x8, - /* 7DA00-7DAFF: page 8 */ - 0x8, - /* 7DB00-7DBFF: page 8 */ - 0x8, - /* 7DC00-7DCFF: page 8 */ - 0x8, - /* 7DD00-7DDFF: page 8 */ - 0x8, - /* 7DE00-7DEFF: page 8 */ - 0x8, - /* 7DF00-7DFFF: page 8 */ - 0x8, - /* 7E000-7E0FF: page 8 */ - 0x8, - /* 7E100-7E1FF: page 8 */ - 0x8, - /* 7E200-7E2FF: page 8 */ - 0x8, - /* 7E300-7E3FF: page 8 */ - 0x8, - /* 7E400-7E4FF: page 8 */ - 0x8, - /* 7E500-7E5FF: page 8 */ - 0x8, - /* 7E600-7E6FF: page 8 */ - 0x8, - /* 7E700-7E7FF: page 8 */ - 0x8, - /* 7E800-7E8FF: page 8 */ - 0x8, - /* 7E900-7E9FF: page 8 */ - 0x8, - /* 7EA00-7EAFF: page 8 */ - 0x8, - /* 7EB00-7EBFF: page 8 */ - 0x8, - /* 7EC00-7ECFF: page 8 */ - 0x8, - /* 7ED00-7EDFF: page 8 */ - 0x8, - /* 7EE00-7EEFF: page 8 */ - 0x8, - /* 7EF00-7EFFF: page 8 */ - 0x8, - /* 7F000-7F0FF: page 8 */ - 0x8, - /* 7F100-7F1FF: page 8 */ - 0x8, - /* 7F200-7F2FF: page 8 */ - 0x8, - /* 7F300-7F3FF: page 8 */ - 0x8, - /* 7F400-7F4FF: page 8 */ - 0x8, - /* 7F500-7F5FF: page 8 */ - 0x8, - /* 7F600-7F6FF: page 8 */ - 0x8, - /* 7F700-7F7FF: page 8 */ - 0x8, - /* 7F800-7F8FF: page 8 */ - 0x8, - /* 7F900-7F9FF: page 8 */ - 0x8, - /* 7FA00-7FAFF: page 8 */ - 0x8, - /* 7FB00-7FBFF: page 8 */ - 0x8, - /* 7FC00-7FCFF: page 8 */ - 0x8, - /* 7FD00-7FDFF: page 8 */ - 0x8, - /* 7FE00-7FEFF: page 8 */ - 0x8, - /* 7FF00-7FFFF: page 8 */ - 0x8, - /* 80000-800FF: page 8 */ - 0x8, - /* 80100-801FF: page 8 */ - 0x8, - /* 80200-802FF: page 8 */ - 0x8, - /* 80300-803FF: page 8 */ - 0x8, - /* 80400-804FF: page 8 */ - 0x8, - /* 80500-805FF: page 8 */ - 0x8, - /* 80600-806FF: page 8 */ - 0x8, - /* 80700-807FF: page 8 */ - 0x8, - /* 80800-808FF: page 8 */ - 0x8, - /* 80900-809FF: page 8 */ - 0x8, - /* 80A00-80AFF: page 8 */ - 0x8, - /* 80B00-80BFF: page 8 */ - 0x8, - /* 80C00-80CFF: page 8 */ - 0x8, - /* 80D00-80DFF: page 8 */ - 0x8, - /* 80E00-80EFF: page 8 */ - 0x8, - /* 80F00-80FFF: page 8 */ - 0x8, - /* 81000-810FF: page 8 */ - 0x8, - /* 81100-811FF: page 8 */ - 0x8, - /* 81200-812FF: page 8 */ - 0x8, - /* 81300-813FF: page 8 */ - 0x8, - /* 81400-814FF: page 8 */ - 0x8, - /* 81500-815FF: page 8 */ - 0x8, - /* 81600-816FF: page 8 */ - 0x8, - /* 81700-817FF: page 8 */ - 0x8, - /* 81800-818FF: page 8 */ - 0x8, - /* 81900-819FF: page 8 */ - 0x8, - /* 81A00-81AFF: page 8 */ - 0x8, - /* 81B00-81BFF: page 8 */ - 0x8, - /* 81C00-81CFF: page 8 */ - 0x8, - /* 81D00-81DFF: page 8 */ - 0x8, - /* 81E00-81EFF: page 8 */ - 0x8, - /* 81F00-81FFF: page 8 */ - 0x8, - /* 82000-820FF: page 8 */ - 0x8, - /* 82100-821FF: page 8 */ - 0x8, - /* 82200-822FF: page 8 */ - 0x8, - /* 82300-823FF: page 8 */ - 0x8, - /* 82400-824FF: page 8 */ - 0x8, - /* 82500-825FF: page 8 */ - 0x8, - /* 82600-826FF: page 8 */ - 0x8, - /* 82700-827FF: page 8 */ - 0x8, - /* 82800-828FF: page 8 */ - 0x8, - /* 82900-829FF: page 8 */ - 0x8, - /* 82A00-82AFF: page 8 */ - 0x8, - /* 82B00-82BFF: page 8 */ - 0x8, - /* 82C00-82CFF: page 8 */ - 0x8, - /* 82D00-82DFF: page 8 */ - 0x8, - /* 82E00-82EFF: page 8 */ - 0x8, - /* 82F00-82FFF: page 8 */ - 0x8, - /* 83000-830FF: page 8 */ - 0x8, - /* 83100-831FF: page 8 */ - 0x8, - /* 83200-832FF: page 8 */ - 0x8, - /* 83300-833FF: page 8 */ - 0x8, - /* 83400-834FF: page 8 */ - 0x8, - /* 83500-835FF: page 8 */ - 0x8, - /* 83600-836FF: page 8 */ - 0x8, - /* 83700-837FF: page 8 */ - 0x8, - /* 83800-838FF: page 8 */ - 0x8, - /* 83900-839FF: page 8 */ - 0x8, - /* 83A00-83AFF: page 8 */ - 0x8, - /* 83B00-83BFF: page 8 */ - 0x8, - /* 83C00-83CFF: page 8 */ - 0x8, - /* 83D00-83DFF: page 8 */ - 0x8, - /* 83E00-83EFF: page 8 */ - 0x8, - /* 83F00-83FFF: page 8 */ - 0x8, - /* 84000-840FF: page 8 */ - 0x8, - /* 84100-841FF: page 8 */ - 0x8, - /* 84200-842FF: page 8 */ - 0x8, - /* 84300-843FF: page 8 */ - 0x8, - /* 84400-844FF: page 8 */ - 0x8, - /* 84500-845FF: page 8 */ - 0x8, - /* 84600-846FF: page 8 */ - 0x8, - /* 84700-847FF: page 8 */ - 0x8, - /* 84800-848FF: page 8 */ - 0x8, - /* 84900-849FF: page 8 */ - 0x8, - /* 84A00-84AFF: page 8 */ - 0x8, - /* 84B00-84BFF: page 8 */ - 0x8, - /* 84C00-84CFF: page 8 */ - 0x8, - /* 84D00-84DFF: page 8 */ - 0x8, - /* 84E00-84EFF: page 8 */ - 0x8, - /* 84F00-84FFF: page 8 */ - 0x8, - /* 85000-850FF: page 8 */ - 0x8, - /* 85100-851FF: page 8 */ - 0x8, - /* 85200-852FF: page 8 */ - 0x8, - /* 85300-853FF: page 8 */ - 0x8, - /* 85400-854FF: page 8 */ - 0x8, - /* 85500-855FF: page 8 */ - 0x8, - /* 85600-856FF: page 8 */ - 0x8, - /* 85700-857FF: page 8 */ - 0x8, - /* 85800-858FF: page 8 */ - 0x8, - /* 85900-859FF: page 8 */ - 0x8, - /* 85A00-85AFF: page 8 */ - 0x8, - /* 85B00-85BFF: page 8 */ - 0x8, - /* 85C00-85CFF: page 8 */ - 0x8, - /* 85D00-85DFF: page 8 */ - 0x8, - /* 85E00-85EFF: page 8 */ - 0x8, - /* 85F00-85FFF: page 8 */ - 0x8, - /* 86000-860FF: page 8 */ - 0x8, - /* 86100-861FF: page 8 */ - 0x8, - /* 86200-862FF: page 8 */ - 0x8, - /* 86300-863FF: page 8 */ - 0x8, - /* 86400-864FF: page 8 */ - 0x8, - /* 86500-865FF: page 8 */ - 0x8, - /* 86600-866FF: page 8 */ - 0x8, - /* 86700-867FF: page 8 */ - 0x8, - /* 86800-868FF: page 8 */ - 0x8, - /* 86900-869FF: page 8 */ - 0x8, - /* 86A00-86AFF: page 8 */ - 0x8, - /* 86B00-86BFF: page 8 */ - 0x8, - /* 86C00-86CFF: page 8 */ - 0x8, - /* 86D00-86DFF: page 8 */ - 0x8, - /* 86E00-86EFF: page 8 */ - 0x8, - /* 86F00-86FFF: page 8 */ - 0x8, - /* 87000-870FF: page 8 */ - 0x8, - /* 87100-871FF: page 8 */ - 0x8, - /* 87200-872FF: page 8 */ - 0x8, - /* 87300-873FF: page 8 */ - 0x8, - /* 87400-874FF: page 8 */ - 0x8, - /* 87500-875FF: page 8 */ - 0x8, - /* 87600-876FF: page 8 */ - 0x8, - /* 87700-877FF: page 8 */ - 0x8, - /* 87800-878FF: page 8 */ - 0x8, - /* 87900-879FF: page 8 */ - 0x8, - /* 87A00-87AFF: page 8 */ - 0x8, - /* 87B00-87BFF: page 8 */ - 0x8, - /* 87C00-87CFF: page 8 */ - 0x8, - /* 87D00-87DFF: page 8 */ - 0x8, - /* 87E00-87EFF: page 8 */ - 0x8, - /* 87F00-87FFF: page 8 */ - 0x8, - /* 88000-880FF: page 8 */ - 0x8, - /* 88100-881FF: page 8 */ - 0x8, - /* 88200-882FF: page 8 */ - 0x8, - /* 88300-883FF: page 8 */ - 0x8, - /* 88400-884FF: page 8 */ - 0x8, - /* 88500-885FF: page 8 */ - 0x8, - /* 88600-886FF: page 8 */ - 0x8, - /* 88700-887FF: page 8 */ - 0x8, - /* 88800-888FF: page 8 */ - 0x8, - /* 88900-889FF: page 8 */ - 0x8, - /* 88A00-88AFF: page 8 */ - 0x8, - /* 88B00-88BFF: page 8 */ - 0x8, - /* 88C00-88CFF: page 8 */ - 0x8, - /* 88D00-88DFF: page 8 */ - 0x8, - /* 88E00-88EFF: page 8 */ - 0x8, - /* 88F00-88FFF: page 8 */ - 0x8, - /* 89000-890FF: page 8 */ - 0x8, - /* 89100-891FF: page 8 */ - 0x8, - /* 89200-892FF: page 8 */ - 0x8, - /* 89300-893FF: page 8 */ - 0x8, - /* 89400-894FF: page 8 */ - 0x8, - /* 89500-895FF: page 8 */ - 0x8, - /* 89600-896FF: page 8 */ - 0x8, - /* 89700-897FF: page 8 */ - 0x8, - /* 89800-898FF: page 8 */ - 0x8, - /* 89900-899FF: page 8 */ - 0x8, - /* 89A00-89AFF: page 8 */ - 0x8, - /* 89B00-89BFF: page 8 */ - 0x8, - /* 89C00-89CFF: page 8 */ - 0x8, - /* 89D00-89DFF: page 8 */ - 0x8, - /* 89E00-89EFF: page 8 */ - 0x8, - /* 89F00-89FFF: page 8 */ - 0x8, - /* 8A000-8A0FF: page 8 */ - 0x8, - /* 8A100-8A1FF: page 8 */ - 0x8, - /* 8A200-8A2FF: page 8 */ - 0x8, - /* 8A300-8A3FF: page 8 */ - 0x8, - /* 8A400-8A4FF: page 8 */ - 0x8, - /* 8A500-8A5FF: page 8 */ - 0x8, - /* 8A600-8A6FF: page 8 */ - 0x8, - /* 8A700-8A7FF: page 8 */ - 0x8, - /* 8A800-8A8FF: page 8 */ - 0x8, - /* 8A900-8A9FF: page 8 */ - 0x8, - /* 8AA00-8AAFF: page 8 */ - 0x8, - /* 8AB00-8ABFF: page 8 */ - 0x8, - /* 8AC00-8ACFF: page 8 */ - 0x8, - /* 8AD00-8ADFF: page 8 */ - 0x8, - /* 8AE00-8AEFF: page 8 */ - 0x8, - /* 8AF00-8AFFF: page 8 */ - 0x8, - /* 8B000-8B0FF: page 8 */ - 0x8, - /* 8B100-8B1FF: page 8 */ - 0x8, - /* 8B200-8B2FF: page 8 */ - 0x8, - /* 8B300-8B3FF: page 8 */ - 0x8, - /* 8B400-8B4FF: page 8 */ - 0x8, - /* 8B500-8B5FF: page 8 */ - 0x8, - /* 8B600-8B6FF: page 8 */ - 0x8, - /* 8B700-8B7FF: page 8 */ - 0x8, - /* 8B800-8B8FF: page 8 */ - 0x8, - /* 8B900-8B9FF: page 8 */ - 0x8, - /* 8BA00-8BAFF: page 8 */ - 0x8, - /* 8BB00-8BBFF: page 8 */ - 0x8, - /* 8BC00-8BCFF: page 8 */ - 0x8, - /* 8BD00-8BDFF: page 8 */ - 0x8, - /* 8BE00-8BEFF: page 8 */ - 0x8, - /* 8BF00-8BFFF: page 8 */ - 0x8, - /* 8C000-8C0FF: page 8 */ - 0x8, - /* 8C100-8C1FF: page 8 */ - 0x8, - /* 8C200-8C2FF: page 8 */ - 0x8, - /* 8C300-8C3FF: page 8 */ - 0x8, - /* 8C400-8C4FF: page 8 */ - 0x8, - /* 8C500-8C5FF: page 8 */ - 0x8, - /* 8C600-8C6FF: page 8 */ - 0x8, - /* 8C700-8C7FF: page 8 */ - 0x8, - /* 8C800-8C8FF: page 8 */ - 0x8, - /* 8C900-8C9FF: page 8 */ - 0x8, - /* 8CA00-8CAFF: page 8 */ - 0x8, - /* 8CB00-8CBFF: page 8 */ - 0x8, - /* 8CC00-8CCFF: page 8 */ - 0x8, - /* 8CD00-8CDFF: page 8 */ - 0x8, - /* 8CE00-8CEFF: page 8 */ - 0x8, - /* 8CF00-8CFFF: page 8 */ - 0x8, - /* 8D000-8D0FF: page 8 */ - 0x8, - /* 8D100-8D1FF: page 8 */ - 0x8, - /* 8D200-8D2FF: page 8 */ - 0x8, - /* 8D300-8D3FF: page 8 */ - 0x8, - /* 8D400-8D4FF: page 8 */ - 0x8, - /* 8D500-8D5FF: page 8 */ - 0x8, - /* 8D600-8D6FF: page 8 */ - 0x8, - /* 8D700-8D7FF: page 8 */ - 0x8, - /* 8D800-8D8FF: page 8 */ - 0x8, - /* 8D900-8D9FF: page 8 */ - 0x8, - /* 8DA00-8DAFF: page 8 */ - 0x8, - /* 8DB00-8DBFF: page 8 */ - 0x8, - /* 8DC00-8DCFF: page 8 */ - 0x8, - /* 8DD00-8DDFF: page 8 */ - 0x8, - /* 8DE00-8DEFF: page 8 */ - 0x8, - /* 8DF00-8DFFF: page 8 */ - 0x8, - /* 8E000-8E0FF: page 8 */ - 0x8, - /* 8E100-8E1FF: page 8 */ - 0x8, - /* 8E200-8E2FF: page 8 */ - 0x8, - /* 8E300-8E3FF: page 8 */ - 0x8, - /* 8E400-8E4FF: page 8 */ - 0x8, - /* 8E500-8E5FF: page 8 */ - 0x8, - /* 8E600-8E6FF: page 8 */ - 0x8, - /* 8E700-8E7FF: page 8 */ - 0x8, - /* 8E800-8E8FF: page 8 */ - 0x8, - /* 8E900-8E9FF: page 8 */ - 0x8, - /* 8EA00-8EAFF: page 8 */ - 0x8, - /* 8EB00-8EBFF: page 8 */ - 0x8, - /* 8EC00-8ECFF: page 8 */ - 0x8, - /* 8ED00-8EDFF: page 8 */ - 0x8, - /* 8EE00-8EEFF: page 8 */ - 0x8, - /* 8EF00-8EFFF: page 8 */ - 0x8, - /* 8F000-8F0FF: page 8 */ - 0x8, - /* 8F100-8F1FF: page 8 */ - 0x8, - /* 8F200-8F2FF: page 8 */ - 0x8, - /* 8F300-8F3FF: page 8 */ - 0x8, - /* 8F400-8F4FF: page 8 */ - 0x8, - /* 8F500-8F5FF: page 8 */ - 0x8, - /* 8F600-8F6FF: page 8 */ - 0x8, - /* 8F700-8F7FF: page 8 */ - 0x8, - /* 8F800-8F8FF: page 8 */ - 0x8, - /* 8F900-8F9FF: page 8 */ - 0x8, - /* 8FA00-8FAFF: page 8 */ - 0x8, - /* 8FB00-8FBFF: page 8 */ - 0x8, - /* 8FC00-8FCFF: page 8 */ - 0x8, - /* 8FD00-8FDFF: page 8 */ - 0x8, - /* 8FE00-8FEFF: page 8 */ - 0x8, - /* 8FF00-8FFFF: page 8 */ - 0x8, - /* 90000-900FF: page 8 */ - 0x8, - /* 90100-901FF: page 8 */ - 0x8, - /* 90200-902FF: page 8 */ - 0x8, - /* 90300-903FF: page 8 */ - 0x8, - /* 90400-904FF: page 8 */ - 0x8, - /* 90500-905FF: page 8 */ - 0x8, - /* 90600-906FF: page 8 */ - 0x8, - /* 90700-907FF: page 8 */ - 0x8, - /* 90800-908FF: page 8 */ - 0x8, - /* 90900-909FF: page 8 */ - 0x8, - /* 90A00-90AFF: page 8 */ - 0x8, - /* 90B00-90BFF: page 8 */ - 0x8, - /* 90C00-90CFF: page 8 */ - 0x8, - /* 90D00-90DFF: page 8 */ - 0x8, - /* 90E00-90EFF: page 8 */ - 0x8, - /* 90F00-90FFF: page 8 */ - 0x8, - /* 91000-910FF: page 8 */ - 0x8, - /* 91100-911FF: page 8 */ - 0x8, - /* 91200-912FF: page 8 */ - 0x8, - /* 91300-913FF: page 8 */ - 0x8, - /* 91400-914FF: page 8 */ - 0x8, - /* 91500-915FF: page 8 */ - 0x8, - /* 91600-916FF: page 8 */ - 0x8, - /* 91700-917FF: page 8 */ - 0x8, - /* 91800-918FF: page 8 */ - 0x8, - /* 91900-919FF: page 8 */ - 0x8, - /* 91A00-91AFF: page 8 */ - 0x8, - /* 91B00-91BFF: page 8 */ - 0x8, - /* 91C00-91CFF: page 8 */ - 0x8, - /* 91D00-91DFF: page 8 */ - 0x8, - /* 91E00-91EFF: page 8 */ - 0x8, - /* 91F00-91FFF: page 8 */ - 0x8, - /* 92000-920FF: page 8 */ - 0x8, - /* 92100-921FF: page 8 */ - 0x8, - /* 92200-922FF: page 8 */ - 0x8, - /* 92300-923FF: page 8 */ - 0x8, - /* 92400-924FF: page 8 */ - 0x8, - /* 92500-925FF: page 8 */ - 0x8, - /* 92600-926FF: page 8 */ - 0x8, - /* 92700-927FF: page 8 */ - 0x8, - /* 92800-928FF: page 8 */ - 0x8, - /* 92900-929FF: page 8 */ - 0x8, - /* 92A00-92AFF: page 8 */ - 0x8, - /* 92B00-92BFF: page 8 */ - 0x8, - /* 92C00-92CFF: page 8 */ - 0x8, - /* 92D00-92DFF: page 8 */ - 0x8, - /* 92E00-92EFF: page 8 */ - 0x8, - /* 92F00-92FFF: page 8 */ - 0x8, - /* 93000-930FF: page 8 */ - 0x8, - /* 93100-931FF: page 8 */ - 0x8, - /* 93200-932FF: page 8 */ - 0x8, - /* 93300-933FF: page 8 */ - 0x8, - /* 93400-934FF: page 8 */ - 0x8, - /* 93500-935FF: page 8 */ - 0x8, - /* 93600-936FF: page 8 */ - 0x8, - /* 93700-937FF: page 8 */ - 0x8, - /* 93800-938FF: page 8 */ - 0x8, - /* 93900-939FF: page 8 */ - 0x8, - /* 93A00-93AFF: page 8 */ - 0x8, - /* 93B00-93BFF: page 8 */ - 0x8, - /* 93C00-93CFF: page 8 */ - 0x8, - /* 93D00-93DFF: page 8 */ - 0x8, - /* 93E00-93EFF: page 8 */ - 0x8, - /* 93F00-93FFF: page 8 */ - 0x8, - /* 94000-940FF: page 8 */ - 0x8, - /* 94100-941FF: page 8 */ - 0x8, - /* 94200-942FF: page 8 */ - 0x8, - /* 94300-943FF: page 8 */ - 0x8, - /* 94400-944FF: page 8 */ - 0x8, - /* 94500-945FF: page 8 */ - 0x8, - /* 94600-946FF: page 8 */ - 0x8, - /* 94700-947FF: page 8 */ - 0x8, - /* 94800-948FF: page 8 */ - 0x8, - /* 94900-949FF: page 8 */ - 0x8, - /* 94A00-94AFF: page 8 */ - 0x8, - /* 94B00-94BFF: page 8 */ - 0x8, - /* 94C00-94CFF: page 8 */ - 0x8, - /* 94D00-94DFF: page 8 */ - 0x8, - /* 94E00-94EFF: page 8 */ - 0x8, - /* 94F00-94FFF: page 8 */ - 0x8, - /* 95000-950FF: page 8 */ - 0x8, - /* 95100-951FF: page 8 */ - 0x8, - /* 95200-952FF: page 8 */ - 0x8, - /* 95300-953FF: page 8 */ - 0x8, - /* 95400-954FF: page 8 */ - 0x8, - /* 95500-955FF: page 8 */ - 0x8, - /* 95600-956FF: page 8 */ - 0x8, - /* 95700-957FF: page 8 */ - 0x8, - /* 95800-958FF: page 8 */ - 0x8, - /* 95900-959FF: page 8 */ - 0x8, - /* 95A00-95AFF: page 8 */ - 0x8, - /* 95B00-95BFF: page 8 */ - 0x8, - /* 95C00-95CFF: page 8 */ - 0x8, - /* 95D00-95DFF: page 8 */ - 0x8, - /* 95E00-95EFF: page 8 */ - 0x8, - /* 95F00-95FFF: page 8 */ - 0x8, - /* 96000-960FF: page 8 */ - 0x8, - /* 96100-961FF: page 8 */ - 0x8, - /* 96200-962FF: page 8 */ - 0x8, - /* 96300-963FF: page 8 */ - 0x8, - /* 96400-964FF: page 8 */ - 0x8, - /* 96500-965FF: page 8 */ - 0x8, - /* 96600-966FF: page 8 */ - 0x8, - /* 96700-967FF: page 8 */ - 0x8, - /* 96800-968FF: page 8 */ - 0x8, - /* 96900-969FF: page 8 */ - 0x8, - /* 96A00-96AFF: page 8 */ - 0x8, - /* 96B00-96BFF: page 8 */ - 0x8, - /* 96C00-96CFF: page 8 */ - 0x8, - /* 96D00-96DFF: page 8 */ - 0x8, - /* 96E00-96EFF: page 8 */ - 0x8, - /* 96F00-96FFF: page 8 */ - 0x8, - /* 97000-970FF: page 8 */ - 0x8, - /* 97100-971FF: page 8 */ - 0x8, - /* 97200-972FF: page 8 */ - 0x8, - /* 97300-973FF: page 8 */ - 0x8, - /* 97400-974FF: page 8 */ - 0x8, - /* 97500-975FF: page 8 */ - 0x8, - /* 97600-976FF: page 8 */ - 0x8, - /* 97700-977FF: page 8 */ - 0x8, - /* 97800-978FF: page 8 */ - 0x8, - /* 97900-979FF: page 8 */ - 0x8, - /* 97A00-97AFF: page 8 */ - 0x8, - /* 97B00-97BFF: page 8 */ - 0x8, - /* 97C00-97CFF: page 8 */ - 0x8, - /* 97D00-97DFF: page 8 */ - 0x8, - /* 97E00-97EFF: page 8 */ - 0x8, - /* 97F00-97FFF: page 8 */ - 0x8, - /* 98000-980FF: page 8 */ - 0x8, - /* 98100-981FF: page 8 */ - 0x8, - /* 98200-982FF: page 8 */ - 0x8, - /* 98300-983FF: page 8 */ - 0x8, - /* 98400-984FF: page 8 */ - 0x8, - /* 98500-985FF: page 8 */ - 0x8, - /* 98600-986FF: page 8 */ - 0x8, - /* 98700-987FF: page 8 */ - 0x8, - /* 98800-988FF: page 8 */ - 0x8, - /* 98900-989FF: page 8 */ - 0x8, - /* 98A00-98AFF: page 8 */ - 0x8, - /* 98B00-98BFF: page 8 */ - 0x8, - /* 98C00-98CFF: page 8 */ - 0x8, - /* 98D00-98DFF: page 8 */ - 0x8, - /* 98E00-98EFF: page 8 */ - 0x8, - /* 98F00-98FFF: page 8 */ - 0x8, - /* 99000-990FF: page 8 */ - 0x8, - /* 99100-991FF: page 8 */ - 0x8, - /* 99200-992FF: page 8 */ - 0x8, - /* 99300-993FF: page 8 */ - 0x8, - /* 99400-994FF: page 8 */ - 0x8, - /* 99500-995FF: page 8 */ - 0x8, - /* 99600-996FF: page 8 */ - 0x8, - /* 99700-997FF: page 8 */ - 0x8, - /* 99800-998FF: page 8 */ - 0x8, - /* 99900-999FF: page 8 */ - 0x8, - /* 99A00-99AFF: page 8 */ - 0x8, - /* 99B00-99BFF: page 8 */ - 0x8, - /* 99C00-99CFF: page 8 */ - 0x8, - /* 99D00-99DFF: page 8 */ - 0x8, - /* 99E00-99EFF: page 8 */ - 0x8, - /* 99F00-99FFF: page 8 */ - 0x8, - /* 9A000-9A0FF: page 8 */ - 0x8, - /* 9A100-9A1FF: page 8 */ - 0x8, - /* 9A200-9A2FF: page 8 */ - 0x8, - /* 9A300-9A3FF: page 8 */ - 0x8, - /* 9A400-9A4FF: page 8 */ - 0x8, - /* 9A500-9A5FF: page 8 */ - 0x8, - /* 9A600-9A6FF: page 8 */ - 0x8, - /* 9A700-9A7FF: page 8 */ - 0x8, - /* 9A800-9A8FF: page 8 */ - 0x8, - /* 9A900-9A9FF: page 8 */ - 0x8, - /* 9AA00-9AAFF: page 8 */ - 0x8, - /* 9AB00-9ABFF: page 8 */ - 0x8, - /* 9AC00-9ACFF: page 8 */ - 0x8, - /* 9AD00-9ADFF: page 8 */ - 0x8, - /* 9AE00-9AEFF: page 8 */ - 0x8, - /* 9AF00-9AFFF: page 8 */ - 0x8, - /* 9B000-9B0FF: page 8 */ - 0x8, - /* 9B100-9B1FF: page 8 */ - 0x8, - /* 9B200-9B2FF: page 8 */ - 0x8, - /* 9B300-9B3FF: page 8 */ - 0x8, - /* 9B400-9B4FF: page 8 */ - 0x8, - /* 9B500-9B5FF: page 8 */ - 0x8, - /* 9B600-9B6FF: page 8 */ - 0x8, - /* 9B700-9B7FF: page 8 */ - 0x8, - /* 9B800-9B8FF: page 8 */ - 0x8, - /* 9B900-9B9FF: page 8 */ - 0x8, - /* 9BA00-9BAFF: page 8 */ - 0x8, - /* 9BB00-9BBFF: page 8 */ - 0x8, - /* 9BC00-9BCFF: page 8 */ - 0x8, - /* 9BD00-9BDFF: page 8 */ - 0x8, - /* 9BE00-9BEFF: page 8 */ - 0x8, - /* 9BF00-9BFFF: page 8 */ - 0x8, - /* 9C000-9C0FF: page 8 */ - 0x8, - /* 9C100-9C1FF: page 8 */ - 0x8, - /* 9C200-9C2FF: page 8 */ - 0x8, - /* 9C300-9C3FF: page 8 */ - 0x8, - /* 9C400-9C4FF: page 8 */ - 0x8, - /* 9C500-9C5FF: page 8 */ - 0x8, - /* 9C600-9C6FF: page 8 */ - 0x8, - /* 9C700-9C7FF: page 8 */ - 0x8, - /* 9C800-9C8FF: page 8 */ - 0x8, - /* 9C900-9C9FF: page 8 */ - 0x8, - /* 9CA00-9CAFF: page 8 */ - 0x8, - /* 9CB00-9CBFF: page 8 */ - 0x8, - /* 9CC00-9CCFF: page 8 */ - 0x8, - /* 9CD00-9CDFF: page 8 */ - 0x8, - /* 9CE00-9CEFF: page 8 */ - 0x8, - /* 9CF00-9CFFF: page 8 */ - 0x8, - /* 9D000-9D0FF: page 8 */ - 0x8, - /* 9D100-9D1FF: page 8 */ - 0x8, - /* 9D200-9D2FF: page 8 */ - 0x8, - /* 9D300-9D3FF: page 8 */ - 0x8, - /* 9D400-9D4FF: page 8 */ - 0x8, - /* 9D500-9D5FF: page 8 */ - 0x8, - /* 9D600-9D6FF: page 8 */ - 0x8, - /* 9D700-9D7FF: page 8 */ - 0x8, - /* 9D800-9D8FF: page 8 */ - 0x8, - /* 9D900-9D9FF: page 8 */ - 0x8, - /* 9DA00-9DAFF: page 8 */ - 0x8, - /* 9DB00-9DBFF: page 8 */ - 0x8, - /* 9DC00-9DCFF: page 8 */ - 0x8, - /* 9DD00-9DDFF: page 8 */ - 0x8, - /* 9DE00-9DEFF: page 8 */ - 0x8, - /* 9DF00-9DFFF: page 8 */ - 0x8, - /* 9E000-9E0FF: page 8 */ - 0x8, - /* 9E100-9E1FF: page 8 */ - 0x8, - /* 9E200-9E2FF: page 8 */ - 0x8, - /* 9E300-9E3FF: page 8 */ - 0x8, - /* 9E400-9E4FF: page 8 */ - 0x8, - /* 9E500-9E5FF: page 8 */ - 0x8, - /* 9E600-9E6FF: page 8 */ - 0x8, - /* 9E700-9E7FF: page 8 */ - 0x8, - /* 9E800-9E8FF: page 8 */ - 0x8, - /* 9E900-9E9FF: page 8 */ - 0x8, - /* 9EA00-9EAFF: page 8 */ - 0x8, - /* 9EB00-9EBFF: page 8 */ - 0x8, - /* 9EC00-9ECFF: page 8 */ - 0x8, - /* 9ED00-9EDFF: page 8 */ - 0x8, - /* 9EE00-9EEFF: page 8 */ - 0x8, - /* 9EF00-9EFFF: page 8 */ - 0x8, - /* 9F000-9F0FF: page 8 */ - 0x8, - /* 9F100-9F1FF: page 8 */ - 0x8, - /* 9F200-9F2FF: page 8 */ - 0x8, - /* 9F300-9F3FF: page 8 */ - 0x8, - /* 9F400-9F4FF: page 8 */ - 0x8, - /* 9F500-9F5FF: page 8 */ - 0x8, - /* 9F600-9F6FF: page 8 */ - 0x8, - /* 9F700-9F7FF: page 8 */ - 0x8, - /* 9F800-9F8FF: page 8 */ - 0x8, - /* 9F900-9F9FF: page 8 */ - 0x8, - /* 9FA00-9FAFF: page 8 */ - 0x8, - /* 9FB00-9FBFF: page 8 */ - 0x8, - /* 9FC00-9FCFF: page 8 */ - 0x8, - /* 9FD00-9FDFF: page 8 */ - 0x8, - /* 9FE00-9FEFF: page 8 */ - 0x8, - /* 9FF00-9FFFF: page 8 */ - 0x8, - /* A0000-A00FF: page 8 */ - 0x8, - /* A0100-A01FF: page 8 */ - 0x8, - /* A0200-A02FF: page 8 */ - 0x8, - /* A0300-A03FF: page 8 */ - 0x8, - /* A0400-A04FF: page 8 */ - 0x8, - /* A0500-A05FF: page 8 */ - 0x8, - /* A0600-A06FF: page 8 */ - 0x8, - /* A0700-A07FF: page 8 */ - 0x8, - /* A0800-A08FF: page 8 */ - 0x8, - /* A0900-A09FF: page 8 */ - 0x8, - /* A0A00-A0AFF: page 8 */ - 0x8, - /* A0B00-A0BFF: page 8 */ - 0x8, - /* A0C00-A0CFF: page 8 */ - 0x8, - /* A0D00-A0DFF: page 8 */ - 0x8, - /* A0E00-A0EFF: page 8 */ - 0x8, - /* A0F00-A0FFF: page 8 */ - 0x8, - /* A1000-A10FF: page 8 */ - 0x8, - /* A1100-A11FF: page 8 */ - 0x8, - /* A1200-A12FF: page 8 */ - 0x8, - /* A1300-A13FF: page 8 */ - 0x8, - /* A1400-A14FF: page 8 */ - 0x8, - /* A1500-A15FF: page 8 */ - 0x8, - /* A1600-A16FF: page 8 */ - 0x8, - /* A1700-A17FF: page 8 */ - 0x8, - /* A1800-A18FF: page 8 */ - 0x8, - /* A1900-A19FF: page 8 */ - 0x8, - /* A1A00-A1AFF: page 8 */ - 0x8, - /* A1B00-A1BFF: page 8 */ - 0x8, - /* A1C00-A1CFF: page 8 */ - 0x8, - /* A1D00-A1DFF: page 8 */ - 0x8, - /* A1E00-A1EFF: page 8 */ - 0x8, - /* A1F00-A1FFF: page 8 */ - 0x8, - /* A2000-A20FF: page 8 */ - 0x8, - /* A2100-A21FF: page 8 */ - 0x8, - /* A2200-A22FF: page 8 */ - 0x8, - /* A2300-A23FF: page 8 */ - 0x8, - /* A2400-A24FF: page 8 */ - 0x8, - /* A2500-A25FF: page 8 */ - 0x8, - /* A2600-A26FF: page 8 */ - 0x8, - /* A2700-A27FF: page 8 */ - 0x8, - /* A2800-A28FF: page 8 */ - 0x8, - /* A2900-A29FF: page 8 */ - 0x8, - /* A2A00-A2AFF: page 8 */ - 0x8, - /* A2B00-A2BFF: page 8 */ - 0x8, - /* A2C00-A2CFF: page 8 */ - 0x8, - /* A2D00-A2DFF: page 8 */ - 0x8, - /* A2E00-A2EFF: page 8 */ - 0x8, - /* A2F00-A2FFF: page 8 */ - 0x8, - /* A3000-A30FF: page 8 */ - 0x8, - /* A3100-A31FF: page 8 */ - 0x8, - /* A3200-A32FF: page 8 */ - 0x8, - /* A3300-A33FF: page 8 */ - 0x8, - /* A3400-A34FF: page 8 */ - 0x8, - /* A3500-A35FF: page 8 */ - 0x8, - /* A3600-A36FF: page 8 */ - 0x8, - /* A3700-A37FF: page 8 */ - 0x8, - /* A3800-A38FF: page 8 */ - 0x8, - /* A3900-A39FF: page 8 */ - 0x8, - /* A3A00-A3AFF: page 8 */ - 0x8, - /* A3B00-A3BFF: page 8 */ - 0x8, - /* A3C00-A3CFF: page 8 */ - 0x8, - /* A3D00-A3DFF: page 8 */ - 0x8, - /* A3E00-A3EFF: page 8 */ - 0x8, - /* A3F00-A3FFF: page 8 */ - 0x8, - /* A4000-A40FF: page 8 */ - 0x8, - /* A4100-A41FF: page 8 */ - 0x8, - /* A4200-A42FF: page 8 */ - 0x8, - /* A4300-A43FF: page 8 */ - 0x8, - /* A4400-A44FF: page 8 */ - 0x8, - /* A4500-A45FF: page 8 */ - 0x8, - /* A4600-A46FF: page 8 */ - 0x8, - /* A4700-A47FF: page 8 */ - 0x8, - /* A4800-A48FF: page 8 */ - 0x8, - /* A4900-A49FF: page 8 */ - 0x8, - /* A4A00-A4AFF: page 8 */ - 0x8, - /* A4B00-A4BFF: page 8 */ - 0x8, - /* A4C00-A4CFF: page 8 */ - 0x8, - /* A4D00-A4DFF: page 8 */ - 0x8, - /* A4E00-A4EFF: page 8 */ - 0x8, - /* A4F00-A4FFF: page 8 */ - 0x8, - /* A5000-A50FF: page 8 */ - 0x8, - /* A5100-A51FF: page 8 */ - 0x8, - /* A5200-A52FF: page 8 */ - 0x8, - /* A5300-A53FF: page 8 */ - 0x8, - /* A5400-A54FF: page 8 */ - 0x8, - /* A5500-A55FF: page 8 */ - 0x8, - /* A5600-A56FF: page 8 */ - 0x8, - /* A5700-A57FF: page 8 */ - 0x8, - /* A5800-A58FF: page 8 */ - 0x8, - /* A5900-A59FF: page 8 */ - 0x8, - /* A5A00-A5AFF: page 8 */ - 0x8, - /* A5B00-A5BFF: page 8 */ - 0x8, - /* A5C00-A5CFF: page 8 */ - 0x8, - /* A5D00-A5DFF: page 8 */ - 0x8, - /* A5E00-A5EFF: page 8 */ - 0x8, - /* A5F00-A5FFF: page 8 */ - 0x8, - /* A6000-A60FF: page 8 */ - 0x8, - /* A6100-A61FF: page 8 */ - 0x8, - /* A6200-A62FF: page 8 */ - 0x8, - /* A6300-A63FF: page 8 */ - 0x8, - /* A6400-A64FF: page 8 */ - 0x8, - /* A6500-A65FF: page 8 */ - 0x8, - /* A6600-A66FF: page 8 */ - 0x8, - /* A6700-A67FF: page 8 */ - 0x8, - /* A6800-A68FF: page 8 */ - 0x8, - /* A6900-A69FF: page 8 */ - 0x8, - /* A6A00-A6AFF: page 8 */ - 0x8, - /* A6B00-A6BFF: page 8 */ - 0x8, - /* A6C00-A6CFF: page 8 */ - 0x8, - /* A6D00-A6DFF: page 8 */ - 0x8, - /* A6E00-A6EFF: page 8 */ - 0x8, - /* A6F00-A6FFF: page 8 */ - 0x8, - /* A7000-A70FF: page 8 */ - 0x8, - /* A7100-A71FF: page 8 */ - 0x8, - /* A7200-A72FF: page 8 */ - 0x8, - /* A7300-A73FF: page 8 */ - 0x8, - /* A7400-A74FF: page 8 */ - 0x8, - /* A7500-A75FF: page 8 */ - 0x8, - /* A7600-A76FF: page 8 */ - 0x8, - /* A7700-A77FF: page 8 */ - 0x8, - /* A7800-A78FF: page 8 */ - 0x8, - /* A7900-A79FF: page 8 */ - 0x8, - /* A7A00-A7AFF: page 8 */ - 0x8, - /* A7B00-A7BFF: page 8 */ - 0x8, - /* A7C00-A7CFF: page 8 */ - 0x8, - /* A7D00-A7DFF: page 8 */ - 0x8, - /* A7E00-A7EFF: page 8 */ - 0x8, - /* A7F00-A7FFF: page 8 */ - 0x8, - /* A8000-A80FF: page 8 */ - 0x8, - /* A8100-A81FF: page 8 */ - 0x8, - /* A8200-A82FF: page 8 */ - 0x8, - /* A8300-A83FF: page 8 */ - 0x8, - /* A8400-A84FF: page 8 */ - 0x8, - /* A8500-A85FF: page 8 */ - 0x8, - /* A8600-A86FF: page 8 */ - 0x8, - /* A8700-A87FF: page 8 */ - 0x8, - /* A8800-A88FF: page 8 */ - 0x8, - /* A8900-A89FF: page 8 */ - 0x8, - /* A8A00-A8AFF: page 8 */ - 0x8, - /* A8B00-A8BFF: page 8 */ - 0x8, - /* A8C00-A8CFF: page 8 */ - 0x8, - /* A8D00-A8DFF: page 8 */ - 0x8, - /* A8E00-A8EFF: page 8 */ - 0x8, - /* A8F00-A8FFF: page 8 */ - 0x8, - /* A9000-A90FF: page 8 */ - 0x8, - /* A9100-A91FF: page 8 */ - 0x8, - /* A9200-A92FF: page 8 */ - 0x8, - /* A9300-A93FF: page 8 */ - 0x8, - /* A9400-A94FF: page 8 */ - 0x8, - /* A9500-A95FF: page 8 */ - 0x8, - /* A9600-A96FF: page 8 */ - 0x8, - /* A9700-A97FF: page 8 */ - 0x8, - /* A9800-A98FF: page 8 */ - 0x8, - /* A9900-A99FF: page 8 */ - 0x8, - /* A9A00-A9AFF: page 8 */ - 0x8, - /* A9B00-A9BFF: page 8 */ - 0x8, - /* A9C00-A9CFF: page 8 */ - 0x8, - /* A9D00-A9DFF: page 8 */ - 0x8, - /* A9E00-A9EFF: page 8 */ - 0x8, - /* A9F00-A9FFF: page 8 */ - 0x8, - /* AA000-AA0FF: page 8 */ - 0x8, - /* AA100-AA1FF: page 8 */ - 0x8, - /* AA200-AA2FF: page 8 */ - 0x8, - /* AA300-AA3FF: page 8 */ - 0x8, - /* AA400-AA4FF: page 8 */ - 0x8, - /* AA500-AA5FF: page 8 */ - 0x8, - /* AA600-AA6FF: page 8 */ - 0x8, - /* AA700-AA7FF: page 8 */ - 0x8, - /* AA800-AA8FF: page 8 */ - 0x8, - /* AA900-AA9FF: page 8 */ - 0x8, - /* AAA00-AAAFF: page 8 */ - 0x8, - /* AAB00-AABFF: page 8 */ - 0x8, - /* AAC00-AACFF: page 8 */ - 0x8, - /* AAD00-AADFF: page 8 */ - 0x8, - /* AAE00-AAEFF: page 8 */ - 0x8, - /* AAF00-AAFFF: page 8 */ - 0x8, - /* AB000-AB0FF: page 8 */ - 0x8, - /* AB100-AB1FF: page 8 */ - 0x8, - /* AB200-AB2FF: page 8 */ - 0x8, - /* AB300-AB3FF: page 8 */ - 0x8, - /* AB400-AB4FF: page 8 */ - 0x8, - /* AB500-AB5FF: page 8 */ - 0x8, - /* AB600-AB6FF: page 8 */ - 0x8, - /* AB700-AB7FF: page 8 */ - 0x8, - /* AB800-AB8FF: page 8 */ - 0x8, - /* AB900-AB9FF: page 8 */ - 0x8, - /* ABA00-ABAFF: page 8 */ - 0x8, - /* ABB00-ABBFF: page 8 */ - 0x8, - /* ABC00-ABCFF: page 8 */ - 0x8, - /* ABD00-ABDFF: page 8 */ - 0x8, - /* ABE00-ABEFF: page 8 */ - 0x8, - /* ABF00-ABFFF: page 8 */ - 0x8, - /* AC000-AC0FF: page 8 */ - 0x8, - /* AC100-AC1FF: page 8 */ - 0x8, - /* AC200-AC2FF: page 8 */ - 0x8, - /* AC300-AC3FF: page 8 */ - 0x8, - /* AC400-AC4FF: page 8 */ - 0x8, - /* AC500-AC5FF: page 8 */ - 0x8, - /* AC600-AC6FF: page 8 */ - 0x8, - /* AC700-AC7FF: page 8 */ - 0x8, - /* AC800-AC8FF: page 8 */ - 0x8, - /* AC900-AC9FF: page 8 */ - 0x8, - /* ACA00-ACAFF: page 8 */ - 0x8, - /* ACB00-ACBFF: page 8 */ - 0x8, - /* ACC00-ACCFF: page 8 */ - 0x8, - /* ACD00-ACDFF: page 8 */ - 0x8, - /* ACE00-ACEFF: page 8 */ - 0x8, - /* ACF00-ACFFF: page 8 */ - 0x8, - /* AD000-AD0FF: page 8 */ - 0x8, - /* AD100-AD1FF: page 8 */ - 0x8, - /* AD200-AD2FF: page 8 */ - 0x8, - /* AD300-AD3FF: page 8 */ - 0x8, - /* AD400-AD4FF: page 8 */ - 0x8, - /* AD500-AD5FF: page 8 */ - 0x8, - /* AD600-AD6FF: page 8 */ - 0x8, - /* AD700-AD7FF: page 8 */ - 0x8, - /* AD800-AD8FF: page 8 */ - 0x8, - /* AD900-AD9FF: page 8 */ - 0x8, - /* ADA00-ADAFF: page 8 */ - 0x8, - /* ADB00-ADBFF: page 8 */ - 0x8, - /* ADC00-ADCFF: page 8 */ - 0x8, - /* ADD00-ADDFF: page 8 */ - 0x8, - /* ADE00-ADEFF: page 8 */ - 0x8, - /* ADF00-ADFFF: page 8 */ - 0x8, - /* AE000-AE0FF: page 8 */ - 0x8, - /* AE100-AE1FF: page 8 */ - 0x8, - /* AE200-AE2FF: page 8 */ - 0x8, - /* AE300-AE3FF: page 8 */ - 0x8, - /* AE400-AE4FF: page 8 */ - 0x8, - /* AE500-AE5FF: page 8 */ - 0x8, - /* AE600-AE6FF: page 8 */ - 0x8, - /* AE700-AE7FF: page 8 */ - 0x8, - /* AE800-AE8FF: page 8 */ - 0x8, - /* AE900-AE9FF: page 8 */ - 0x8, - /* AEA00-AEAFF: page 8 */ - 0x8, - /* AEB00-AEBFF: page 8 */ - 0x8, - /* AEC00-AECFF: page 8 */ - 0x8, - /* AED00-AEDFF: page 8 */ - 0x8, - /* AEE00-AEEFF: page 8 */ - 0x8, - /* AEF00-AEFFF: page 8 */ - 0x8, - /* AF000-AF0FF: page 8 */ - 0x8, - /* AF100-AF1FF: page 8 */ - 0x8, - /* AF200-AF2FF: page 8 */ - 0x8, - /* AF300-AF3FF: page 8 */ - 0x8, - /* AF400-AF4FF: page 8 */ - 0x8, - /* AF500-AF5FF: page 8 */ - 0x8, - /* AF600-AF6FF: page 8 */ - 0x8, - /* AF700-AF7FF: page 8 */ - 0x8, - /* AF800-AF8FF: page 8 */ - 0x8, - /* AF900-AF9FF: page 8 */ - 0x8, - /* AFA00-AFAFF: page 8 */ - 0x8, - /* AFB00-AFBFF: page 8 */ - 0x8, - /* AFC00-AFCFF: page 8 */ - 0x8, - /* AFD00-AFDFF: page 8 */ - 0x8, - /* AFE00-AFEFF: page 8 */ - 0x8, - /* AFF00-AFFFF: page 8 */ - 0x8, - /* B0000-B00FF: page 8 */ - 0x8, - /* B0100-B01FF: page 8 */ - 0x8, - /* B0200-B02FF: page 8 */ - 0x8, - /* B0300-B03FF: page 8 */ - 0x8, - /* B0400-B04FF: page 8 */ - 0x8, - /* B0500-B05FF: page 8 */ - 0x8, - /* B0600-B06FF: page 8 */ - 0x8, - /* B0700-B07FF: page 8 */ - 0x8, - /* B0800-B08FF: page 8 */ - 0x8, - /* B0900-B09FF: page 8 */ - 0x8, - /* B0A00-B0AFF: page 8 */ - 0x8, - /* B0B00-B0BFF: page 8 */ - 0x8, - /* B0C00-B0CFF: page 8 */ - 0x8, - /* B0D00-B0DFF: page 8 */ - 0x8, - /* B0E00-B0EFF: page 8 */ - 0x8, - /* B0F00-B0FFF: page 8 */ - 0x8, - /* B1000-B10FF: page 8 */ - 0x8, - /* B1100-B11FF: page 8 */ - 0x8, - /* B1200-B12FF: page 8 */ - 0x8, - /* B1300-B13FF: page 8 */ - 0x8, - /* B1400-B14FF: page 8 */ - 0x8, - /* B1500-B15FF: page 8 */ - 0x8, - /* B1600-B16FF: page 8 */ - 0x8, - /* B1700-B17FF: page 8 */ - 0x8, - /* B1800-B18FF: page 8 */ - 0x8, - /* B1900-B19FF: page 8 */ - 0x8, - /* B1A00-B1AFF: page 8 */ - 0x8, - /* B1B00-B1BFF: page 8 */ - 0x8, - /* B1C00-B1CFF: page 8 */ - 0x8, - /* B1D00-B1DFF: page 8 */ - 0x8, - /* B1E00-B1EFF: page 8 */ - 0x8, - /* B1F00-B1FFF: page 8 */ - 0x8, - /* B2000-B20FF: page 8 */ - 0x8, - /* B2100-B21FF: page 8 */ - 0x8, - /* B2200-B22FF: page 8 */ - 0x8, - /* B2300-B23FF: page 8 */ - 0x8, - /* B2400-B24FF: page 8 */ - 0x8, - /* B2500-B25FF: page 8 */ - 0x8, - /* B2600-B26FF: page 8 */ - 0x8, - /* B2700-B27FF: page 8 */ - 0x8, - /* B2800-B28FF: page 8 */ - 0x8, - /* B2900-B29FF: page 8 */ - 0x8, - /* B2A00-B2AFF: page 8 */ - 0x8, - /* B2B00-B2BFF: page 8 */ - 0x8, - /* B2C00-B2CFF: page 8 */ - 0x8, - /* B2D00-B2DFF: page 8 */ - 0x8, - /* B2E00-B2EFF: page 8 */ - 0x8, - /* B2F00-B2FFF: page 8 */ - 0x8, - /* B3000-B30FF: page 8 */ - 0x8, - /* B3100-B31FF: page 8 */ - 0x8, - /* B3200-B32FF: page 8 */ - 0x8, - /* B3300-B33FF: page 8 */ - 0x8, - /* B3400-B34FF: page 8 */ - 0x8, - /* B3500-B35FF: page 8 */ - 0x8, - /* B3600-B36FF: page 8 */ - 0x8, - /* B3700-B37FF: page 8 */ - 0x8, - /* B3800-B38FF: page 8 */ - 0x8, - /* B3900-B39FF: page 8 */ - 0x8, - /* B3A00-B3AFF: page 8 */ - 0x8, - /* B3B00-B3BFF: page 8 */ - 0x8, - /* B3C00-B3CFF: page 8 */ - 0x8, - /* B3D00-B3DFF: page 8 */ - 0x8, - /* B3E00-B3EFF: page 8 */ - 0x8, - /* B3F00-B3FFF: page 8 */ - 0x8, - /* B4000-B40FF: page 8 */ - 0x8, - /* B4100-B41FF: page 8 */ - 0x8, - /* B4200-B42FF: page 8 */ - 0x8, - /* B4300-B43FF: page 8 */ - 0x8, - /* B4400-B44FF: page 8 */ - 0x8, - /* B4500-B45FF: page 8 */ - 0x8, - /* B4600-B46FF: page 8 */ - 0x8, - /* B4700-B47FF: page 8 */ - 0x8, - /* B4800-B48FF: page 8 */ - 0x8, - /* B4900-B49FF: page 8 */ - 0x8, - /* B4A00-B4AFF: page 8 */ - 0x8, - /* B4B00-B4BFF: page 8 */ - 0x8, - /* B4C00-B4CFF: page 8 */ - 0x8, - /* B4D00-B4DFF: page 8 */ - 0x8, - /* B4E00-B4EFF: page 8 */ - 0x8, - /* B4F00-B4FFF: page 8 */ - 0x8, - /* B5000-B50FF: page 8 */ - 0x8, - /* B5100-B51FF: page 8 */ - 0x8, - /* B5200-B52FF: page 8 */ - 0x8, - /* B5300-B53FF: page 8 */ - 0x8, - /* B5400-B54FF: page 8 */ - 0x8, - /* B5500-B55FF: page 8 */ - 0x8, - /* B5600-B56FF: page 8 */ - 0x8, - /* B5700-B57FF: page 8 */ - 0x8, - /* B5800-B58FF: page 8 */ - 0x8, - /* B5900-B59FF: page 8 */ - 0x8, - /* B5A00-B5AFF: page 8 */ - 0x8, - /* B5B00-B5BFF: page 8 */ - 0x8, - /* B5C00-B5CFF: page 8 */ - 0x8, - /* B5D00-B5DFF: page 8 */ - 0x8, - /* B5E00-B5EFF: page 8 */ - 0x8, - /* B5F00-B5FFF: page 8 */ - 0x8, - /* B6000-B60FF: page 8 */ - 0x8, - /* B6100-B61FF: page 8 */ - 0x8, - /* B6200-B62FF: page 8 */ - 0x8, - /* B6300-B63FF: page 8 */ - 0x8, - /* B6400-B64FF: page 8 */ - 0x8, - /* B6500-B65FF: page 8 */ - 0x8, - /* B6600-B66FF: page 8 */ - 0x8, - /* B6700-B67FF: page 8 */ - 0x8, - /* B6800-B68FF: page 8 */ - 0x8, - /* B6900-B69FF: page 8 */ - 0x8, - /* B6A00-B6AFF: page 8 */ - 0x8, - /* B6B00-B6BFF: page 8 */ - 0x8, - /* B6C00-B6CFF: page 8 */ - 0x8, - /* B6D00-B6DFF: page 8 */ - 0x8, - /* B6E00-B6EFF: page 8 */ - 0x8, - /* B6F00-B6FFF: page 8 */ - 0x8, - /* B7000-B70FF: page 8 */ - 0x8, - /* B7100-B71FF: page 8 */ - 0x8, - /* B7200-B72FF: page 8 */ - 0x8, - /* B7300-B73FF: page 8 */ - 0x8, - /* B7400-B74FF: page 8 */ - 0x8, - /* B7500-B75FF: page 8 */ - 0x8, - /* B7600-B76FF: page 8 */ - 0x8, - /* B7700-B77FF: page 8 */ - 0x8, - /* B7800-B78FF: page 8 */ - 0x8, - /* B7900-B79FF: page 8 */ - 0x8, - /* B7A00-B7AFF: page 8 */ - 0x8, - /* B7B00-B7BFF: page 8 */ - 0x8, - /* B7C00-B7CFF: page 8 */ - 0x8, - /* B7D00-B7DFF: page 8 */ - 0x8, - /* B7E00-B7EFF: page 8 */ - 0x8, - /* B7F00-B7FFF: page 8 */ - 0x8, - /* B8000-B80FF: page 8 */ - 0x8, - /* B8100-B81FF: page 8 */ - 0x8, - /* B8200-B82FF: page 8 */ - 0x8, - /* B8300-B83FF: page 8 */ - 0x8, - /* B8400-B84FF: page 8 */ - 0x8, - /* B8500-B85FF: page 8 */ - 0x8, - /* B8600-B86FF: page 8 */ - 0x8, - /* B8700-B87FF: page 8 */ - 0x8, - /* B8800-B88FF: page 8 */ - 0x8, - /* B8900-B89FF: page 8 */ - 0x8, - /* B8A00-B8AFF: page 8 */ - 0x8, - /* B8B00-B8BFF: page 8 */ - 0x8, - /* B8C00-B8CFF: page 8 */ - 0x8, - /* B8D00-B8DFF: page 8 */ - 0x8, - /* B8E00-B8EFF: page 8 */ - 0x8, - /* B8F00-B8FFF: page 8 */ - 0x8, - /* B9000-B90FF: page 8 */ - 0x8, - /* B9100-B91FF: page 8 */ - 0x8, - /* B9200-B92FF: page 8 */ - 0x8, - /* B9300-B93FF: page 8 */ - 0x8, - /* B9400-B94FF: page 8 */ - 0x8, - /* B9500-B95FF: page 8 */ - 0x8, - /* B9600-B96FF: page 8 */ - 0x8, - /* B9700-B97FF: page 8 */ - 0x8, - /* B9800-B98FF: page 8 */ - 0x8, - /* B9900-B99FF: page 8 */ - 0x8, - /* B9A00-B9AFF: page 8 */ - 0x8, - /* B9B00-B9BFF: page 8 */ - 0x8, - /* B9C00-B9CFF: page 8 */ - 0x8, - /* B9D00-B9DFF: page 8 */ - 0x8, - /* B9E00-B9EFF: page 8 */ - 0x8, - /* B9F00-B9FFF: page 8 */ - 0x8, - /* BA000-BA0FF: page 8 */ - 0x8, - /* BA100-BA1FF: page 8 */ - 0x8, - /* BA200-BA2FF: page 8 */ - 0x8, - /* BA300-BA3FF: page 8 */ - 0x8, - /* BA400-BA4FF: page 8 */ - 0x8, - /* BA500-BA5FF: page 8 */ - 0x8, - /* BA600-BA6FF: page 8 */ - 0x8, - /* BA700-BA7FF: page 8 */ - 0x8, - /* BA800-BA8FF: page 8 */ - 0x8, - /* BA900-BA9FF: page 8 */ - 0x8, - /* BAA00-BAAFF: page 8 */ - 0x8, - /* BAB00-BABFF: page 8 */ - 0x8, - /* BAC00-BACFF: page 8 */ - 0x8, - /* BAD00-BADFF: page 8 */ - 0x8, - /* BAE00-BAEFF: page 8 */ - 0x8, - /* BAF00-BAFFF: page 8 */ - 0x8, - /* BB000-BB0FF: page 8 */ - 0x8, - /* BB100-BB1FF: page 8 */ - 0x8, - /* BB200-BB2FF: page 8 */ - 0x8, - /* BB300-BB3FF: page 8 */ - 0x8, - /* BB400-BB4FF: page 8 */ - 0x8, - /* BB500-BB5FF: page 8 */ - 0x8, - /* BB600-BB6FF: page 8 */ - 0x8, - /* BB700-BB7FF: page 8 */ - 0x8, - /* BB800-BB8FF: page 8 */ - 0x8, - /* BB900-BB9FF: page 8 */ - 0x8, - /* BBA00-BBAFF: page 8 */ - 0x8, - /* BBB00-BBBFF: page 8 */ - 0x8, - /* BBC00-BBCFF: page 8 */ - 0x8, - /* BBD00-BBDFF: page 8 */ - 0x8, - /* BBE00-BBEFF: page 8 */ - 0x8, - /* BBF00-BBFFF: page 8 */ - 0x8, - /* BC000-BC0FF: page 8 */ - 0x8, - /* BC100-BC1FF: page 8 */ - 0x8, - /* BC200-BC2FF: page 8 */ - 0x8, - /* BC300-BC3FF: page 8 */ - 0x8, - /* BC400-BC4FF: page 8 */ - 0x8, - /* BC500-BC5FF: page 8 */ - 0x8, - /* BC600-BC6FF: page 8 */ - 0x8, - /* BC700-BC7FF: page 8 */ - 0x8, - /* BC800-BC8FF: page 8 */ - 0x8, - /* BC900-BC9FF: page 8 */ - 0x8, - /* BCA00-BCAFF: page 8 */ - 0x8, - /* BCB00-BCBFF: page 8 */ - 0x8, - /* BCC00-BCCFF: page 8 */ - 0x8, - /* BCD00-BCDFF: page 8 */ - 0x8, - /* BCE00-BCEFF: page 8 */ - 0x8, - /* BCF00-BCFFF: page 8 */ - 0x8, - /* BD000-BD0FF: page 8 */ - 0x8, - /* BD100-BD1FF: page 8 */ - 0x8, - /* BD200-BD2FF: page 8 */ - 0x8, - /* BD300-BD3FF: page 8 */ - 0x8, - /* BD400-BD4FF: page 8 */ - 0x8, - /* BD500-BD5FF: page 8 */ - 0x8, - /* BD600-BD6FF: page 8 */ - 0x8, - /* BD700-BD7FF: page 8 */ - 0x8, - /* BD800-BD8FF: page 8 */ - 0x8, - /* BD900-BD9FF: page 8 */ - 0x8, - /* BDA00-BDAFF: page 8 */ - 0x8, - /* BDB00-BDBFF: page 8 */ - 0x8, - /* BDC00-BDCFF: page 8 */ - 0x8, - /* BDD00-BDDFF: page 8 */ - 0x8, - /* BDE00-BDEFF: page 8 */ - 0x8, - /* BDF00-BDFFF: page 8 */ - 0x8, - /* BE000-BE0FF: page 8 */ - 0x8, - /* BE100-BE1FF: page 8 */ - 0x8, - /* BE200-BE2FF: page 8 */ - 0x8, - /* BE300-BE3FF: page 8 */ - 0x8, - /* BE400-BE4FF: page 8 */ - 0x8, - /* BE500-BE5FF: page 8 */ - 0x8, - /* BE600-BE6FF: page 8 */ - 0x8, - /* BE700-BE7FF: page 8 */ - 0x8, - /* BE800-BE8FF: page 8 */ - 0x8, - /* BE900-BE9FF: page 8 */ - 0x8, - /* BEA00-BEAFF: page 8 */ - 0x8, - /* BEB00-BEBFF: page 8 */ - 0x8, - /* BEC00-BECFF: page 8 */ - 0x8, - /* BED00-BEDFF: page 8 */ - 0x8, - /* BEE00-BEEFF: page 8 */ - 0x8, - /* BEF00-BEFFF: page 8 */ - 0x8, - /* BF000-BF0FF: page 8 */ - 0x8, - /* BF100-BF1FF: page 8 */ - 0x8, - /* BF200-BF2FF: page 8 */ - 0x8, - /* BF300-BF3FF: page 8 */ - 0x8, - /* BF400-BF4FF: page 8 */ - 0x8, - /* BF500-BF5FF: page 8 */ - 0x8, - /* BF600-BF6FF: page 8 */ - 0x8, - /* BF700-BF7FF: page 8 */ - 0x8, - /* BF800-BF8FF: page 8 */ - 0x8, - /* BF900-BF9FF: page 8 */ - 0x8, - /* BFA00-BFAFF: page 8 */ - 0x8, - /* BFB00-BFBFF: page 8 */ - 0x8, - /* BFC00-BFCFF: page 8 */ - 0x8, - /* BFD00-BFDFF: page 8 */ - 0x8, - /* BFE00-BFEFF: page 8 */ - 0x8, - /* BFF00-BFFFF: page 8 */ - 0x8, - /* C0000-C00FF: page 8 */ - 0x8, - /* C0100-C01FF: page 8 */ - 0x8, - /* C0200-C02FF: page 8 */ - 0x8, - /* C0300-C03FF: page 8 */ - 0x8, - /* C0400-C04FF: page 8 */ - 0x8, - /* C0500-C05FF: page 8 */ - 0x8, - /* C0600-C06FF: page 8 */ - 0x8, - /* C0700-C07FF: page 8 */ - 0x8, - /* C0800-C08FF: page 8 */ - 0x8, - /* C0900-C09FF: page 8 */ - 0x8, - /* C0A00-C0AFF: page 8 */ - 0x8, - /* C0B00-C0BFF: page 8 */ - 0x8, - /* C0C00-C0CFF: page 8 */ - 0x8, - /* C0D00-C0DFF: page 8 */ - 0x8, - /* C0E00-C0EFF: page 8 */ - 0x8, - /* C0F00-C0FFF: page 8 */ - 0x8, - /* C1000-C10FF: page 8 */ - 0x8, - /* C1100-C11FF: page 8 */ - 0x8, - /* C1200-C12FF: page 8 */ - 0x8, - /* C1300-C13FF: page 8 */ - 0x8, - /* C1400-C14FF: page 8 */ - 0x8, - /* C1500-C15FF: page 8 */ - 0x8, - /* C1600-C16FF: page 8 */ - 0x8, - /* C1700-C17FF: page 8 */ - 0x8, - /* C1800-C18FF: page 8 */ - 0x8, - /* C1900-C19FF: page 8 */ - 0x8, - /* C1A00-C1AFF: page 8 */ - 0x8, - /* C1B00-C1BFF: page 8 */ - 0x8, - /* C1C00-C1CFF: page 8 */ - 0x8, - /* C1D00-C1DFF: page 8 */ - 0x8, - /* C1E00-C1EFF: page 8 */ - 0x8, - /* C1F00-C1FFF: page 8 */ - 0x8, - /* C2000-C20FF: page 8 */ - 0x8, - /* C2100-C21FF: page 8 */ - 0x8, - /* C2200-C22FF: page 8 */ - 0x8, - /* C2300-C23FF: page 8 */ - 0x8, - /* C2400-C24FF: page 8 */ - 0x8, - /* C2500-C25FF: page 8 */ - 0x8, - /* C2600-C26FF: page 8 */ - 0x8, - /* C2700-C27FF: page 8 */ - 0x8, - /* C2800-C28FF: page 8 */ - 0x8, - /* C2900-C29FF: page 8 */ - 0x8, - /* C2A00-C2AFF: page 8 */ - 0x8, - /* C2B00-C2BFF: page 8 */ - 0x8, - /* C2C00-C2CFF: page 8 */ - 0x8, - /* C2D00-C2DFF: page 8 */ - 0x8, - /* C2E00-C2EFF: page 8 */ - 0x8, - /* C2F00-C2FFF: page 8 */ - 0x8, - /* C3000-C30FF: page 8 */ - 0x8, - /* C3100-C31FF: page 8 */ - 0x8, - /* C3200-C32FF: page 8 */ - 0x8, - /* C3300-C33FF: page 8 */ - 0x8, - /* C3400-C34FF: page 8 */ - 0x8, - /* C3500-C35FF: page 8 */ - 0x8, - /* C3600-C36FF: page 8 */ - 0x8, - /* C3700-C37FF: page 8 */ - 0x8, - /* C3800-C38FF: page 8 */ - 0x8, - /* C3900-C39FF: page 8 */ - 0x8, - /* C3A00-C3AFF: page 8 */ - 0x8, - /* C3B00-C3BFF: page 8 */ - 0x8, - /* C3C00-C3CFF: page 8 */ - 0x8, - /* C3D00-C3DFF: page 8 */ - 0x8, - /* C3E00-C3EFF: page 8 */ - 0x8, - /* C3F00-C3FFF: page 8 */ - 0x8, - /* C4000-C40FF: page 8 */ - 0x8, - /* C4100-C41FF: page 8 */ - 0x8, - /* C4200-C42FF: page 8 */ - 0x8, - /* C4300-C43FF: page 8 */ - 0x8, - /* C4400-C44FF: page 8 */ - 0x8, - /* C4500-C45FF: page 8 */ - 0x8, - /* C4600-C46FF: page 8 */ - 0x8, - /* C4700-C47FF: page 8 */ - 0x8, - /* C4800-C48FF: page 8 */ - 0x8, - /* C4900-C49FF: page 8 */ - 0x8, - /* C4A00-C4AFF: page 8 */ - 0x8, - /* C4B00-C4BFF: page 8 */ - 0x8, - /* C4C00-C4CFF: page 8 */ - 0x8, - /* C4D00-C4DFF: page 8 */ - 0x8, - /* C4E00-C4EFF: page 8 */ - 0x8, - /* C4F00-C4FFF: page 8 */ - 0x8, - /* C5000-C50FF: page 8 */ - 0x8, - /* C5100-C51FF: page 8 */ - 0x8, - /* C5200-C52FF: page 8 */ - 0x8, - /* C5300-C53FF: page 8 */ - 0x8, - /* C5400-C54FF: page 8 */ - 0x8, - /* C5500-C55FF: page 8 */ - 0x8, - /* C5600-C56FF: page 8 */ - 0x8, - /* C5700-C57FF: page 8 */ - 0x8, - /* C5800-C58FF: page 8 */ - 0x8, - /* C5900-C59FF: page 8 */ - 0x8, - /* C5A00-C5AFF: page 8 */ - 0x8, - /* C5B00-C5BFF: page 8 */ - 0x8, - /* C5C00-C5CFF: page 8 */ - 0x8, - /* C5D00-C5DFF: page 8 */ - 0x8, - /* C5E00-C5EFF: page 8 */ - 0x8, - /* C5F00-C5FFF: page 8 */ - 0x8, - /* C6000-C60FF: page 8 */ - 0x8, - /* C6100-C61FF: page 8 */ - 0x8, - /* C6200-C62FF: page 8 */ - 0x8, - /* C6300-C63FF: page 8 */ - 0x8, - /* C6400-C64FF: page 8 */ - 0x8, - /* C6500-C65FF: page 8 */ - 0x8, - /* C6600-C66FF: page 8 */ - 0x8, - /* C6700-C67FF: page 8 */ - 0x8, - /* C6800-C68FF: page 8 */ - 0x8, - /* C6900-C69FF: page 8 */ - 0x8, - /* C6A00-C6AFF: page 8 */ - 0x8, - /* C6B00-C6BFF: page 8 */ - 0x8, - /* C6C00-C6CFF: page 8 */ - 0x8, - /* C6D00-C6DFF: page 8 */ - 0x8, - /* C6E00-C6EFF: page 8 */ - 0x8, - /* C6F00-C6FFF: page 8 */ - 0x8, - /* C7000-C70FF: page 8 */ - 0x8, - /* C7100-C71FF: page 8 */ - 0x8, - /* C7200-C72FF: page 8 */ - 0x8, - /* C7300-C73FF: page 8 */ - 0x8, - /* C7400-C74FF: page 8 */ - 0x8, - /* C7500-C75FF: page 8 */ - 0x8, - /* C7600-C76FF: page 8 */ - 0x8, - /* C7700-C77FF: page 8 */ - 0x8, - /* C7800-C78FF: page 8 */ - 0x8, - /* C7900-C79FF: page 8 */ - 0x8, - /* C7A00-C7AFF: page 8 */ - 0x8, - /* C7B00-C7BFF: page 8 */ - 0x8, - /* C7C00-C7CFF: page 8 */ - 0x8, - /* C7D00-C7DFF: page 8 */ - 0x8, - /* C7E00-C7EFF: page 8 */ - 0x8, - /* C7F00-C7FFF: page 8 */ - 0x8, - /* C8000-C80FF: page 8 */ - 0x8, - /* C8100-C81FF: page 8 */ - 0x8, - /* C8200-C82FF: page 8 */ - 0x8, - /* C8300-C83FF: page 8 */ - 0x8, - /* C8400-C84FF: page 8 */ - 0x8, - /* C8500-C85FF: page 8 */ - 0x8, - /* C8600-C86FF: page 8 */ - 0x8, - /* C8700-C87FF: page 8 */ - 0x8, - /* C8800-C88FF: page 8 */ - 0x8, - /* C8900-C89FF: page 8 */ - 0x8, - /* C8A00-C8AFF: page 8 */ - 0x8, - /* C8B00-C8BFF: page 8 */ - 0x8, - /* C8C00-C8CFF: page 8 */ - 0x8, - /* C8D00-C8DFF: page 8 */ - 0x8, - /* C8E00-C8EFF: page 8 */ - 0x8, - /* C8F00-C8FFF: page 8 */ - 0x8, - /* C9000-C90FF: page 8 */ - 0x8, - /* C9100-C91FF: page 8 */ - 0x8, - /* C9200-C92FF: page 8 */ - 0x8, - /* C9300-C93FF: page 8 */ - 0x8, - /* C9400-C94FF: page 8 */ - 0x8, - /* C9500-C95FF: page 8 */ - 0x8, - /* C9600-C96FF: page 8 */ - 0x8, - /* C9700-C97FF: page 8 */ - 0x8, - /* C9800-C98FF: page 8 */ - 0x8, - /* C9900-C99FF: page 8 */ - 0x8, - /* C9A00-C9AFF: page 8 */ - 0x8, - /* C9B00-C9BFF: page 8 */ - 0x8, - /* C9C00-C9CFF: page 8 */ - 0x8, - /* C9D00-C9DFF: page 8 */ - 0x8, - /* C9E00-C9EFF: page 8 */ - 0x8, - /* C9F00-C9FFF: page 8 */ - 0x8, - /* CA000-CA0FF: page 8 */ - 0x8, - /* CA100-CA1FF: page 8 */ - 0x8, - /* CA200-CA2FF: page 8 */ - 0x8, - /* CA300-CA3FF: page 8 */ - 0x8, - /* CA400-CA4FF: page 8 */ - 0x8, - /* CA500-CA5FF: page 8 */ - 0x8, - /* CA600-CA6FF: page 8 */ - 0x8, - /* CA700-CA7FF: page 8 */ - 0x8, - /* CA800-CA8FF: page 8 */ - 0x8, - /* CA900-CA9FF: page 8 */ - 0x8, - /* CAA00-CAAFF: page 8 */ - 0x8, - /* CAB00-CABFF: page 8 */ - 0x8, - /* CAC00-CACFF: page 8 */ - 0x8, - /* CAD00-CADFF: page 8 */ - 0x8, - /* CAE00-CAEFF: page 8 */ - 0x8, - /* CAF00-CAFFF: page 8 */ - 0x8, - /* CB000-CB0FF: page 8 */ - 0x8, - /* CB100-CB1FF: page 8 */ - 0x8, - /* CB200-CB2FF: page 8 */ - 0x8, - /* CB300-CB3FF: page 8 */ - 0x8, - /* CB400-CB4FF: page 8 */ - 0x8, - /* CB500-CB5FF: page 8 */ - 0x8, - /* CB600-CB6FF: page 8 */ - 0x8, - /* CB700-CB7FF: page 8 */ - 0x8, - /* CB800-CB8FF: page 8 */ - 0x8, - /* CB900-CB9FF: page 8 */ - 0x8, - /* CBA00-CBAFF: page 8 */ - 0x8, - /* CBB00-CBBFF: page 8 */ - 0x8, - /* CBC00-CBCFF: page 8 */ - 0x8, - /* CBD00-CBDFF: page 8 */ - 0x8, - /* CBE00-CBEFF: page 8 */ - 0x8, - /* CBF00-CBFFF: page 8 */ - 0x8, - /* CC000-CC0FF: page 8 */ - 0x8, - /* CC100-CC1FF: page 8 */ - 0x8, - /* CC200-CC2FF: page 8 */ - 0x8, - /* CC300-CC3FF: page 8 */ - 0x8, - /* CC400-CC4FF: page 8 */ - 0x8, - /* CC500-CC5FF: page 8 */ - 0x8, - /* CC600-CC6FF: page 8 */ - 0x8, - /* CC700-CC7FF: page 8 */ - 0x8, - /* CC800-CC8FF: page 8 */ - 0x8, - /* CC900-CC9FF: page 8 */ - 0x8, - /* CCA00-CCAFF: page 8 */ - 0x8, - /* CCB00-CCBFF: page 8 */ - 0x8, - /* CCC00-CCCFF: page 8 */ - 0x8, - /* CCD00-CCDFF: page 8 */ - 0x8, - /* CCE00-CCEFF: page 8 */ - 0x8, - /* CCF00-CCFFF: page 8 */ - 0x8, - /* CD000-CD0FF: page 8 */ - 0x8, - /* CD100-CD1FF: page 8 */ - 0x8, - /* CD200-CD2FF: page 8 */ - 0x8, - /* CD300-CD3FF: page 8 */ - 0x8, - /* CD400-CD4FF: page 8 */ - 0x8, - /* CD500-CD5FF: page 8 */ - 0x8, - /* CD600-CD6FF: page 8 */ - 0x8, - /* CD700-CD7FF: page 8 */ - 0x8, - /* CD800-CD8FF: page 8 */ - 0x8, - /* CD900-CD9FF: page 8 */ - 0x8, - /* CDA00-CDAFF: page 8 */ - 0x8, - /* CDB00-CDBFF: page 8 */ - 0x8, - /* CDC00-CDCFF: page 8 */ - 0x8, - /* CDD00-CDDFF: page 8 */ - 0x8, - /* CDE00-CDEFF: page 8 */ - 0x8, - /* CDF00-CDFFF: page 8 */ - 0x8, - /* CE000-CE0FF: page 8 */ - 0x8, - /* CE100-CE1FF: page 8 */ - 0x8, - /* CE200-CE2FF: page 8 */ - 0x8, - /* CE300-CE3FF: page 8 */ - 0x8, - /* CE400-CE4FF: page 8 */ - 0x8, - /* CE500-CE5FF: page 8 */ - 0x8, - /* CE600-CE6FF: page 8 */ - 0x8, - /* CE700-CE7FF: page 8 */ - 0x8, - /* CE800-CE8FF: page 8 */ - 0x8, - /* CE900-CE9FF: page 8 */ - 0x8, - /* CEA00-CEAFF: page 8 */ - 0x8, - /* CEB00-CEBFF: page 8 */ - 0x8, - /* CEC00-CECFF: page 8 */ - 0x8, - /* CED00-CEDFF: page 8 */ - 0x8, - /* CEE00-CEEFF: page 8 */ - 0x8, - /* CEF00-CEFFF: page 8 */ - 0x8, - /* CF000-CF0FF: page 8 */ - 0x8, - /* CF100-CF1FF: page 8 */ - 0x8, - /* CF200-CF2FF: page 8 */ - 0x8, - /* CF300-CF3FF: page 8 */ - 0x8, - /* CF400-CF4FF: page 8 */ - 0x8, - /* CF500-CF5FF: page 8 */ - 0x8, - /* CF600-CF6FF: page 8 */ - 0x8, - /* CF700-CF7FF: page 8 */ - 0x8, - /* CF800-CF8FF: page 8 */ - 0x8, - /* CF900-CF9FF: page 8 */ - 0x8, - /* CFA00-CFAFF: page 8 */ - 0x8, - /* CFB00-CFBFF: page 8 */ - 0x8, - /* CFC00-CFCFF: page 8 */ - 0x8, - /* CFD00-CFDFF: page 8 */ - 0x8, - /* CFE00-CFEFF: page 8 */ - 0x8, - /* CFF00-CFFFF: page 8 */ - 0x8, - /* D0000-D00FF: page 8 */ - 0x8, - /* D0100-D01FF: page 8 */ - 0x8, - /* D0200-D02FF: page 8 */ - 0x8, - /* D0300-D03FF: page 8 */ - 0x8, - /* D0400-D04FF: page 8 */ - 0x8, - /* D0500-D05FF: page 8 */ - 0x8, - /* D0600-D06FF: page 8 */ - 0x8, - /* D0700-D07FF: page 8 */ - 0x8, - /* D0800-D08FF: page 8 */ - 0x8, - /* D0900-D09FF: page 8 */ - 0x8, - /* D0A00-D0AFF: page 8 */ - 0x8, - /* D0B00-D0BFF: page 8 */ - 0x8, - /* D0C00-D0CFF: page 8 */ - 0x8, - /* D0D00-D0DFF: page 8 */ - 0x8, - /* D0E00-D0EFF: page 8 */ - 0x8, - /* D0F00-D0FFF: page 8 */ - 0x8, - /* D1000-D10FF: page 8 */ - 0x8, - /* D1100-D11FF: page 8 */ - 0x8, - /* D1200-D12FF: page 8 */ - 0x8, - /* D1300-D13FF: page 8 */ - 0x8, - /* D1400-D14FF: page 8 */ - 0x8, - /* D1500-D15FF: page 8 */ - 0x8, - /* D1600-D16FF: page 8 */ - 0x8, - /* D1700-D17FF: page 8 */ - 0x8, - /* D1800-D18FF: page 8 */ - 0x8, - /* D1900-D19FF: page 8 */ - 0x8, - /* D1A00-D1AFF: page 8 */ - 0x8, - /* D1B00-D1BFF: page 8 */ - 0x8, - /* D1C00-D1CFF: page 8 */ - 0x8, - /* D1D00-D1DFF: page 8 */ - 0x8, - /* D1E00-D1EFF: page 8 */ - 0x8, - /* D1F00-D1FFF: page 8 */ - 0x8, - /* D2000-D20FF: page 8 */ - 0x8, - /* D2100-D21FF: page 8 */ - 0x8, - /* D2200-D22FF: page 8 */ - 0x8, - /* D2300-D23FF: page 8 */ - 0x8, - /* D2400-D24FF: page 8 */ - 0x8, - /* D2500-D25FF: page 8 */ - 0x8, - /* D2600-D26FF: page 8 */ - 0x8, - /* D2700-D27FF: page 8 */ - 0x8, - /* D2800-D28FF: page 8 */ - 0x8, - /* D2900-D29FF: page 8 */ - 0x8, - /* D2A00-D2AFF: page 8 */ - 0x8, - /* D2B00-D2BFF: page 8 */ - 0x8, - /* D2C00-D2CFF: page 8 */ - 0x8, - /* D2D00-D2DFF: page 8 */ - 0x8, - /* D2E00-D2EFF: page 8 */ - 0x8, - /* D2F00-D2FFF: page 8 */ - 0x8, - /* D3000-D30FF: page 8 */ - 0x8, - /* D3100-D31FF: page 8 */ - 0x8, - /* D3200-D32FF: page 8 */ - 0x8, - /* D3300-D33FF: page 8 */ - 0x8, - /* D3400-D34FF: page 8 */ - 0x8, - /* D3500-D35FF: page 8 */ - 0x8, - /* D3600-D36FF: page 8 */ - 0x8, - /* D3700-D37FF: page 8 */ - 0x8, - /* D3800-D38FF: page 8 */ - 0x8, - /* D3900-D39FF: page 8 */ - 0x8, - /* D3A00-D3AFF: page 8 */ - 0x8, - /* D3B00-D3BFF: page 8 */ - 0x8, - /* D3C00-D3CFF: page 8 */ - 0x8, - /* D3D00-D3DFF: page 8 */ - 0x8, - /* D3E00-D3EFF: page 8 */ - 0x8, - /* D3F00-D3FFF: page 8 */ - 0x8, - /* D4000-D40FF: page 8 */ - 0x8, - /* D4100-D41FF: page 8 */ - 0x8, - /* D4200-D42FF: page 8 */ - 0x8, - /* D4300-D43FF: page 8 */ - 0x8, - /* D4400-D44FF: page 8 */ - 0x8, - /* D4500-D45FF: page 8 */ - 0x8, - /* D4600-D46FF: page 8 */ - 0x8, - /* D4700-D47FF: page 8 */ - 0x8, - /* D4800-D48FF: page 8 */ - 0x8, - /* D4900-D49FF: page 8 */ - 0x8, - /* D4A00-D4AFF: page 8 */ - 0x8, - /* D4B00-D4BFF: page 8 */ - 0x8, - /* D4C00-D4CFF: page 8 */ - 0x8, - /* D4D00-D4DFF: page 8 */ - 0x8, - /* D4E00-D4EFF: page 8 */ - 0x8, - /* D4F00-D4FFF: page 8 */ - 0x8, - /* D5000-D50FF: page 8 */ - 0x8, - /* D5100-D51FF: page 8 */ - 0x8, - /* D5200-D52FF: page 8 */ - 0x8, - /* D5300-D53FF: page 8 */ - 0x8, - /* D5400-D54FF: page 8 */ - 0x8, - /* D5500-D55FF: page 8 */ - 0x8, - /* D5600-D56FF: page 8 */ - 0x8, - /* D5700-D57FF: page 8 */ - 0x8, - /* D5800-D58FF: page 8 */ - 0x8, - /* D5900-D59FF: page 8 */ - 0x8, - /* D5A00-D5AFF: page 8 */ - 0x8, - /* D5B00-D5BFF: page 8 */ - 0x8, - /* D5C00-D5CFF: page 8 */ - 0x8, - /* D5D00-D5DFF: page 8 */ - 0x8, - /* D5E00-D5EFF: page 8 */ - 0x8, - /* D5F00-D5FFF: page 8 */ - 0x8, - /* D6000-D60FF: page 8 */ - 0x8, - /* D6100-D61FF: page 8 */ - 0x8, - /* D6200-D62FF: page 8 */ - 0x8, - /* D6300-D63FF: page 8 */ - 0x8, - /* D6400-D64FF: page 8 */ - 0x8, - /* D6500-D65FF: page 8 */ - 0x8, - /* D6600-D66FF: page 8 */ - 0x8, - /* D6700-D67FF: page 8 */ - 0x8, - /* D6800-D68FF: page 8 */ - 0x8, - /* D6900-D69FF: page 8 */ - 0x8, - /* D6A00-D6AFF: page 8 */ - 0x8, - /* D6B00-D6BFF: page 8 */ - 0x8, - /* D6C00-D6CFF: page 8 */ - 0x8, - /* D6D00-D6DFF: page 8 */ - 0x8, - /* D6E00-D6EFF: page 8 */ - 0x8, - /* D6F00-D6FFF: page 8 */ - 0x8, - /* D7000-D70FF: page 8 */ - 0x8, - /* D7100-D71FF: page 8 */ - 0x8, - /* D7200-D72FF: page 8 */ - 0x8, - /* D7300-D73FF: page 8 */ - 0x8, - /* D7400-D74FF: page 8 */ - 0x8, - /* D7500-D75FF: page 8 */ - 0x8, - /* D7600-D76FF: page 8 */ - 0x8, - /* D7700-D77FF: page 8 */ - 0x8, - /* D7800-D78FF: page 8 */ - 0x8, - /* D7900-D79FF: page 8 */ - 0x8, - /* D7A00-D7AFF: page 8 */ - 0x8, - /* D7B00-D7BFF: page 8 */ - 0x8, - /* D7C00-D7CFF: page 8 */ - 0x8, - /* D7D00-D7DFF: page 8 */ - 0x8, - /* D7E00-D7EFF: page 8 */ - 0x8, - /* D7F00-D7FFF: page 8 */ - 0x8, - /* D8000-D80FF: page 8 */ - 0x8, - /* D8100-D81FF: page 8 */ - 0x8, - /* D8200-D82FF: page 8 */ - 0x8, - /* D8300-D83FF: page 8 */ - 0x8, - /* D8400-D84FF: page 8 */ - 0x8, - /* D8500-D85FF: page 8 */ - 0x8, - /* D8600-D86FF: page 8 */ - 0x8, - /* D8700-D87FF: page 8 */ - 0x8, - /* D8800-D88FF: page 8 */ - 0x8, - /* D8900-D89FF: page 8 */ - 0x8, - /* D8A00-D8AFF: page 8 */ - 0x8, - /* D8B00-D8BFF: page 8 */ - 0x8, - /* D8C00-D8CFF: page 8 */ - 0x8, - /* D8D00-D8DFF: page 8 */ - 0x8, - /* D8E00-D8EFF: page 8 */ - 0x8, - /* D8F00-D8FFF: page 8 */ - 0x8, - /* D9000-D90FF: page 8 */ - 0x8, - /* D9100-D91FF: page 8 */ - 0x8, - /* D9200-D92FF: page 8 */ - 0x8, - /* D9300-D93FF: page 8 */ - 0x8, - /* D9400-D94FF: page 8 */ - 0x8, - /* D9500-D95FF: page 8 */ - 0x8, - /* D9600-D96FF: page 8 */ - 0x8, - /* D9700-D97FF: page 8 */ - 0x8, - /* D9800-D98FF: page 8 */ - 0x8, - /* D9900-D99FF: page 8 */ - 0x8, - /* D9A00-D9AFF: page 8 */ - 0x8, - /* D9B00-D9BFF: page 8 */ - 0x8, - /* D9C00-D9CFF: page 8 */ - 0x8, - /* D9D00-D9DFF: page 8 */ - 0x8, - /* D9E00-D9EFF: page 8 */ - 0x8, - /* D9F00-D9FFF: page 8 */ - 0x8, - /* DA000-DA0FF: page 8 */ - 0x8, - /* DA100-DA1FF: page 8 */ - 0x8, - /* DA200-DA2FF: page 8 */ - 0x8, - /* DA300-DA3FF: page 8 */ - 0x8, - /* DA400-DA4FF: page 8 */ - 0x8, - /* DA500-DA5FF: page 8 */ - 0x8, - /* DA600-DA6FF: page 8 */ - 0x8, - /* DA700-DA7FF: page 8 */ - 0x8, - /* DA800-DA8FF: page 8 */ - 0x8, - /* DA900-DA9FF: page 8 */ - 0x8, - /* DAA00-DAAFF: page 8 */ - 0x8, - /* DAB00-DABFF: page 8 */ - 0x8, - /* DAC00-DACFF: page 8 */ - 0x8, - /* DAD00-DADFF: page 8 */ - 0x8, - /* DAE00-DAEFF: page 8 */ - 0x8, - /* DAF00-DAFFF: page 8 */ - 0x8, - /* DB000-DB0FF: page 8 */ - 0x8, - /* DB100-DB1FF: page 8 */ - 0x8, - /* DB200-DB2FF: page 8 */ - 0x8, - /* DB300-DB3FF: page 8 */ - 0x8, - /* DB400-DB4FF: page 8 */ - 0x8, - /* DB500-DB5FF: page 8 */ - 0x8, - /* DB600-DB6FF: page 8 */ - 0x8, - /* DB700-DB7FF: page 8 */ - 0x8, - /* DB800-DB8FF: page 8 */ - 0x8, - /* DB900-DB9FF: page 8 */ - 0x8, - /* DBA00-DBAFF: page 8 */ - 0x8, - /* DBB00-DBBFF: page 8 */ - 0x8, - /* DBC00-DBCFF: page 8 */ - 0x8, - /* DBD00-DBDFF: page 8 */ - 0x8, - /* DBE00-DBEFF: page 8 */ - 0x8, - /* DBF00-DBFFF: page 8 */ - 0x8, - /* DC000-DC0FF: page 8 */ - 0x8, - /* DC100-DC1FF: page 8 */ - 0x8, - /* DC200-DC2FF: page 8 */ - 0x8, - /* DC300-DC3FF: page 8 */ - 0x8, - /* DC400-DC4FF: page 8 */ - 0x8, - /* DC500-DC5FF: page 8 */ - 0x8, - /* DC600-DC6FF: page 8 */ - 0x8, - /* DC700-DC7FF: page 8 */ - 0x8, - /* DC800-DC8FF: page 8 */ - 0x8, - /* DC900-DC9FF: page 8 */ - 0x8, - /* DCA00-DCAFF: page 8 */ - 0x8, - /* DCB00-DCBFF: page 8 */ - 0x8, - /* DCC00-DCCFF: page 8 */ - 0x8, - /* DCD00-DCDFF: page 8 */ - 0x8, - /* DCE00-DCEFF: page 8 */ - 0x8, - /* DCF00-DCFFF: page 8 */ - 0x8, - /* DD000-DD0FF: page 8 */ - 0x8, - /* DD100-DD1FF: page 8 */ - 0x8, - /* DD200-DD2FF: page 8 */ - 0x8, - /* DD300-DD3FF: page 8 */ - 0x8, - /* DD400-DD4FF: page 8 */ - 0x8, - /* DD500-DD5FF: page 8 */ - 0x8, - /* DD600-DD6FF: page 8 */ - 0x8, - /* DD700-DD7FF: page 8 */ - 0x8, - /* DD800-DD8FF: page 8 */ - 0x8, - /* DD900-DD9FF: page 8 */ - 0x8, - /* DDA00-DDAFF: page 8 */ - 0x8, - /* DDB00-DDBFF: page 8 */ - 0x8, - /* DDC00-DDCFF: page 8 */ - 0x8, - /* DDD00-DDDFF: page 8 */ - 0x8, - /* DDE00-DDEFF: page 8 */ - 0x8, - /* DDF00-DDFFF: page 8 */ - 0x8, - /* DE000-DE0FF: page 8 */ - 0x8, - /* DE100-DE1FF: page 8 */ - 0x8, - /* DE200-DE2FF: page 8 */ - 0x8, - /* DE300-DE3FF: page 8 */ - 0x8, - /* DE400-DE4FF: page 8 */ - 0x8, - /* DE500-DE5FF: page 8 */ - 0x8, - /* DE600-DE6FF: page 8 */ - 0x8, - /* DE700-DE7FF: page 8 */ - 0x8, - /* DE800-DE8FF: page 8 */ - 0x8, - /* DE900-DE9FF: page 8 */ - 0x8, - /* DEA00-DEAFF: page 8 */ - 0x8, - /* DEB00-DEBFF: page 8 */ - 0x8, - /* DEC00-DECFF: page 8 */ - 0x8, - /* DED00-DEDFF: page 8 */ - 0x8, - /* DEE00-DEEFF: page 8 */ - 0x8, - /* DEF00-DEFFF: page 8 */ - 0x8, - /* DF000-DF0FF: page 8 */ - 0x8, - /* DF100-DF1FF: page 8 */ - 0x8, - /* DF200-DF2FF: page 8 */ - 0x8, - /* DF300-DF3FF: page 8 */ - 0x8, - /* DF400-DF4FF: page 8 */ - 0x8, - /* DF500-DF5FF: page 8 */ - 0x8, - /* DF600-DF6FF: page 8 */ - 0x8, - /* DF700-DF7FF: page 8 */ - 0x8, - /* DF800-DF8FF: page 8 */ - 0x8, - /* DF900-DF9FF: page 8 */ - 0x8, - /* DFA00-DFAFF: page 8 */ - 0x8, - /* DFB00-DFBFF: page 8 */ - 0x8, - /* DFC00-DFCFF: page 8 */ - 0x8, - /* DFD00-DFDFF: page 8 */ - 0x8, - /* DFE00-DFEFF: page 8 */ - 0x8, - /* DFF00-DFFFF: page 8 */ - 0x8, - /* E0000-E00FF: page 275 */ - 0x113, - /* E0100-E01FF: page 276 */ - 0x114, - /* E0200-E02FF: page 8 */ - 0x8, - /* E0300-E03FF: page 8 */ - 0x8, - /* E0400-E04FF: page 8 */ - 0x8, - /* E0500-E05FF: page 8 */ - 0x8, - /* E0600-E06FF: page 8 */ - 0x8, - /* E0700-E07FF: page 8 */ - 0x8, - /* E0800-E08FF: page 8 */ - 0x8, - /* E0900-E09FF: page 8 */ - 0x8, - /* E0A00-E0AFF: page 8 */ - 0x8, - /* E0B00-E0BFF: page 8 */ - 0x8, - /* E0C00-E0CFF: page 8 */ - 0x8, - /* E0D00-E0DFF: page 8 */ - 0x8, - /* E0E00-E0EFF: page 8 */ - 0x8, - /* E0F00-E0FFF: page 8 */ - 0x8, - /* E1000-E10FF: page 8 */ - 0x8, - /* E1100-E11FF: page 8 */ - 0x8, - /* E1200-E12FF: page 8 */ - 0x8, - /* E1300-E13FF: page 8 */ - 0x8, - /* E1400-E14FF: page 8 */ - 0x8, - /* E1500-E15FF: page 8 */ - 0x8, - /* E1600-E16FF: page 8 */ - 0x8, - /* E1700-E17FF: page 8 */ - 0x8, - /* E1800-E18FF: page 8 */ - 0x8, - /* E1900-E19FF: page 8 */ - 0x8, - /* E1A00-E1AFF: page 8 */ - 0x8, - /* E1B00-E1BFF: page 8 */ - 0x8, - /* E1C00-E1CFF: page 8 */ - 0x8, - /* E1D00-E1DFF: page 8 */ - 0x8, - /* E1E00-E1EFF: page 8 */ - 0x8, - /* E1F00-E1FFF: page 8 */ - 0x8, - /* E2000-E20FF: page 8 */ - 0x8, - /* E2100-E21FF: page 8 */ - 0x8, - /* E2200-E22FF: page 8 */ - 0x8, - /* E2300-E23FF: page 8 */ - 0x8, - /* E2400-E24FF: page 8 */ - 0x8, - /* E2500-E25FF: page 8 */ - 0x8, - /* E2600-E26FF: page 8 */ - 0x8, - /* E2700-E27FF: page 8 */ - 0x8, - /* E2800-E28FF: page 8 */ - 0x8, - /* E2900-E29FF: page 8 */ - 0x8, - /* E2A00-E2AFF: page 8 */ - 0x8, - /* E2B00-E2BFF: page 8 */ - 0x8, - /* E2C00-E2CFF: page 8 */ - 0x8, - /* E2D00-E2DFF: page 8 */ - 0x8, - /* E2E00-E2EFF: page 8 */ - 0x8, - /* E2F00-E2FFF: page 8 */ - 0x8, - /* E3000-E30FF: page 8 */ - 0x8, - /* E3100-E31FF: page 8 */ - 0x8, - /* E3200-E32FF: page 8 */ - 0x8, - /* E3300-E33FF: page 8 */ - 0x8, - /* E3400-E34FF: page 8 */ - 0x8, - /* E3500-E35FF: page 8 */ - 0x8, - /* E3600-E36FF: page 8 */ - 0x8, - /* E3700-E37FF: page 8 */ - 0x8, - /* E3800-E38FF: page 8 */ - 0x8, - /* E3900-E39FF: page 8 */ - 0x8, - /* E3A00-E3AFF: page 8 */ - 0x8, - /* E3B00-E3BFF: page 8 */ - 0x8, - /* E3C00-E3CFF: page 8 */ - 0x8, - /* E3D00-E3DFF: page 8 */ - 0x8, - /* E3E00-E3EFF: page 8 */ - 0x8, - /* E3F00-E3FFF: page 8 */ - 0x8, - /* E4000-E40FF: page 8 */ - 0x8, - /* E4100-E41FF: page 8 */ - 0x8, - /* E4200-E42FF: page 8 */ - 0x8, - /* E4300-E43FF: page 8 */ - 0x8, - /* E4400-E44FF: page 8 */ - 0x8, - /* E4500-E45FF: page 8 */ - 0x8, - /* E4600-E46FF: page 8 */ - 0x8, - /* E4700-E47FF: page 8 */ - 0x8, - /* E4800-E48FF: page 8 */ - 0x8, - /* E4900-E49FF: page 8 */ - 0x8, - /* E4A00-E4AFF: page 8 */ - 0x8, - /* E4B00-E4BFF: page 8 */ - 0x8, - /* E4C00-E4CFF: page 8 */ - 0x8, - /* E4D00-E4DFF: page 8 */ - 0x8, - /* E4E00-E4EFF: page 8 */ - 0x8, - /* E4F00-E4FFF: page 8 */ - 0x8, - /* E5000-E50FF: page 8 */ - 0x8, - /* E5100-E51FF: page 8 */ - 0x8, - /* E5200-E52FF: page 8 */ - 0x8, - /* E5300-E53FF: page 8 */ - 0x8, - /* E5400-E54FF: page 8 */ - 0x8, - /* E5500-E55FF: page 8 */ - 0x8, - /* E5600-E56FF: page 8 */ - 0x8, - /* E5700-E57FF: page 8 */ - 0x8, - /* E5800-E58FF: page 8 */ - 0x8, - /* E5900-E59FF: page 8 */ - 0x8, - /* E5A00-E5AFF: page 8 */ - 0x8, - /* E5B00-E5BFF: page 8 */ - 0x8, - /* E5C00-E5CFF: page 8 */ - 0x8, - /* E5D00-E5DFF: page 8 */ - 0x8, - /* E5E00-E5EFF: page 8 */ - 0x8, - /* E5F00-E5FFF: page 8 */ - 0x8, - /* E6000-E60FF: page 8 */ - 0x8, - /* E6100-E61FF: page 8 */ - 0x8, - /* E6200-E62FF: page 8 */ - 0x8, - /* E6300-E63FF: page 8 */ - 0x8, - /* E6400-E64FF: page 8 */ - 0x8, - /* E6500-E65FF: page 8 */ - 0x8, - /* E6600-E66FF: page 8 */ - 0x8, - /* E6700-E67FF: page 8 */ - 0x8, - /* E6800-E68FF: page 8 */ - 0x8, - /* E6900-E69FF: page 8 */ - 0x8, - /* E6A00-E6AFF: page 8 */ - 0x8, - /* E6B00-E6BFF: page 8 */ - 0x8, - /* E6C00-E6CFF: page 8 */ - 0x8, - /* E6D00-E6DFF: page 8 */ - 0x8, - /* E6E00-E6EFF: page 8 */ - 0x8, - /* E6F00-E6FFF: page 8 */ - 0x8, - /* E7000-E70FF: page 8 */ - 0x8, - /* E7100-E71FF: page 8 */ - 0x8, - /* E7200-E72FF: page 8 */ - 0x8, - /* E7300-E73FF: page 8 */ - 0x8, - /* E7400-E74FF: page 8 */ - 0x8, - /* E7500-E75FF: page 8 */ - 0x8, - /* E7600-E76FF: page 8 */ - 0x8, - /* E7700-E77FF: page 8 */ - 0x8, - /* E7800-E78FF: page 8 */ - 0x8, - /* E7900-E79FF: page 8 */ - 0x8, - /* E7A00-E7AFF: page 8 */ - 0x8, - /* E7B00-E7BFF: page 8 */ - 0x8, - /* E7C00-E7CFF: page 8 */ - 0x8, - /* E7D00-E7DFF: page 8 */ - 0x8, - /* E7E00-E7EFF: page 8 */ - 0x8, - /* E7F00-E7FFF: page 8 */ - 0x8, - /* E8000-E80FF: page 8 */ - 0x8, - /* E8100-E81FF: page 8 */ - 0x8, - /* E8200-E82FF: page 8 */ - 0x8, - /* E8300-E83FF: page 8 */ - 0x8, - /* E8400-E84FF: page 8 */ - 0x8, - /* E8500-E85FF: page 8 */ - 0x8, - /* E8600-E86FF: page 8 */ - 0x8, - /* E8700-E87FF: page 8 */ - 0x8, - /* E8800-E88FF: page 8 */ - 0x8, - /* E8900-E89FF: page 8 */ - 0x8, - /* E8A00-E8AFF: page 8 */ - 0x8, - /* E8B00-E8BFF: page 8 */ - 0x8, - /* E8C00-E8CFF: page 8 */ - 0x8, - /* E8D00-E8DFF: page 8 */ - 0x8, - /* E8E00-E8EFF: page 8 */ - 0x8, - /* E8F00-E8FFF: page 8 */ - 0x8, - /* E9000-E90FF: page 8 */ - 0x8, - /* E9100-E91FF: page 8 */ - 0x8, - /* E9200-E92FF: page 8 */ - 0x8, - /* E9300-E93FF: page 8 */ - 0x8, - /* E9400-E94FF: page 8 */ - 0x8, - /* E9500-E95FF: page 8 */ - 0x8, - /* E9600-E96FF: page 8 */ - 0x8, - /* E9700-E97FF: page 8 */ - 0x8, - /* E9800-E98FF: page 8 */ - 0x8, - /* E9900-E99FF: page 8 */ - 0x8, - /* E9A00-E9AFF: page 8 */ - 0x8, - /* E9B00-E9BFF: page 8 */ - 0x8, - /* E9C00-E9CFF: page 8 */ - 0x8, - /* E9D00-E9DFF: page 8 */ - 0x8, - /* E9E00-E9EFF: page 8 */ - 0x8, - /* E9F00-E9FFF: page 8 */ - 0x8, - /* EA000-EA0FF: page 8 */ - 0x8, - /* EA100-EA1FF: page 8 */ - 0x8, - /* EA200-EA2FF: page 8 */ - 0x8, - /* EA300-EA3FF: page 8 */ - 0x8, - /* EA400-EA4FF: page 8 */ - 0x8, - /* EA500-EA5FF: page 8 */ - 0x8, - /* EA600-EA6FF: page 8 */ - 0x8, - /* EA700-EA7FF: page 8 */ - 0x8, - /* EA800-EA8FF: page 8 */ - 0x8, - /* EA900-EA9FF: page 8 */ - 0x8, - /* EAA00-EAAFF: page 8 */ - 0x8, - /* EAB00-EABFF: page 8 */ - 0x8, - /* EAC00-EACFF: page 8 */ - 0x8, - /* EAD00-EADFF: page 8 */ - 0x8, - /* EAE00-EAEFF: page 8 */ - 0x8, - /* EAF00-EAFFF: page 8 */ - 0x8, - /* EB000-EB0FF: page 8 */ - 0x8, - /* EB100-EB1FF: page 8 */ - 0x8, - /* EB200-EB2FF: page 8 */ - 0x8, - /* EB300-EB3FF: page 8 */ - 0x8, - /* EB400-EB4FF: page 8 */ - 0x8, - /* EB500-EB5FF: page 8 */ - 0x8, - /* EB600-EB6FF: page 8 */ - 0x8, - /* EB700-EB7FF: page 8 */ - 0x8, - /* EB800-EB8FF: page 8 */ - 0x8, - /* EB900-EB9FF: page 8 */ - 0x8, - /* EBA00-EBAFF: page 8 */ - 0x8, - /* EBB00-EBBFF: page 8 */ - 0x8, - /* EBC00-EBCFF: page 8 */ - 0x8, - /* EBD00-EBDFF: page 8 */ - 0x8, - /* EBE00-EBEFF: page 8 */ - 0x8, - /* EBF00-EBFFF: page 8 */ - 0x8, - /* EC000-EC0FF: page 8 */ - 0x8, - /* EC100-EC1FF: page 8 */ - 0x8, - /* EC200-EC2FF: page 8 */ - 0x8, - /* EC300-EC3FF: page 8 */ - 0x8, - /* EC400-EC4FF: page 8 */ - 0x8, - /* EC500-EC5FF: page 8 */ - 0x8, - /* EC600-EC6FF: page 8 */ - 0x8, - /* EC700-EC7FF: page 8 */ - 0x8, - /* EC800-EC8FF: page 8 */ - 0x8, - /* EC900-EC9FF: page 8 */ - 0x8, - /* ECA00-ECAFF: page 8 */ - 0x8, - /* ECB00-ECBFF: page 8 */ - 0x8, - /* ECC00-ECCFF: page 8 */ - 0x8, - /* ECD00-ECDFF: page 8 */ - 0x8, - /* ECE00-ECEFF: page 8 */ - 0x8, - /* ECF00-ECFFF: page 8 */ - 0x8, - /* ED000-ED0FF: page 8 */ - 0x8, - /* ED100-ED1FF: page 8 */ - 0x8, - /* ED200-ED2FF: page 8 */ - 0x8, - /* ED300-ED3FF: page 8 */ - 0x8, - /* ED400-ED4FF: page 8 */ - 0x8, - /* ED500-ED5FF: page 8 */ - 0x8, - /* ED600-ED6FF: page 8 */ - 0x8, - /* ED700-ED7FF: page 8 */ - 0x8, - /* ED800-ED8FF: page 8 */ - 0x8, - /* ED900-ED9FF: page 8 */ - 0x8, - /* EDA00-EDAFF: page 8 */ - 0x8, - /* EDB00-EDBFF: page 8 */ - 0x8, - /* EDC00-EDCFF: page 8 */ - 0x8, - /* EDD00-EDDFF: page 8 */ - 0x8, - /* EDE00-EDEFF: page 8 */ - 0x8, - /* EDF00-EDFFF: page 8 */ - 0x8, - /* EE000-EE0FF: page 8 */ - 0x8, - /* EE100-EE1FF: page 8 */ - 0x8, - /* EE200-EE2FF: page 8 */ - 0x8, - /* EE300-EE3FF: page 8 */ - 0x8, - /* EE400-EE4FF: page 8 */ - 0x8, - /* EE500-EE5FF: page 8 */ - 0x8, - /* EE600-EE6FF: page 8 */ - 0x8, - /* EE700-EE7FF: page 8 */ - 0x8, - /* EE800-EE8FF: page 8 */ - 0x8, - /* EE900-EE9FF: page 8 */ - 0x8, - /* EEA00-EEAFF: page 8 */ - 0x8, - /* EEB00-EEBFF: page 8 */ - 0x8, - /* EEC00-EECFF: page 8 */ - 0x8, - /* EED00-EEDFF: page 8 */ - 0x8, - /* EEE00-EEEFF: page 8 */ - 0x8, - /* EEF00-EEFFF: page 8 */ - 0x8, - /* EF000-EF0FF: page 8 */ - 0x8, - /* EF100-EF1FF: page 8 */ - 0x8, - /* EF200-EF2FF: page 8 */ - 0x8, - /* EF300-EF3FF: page 8 */ - 0x8, - /* EF400-EF4FF: page 8 */ - 0x8, - /* EF500-EF5FF: page 8 */ - 0x8, - /* EF600-EF6FF: page 8 */ - 0x8, - /* EF700-EF7FF: page 8 */ - 0x8, - /* EF800-EF8FF: page 8 */ - 0x8, - /* EF900-EF9FF: page 8 */ - 0x8, - /* EFA00-EFAFF: page 8 */ - 0x8, - /* EFB00-EFBFF: page 8 */ - 0x8, - /* EFC00-EFCFF: page 8 */ - 0x8, - /* EFD00-EFDFF: page 8 */ - 0x8, - /* EFE00-EFEFF: page 8 */ - 0x8, - /* EFF00-EFFFF: page 8 */ - 0x8, - /* F0000-F00FF: page 224 */ - 0xE0, - /* F0100-F01FF: page 224 */ - 0xE0, - /* F0200-F02FF: page 224 */ - 0xE0, - /* F0300-F03FF: page 224 */ - 0xE0, - /* F0400-F04FF: page 224 */ - 0xE0, - /* F0500-F05FF: page 224 */ - 0xE0, - /* F0600-F06FF: page 224 */ - 0xE0, - /* F0700-F07FF: page 224 */ - 0xE0, - /* F0800-F08FF: page 224 */ - 0xE0, - /* F0900-F09FF: page 224 */ - 0xE0, - /* F0A00-F0AFF: page 224 */ - 0xE0, - /* F0B00-F0BFF: page 224 */ - 0xE0, - /* F0C00-F0CFF: page 224 */ - 0xE0, - /* F0D00-F0DFF: page 224 */ - 0xE0, - /* F0E00-F0EFF: page 224 */ - 0xE0, - /* F0F00-F0FFF: page 224 */ - 0xE0, - /* F1000-F10FF: page 224 */ - 0xE0, - /* F1100-F11FF: page 224 */ - 0xE0, - /* F1200-F12FF: page 224 */ - 0xE0, - /* F1300-F13FF: page 224 */ - 0xE0, - /* F1400-F14FF: page 224 */ - 0xE0, - /* F1500-F15FF: page 224 */ - 0xE0, - /* F1600-F16FF: page 224 */ - 0xE0, - /* F1700-F17FF: page 224 */ - 0xE0, - /* F1800-F18FF: page 224 */ - 0xE0, - /* F1900-F19FF: page 224 */ - 0xE0, - /* F1A00-F1AFF: page 224 */ - 0xE0, - /* F1B00-F1BFF: page 224 */ - 0xE0, - /* F1C00-F1CFF: page 224 */ - 0xE0, - /* F1D00-F1DFF: page 224 */ - 0xE0, - /* F1E00-F1EFF: page 224 */ - 0xE0, - /* F1F00-F1FFF: page 224 */ - 0xE0, - /* F2000-F20FF: page 224 */ - 0xE0, - /* F2100-F21FF: page 224 */ - 0xE0, - /* F2200-F22FF: page 224 */ - 0xE0, - /* F2300-F23FF: page 224 */ - 0xE0, - /* F2400-F24FF: page 224 */ - 0xE0, - /* F2500-F25FF: page 224 */ - 0xE0, - /* F2600-F26FF: page 224 */ - 0xE0, - /* F2700-F27FF: page 224 */ - 0xE0, - /* F2800-F28FF: page 224 */ - 0xE0, - /* F2900-F29FF: page 224 */ - 0xE0, - /* F2A00-F2AFF: page 224 */ - 0xE0, - /* F2B00-F2BFF: page 224 */ - 0xE0, - /* F2C00-F2CFF: page 224 */ - 0xE0, - /* F2D00-F2DFF: page 224 */ - 0xE0, - /* F2E00-F2EFF: page 224 */ - 0xE0, - /* F2F00-F2FFF: page 224 */ - 0xE0, - /* F3000-F30FF: page 224 */ - 0xE0, - /* F3100-F31FF: page 224 */ - 0xE0, - /* F3200-F32FF: page 224 */ - 0xE0, - /* F3300-F33FF: page 224 */ - 0xE0, - /* F3400-F34FF: page 224 */ - 0xE0, - /* F3500-F35FF: page 224 */ - 0xE0, - /* F3600-F36FF: page 224 */ - 0xE0, - /* F3700-F37FF: page 224 */ - 0xE0, - /* F3800-F38FF: page 224 */ - 0xE0, - /* F3900-F39FF: page 224 */ - 0xE0, - /* F3A00-F3AFF: page 224 */ - 0xE0, - /* F3B00-F3BFF: page 224 */ - 0xE0, - /* F3C00-F3CFF: page 224 */ - 0xE0, - /* F3D00-F3DFF: page 224 */ - 0xE0, - /* F3E00-F3EFF: page 224 */ - 0xE0, - /* F3F00-F3FFF: page 224 */ - 0xE0, - /* F4000-F40FF: page 224 */ - 0xE0, - /* F4100-F41FF: page 224 */ - 0xE0, - /* F4200-F42FF: page 224 */ - 0xE0, - /* F4300-F43FF: page 224 */ - 0xE0, - /* F4400-F44FF: page 224 */ - 0xE0, - /* F4500-F45FF: page 224 */ - 0xE0, - /* F4600-F46FF: page 224 */ - 0xE0, - /* F4700-F47FF: page 224 */ - 0xE0, - /* F4800-F48FF: page 224 */ - 0xE0, - /* F4900-F49FF: page 224 */ - 0xE0, - /* F4A00-F4AFF: page 224 */ - 0xE0, - /* F4B00-F4BFF: page 224 */ - 0xE0, - /* F4C00-F4CFF: page 224 */ - 0xE0, - /* F4D00-F4DFF: page 224 */ - 0xE0, - /* F4E00-F4EFF: page 224 */ - 0xE0, - /* F4F00-F4FFF: page 224 */ - 0xE0, - /* F5000-F50FF: page 224 */ - 0xE0, - /* F5100-F51FF: page 224 */ - 0xE0, - /* F5200-F52FF: page 224 */ - 0xE0, - /* F5300-F53FF: page 224 */ - 0xE0, - /* F5400-F54FF: page 224 */ - 0xE0, - /* F5500-F55FF: page 224 */ - 0xE0, - /* F5600-F56FF: page 224 */ - 0xE0, - /* F5700-F57FF: page 224 */ - 0xE0, - /* F5800-F58FF: page 224 */ - 0xE0, - /* F5900-F59FF: page 224 */ - 0xE0, - /* F5A00-F5AFF: page 224 */ - 0xE0, - /* F5B00-F5BFF: page 224 */ - 0xE0, - /* F5C00-F5CFF: page 224 */ - 0xE0, - /* F5D00-F5DFF: page 224 */ - 0xE0, - /* F5E00-F5EFF: page 224 */ - 0xE0, - /* F5F00-F5FFF: page 224 */ - 0xE0, - /* F6000-F60FF: page 224 */ - 0xE0, - /* F6100-F61FF: page 224 */ - 0xE0, - /* F6200-F62FF: page 224 */ - 0xE0, - /* F6300-F63FF: page 224 */ - 0xE0, - /* F6400-F64FF: page 224 */ - 0xE0, - /* F6500-F65FF: page 224 */ - 0xE0, - /* F6600-F66FF: page 224 */ - 0xE0, - /* F6700-F67FF: page 224 */ - 0xE0, - /* F6800-F68FF: page 224 */ - 0xE0, - /* F6900-F69FF: page 224 */ - 0xE0, - /* F6A00-F6AFF: page 224 */ - 0xE0, - /* F6B00-F6BFF: page 224 */ - 0xE0, - /* F6C00-F6CFF: page 224 */ - 0xE0, - /* F6D00-F6DFF: page 224 */ - 0xE0, - /* F6E00-F6EFF: page 224 */ - 0xE0, - /* F6F00-F6FFF: page 224 */ - 0xE0, - /* F7000-F70FF: page 224 */ - 0xE0, - /* F7100-F71FF: page 224 */ - 0xE0, - /* F7200-F72FF: page 224 */ - 0xE0, - /* F7300-F73FF: page 224 */ - 0xE0, - /* F7400-F74FF: page 224 */ - 0xE0, - /* F7500-F75FF: page 224 */ - 0xE0, - /* F7600-F76FF: page 224 */ - 0xE0, - /* F7700-F77FF: page 224 */ - 0xE0, - /* F7800-F78FF: page 224 */ - 0xE0, - /* F7900-F79FF: page 224 */ - 0xE0, - /* F7A00-F7AFF: page 224 */ - 0xE0, - /* F7B00-F7BFF: page 224 */ - 0xE0, - /* F7C00-F7CFF: page 224 */ - 0xE0, - /* F7D00-F7DFF: page 224 */ - 0xE0, - /* F7E00-F7EFF: page 224 */ - 0xE0, - /* F7F00-F7FFF: page 224 */ - 0xE0, - /* F8000-F80FF: page 224 */ - 0xE0, - /* F8100-F81FF: page 224 */ - 0xE0, - /* F8200-F82FF: page 224 */ - 0xE0, - /* F8300-F83FF: page 224 */ - 0xE0, - /* F8400-F84FF: page 224 */ - 0xE0, - /* F8500-F85FF: page 224 */ - 0xE0, - /* F8600-F86FF: page 224 */ - 0xE0, - /* F8700-F87FF: page 224 */ - 0xE0, - /* F8800-F88FF: page 224 */ - 0xE0, - /* F8900-F89FF: page 224 */ - 0xE0, - /* F8A00-F8AFF: page 224 */ - 0xE0, - /* F8B00-F8BFF: page 224 */ - 0xE0, - /* F8C00-F8CFF: page 224 */ - 0xE0, - /* F8D00-F8DFF: page 224 */ - 0xE0, - /* F8E00-F8EFF: page 224 */ - 0xE0, - /* F8F00-F8FFF: page 224 */ - 0xE0, - /* F9000-F90FF: page 224 */ - 0xE0, - /* F9100-F91FF: page 224 */ - 0xE0, - /* F9200-F92FF: page 224 */ - 0xE0, - /* F9300-F93FF: page 224 */ - 0xE0, - /* F9400-F94FF: page 224 */ - 0xE0, - /* F9500-F95FF: page 224 */ - 0xE0, - /* F9600-F96FF: page 224 */ - 0xE0, - /* F9700-F97FF: page 224 */ - 0xE0, - /* F9800-F98FF: page 224 */ - 0xE0, - /* F9900-F99FF: page 224 */ - 0xE0, - /* F9A00-F9AFF: page 224 */ - 0xE0, - /* F9B00-F9BFF: page 224 */ - 0xE0, - /* F9C00-F9CFF: page 224 */ - 0xE0, - /* F9D00-F9DFF: page 224 */ - 0xE0, - /* F9E00-F9EFF: page 224 */ - 0xE0, - /* F9F00-F9FFF: page 224 */ - 0xE0, - /* FA000-FA0FF: page 224 */ - 0xE0, - /* FA100-FA1FF: page 224 */ - 0xE0, - /* FA200-FA2FF: page 224 */ - 0xE0, - /* FA300-FA3FF: page 224 */ - 0xE0, - /* FA400-FA4FF: page 224 */ - 0xE0, - /* FA500-FA5FF: page 224 */ - 0xE0, - /* FA600-FA6FF: page 224 */ - 0xE0, - /* FA700-FA7FF: page 224 */ - 0xE0, - /* FA800-FA8FF: page 224 */ - 0xE0, - /* FA900-FA9FF: page 224 */ - 0xE0, - /* FAA00-FAAFF: page 224 */ - 0xE0, - /* FAB00-FABFF: page 224 */ - 0xE0, - /* FAC00-FACFF: page 224 */ - 0xE0, - /* FAD00-FADFF: page 224 */ - 0xE0, - /* FAE00-FAEFF: page 224 */ - 0xE0, - /* FAF00-FAFFF: page 224 */ - 0xE0, - /* FB000-FB0FF: page 224 */ - 0xE0, - /* FB100-FB1FF: page 224 */ - 0xE0, - /* FB200-FB2FF: page 224 */ - 0xE0, - /* FB300-FB3FF: page 224 */ - 0xE0, - /* FB400-FB4FF: page 224 */ - 0xE0, - /* FB500-FB5FF: page 224 */ - 0xE0, - /* FB600-FB6FF: page 224 */ - 0xE0, - /* FB700-FB7FF: page 224 */ - 0xE0, - /* FB800-FB8FF: page 224 */ - 0xE0, - /* FB900-FB9FF: page 224 */ - 0xE0, - /* FBA00-FBAFF: page 224 */ - 0xE0, - /* FBB00-FBBFF: page 224 */ - 0xE0, - /* FBC00-FBCFF: page 224 */ - 0xE0, - /* FBD00-FBDFF: page 224 */ - 0xE0, - /* FBE00-FBEFF: page 224 */ - 0xE0, - /* FBF00-FBFFF: page 224 */ - 0xE0, - /* FC000-FC0FF: page 224 */ - 0xE0, - /* FC100-FC1FF: page 224 */ - 0xE0, - /* FC200-FC2FF: page 224 */ - 0xE0, - /* FC300-FC3FF: page 224 */ - 0xE0, - /* FC400-FC4FF: page 224 */ - 0xE0, - /* FC500-FC5FF: page 224 */ - 0xE0, - /* FC600-FC6FF: page 224 */ - 0xE0, - /* FC700-FC7FF: page 224 */ - 0xE0, - /* FC800-FC8FF: page 224 */ - 0xE0, - /* FC900-FC9FF: page 224 */ - 0xE0, - /* FCA00-FCAFF: page 224 */ - 0xE0, - /* FCB00-FCBFF: page 224 */ - 0xE0, - /* FCC00-FCCFF: page 224 */ - 0xE0, - /* FCD00-FCDFF: page 224 */ - 0xE0, - /* FCE00-FCEFF: page 224 */ - 0xE0, - /* FCF00-FCFFF: page 224 */ - 0xE0, - /* FD000-FD0FF: page 224 */ - 0xE0, - /* FD100-FD1FF: page 224 */ - 0xE0, - /* FD200-FD2FF: page 224 */ - 0xE0, - /* FD300-FD3FF: page 224 */ - 0xE0, - /* FD400-FD4FF: page 224 */ - 0xE0, - /* FD500-FD5FF: page 224 */ - 0xE0, - /* FD600-FD6FF: page 224 */ - 0xE0, - /* FD700-FD7FF: page 224 */ - 0xE0, - /* FD800-FD8FF: page 224 */ - 0xE0, - /* FD900-FD9FF: page 224 */ - 0xE0, - /* FDA00-FDAFF: page 224 */ - 0xE0, - /* FDB00-FDBFF: page 224 */ - 0xE0, - /* FDC00-FDCFF: page 224 */ - 0xE0, - /* FDD00-FDDFF: page 224 */ - 0xE0, - /* FDE00-FDEFF: page 224 */ - 0xE0, - /* FDF00-FDFFF: page 224 */ - 0xE0, - /* FE000-FE0FF: page 224 */ - 0xE0, - /* FE100-FE1FF: page 224 */ - 0xE0, - /* FE200-FE2FF: page 224 */ - 0xE0, - /* FE300-FE3FF: page 224 */ - 0xE0, - /* FE400-FE4FF: page 224 */ - 0xE0, - /* FE500-FE5FF: page 224 */ - 0xE0, - /* FE600-FE6FF: page 224 */ - 0xE0, - /* FE700-FE7FF: page 224 */ - 0xE0, - /* FE800-FE8FF: page 224 */ - 0xE0, - /* FE900-FE9FF: page 224 */ - 0xE0, - /* FEA00-FEAFF: page 224 */ - 0xE0, - /* FEB00-FEBFF: page 224 */ - 0xE0, - /* FEC00-FECFF: page 224 */ - 0xE0, - /* FED00-FEDFF: page 224 */ - 0xE0, - /* FEE00-FEEFF: page 224 */ - 0xE0, - /* FEF00-FEFFF: page 224 */ - 0xE0, - /* FF000-FF0FF: page 224 */ - 0xE0, - /* FF100-FF1FF: page 224 */ - 0xE0, - /* FF200-FF2FF: page 224 */ - 0xE0, - /* FF300-FF3FF: page 224 */ - 0xE0, - /* FF400-FF4FF: page 224 */ - 0xE0, - /* FF500-FF5FF: page 224 */ - 0xE0, - /* FF600-FF6FF: page 224 */ - 0xE0, - /* FF700-FF7FF: page 224 */ - 0xE0, - /* FF800-FF8FF: page 224 */ - 0xE0, - /* FF900-FF9FF: page 224 */ - 0xE0, - /* FFA00-FFAFF: page 224 */ - 0xE0, - /* FFB00-FFBFF: page 224 */ - 0xE0, - /* FFC00-FFCFF: page 224 */ - 0xE0, - /* FFD00-FFDFF: page 224 */ - 0xE0, - /* FFE00-FFEFF: page 224 */ - 0xE0, - /* FFF00-FFFFF: page 277 */ - 0x115, - /* 100000-1000FF: page 224 */ - 0xE0, - /* 100100-1001FF: page 224 */ - 0xE0, - /* 100200-1002FF: page 224 */ - 0xE0, - /* 100300-1003FF: page 224 */ - 0xE0, - /* 100400-1004FF: page 224 */ - 0xE0, - /* 100500-1005FF: page 224 */ - 0xE0, - /* 100600-1006FF: page 224 */ - 0xE0, - /* 100700-1007FF: page 224 */ - 0xE0, - /* 100800-1008FF: page 224 */ - 0xE0, - /* 100900-1009FF: page 224 */ - 0xE0, - /* 100A00-100AFF: page 224 */ - 0xE0, - /* 100B00-100BFF: page 224 */ - 0xE0, - /* 100C00-100CFF: page 224 */ - 0xE0, - /* 100D00-100DFF: page 224 */ - 0xE0, - /* 100E00-100EFF: page 224 */ - 0xE0, - /* 100F00-100FFF: page 224 */ - 0xE0, - /* 101000-1010FF: page 224 */ - 0xE0, - /* 101100-1011FF: page 224 */ - 0xE0, - /* 101200-1012FF: page 224 */ - 0xE0, - /* 101300-1013FF: page 224 */ - 0xE0, - /* 101400-1014FF: page 224 */ - 0xE0, - /* 101500-1015FF: page 224 */ - 0xE0, - /* 101600-1016FF: page 224 */ - 0xE0, - /* 101700-1017FF: page 224 */ - 0xE0, - /* 101800-1018FF: page 224 */ - 0xE0, - /* 101900-1019FF: page 224 */ - 0xE0, - /* 101A00-101AFF: page 224 */ - 0xE0, - /* 101B00-101BFF: page 224 */ - 0xE0, - /* 101C00-101CFF: page 224 */ - 0xE0, - /* 101D00-101DFF: page 224 */ - 0xE0, - /* 101E00-101EFF: page 224 */ - 0xE0, - /* 101F00-101FFF: page 224 */ - 0xE0, - /* 102000-1020FF: page 224 */ - 0xE0, - /* 102100-1021FF: page 224 */ - 0xE0, - /* 102200-1022FF: page 224 */ - 0xE0, - /* 102300-1023FF: page 224 */ - 0xE0, - /* 102400-1024FF: page 224 */ - 0xE0, - /* 102500-1025FF: page 224 */ - 0xE0, - /* 102600-1026FF: page 224 */ - 0xE0, - /* 102700-1027FF: page 224 */ - 0xE0, - /* 102800-1028FF: page 224 */ - 0xE0, - /* 102900-1029FF: page 224 */ - 0xE0, - /* 102A00-102AFF: page 224 */ - 0xE0, - /* 102B00-102BFF: page 224 */ - 0xE0, - /* 102C00-102CFF: page 224 */ - 0xE0, - /* 102D00-102DFF: page 224 */ - 0xE0, - /* 102E00-102EFF: page 224 */ - 0xE0, - /* 102F00-102FFF: page 224 */ - 0xE0, - /* 103000-1030FF: page 224 */ - 0xE0, - /* 103100-1031FF: page 224 */ - 0xE0, - /* 103200-1032FF: page 224 */ - 0xE0, - /* 103300-1033FF: page 224 */ - 0xE0, - /* 103400-1034FF: page 224 */ - 0xE0, - /* 103500-1035FF: page 224 */ - 0xE0, - /* 103600-1036FF: page 224 */ - 0xE0, - /* 103700-1037FF: page 224 */ - 0xE0, - /* 103800-1038FF: page 224 */ - 0xE0, - /* 103900-1039FF: page 224 */ - 0xE0, - /* 103A00-103AFF: page 224 */ - 0xE0, - /* 103B00-103BFF: page 224 */ - 0xE0, - /* 103C00-103CFF: page 224 */ - 0xE0, - /* 103D00-103DFF: page 224 */ - 0xE0, - /* 103E00-103EFF: page 224 */ - 0xE0, - /* 103F00-103FFF: page 224 */ - 0xE0, - /* 104000-1040FF: page 224 */ - 0xE0, - /* 104100-1041FF: page 224 */ - 0xE0, - /* 104200-1042FF: page 224 */ - 0xE0, - /* 104300-1043FF: page 224 */ - 0xE0, - /* 104400-1044FF: page 224 */ - 0xE0, - /* 104500-1045FF: page 224 */ - 0xE0, - /* 104600-1046FF: page 224 */ - 0xE0, - /* 104700-1047FF: page 224 */ - 0xE0, - /* 104800-1048FF: page 224 */ - 0xE0, - /* 104900-1049FF: page 224 */ - 0xE0, - /* 104A00-104AFF: page 224 */ - 0xE0, - /* 104B00-104BFF: page 224 */ - 0xE0, - /* 104C00-104CFF: page 224 */ - 0xE0, - /* 104D00-104DFF: page 224 */ - 0xE0, - /* 104E00-104EFF: page 224 */ - 0xE0, - /* 104F00-104FFF: page 224 */ - 0xE0, - /* 105000-1050FF: page 224 */ - 0xE0, - /* 105100-1051FF: page 224 */ - 0xE0, - /* 105200-1052FF: page 224 */ - 0xE0, - /* 105300-1053FF: page 224 */ - 0xE0, - /* 105400-1054FF: page 224 */ - 0xE0, - /* 105500-1055FF: page 224 */ - 0xE0, - /* 105600-1056FF: page 224 */ - 0xE0, - /* 105700-1057FF: page 224 */ - 0xE0, - /* 105800-1058FF: page 224 */ - 0xE0, - /* 105900-1059FF: page 224 */ - 0xE0, - /* 105A00-105AFF: page 224 */ - 0xE0, - /* 105B00-105BFF: page 224 */ - 0xE0, - /* 105C00-105CFF: page 224 */ - 0xE0, - /* 105D00-105DFF: page 224 */ - 0xE0, - /* 105E00-105EFF: page 224 */ - 0xE0, - /* 105F00-105FFF: page 224 */ - 0xE0, - /* 106000-1060FF: page 224 */ - 0xE0, - /* 106100-1061FF: page 224 */ - 0xE0, - /* 106200-1062FF: page 224 */ - 0xE0, - /* 106300-1063FF: page 224 */ - 0xE0, - /* 106400-1064FF: page 224 */ - 0xE0, - /* 106500-1065FF: page 224 */ - 0xE0, - /* 106600-1066FF: page 224 */ - 0xE0, - /* 106700-1067FF: page 224 */ - 0xE0, - /* 106800-1068FF: page 224 */ - 0xE0, - /* 106900-1069FF: page 224 */ - 0xE0, - /* 106A00-106AFF: page 224 */ - 0xE0, - /* 106B00-106BFF: page 224 */ - 0xE0, - /* 106C00-106CFF: page 224 */ - 0xE0, - /* 106D00-106DFF: page 224 */ - 0xE0, - /* 106E00-106EFF: page 224 */ - 0xE0, - /* 106F00-106FFF: page 224 */ - 0xE0, - /* 107000-1070FF: page 224 */ - 0xE0, - /* 107100-1071FF: page 224 */ - 0xE0, - /* 107200-1072FF: page 224 */ - 0xE0, - /* 107300-1073FF: page 224 */ - 0xE0, - /* 107400-1074FF: page 224 */ - 0xE0, - /* 107500-1075FF: page 224 */ - 0xE0, - /* 107600-1076FF: page 224 */ - 0xE0, - /* 107700-1077FF: page 224 */ - 0xE0, - /* 107800-1078FF: page 224 */ - 0xE0, - /* 107900-1079FF: page 224 */ - 0xE0, - /* 107A00-107AFF: page 224 */ - 0xE0, - /* 107B00-107BFF: page 224 */ - 0xE0, - /* 107C00-107CFF: page 224 */ - 0xE0, - /* 107D00-107DFF: page 224 */ - 0xE0, - /* 107E00-107EFF: page 224 */ - 0xE0, - /* 107F00-107FFF: page 224 */ - 0xE0, - /* 108000-1080FF: page 224 */ - 0xE0, - /* 108100-1081FF: page 224 */ - 0xE0, - /* 108200-1082FF: page 224 */ - 0xE0, - /* 108300-1083FF: page 224 */ - 0xE0, - /* 108400-1084FF: page 224 */ - 0xE0, - /* 108500-1085FF: page 224 */ - 0xE0, - /* 108600-1086FF: page 224 */ - 0xE0, - /* 108700-1087FF: page 224 */ - 0xE0, - /* 108800-1088FF: page 224 */ - 0xE0, - /* 108900-1089FF: page 224 */ - 0xE0, - /* 108A00-108AFF: page 224 */ - 0xE0, - /* 108B00-108BFF: page 224 */ - 0xE0, - /* 108C00-108CFF: page 224 */ - 0xE0, - /* 108D00-108DFF: page 224 */ - 0xE0, - /* 108E00-108EFF: page 224 */ - 0xE0, - /* 108F00-108FFF: page 224 */ - 0xE0, - /* 109000-1090FF: page 224 */ - 0xE0, - /* 109100-1091FF: page 224 */ - 0xE0, - /* 109200-1092FF: page 224 */ - 0xE0, - /* 109300-1093FF: page 224 */ - 0xE0, - /* 109400-1094FF: page 224 */ - 0xE0, - /* 109500-1095FF: page 224 */ - 0xE0, - /* 109600-1096FF: page 224 */ - 0xE0, - /* 109700-1097FF: page 224 */ - 0xE0, - /* 109800-1098FF: page 224 */ - 0xE0, - /* 109900-1099FF: page 224 */ - 0xE0, - /* 109A00-109AFF: page 224 */ - 0xE0, - /* 109B00-109BFF: page 224 */ - 0xE0, - /* 109C00-109CFF: page 224 */ - 0xE0, - /* 109D00-109DFF: page 224 */ - 0xE0, - /* 109E00-109EFF: page 224 */ - 0xE0, - /* 109F00-109FFF: page 224 */ - 0xE0, - /* 10A000-10A0FF: page 224 */ - 0xE0, - /* 10A100-10A1FF: page 224 */ - 0xE0, - /* 10A200-10A2FF: page 224 */ - 0xE0, - /* 10A300-10A3FF: page 224 */ - 0xE0, - /* 10A400-10A4FF: page 224 */ - 0xE0, - /* 10A500-10A5FF: page 224 */ - 0xE0, - /* 10A600-10A6FF: page 224 */ - 0xE0, - /* 10A700-10A7FF: page 224 */ - 0xE0, - /* 10A800-10A8FF: page 224 */ - 0xE0, - /* 10A900-10A9FF: page 224 */ - 0xE0, - /* 10AA00-10AAFF: page 224 */ - 0xE0, - /* 10AB00-10ABFF: page 224 */ - 0xE0, - /* 10AC00-10ACFF: page 224 */ - 0xE0, - /* 10AD00-10ADFF: page 224 */ - 0xE0, - /* 10AE00-10AEFF: page 224 */ - 0xE0, - /* 10AF00-10AFFF: page 224 */ - 0xE0, - /* 10B000-10B0FF: page 224 */ - 0xE0, - /* 10B100-10B1FF: page 224 */ - 0xE0, - /* 10B200-10B2FF: page 224 */ - 0xE0, - /* 10B300-10B3FF: page 224 */ - 0xE0, - /* 10B400-10B4FF: page 224 */ - 0xE0, - /* 10B500-10B5FF: page 224 */ - 0xE0, - /* 10B600-10B6FF: page 224 */ - 0xE0, - /* 10B700-10B7FF: page 224 */ - 0xE0, - /* 10B800-10B8FF: page 224 */ - 0xE0, - /* 10B900-10B9FF: page 224 */ - 0xE0, - /* 10BA00-10BAFF: page 224 */ - 0xE0, - /* 10BB00-10BBFF: page 224 */ - 0xE0, - /* 10BC00-10BCFF: page 224 */ - 0xE0, - /* 10BD00-10BDFF: page 224 */ - 0xE0, - /* 10BE00-10BEFF: page 224 */ - 0xE0, - /* 10BF00-10BFFF: page 224 */ - 0xE0, - /* 10C000-10C0FF: page 224 */ - 0xE0, - /* 10C100-10C1FF: page 224 */ - 0xE0, - /* 10C200-10C2FF: page 224 */ - 0xE0, - /* 10C300-10C3FF: page 224 */ - 0xE0, - /* 10C400-10C4FF: page 224 */ - 0xE0, - /* 10C500-10C5FF: page 224 */ - 0xE0, - /* 10C600-10C6FF: page 224 */ - 0xE0, - /* 10C700-10C7FF: page 224 */ - 0xE0, - /* 10C800-10C8FF: page 224 */ - 0xE0, - /* 10C900-10C9FF: page 224 */ - 0xE0, - /* 10CA00-10CAFF: page 224 */ - 0xE0, - /* 10CB00-10CBFF: page 224 */ - 0xE0, - /* 10CC00-10CCFF: page 224 */ - 0xE0, - /* 10CD00-10CDFF: page 224 */ - 0xE0, - /* 10CE00-10CEFF: page 224 */ - 0xE0, - /* 10CF00-10CFFF: page 224 */ - 0xE0, - /* 10D000-10D0FF: page 224 */ - 0xE0, - /* 10D100-10D1FF: page 224 */ - 0xE0, - /* 10D200-10D2FF: page 224 */ - 0xE0, - /* 10D300-10D3FF: page 224 */ - 0xE0, - /* 10D400-10D4FF: page 224 */ - 0xE0, - /* 10D500-10D5FF: page 224 */ - 0xE0, - /* 10D600-10D6FF: page 224 */ - 0xE0, - /* 10D700-10D7FF: page 224 */ - 0xE0, - /* 10D800-10D8FF: page 224 */ - 0xE0, - /* 10D900-10D9FF: page 224 */ - 0xE0, - /* 10DA00-10DAFF: page 224 */ - 0xE0, - /* 10DB00-10DBFF: page 224 */ - 0xE0, - /* 10DC00-10DCFF: page 224 */ - 0xE0, - /* 10DD00-10DDFF: page 224 */ - 0xE0, - /* 10DE00-10DEFF: page 224 */ - 0xE0, - /* 10DF00-10DFFF: page 224 */ - 0xE0, - /* 10E000-10E0FF: page 224 */ - 0xE0, - /* 10E100-10E1FF: page 224 */ - 0xE0, - /* 10E200-10E2FF: page 224 */ - 0xE0, - /* 10E300-10E3FF: page 224 */ - 0xE0, - /* 10E400-10E4FF: page 224 */ - 0xE0, - /* 10E500-10E5FF: page 224 */ - 0xE0, - /* 10E600-10E6FF: page 224 */ - 0xE0, - /* 10E700-10E7FF: page 224 */ - 0xE0, - /* 10E800-10E8FF: page 224 */ - 0xE0, - /* 10E900-10E9FF: page 224 */ - 0xE0, - /* 10EA00-10EAFF: page 224 */ - 0xE0, - /* 10EB00-10EBFF: page 224 */ - 0xE0, - /* 10EC00-10ECFF: page 224 */ - 0xE0, - /* 10ED00-10EDFF: page 224 */ - 0xE0, - /* 10EE00-10EEFF: page 224 */ - 0xE0, - /* 10EF00-10EFFF: page 224 */ - 0xE0, - /* 10F000-10F0FF: page 224 */ - 0xE0, - /* 10F100-10F1FF: page 224 */ - 0xE0, - /* 10F200-10F2FF: page 224 */ - 0xE0, - /* 10F300-10F3FF: page 224 */ - 0xE0, - /* 10F400-10F4FF: page 224 */ - 0xE0, - /* 10F500-10F5FF: page 224 */ - 0xE0, - /* 10F600-10F6FF: page 224 */ - 0xE0, - /* 10F700-10F7FF: page 224 */ - 0xE0, - /* 10F800-10F8FF: page 224 */ - 0xE0, - /* 10F900-10F9FF: page 224 */ - 0xE0, - /* 10FA00-10FAFF: page 224 */ - 0xE0, - /* 10FB00-10FBFF: page 224 */ - 0xE0, - /* 10FC00-10FCFF: page 224 */ - 0xE0, - /* 10FD00-10FDFF: page 224 */ - 0xE0, - /* 10FE00-10FEFF: page 224 */ - 0xE0, - /* 10FF00-10FFFF: page 277 */ - 0x115 -}; -#endif - -#ifndef DISABLE_NET_4_0 -/* - * The CategoryData_v4* tables below are automatically generated - * by create-category-table(.cs), available in the mcs - * sources. DO NOT EDIT! - */ - -/* - * Value bits: 8, Page size: 256 - * Packed table: 71680 bytes - * Index astral_index: 8192 bytes - * Total: 79872 bytes - */ -static const guint8 CategoryData_v4 [71680] = -{ - /* Page 0, 0 indirect uses */ - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 11,24,24,24,26,24,24,24,20,21,24,25,24,19,24,24, - 8,8,8,8,8,8,8,8,8,8,24,24,25,25,25,24, - 24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,20,24,21,27,18, - 27,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,20,25,21,25,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 11,24,26,26,26,26,28,28,27,28,1,22,25,19,28,27, - 28,25,10,10,27,1,28,24,27,10,1,23,10,10,10,24, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,25,1,1,1,1,1,1,1,1, - /* Page 1, 0 indirect uses */ - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0, - 1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,1, - 1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,0, - 0,0,1,0,0,1,0,0,0,1,1,1,0,0,1,0, - 0,1,0,1,0,1,0,0,1,0,1,1,0,1,0,0, - 1,0,0,0,1,0,1,0,0,1,1,4,0,1,1,1, - 4,4,4,4,0,2,1,0,2,1,0,2,1,0,1,0, - 1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 1,0,2,1,0,1,0,0,0,1,0,1,0,1,0,1, - /* Page 2, 0 indirect uses */ - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,1,1,1,1,1,1,0,0,1,0,0,1, - 1,0,1,0,0,0,0,1,0,1,0,1,0,1,0,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,27,27,27,27,3,3,3,3,3,3,3,3,3,3, - 3,3,27,27,27,27,27,27,27,27,27,27,27,27,27,27, - 3,3,3,3,3,27,27,27,27,27,27,27,3,27,3,27, - 27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, - /* Page 3, 0 indirect uses */ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 0,1,0,1,3,27,0,1,29,29,3,1,1,1,24,29, - 29,29,29,29,27,27,0,24,0,0,0,29,0,29,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,29,0,0,0,0,0,0,0,0,0,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, - 1,1,0,0,0,1,1,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 1,1,1,1,0,1,25,0,1,0,0,1,1,0,0,0, - /* Page 4, 0 indirect uses */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,28,5,5,5,5,5,7,7,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - /* Page 5, 0 indirect uses */ - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,29,29,29,29,29,29,29,29,29,29,29,29, - 29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,29,29,3,24,24,24,24,24,24, - 29,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,29,24,19,29,29,29,29,29, - 29,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,19,5, - 24,5,5,24,5,5,24,5,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,29,29,29,29, - 4,4,4,24,24,29,29,29,29,29,29,29,29,29,29,29, - /* Page 6, 0 indirect uses */ - 15,15,15,15,29,29,25,25,25,24,24,26,24,24,28,28, - 5,5,5,5,5,5,5,5,5,5,5,24,29,29,24,24, - 29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 3,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,29, - 8,8,8,8,8,8,8,8,8,8,24,24,24,24,4,4, - 5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,24,4,5,5,5,5,5,5,5,15,7,5, - 5,5,5,5,5,3,3,5,5,28,5,5,5,5,4,4, - 8,8,8,8,8,8,8,8,8,8,4,4,4,28,28,4, - /* Page 7, 0 indirect uses */ - 24,24,24,24,24,24,24,24,24,24,24,24,24,24,29,15, - 4,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,29,29,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5, - 5,4,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 8,8,8,8,8,8,8,8,8,8,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5, - 5,5,5,5,3,3,28,24,24,24,3,29,29,29,29,29, - /* - * Page 8, 3390 indirect uses: - * 10500-107FF (astral_index), - * 10B00-11FFF (astral_index), - * 12500-1CFFF (astral_index), - * 1D800-1EFFF (astral_index), - * 1F100-1FFFF (astral_index), - * 2A700-2F7FF (astral_index), - * 2FB00-DFFFF (astral_index), - * E0200-EFFFF (astral_index) - */ - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 9, 0 indirect uses */ - 29,5,5,6,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,5,4,6,6, - 6,5,5,5,5,5,5,5,5,6,6,6,6,5,29,29, - 4,5,5,5,5,29,29,29,4,4,4,4,4,4,4,4, - 4,4,5,5,24,24,8,8,8,8,8,8,8,8,8,8, - 24,3,4,29,29,29,29,29,29,29,29,4,4,4,4,4, - 29,5,6,6,29,4,4,4,4,4,4,4,4,29,29,4, - 4,29,29,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,29,4,29,29,29,4,4,4,4,29,29,5,4,6,6, - 6,5,5,5,5,29,29,6,6,29,29,6,6,5,4,29, - 29,29,29,29,29,29,29,6,29,29,29,29,4,4,29,4, - 4,4,5,5,29,29,8,8,8,8,8,8,8,8,8,8, - 4,4,26,26,10,10,10,10,10,10,28,29,29,29,29,29, - /* Page 10, 0 indirect uses */ - 29,5,5,6,29,4,4,4,4,4,4,29,29,29,29,4, - 4,29,29,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,29,4,4,29,4,4,29,4,4,29,29,5,29,6,6, - 6,5,5,29,29,29,29,5,5,29,29,5,5,5,29,29, - 29,5,29,29,29,29,29,29,29,4,4,4,4,29,4,29, - 29,29,29,29,29,29,8,8,8,8,8,8,8,8,8,8, - 5,5,4,4,4,5,29,29,29,29,29,29,29,29,29,29, - 29,5,5,6,29,4,4,4,4,4,4,4,4,4,29,4, - 4,4,29,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,29,4,4,29,4,4,4,4,4,29,29,5,4,6,6, - 6,5,5,5,5,5,29,5,5,6,29,6,6,5,29,29, - 4,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,5,5,29,29,8,8,8,8,8,8,8,8,8,8, - 29,26,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 11, 0 indirect uses */ - 29,5,6,6,29,4,4,4,4,4,4,4,4,29,29,4, - 4,29,29,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,29,4,4,29,4,4,4,4,4,29,29,5,4,6,5, - 6,5,5,5,5,29,29,6,6,29,29,6,6,5,29,29, - 29,29,29,29,29,29,5,6,29,29,29,29,4,4,29,4, - 4,4,5,5,29,29,8,8,8,8,8,8,8,8,8,8, - 28,4,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,5,4,29,4,4,4,4,4,4,29,29,29,4,4, - 4,29,4,4,4,4,29,29,29,4,4,29,4,29,4,4, - 29,29,29,4,4,29,29,29,4,4,4,29,29,29,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,6,6, - 5,6,6,29,29,29,6,6,6,29,6,6,6,5,29,29, - 4,29,29,29,29,29,29,6,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,8,8,8,8,8,8,8,8,8,8, - 10,10,10,28,28,28,28,28,28,26,28,29,29,29,29,29, - /* Page 12, 0 indirect uses */ - 29,6,6,6,29,4,4,4,4,4,4,4,4,29,4,4, - 4,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,4,4,4,29,4,4,4,4,4,29,29,29,4,5,5, - 5,6,6,6,6,29,5,5,5,29,5,5,5,5,29,29, - 29,29,29,29,29,5,5,29,4,4,29,29,29,29,29,29, - 4,4,5,5,29,29,8,8,8,8,8,8,8,8,8,8, - 29,29,29,29,29,29,29,29,10,10,10,10,10,10,10,28, - 29,29,6,6,29,4,4,4,4,4,4,4,4,29,4,4, - 4,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,4,4,4,29,4,4,4,4,4,29,29,5,4,6,5, - 6,6,6,6,6,29,5,6,6,29,6,6,5,5,29,29, - 29,29,29,29,29,6,6,29,29,29,29,29,29,29,4,29, - 4,4,5,5,29,29,8,8,8,8,8,8,8,8,8,8, - 29,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 13, 0 indirect uses */ - 29,29,6,6,29,4,4,4,4,4,4,4,4,29,4,4, - 4,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,4,6,6, - 6,5,5,5,5,29,6,6,6,29,6,6,6,5,29,29, - 29,29,29,29,29,29,29,6,29,29,29,29,29,29,29,29, - 4,4,5,5,29,29,8,8,8,8,8,8,8,8,8,8, - 10,10,10,10,10,10,29,29,29,28,4,4,4,4,4,4, - 29,29,6,6,29,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,29,29,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,29,4,4,4,4,4,4,4,4,4,29,4,29,29, - 4,4,4,4,4,4,4,29,29,29,5,29,29,29,29,6, - 6,6,5,5,5,29,5,29,6,6,6,6,6,6,6,6, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,6,6,24,29,29,29,29,29,29,29,29,29,29,29, - /* Page 14, 0 indirect uses */ - 29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,5,4,4,5,5,5,5,5,5,5,29,29,29,29,26, - 4,4,4,4,4,4,3,5,5,5,5,5,5,5,5,24, - 8,8,8,8,8,8,8,8,8,8,24,24,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,4,4,29,4,29,29,4,4,29,4,29,29,4,29,29, - 29,29,29,29,4,4,4,4,29,4,4,4,4,4,4,4, - 29,4,4,4,29,4,29,4,29,29,4,4,29,4,4,4, - 4,5,4,4,5,5,5,5,5,5,29,5,5,4,29,29, - 4,4,4,4,4,29,3,29,5,5,5,5,5,5,29,29, - 8,8,8,8,8,8,8,8,8,8,29,29,4,4,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 15, 0 indirect uses */ - 4,28,28,28,24,24,24,24,24,24,24,24,24,24,24,24, - 24,24,24,28,28,28,28,28,5,5,28,28,28,28,28,28, - 8,8,8,8,8,8,8,8,8,8,10,10,10,10,10,10, - 10,10,10,10,28,5,28,5,28,5,20,21,20,21,6,6, - 4,4,4,4,4,4,4,4,29,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,29,29, - 29,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, - 5,5,5,5,5,24,5,5,4,4,4,4,29,29,29,29, - 5,5,5,5,5,5,5,5,29,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,29,28,28, - 28,28,28,28,28,28,5,28,28,28,28,28,28,29,28,28, - 24,24,24,24,24,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 16, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,6,6,5,5,5, - 5,6,5,5,5,5,5,5,6,5,5,6,6,5,5,4, - 8,8,8,8,8,8,8,8,8,8,24,24,24,24,24,24, - 4,4,4,4,4,4,6,6,5,5,4,4,4,4,5,5, - 5,4,6,6,6,4,4,6,6,6,6,6,6,6,4,4, - 4,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4, - 4,4,5,6,6,5,5,6,6,6,6,6,6,5,4,6, - 8,8,8,8,8,8,8,8,8,8,29,29,29,29,28,28, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,24,3,29,29,29, - /* Page 17, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,29,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,29,29,29,29,29,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,29,29, - /* Page 18, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,29,29, - 4,4,4,4,4,4,4,29,4,29,4,4,4,4,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,29,4,4,4,4,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,29,4,4,4,4,29,29,4,4,4,4,4,4,4,29, - 4,29,4,4,4,4,29,29,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 19, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,29,4,4,4,4,29,29,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,29,29,29,5, - 28,24,24,24,24,24,24,24,24,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 28,28,28,28,28,28,28,28,28,28,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,29,29,29,29,29,29,29,29,29,29,29, - /* Page 20, 0 indirect uses */ - 29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* - * Page 21, 171 indirect uses: - * 12000-122FF (astral_index), - * 20000-2A5FF (astral_index), - * 2F800-2F9FF (astral_index) - */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 22, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,24,24,4, - 4,4,4,4,4,4,4,29,29,29,29,29,29,29,29,29, - 11,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,20,21,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,24,24,24,9,9, - 9,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 23, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,4,4, - 4,4,5,5,5,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,5,5,5,24,24,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,5,5,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,4,4, - 4,29,5,5,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,15,15,6,5,5,5,5,5,5,5,6,6, - 6,6,6,6,6,6,5,6,6,5,5,5,5,5,5,5, - 5,5,5,5,24,24,24,3,24,24,24,26,4,5,29,29, - 8,8,8,8,8,8,8,8,8,8,29,29,29,29,29,29, - 10,10,10,10,10,10,10,10,10,10,29,29,29,29,29,29, - /* Page 24, 0 indirect uses */ - 24,24,24,24,24,24,19,24,24,24,24,5,5,5,11,29, - 8,8,8,8,8,8,8,8,8,8,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,3,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,5,4,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 25, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,29,29, - 5,5,5,6,6,6,6,5,5,6,6,6,29,29,29,29, - 6,6,5,6,6,6,6,6,6,5,5,5,29,29,29,29, - 28,29,29,29,24,24,8,8,8,8,8,8,8,8,8,8, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 4,4,4,4,4,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,29,29, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,4,4,4,4,4,4,4,6,6,29,29,29,29,29,29, - 8,8,8,8,8,8,8,8,8,8,29,29,29,29,24,24, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - /* Page 26, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,5,5,6,6,6,29,29,24,24, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 27, 0 indirect uses */ - 5,5,5,5,6,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,5,6,5,5,5,5,5,6,5,6,6,6, - 6,6,5,6,6,4,4,4,4,4,4,4,29,29,29,29, - 8,8,8,8,8,8,8,8,8,8,24,24,24,24,24,24, - 24,28,28,28,28,28,28,28,28,28,28,5,5,5,5,5, - 5,5,5,5,28,28,28,28,28,28,28,28,28,29,29,29, - 5,5,6,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,6,5,5,5,5,6,6,5,5,6,29,29,29,4,4, - 8,8,8,8,8,8,8,8,8,8,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 28, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,6,6,6,6,6,6,6,6,5,5,5,5, - 5,5,5,5,6,6,5,5,29,29,29,24,24,24,24,24, - 8,8,8,8,8,8,8,8,8,8,29,29,29,4,4,4, - 8,8,8,8,8,8,8,8,8,8,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,3,3,3,3,3,3,24,24, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 29, 0 indirect uses */ - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,5,5, - /* Page 30, 0 indirect uses */ - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - /* Page 31, 0 indirect uses */ - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,29,29,0,0,0,0,0,0,29,29, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,29,29,0,0,0,0,0,0,29,29, - 1,1,1,1,1,1,1,1,29,0,29,0,29,0,29,0, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,29,29, - 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, - 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, - 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, - 1,1,1,1,1,29,1,1,0,0,0,0,2,27,1,27, - 27,27,1,1,1,29,1,1,0,0,0,0,2,27,27,27, - 1,1,1,1,29,29,1,1,0,0,0,0,29,27,27,27, - 1,1,1,1,1,1,1,1,0,0,0,0,0,27,27,27, - 29,29,1,1,1,29,1,1,0,0,0,0,2,27,27,29, - /* Page 32, 0 indirect uses */ - 11,11,11,11,11,11,11,11,11,11,11,15,15,15,15,15, - 19,19,19,19,19,19,24,24,22,23,20,22,22,23,20,22, - 24,24,24,24,24,24,24,24,12,13,15,15,15,15,15,11, - 24,24,24,24,24,24,24,24,24,22,23,24,24,24,24,18, - 18,24,24,24,25,20,21,24,24,24,24,24,24,24,24,24, - 24,24,25,24,18,24,24,24,24,24,24,24,24,24,24,11, - 15,15,15,15,15,29,29,29,29,29,15,15,15,15,15,15, - 10,1,29,29,10,10,10,10,10,10,25,25,25,20,21,1, - 10,10,10,10,10,10,10,10,10,10,25,25,25,20,21,29, - 3,3,3,3,3,29,29,29,29,29,29,29,29,29,29,29, - 26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, - 26,26,26,26,26,26,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 5,5,5,5,5,5,5,5,5,5,5,5,5,7,7,7, - 7,5,7,7,7,5,5,5,5,5,5,5,5,5,5,5, - 5,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 33, 0 indirect uses */ - 28,28,0,28,28,28,28,0,28,28,1,0,0,0,1,1, - 0,0,0,1,28,0,28,28,28,0,0,0,0,0,28,28, - 28,28,28,28,0,28,0,28,0,28,0,0,0,0,28,1, - 0,0,0,0,1,4,4,4,4,1,28,28,1,1,0,0, - 25,25,25,25,25,0,1,1,1,1,28,25,28,28,1,28, - 29,29,29,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,0,1,9,9,9,9,29,29,29,29,29,29,29, - 25,25,25,25,25,28,28,28,28,28,25,25,28,28,28,28, - 25,28,28,25,28,28,25,28,28,28,28,28,28,28,25,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,25,25, - 28,28,25,28,25,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,25,25,25,25,25,25,25,25,25,25,25,25, - /* Page 34, 0 indirect uses */ - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - /* Page 35, 0 indirect uses */ - 28,28,28,28,28,28,28,28,25,25,25,25,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 25,25,28,28,28,28,28,28,28,20,21,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,25,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,25,25,25,25, - 25,25,28,28,28,28,28,28,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 36, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - /* Page 37, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,25,28,28,28,28,28,28,28,28, - 28,25,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,25,25,25,25,25,25,25,25, - /* Page 38, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,25, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,29,29,29, - 28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 39, 0 indirect uses */ - 29,28,28,28,28,29,28,28,28,28,29,29,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,29,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,29,28,29,28, - 28,28,28,29,29,29,28,29,28,28,28,28,28,28,28,29, - 29,28,28,28,28,28,28,28,20,21,20,21,20,21,20,21, - 20,21,20,21,20,21,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,28,29,29,29,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 29,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29, - 25,25,25,25,25,20,21,25,25,25,25,29,25,29,29,29, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,20,21,20,21,20,21,20,21,20,21, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - /* Page 40, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - /* Page 41, 0 indirect uses */ - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,20,21,20,21,20,21,20,21,20,21,20,21,20, - 21,20,21,20,21,20,21,20,21,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,20,21,20,21,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,20,21,25,25, - /* Page 42, 0 indirect uses */ - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - /* Page 43, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,28,28,25,25,25,25,25,25,29,29,29, - 28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 44, 0 indirect uses */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,29, - 0,1,0,0,0,1,1,0,1,0,1,0,1,0,0,0, - 29,1,0,1,1,0,1,1,1,1,1,1,1,3,29,29, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,1,28,28,28,28,28,28,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,24,24,24,24,10,24,24, - /* Page 45, 0 indirect uses */ - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,29,29,29,29,29,29,29,29,29,3, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,29, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,29, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,29, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,29, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - /* Page 46, 0 indirect uses */ - 24,24,22,23,22,23,24,24,24,22,23,24,22,23,24,24, - 24,24,24,24,24,24,24,19,24,24,19,24,22,23,24,24, - 22,23,20,21,20,21,20,21,20,21,24,24,24,24,24,3, - 24,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,29,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 47, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,29,29,29,29, - /* Page 48, 0 indirect uses */ - 11,24,24,24,28,3,4,9,20,21,20,21,20,21,20,21, - 20,21,28,28,20,21,20,21,20,21,20,21,19,20,21,21, - 28,9,9,9,9,9,9,9,9,9,5,5,5,5,5,5, - 19,3,3,3,3,3,28,28,9,9,9,3,4,24,28,28, - 29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,29,5,5,27,27,3,3,4, - 19,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,24,3,3,3,4, - /* Page 49, 0 indirect uses */ - 29,29,29,29,29,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29, - 28,28,10,10,10,10,28,28,28,28,28,28,28,28,28,28, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,29,29,29,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 50, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29, - 10,10,10,10,10,10,10,10,10,10,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29, - 28,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 10,10,10,10,10,10,10,10,10,10,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29, - /* Page 51, 0 indirect uses */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - /* Page 52, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 53, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 54, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 55, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 56, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 57, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 58, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 59, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 60, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 61, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 62, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 63, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 64, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 65, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 66, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 67, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 68, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 69, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 70, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 71, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 72, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 73, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 74, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 75, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 76, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 77, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,29,29,29,29,29,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - /* Page 78, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 79, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 80, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 81, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 82, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 83, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 84, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 85, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 86, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 87, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 88, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 89, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 90, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 91, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 92, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 93, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 94, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 95, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 96, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 97, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 98, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 99, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 100, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 101, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 102, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 103, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 104, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 105, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 106, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 107, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 108, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 109, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 110, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 111, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 112, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 113, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 114, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 115, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 116, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 117, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 118, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 119, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 120, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 121, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 122, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 123, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 124, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 125, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 126, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 127, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 128, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 129, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 130, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 131, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 132, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 133, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 134, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 135, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 136, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 137, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 138, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 139, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 140, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 141, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 142, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 143, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 144, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 145, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 146, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 147, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 148, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 149, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 150, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 151, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 152, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 153, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 154, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 155, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 156, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 157, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 158, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 159, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 160, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,3,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 161, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 162, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 163, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 164, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 165, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 166, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,3,24,24,24, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 8,8,8,8,8,8,8,8,8,8,4,4,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 29,29,0,1,0,1,0,1,0,1,0,1,0,1,4,5, - 7,7,7,24,29,29,29,29,29,29,29,29,5,5,24,3, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 167, 0 indirect uses */ - 27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, - 27,27,27,27,27,27,27,3,3,3,3,3,3,3,3,3, - 27,27,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 3,1,1,1,1,1,1,1,1,0,1,0,1,0,0,1, - 0,1,0,1,0,1,0,1,3,27,27,0,1,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,4,4,4,4,4, - /* Page 168, 0 indirect uses */ - 4,4,5,4,4,4,5,4,4,4,4,5,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,6,6,5,5,6,28,28,28,28,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,24,24,24,24,29,29,29,29,29,29,29,29, - 6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,5,29,29,29,29,29,29,29,29,29,24,24, - 8,8,8,8,8,8,8,8,8,8,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 169, 0 indirect uses */ - 8,8,8,8,8,8,8,8,8,8,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,5,5,5,5,5,5,5,5,24,24, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5, - 5,5,6,6,29,29,29,29,29,29,29,29,29,29,29,24, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 170, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,6, - 6,5,5,6,6,5,5,29,29,29,29,29,29,29,29,29, - 4,4,4,5,4,4,4,4,4,4,4,4,5,6,29,29, - 8,8,8,8,8,8,8,8,8,8,29,29,24,24,24,24, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 171, 0 indirect uses */ - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 172, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 173, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 174, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 175, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 176, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 177, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 178, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 179, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 180, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 181, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 182, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 183, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 184, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 185, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 186, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 187, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 188, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 189, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 190, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 191, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 192, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 193, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 194, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 195, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 196, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 197, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 198, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 199, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 200, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 201, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 202, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 203, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 204, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 205, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 206, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 207, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 208, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 209, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 210, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 211, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 212, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 213, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 214, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 215, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 216, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 217, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 218, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 219, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 220, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 221, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 222, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* Page 223, 0 indirect uses */ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - /* - * Page 224, 510 indirect uses: - * F0000-FFEFF (astral_index), - * 100000-10FEFF (astral_index) - */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 225, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 226, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 227, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 228, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 229, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 230, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 231, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 232, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 233, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 234, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 235, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 236, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 237, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 238, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 239, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 240, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 241, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 242, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 243, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 244, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 245, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 246, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 247, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 248, 0 indirect uses */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - /* Page 249, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 250, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 251, 0 indirect uses */ - 1,1,1,1,1,1,1,29,29,29,29,29,29,29,29,29, - 29,29,29,1,1,1,1,1,29,29,29,29,29,4,5,4, - 4,4,4,4,4,4,4,4,4,25,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,4,4,4,4,4,29,4,29, - 4,4,29,4,4,29,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 252, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - /* Page 253, 0 indirect uses */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,20,21, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 29,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,26,28,29,29, - /* Page 254, 0 indirect uses */ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 24,24,24,24,24,24,24,20,21,24,29,29,29,29,29,29, - 5,5,5,5,5,5,5,29,29,29,29,29,29,29,29,29, - 24,19,19,18,18,20,21,20,21,20,21,20,21,20,21,20, - 21,20,21,20,21,24,24,20,21,24,24,24,24,18,18,18, - 24,24,24,29,24,24,24,24,19,20,21,20,21,20,21,24, - 24,24,25,19,25,25,25,29,24,26,24,24,29,29,29,29, - 4,4,4,4,4,29,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,29,15, - /* Page 255, 0 indirect uses */ - 29,24,24,24,26,24,24,24,20,21,24,25,24,19,24,24, - 8,8,8,8,8,8,8,8,8,8,24,24,25,25,25,24, - 24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,20,24,21,27,18, - 27,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,20,25,21,25,20, - 21,24,20,21,24,24,4,4,4,4,4,4,4,4,4,4, - 3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29, - 29,29,4,4,4,4,4,4,29,29,4,4,4,4,4,4, - 29,29,4,4,4,4,4,4,29,29,4,4,4,29,29,29, - 26,26,25,27,28,26,26,29,28,25,25,25,25,28,28,29, - 29,29,29,29,29,29,29,29,29,15,15,15,28,28,29,29 -#ifndef DISABLE_ASTRAL - , - /* Page 256, 1 indirect use: 10000-100FF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,29,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,4,4,29,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,29,29,29,29,29, - /* Page 257, 1 indirect use: 10100-101FF (astral_index) */ - 24,24,28,29,29,29,29,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,29,29,29,28,28,28,28,28,28,28,28,28, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,10,10,10,10,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,10,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,5,29,29, - /* Page 258, 1 indirect use: 10200-102FF (astral_index) */ - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 259, 1 indirect use: 10300-103FF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29, - 10,10,10,10,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,9,4,4,4,4,4,4,4,4,9,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,24, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,29,29,29,29,4,4,4,4,4,4,4,4, - 24,9,9,9,9,9,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 260, 1 indirect use: 10400-104FF (astral_index) */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 8,8,8,8,8,8,8,8,8,8,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 261, 1 indirect use: 10800-108FF (astral_index) */ - 4,4,4,4,4,4,29,29,4,29,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,29,4,4,29,29,29,4,29,29,4, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 262, 1 indirect use: 10900-109FF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,10,10,10,10,29,29,29,29,29,24, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,29,29,29,29,29,24, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 263, 1 indirect use: 10A00-10AFF (astral_index) */ - 4,5,5,5,29,5,5,29,29,29,29,29,5,5,5,5, - 4,4,4,4,29,4,4,4,29,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,29,29,29,29,5,5,5,29,29,29,29,5, - 10,10,10,10,10,10,10,10,29,29,29,29,29,29,29,29, - 24,24,24,24,24,24,24,24,24,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 264, 1 indirect use: 12300-123FF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 265, 1 indirect use: 12400-124FF (astral_index) */ - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,29,29,29,29,29,29,29,29,29,29,29,29,29, - 24,24,24,24,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 266, 1 indirect use: 1D000-1D0FF (astral_index) */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29, - /* Page 267, 1 indirect use: 1D100-1D1FF (astral_index) */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,29,29,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,6,6,5,5,5,28,28,28,6,6,6, - 6,6,6,15,15,15,15,15,15,15,15,5,5,5,5,5, - 5,5,5,28,28,5,5,5,5,5,5,5,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,5,5,5,5,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 268, 1 indirect use: 1D200-1D2FF (astral_index) */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,5,5,5,28,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 269, 1 indirect use: 1D300-1D3FF (astral_index) */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 270, 1 indirect use: 1D400-1D4FF (astral_index) */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, - 1,1,1,1,1,29,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,0,29,0,0, - 29,29,0,29,29,0,0,29,29,0,0,0,0,29,0,0, - 0,0,0,0,0,0,1,1,1,1,29,1,29,1,1,1, - 1,1,1,1,29,1,1,1,1,1,1,1,1,1,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - /* Page 271, 1 indirect use: 1D500-1D5FF (astral_index) */ - 1,1,1,1,0,0,29,0,0,0,0,29,29,0,0,0, - 0,0,0,0,0,29,0,0,0,0,0,0,0,29,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,0,0,29,0,0,0,0,29, - 0,0,0,0,0,29,0,29,29,29,0,0,0,0,0,0, - 0,29,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - /* Page 272, 1 indirect use: 1D600-1D6FF (astral_index) */ - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,29,29,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,25,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,25,1,1,1,1, - 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,25,1,1,1,1, - /* Page 273, 1 indirect use: 1D700-1D7FF (astral_index) */ - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,25,1,1,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,25,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,25, - 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,25,1,1,1,1,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,25,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,25,1,1,1,1,1,1,0,1,29,29,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - /* Page 274, 1 indirect use: 1F000-1F0FF (astral_index) */ - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,29,29,29,29, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 275, 1 indirect use: 2A600-2A6FF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 276, 1 indirect use: 2FA00-2FAFF (astral_index) */ - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 277, 1 indirect use: E0000-E00FF (astral_index) */ - 29,15,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* Page 278, 1 indirect use: E0100-E01FF (astral_index) */ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - /* - * Page 279, 2 indirect uses: - * FFF00-FFFFF (astral_index), - * 10FF00-10FFFF (astral_index) - */ - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,29,29 -#endif -}; - -#ifndef DISABLE_ASTRAL -static const guint16 CategoryData_v4_astral_index [4096] = -{ - /* 10000-100FF: page 256 */ - 0x100, - /* 10100-101FF: page 257 */ - 0x101, - /* 10200-102FF: page 258 */ - 0x102, - /* 10300-103FF: page 259 */ - 0x103, - /* 10400-104FF: page 260 */ - 0x104, - /* 10500-105FF: page 8 */ - 0x8, - /* 10600-106FF: page 8 */ - 0x8, - /* 10700-107FF: page 8 */ - 0x8, - /* 10800-108FF: page 261 */ - 0x105, - /* 10900-109FF: page 262 */ - 0x106, - /* 10A00-10AFF: page 263 */ - 0x107, - /* 10B00-10BFF: page 8 */ - 0x8, - /* 10C00-10CFF: page 8 */ - 0x8, - /* 10D00-10DFF: page 8 */ - 0x8, - /* 10E00-10EFF: page 8 */ - 0x8, - /* 10F00-10FFF: page 8 */ - 0x8, - /* 11000-110FF: page 8 */ - 0x8, - /* 11100-111FF: page 8 */ - 0x8, - /* 11200-112FF: page 8 */ - 0x8, - /* 11300-113FF: page 8 */ - 0x8, - /* 11400-114FF: page 8 */ - 0x8, - /* 11500-115FF: page 8 */ - 0x8, - /* 11600-116FF: page 8 */ - 0x8, - /* 11700-117FF: page 8 */ - 0x8, - /* 11800-118FF: page 8 */ - 0x8, - /* 11900-119FF: page 8 */ - 0x8, - /* 11A00-11AFF: page 8 */ - 0x8, - /* 11B00-11BFF: page 8 */ - 0x8, - /* 11C00-11CFF: page 8 */ - 0x8, - /* 11D00-11DFF: page 8 */ - 0x8, - /* 11E00-11EFF: page 8 */ - 0x8, - /* 11F00-11FFF: page 8 */ - 0x8, - /* 12000-120FF: page 21 */ - 0x15, - /* 12100-121FF: page 21 */ - 0x15, - /* 12200-122FF: page 21 */ - 0x15, - /* 12300-123FF: page 264 */ - 0x108, - /* 12400-124FF: page 265 */ - 0x109, - /* 12500-125FF: page 8 */ - 0x8, - /* 12600-126FF: page 8 */ - 0x8, - /* 12700-127FF: page 8 */ - 0x8, - /* 12800-128FF: page 8 */ - 0x8, - /* 12900-129FF: page 8 */ - 0x8, - /* 12A00-12AFF: page 8 */ - 0x8, - /* 12B00-12BFF: page 8 */ - 0x8, - /* 12C00-12CFF: page 8 */ - 0x8, - /* 12D00-12DFF: page 8 */ - 0x8, - /* 12E00-12EFF: page 8 */ - 0x8, - /* 12F00-12FFF: page 8 */ - 0x8, - /* 13000-130FF: page 8 */ - 0x8, - /* 13100-131FF: page 8 */ - 0x8, - /* 13200-132FF: page 8 */ - 0x8, - /* 13300-133FF: page 8 */ - 0x8, - /* 13400-134FF: page 8 */ - 0x8, - /* 13500-135FF: page 8 */ - 0x8, - /* 13600-136FF: page 8 */ - 0x8, - /* 13700-137FF: page 8 */ - 0x8, - /* 13800-138FF: page 8 */ - 0x8, - /* 13900-139FF: page 8 */ - 0x8, - /* 13A00-13AFF: page 8 */ - 0x8, - /* 13B00-13BFF: page 8 */ - 0x8, - /* 13C00-13CFF: page 8 */ - 0x8, - /* 13D00-13DFF: page 8 */ - 0x8, - /* 13E00-13EFF: page 8 */ - 0x8, - /* 13F00-13FFF: page 8 */ - 0x8, - /* 14000-140FF: page 8 */ - 0x8, - /* 14100-141FF: page 8 */ - 0x8, - /* 14200-142FF: page 8 */ - 0x8, - /* 14300-143FF: page 8 */ - 0x8, - /* 14400-144FF: page 8 */ - 0x8, - /* 14500-145FF: page 8 */ - 0x8, - /* 14600-146FF: page 8 */ - 0x8, - /* 14700-147FF: page 8 */ - 0x8, - /* 14800-148FF: page 8 */ - 0x8, - /* 14900-149FF: page 8 */ - 0x8, - /* 14A00-14AFF: page 8 */ - 0x8, - /* 14B00-14BFF: page 8 */ - 0x8, - /* 14C00-14CFF: page 8 */ - 0x8, - /* 14D00-14DFF: page 8 */ - 0x8, - /* 14E00-14EFF: page 8 */ - 0x8, - /* 14F00-14FFF: page 8 */ - 0x8, - /* 15000-150FF: page 8 */ - 0x8, - /* 15100-151FF: page 8 */ - 0x8, - /* 15200-152FF: page 8 */ - 0x8, - /* 15300-153FF: page 8 */ - 0x8, - /* 15400-154FF: page 8 */ - 0x8, - /* 15500-155FF: page 8 */ - 0x8, - /* 15600-156FF: page 8 */ - 0x8, - /* 15700-157FF: page 8 */ - 0x8, - /* 15800-158FF: page 8 */ - 0x8, - /* 15900-159FF: page 8 */ - 0x8, - /* 15A00-15AFF: page 8 */ - 0x8, - /* 15B00-15BFF: page 8 */ - 0x8, - /* 15C00-15CFF: page 8 */ - 0x8, - /* 15D00-15DFF: page 8 */ - 0x8, - /* 15E00-15EFF: page 8 */ - 0x8, - /* 15F00-15FFF: page 8 */ - 0x8, - /* 16000-160FF: page 8 */ - 0x8, - /* 16100-161FF: page 8 */ - 0x8, - /* 16200-162FF: page 8 */ - 0x8, - /* 16300-163FF: page 8 */ - 0x8, - /* 16400-164FF: page 8 */ - 0x8, - /* 16500-165FF: page 8 */ - 0x8, - /* 16600-166FF: page 8 */ - 0x8, - /* 16700-167FF: page 8 */ - 0x8, - /* 16800-168FF: page 8 */ - 0x8, - /* 16900-169FF: page 8 */ - 0x8, - /* 16A00-16AFF: page 8 */ - 0x8, - /* 16B00-16BFF: page 8 */ - 0x8, - /* 16C00-16CFF: page 8 */ - 0x8, - /* 16D00-16DFF: page 8 */ - 0x8, - /* 16E00-16EFF: page 8 */ - 0x8, - /* 16F00-16FFF: page 8 */ - 0x8, - /* 17000-170FF: page 8 */ - 0x8, - /* 17100-171FF: page 8 */ - 0x8, - /* 17200-172FF: page 8 */ - 0x8, - /* 17300-173FF: page 8 */ - 0x8, - /* 17400-174FF: page 8 */ - 0x8, - /* 17500-175FF: page 8 */ - 0x8, - /* 17600-176FF: page 8 */ - 0x8, - /* 17700-177FF: page 8 */ - 0x8, - /* 17800-178FF: page 8 */ - 0x8, - /* 17900-179FF: page 8 */ - 0x8, - /* 17A00-17AFF: page 8 */ - 0x8, - /* 17B00-17BFF: page 8 */ - 0x8, - /* 17C00-17CFF: page 8 */ - 0x8, - /* 17D00-17DFF: page 8 */ - 0x8, - /* 17E00-17EFF: page 8 */ - 0x8, - /* 17F00-17FFF: page 8 */ - 0x8, - /* 18000-180FF: page 8 */ - 0x8, - /* 18100-181FF: page 8 */ - 0x8, - /* 18200-182FF: page 8 */ - 0x8, - /* 18300-183FF: page 8 */ - 0x8, - /* 18400-184FF: page 8 */ - 0x8, - /* 18500-185FF: page 8 */ - 0x8, - /* 18600-186FF: page 8 */ - 0x8, - /* 18700-187FF: page 8 */ - 0x8, - /* 18800-188FF: page 8 */ - 0x8, - /* 18900-189FF: page 8 */ - 0x8, - /* 18A00-18AFF: page 8 */ - 0x8, - /* 18B00-18BFF: page 8 */ - 0x8, - /* 18C00-18CFF: page 8 */ - 0x8, - /* 18D00-18DFF: page 8 */ - 0x8, - /* 18E00-18EFF: page 8 */ - 0x8, - /* 18F00-18FFF: page 8 */ - 0x8, - /* 19000-190FF: page 8 */ - 0x8, - /* 19100-191FF: page 8 */ - 0x8, - /* 19200-192FF: page 8 */ - 0x8, - /* 19300-193FF: page 8 */ - 0x8, - /* 19400-194FF: page 8 */ - 0x8, - /* 19500-195FF: page 8 */ - 0x8, - /* 19600-196FF: page 8 */ - 0x8, - /* 19700-197FF: page 8 */ - 0x8, - /* 19800-198FF: page 8 */ - 0x8, - /* 19900-199FF: page 8 */ - 0x8, - /* 19A00-19AFF: page 8 */ - 0x8, - /* 19B00-19BFF: page 8 */ - 0x8, - /* 19C00-19CFF: page 8 */ - 0x8, - /* 19D00-19DFF: page 8 */ - 0x8, - /* 19E00-19EFF: page 8 */ - 0x8, - /* 19F00-19FFF: page 8 */ - 0x8, - /* 1A000-1A0FF: page 8 */ - 0x8, - /* 1A100-1A1FF: page 8 */ - 0x8, - /* 1A200-1A2FF: page 8 */ - 0x8, - /* 1A300-1A3FF: page 8 */ - 0x8, - /* 1A400-1A4FF: page 8 */ - 0x8, - /* 1A500-1A5FF: page 8 */ - 0x8, - /* 1A600-1A6FF: page 8 */ - 0x8, - /* 1A700-1A7FF: page 8 */ - 0x8, - /* 1A800-1A8FF: page 8 */ - 0x8, - /* 1A900-1A9FF: page 8 */ - 0x8, - /* 1AA00-1AAFF: page 8 */ - 0x8, - /* 1AB00-1ABFF: page 8 */ - 0x8, - /* 1AC00-1ACFF: page 8 */ - 0x8, - /* 1AD00-1ADFF: page 8 */ - 0x8, - /* 1AE00-1AEFF: page 8 */ - 0x8, - /* 1AF00-1AFFF: page 8 */ - 0x8, - /* 1B000-1B0FF: page 8 */ - 0x8, - /* 1B100-1B1FF: page 8 */ - 0x8, - /* 1B200-1B2FF: page 8 */ - 0x8, - /* 1B300-1B3FF: page 8 */ - 0x8, - /* 1B400-1B4FF: page 8 */ - 0x8, - /* 1B500-1B5FF: page 8 */ - 0x8, - /* 1B600-1B6FF: page 8 */ - 0x8, - /* 1B700-1B7FF: page 8 */ - 0x8, - /* 1B800-1B8FF: page 8 */ - 0x8, - /* 1B900-1B9FF: page 8 */ - 0x8, - /* 1BA00-1BAFF: page 8 */ - 0x8, - /* 1BB00-1BBFF: page 8 */ - 0x8, - /* 1BC00-1BCFF: page 8 */ - 0x8, - /* 1BD00-1BDFF: page 8 */ - 0x8, - /* 1BE00-1BEFF: page 8 */ - 0x8, - /* 1BF00-1BFFF: page 8 */ - 0x8, - /* 1C000-1C0FF: page 8 */ - 0x8, - /* 1C100-1C1FF: page 8 */ - 0x8, - /* 1C200-1C2FF: page 8 */ - 0x8, - /* 1C300-1C3FF: page 8 */ - 0x8, - /* 1C400-1C4FF: page 8 */ - 0x8, - /* 1C500-1C5FF: page 8 */ - 0x8, - /* 1C600-1C6FF: page 8 */ - 0x8, - /* 1C700-1C7FF: page 8 */ - 0x8, - /* 1C800-1C8FF: page 8 */ - 0x8, - /* 1C900-1C9FF: page 8 */ - 0x8, - /* 1CA00-1CAFF: page 8 */ - 0x8, - /* 1CB00-1CBFF: page 8 */ - 0x8, - /* 1CC00-1CCFF: page 8 */ - 0x8, - /* 1CD00-1CDFF: page 8 */ - 0x8, - /* 1CE00-1CEFF: page 8 */ - 0x8, - /* 1CF00-1CFFF: page 8 */ - 0x8, - /* 1D000-1D0FF: page 266 */ - 0x10A, - /* 1D100-1D1FF: page 267 */ - 0x10B, - /* 1D200-1D2FF: page 268 */ - 0x10C, - /* 1D300-1D3FF: page 269 */ - 0x10D, - /* 1D400-1D4FF: page 270 */ - 0x10E, - /* 1D500-1D5FF: page 271 */ - 0x10F, - /* 1D600-1D6FF: page 272 */ - 0x110, - /* 1D700-1D7FF: page 273 */ - 0x111, - /* 1D800-1D8FF: page 8 */ - 0x8, - /* 1D900-1D9FF: page 8 */ - 0x8, - /* 1DA00-1DAFF: page 8 */ - 0x8, - /* 1DB00-1DBFF: page 8 */ - 0x8, - /* 1DC00-1DCFF: page 8 */ - 0x8, - /* 1DD00-1DDFF: page 8 */ - 0x8, - /* 1DE00-1DEFF: page 8 */ - 0x8, - /* 1DF00-1DFFF: page 8 */ - 0x8, - /* 1E000-1E0FF: page 8 */ - 0x8, - /* 1E100-1E1FF: page 8 */ - 0x8, - /* 1E200-1E2FF: page 8 */ - 0x8, - /* 1E300-1E3FF: page 8 */ - 0x8, - /* 1E400-1E4FF: page 8 */ - 0x8, - /* 1E500-1E5FF: page 8 */ - 0x8, - /* 1E600-1E6FF: page 8 */ - 0x8, - /* 1E700-1E7FF: page 8 */ - 0x8, - /* 1E800-1E8FF: page 8 */ - 0x8, - /* 1E900-1E9FF: page 8 */ - 0x8, - /* 1EA00-1EAFF: page 8 */ - 0x8, - /* 1EB00-1EBFF: page 8 */ - 0x8, - /* 1EC00-1ECFF: page 8 */ - 0x8, - /* 1ED00-1EDFF: page 8 */ - 0x8, - /* 1EE00-1EEFF: page 8 */ - 0x8, - /* 1EF00-1EFFF: page 8 */ - 0x8, - /* 1F000-1F0FF: page 274 */ - 0x112, - /* 1F100-1F1FF: page 8 */ - 0x8, - /* 1F200-1F2FF: page 8 */ - 0x8, - /* 1F300-1F3FF: page 8 */ - 0x8, - /* 1F400-1F4FF: page 8 */ - 0x8, - /* 1F500-1F5FF: page 8 */ - 0x8, - /* 1F600-1F6FF: page 8 */ - 0x8, - /* 1F700-1F7FF: page 8 */ - 0x8, - /* 1F800-1F8FF: page 8 */ - 0x8, - /* 1F900-1F9FF: page 8 */ - 0x8, - /* 1FA00-1FAFF: page 8 */ - 0x8, - /* 1FB00-1FBFF: page 8 */ - 0x8, - /* 1FC00-1FCFF: page 8 */ - 0x8, - /* 1FD00-1FDFF: page 8 */ - 0x8, - /* 1FE00-1FEFF: page 8 */ - 0x8, - /* 1FF00-1FFFF: page 8 */ - 0x8, - /* 20000-200FF: page 21 */ - 0x15, - /* 20100-201FF: page 21 */ - 0x15, - /* 20200-202FF: page 21 */ - 0x15, - /* 20300-203FF: page 21 */ - 0x15, - /* 20400-204FF: page 21 */ - 0x15, - /* 20500-205FF: page 21 */ - 0x15, - /* 20600-206FF: page 21 */ - 0x15, - /* 20700-207FF: page 21 */ - 0x15, - /* 20800-208FF: page 21 */ - 0x15, - /* 20900-209FF: page 21 */ - 0x15, - /* 20A00-20AFF: page 21 */ - 0x15, - /* 20B00-20BFF: page 21 */ - 0x15, - /* 20C00-20CFF: page 21 */ - 0x15, - /* 20D00-20DFF: page 21 */ - 0x15, - /* 20E00-20EFF: page 21 */ - 0x15, - /* 20F00-20FFF: page 21 */ - 0x15, - /* 21000-210FF: page 21 */ - 0x15, - /* 21100-211FF: page 21 */ - 0x15, - /* 21200-212FF: page 21 */ - 0x15, - /* 21300-213FF: page 21 */ - 0x15, - /* 21400-214FF: page 21 */ - 0x15, - /* 21500-215FF: page 21 */ - 0x15, - /* 21600-216FF: page 21 */ - 0x15, - /* 21700-217FF: page 21 */ - 0x15, - /* 21800-218FF: page 21 */ - 0x15, - /* 21900-219FF: page 21 */ - 0x15, - /* 21A00-21AFF: page 21 */ - 0x15, - /* 21B00-21BFF: page 21 */ - 0x15, - /* 21C00-21CFF: page 21 */ - 0x15, - /* 21D00-21DFF: page 21 */ - 0x15, - /* 21E00-21EFF: page 21 */ - 0x15, - /* 21F00-21FFF: page 21 */ - 0x15, - /* 22000-220FF: page 21 */ - 0x15, - /* 22100-221FF: page 21 */ - 0x15, - /* 22200-222FF: page 21 */ - 0x15, - /* 22300-223FF: page 21 */ - 0x15, - /* 22400-224FF: page 21 */ - 0x15, - /* 22500-225FF: page 21 */ - 0x15, - /* 22600-226FF: page 21 */ - 0x15, - /* 22700-227FF: page 21 */ - 0x15, - /* 22800-228FF: page 21 */ - 0x15, - /* 22900-229FF: page 21 */ - 0x15, - /* 22A00-22AFF: page 21 */ - 0x15, - /* 22B00-22BFF: page 21 */ - 0x15, - /* 22C00-22CFF: page 21 */ - 0x15, - /* 22D00-22DFF: page 21 */ - 0x15, - /* 22E00-22EFF: page 21 */ - 0x15, - /* 22F00-22FFF: page 21 */ - 0x15, - /* 23000-230FF: page 21 */ - 0x15, - /* 23100-231FF: page 21 */ - 0x15, - /* 23200-232FF: page 21 */ - 0x15, - /* 23300-233FF: page 21 */ - 0x15, - /* 23400-234FF: page 21 */ - 0x15, - /* 23500-235FF: page 21 */ - 0x15, - /* 23600-236FF: page 21 */ - 0x15, - /* 23700-237FF: page 21 */ - 0x15, - /* 23800-238FF: page 21 */ - 0x15, - /* 23900-239FF: page 21 */ - 0x15, - /* 23A00-23AFF: page 21 */ - 0x15, - /* 23B00-23BFF: page 21 */ - 0x15, - /* 23C00-23CFF: page 21 */ - 0x15, - /* 23D00-23DFF: page 21 */ - 0x15, - /* 23E00-23EFF: page 21 */ - 0x15, - /* 23F00-23FFF: page 21 */ - 0x15, - /* 24000-240FF: page 21 */ - 0x15, - /* 24100-241FF: page 21 */ - 0x15, - /* 24200-242FF: page 21 */ - 0x15, - /* 24300-243FF: page 21 */ - 0x15, - /* 24400-244FF: page 21 */ - 0x15, - /* 24500-245FF: page 21 */ - 0x15, - /* 24600-246FF: page 21 */ - 0x15, - /* 24700-247FF: page 21 */ - 0x15, - /* 24800-248FF: page 21 */ - 0x15, - /* 24900-249FF: page 21 */ - 0x15, - /* 24A00-24AFF: page 21 */ - 0x15, - /* 24B00-24BFF: page 21 */ - 0x15, - /* 24C00-24CFF: page 21 */ - 0x15, - /* 24D00-24DFF: page 21 */ - 0x15, - /* 24E00-24EFF: page 21 */ - 0x15, - /* 24F00-24FFF: page 21 */ - 0x15, - /* 25000-250FF: page 21 */ - 0x15, - /* 25100-251FF: page 21 */ - 0x15, - /* 25200-252FF: page 21 */ - 0x15, - /* 25300-253FF: page 21 */ - 0x15, - /* 25400-254FF: page 21 */ - 0x15, - /* 25500-255FF: page 21 */ - 0x15, - /* 25600-256FF: page 21 */ - 0x15, - /* 25700-257FF: page 21 */ - 0x15, - /* 25800-258FF: page 21 */ - 0x15, - /* 25900-259FF: page 21 */ - 0x15, - /* 25A00-25AFF: page 21 */ - 0x15, - /* 25B00-25BFF: page 21 */ - 0x15, - /* 25C00-25CFF: page 21 */ - 0x15, - /* 25D00-25DFF: page 21 */ - 0x15, - /* 25E00-25EFF: page 21 */ - 0x15, - /* 25F00-25FFF: page 21 */ - 0x15, - /* 26000-260FF: page 21 */ - 0x15, - /* 26100-261FF: page 21 */ - 0x15, - /* 26200-262FF: page 21 */ - 0x15, - /* 26300-263FF: page 21 */ - 0x15, - /* 26400-264FF: page 21 */ - 0x15, - /* 26500-265FF: page 21 */ - 0x15, - /* 26600-266FF: page 21 */ - 0x15, - /* 26700-267FF: page 21 */ - 0x15, - /* 26800-268FF: page 21 */ - 0x15, - /* 26900-269FF: page 21 */ - 0x15, - /* 26A00-26AFF: page 21 */ - 0x15, - /* 26B00-26BFF: page 21 */ - 0x15, - /* 26C00-26CFF: page 21 */ - 0x15, - /* 26D00-26DFF: page 21 */ - 0x15, - /* 26E00-26EFF: page 21 */ - 0x15, - /* 26F00-26FFF: page 21 */ - 0x15, - /* 27000-270FF: page 21 */ - 0x15, - /* 27100-271FF: page 21 */ - 0x15, - /* 27200-272FF: page 21 */ - 0x15, - /* 27300-273FF: page 21 */ - 0x15, - /* 27400-274FF: page 21 */ - 0x15, - /* 27500-275FF: page 21 */ - 0x15, - /* 27600-276FF: page 21 */ - 0x15, - /* 27700-277FF: page 21 */ - 0x15, - /* 27800-278FF: page 21 */ - 0x15, - /* 27900-279FF: page 21 */ - 0x15, - /* 27A00-27AFF: page 21 */ - 0x15, - /* 27B00-27BFF: page 21 */ - 0x15, - /* 27C00-27CFF: page 21 */ - 0x15, - /* 27D00-27DFF: page 21 */ - 0x15, - /* 27E00-27EFF: page 21 */ - 0x15, - /* 27F00-27FFF: page 21 */ - 0x15, - /* 28000-280FF: page 21 */ - 0x15, - /* 28100-281FF: page 21 */ - 0x15, - /* 28200-282FF: page 21 */ - 0x15, - /* 28300-283FF: page 21 */ - 0x15, - /* 28400-284FF: page 21 */ - 0x15, - /* 28500-285FF: page 21 */ - 0x15, - /* 28600-286FF: page 21 */ - 0x15, - /* 28700-287FF: page 21 */ - 0x15, - /* 28800-288FF: page 21 */ - 0x15, - /* 28900-289FF: page 21 */ - 0x15, - /* 28A00-28AFF: page 21 */ - 0x15, - /* 28B00-28BFF: page 21 */ - 0x15, - /* 28C00-28CFF: page 21 */ - 0x15, - /* 28D00-28DFF: page 21 */ - 0x15, - /* 28E00-28EFF: page 21 */ - 0x15, - /* 28F00-28FFF: page 21 */ - 0x15, - /* 29000-290FF: page 21 */ - 0x15, - /* 29100-291FF: page 21 */ - 0x15, - /* 29200-292FF: page 21 */ - 0x15, - /* 29300-293FF: page 21 */ - 0x15, - /* 29400-294FF: page 21 */ - 0x15, - /* 29500-295FF: page 21 */ - 0x15, - /* 29600-296FF: page 21 */ - 0x15, - /* 29700-297FF: page 21 */ - 0x15, - /* 29800-298FF: page 21 */ - 0x15, - /* 29900-299FF: page 21 */ - 0x15, - /* 29A00-29AFF: page 21 */ - 0x15, - /* 29B00-29BFF: page 21 */ - 0x15, - /* 29C00-29CFF: page 21 */ - 0x15, - /* 29D00-29DFF: page 21 */ - 0x15, - /* 29E00-29EFF: page 21 */ - 0x15, - /* 29F00-29FFF: page 21 */ - 0x15, - /* 2A000-2A0FF: page 21 */ - 0x15, - /* 2A100-2A1FF: page 21 */ - 0x15, - /* 2A200-2A2FF: page 21 */ - 0x15, - /* 2A300-2A3FF: page 21 */ - 0x15, - /* 2A400-2A4FF: page 21 */ - 0x15, - /* 2A500-2A5FF: page 21 */ - 0x15, - /* 2A600-2A6FF: page 275 */ - 0x113, - /* 2A700-2A7FF: page 8 */ - 0x8, - /* 2A800-2A8FF: page 8 */ - 0x8, - /* 2A900-2A9FF: page 8 */ - 0x8, - /* 2AA00-2AAFF: page 8 */ - 0x8, - /* 2AB00-2ABFF: page 8 */ - 0x8, - /* 2AC00-2ACFF: page 8 */ - 0x8, - /* 2AD00-2ADFF: page 8 */ - 0x8, - /* 2AE00-2AEFF: page 8 */ - 0x8, - /* 2AF00-2AFFF: page 8 */ - 0x8, - /* 2B000-2B0FF: page 8 */ - 0x8, - /* 2B100-2B1FF: page 8 */ - 0x8, - /* 2B200-2B2FF: page 8 */ - 0x8, - /* 2B300-2B3FF: page 8 */ - 0x8, - /* 2B400-2B4FF: page 8 */ - 0x8, - /* 2B500-2B5FF: page 8 */ - 0x8, - /* 2B600-2B6FF: page 8 */ - 0x8, - /* 2B700-2B7FF: page 8 */ - 0x8, - /* 2B800-2B8FF: page 8 */ - 0x8, - /* 2B900-2B9FF: page 8 */ - 0x8, - /* 2BA00-2BAFF: page 8 */ - 0x8, - /* 2BB00-2BBFF: page 8 */ - 0x8, - /* 2BC00-2BCFF: page 8 */ - 0x8, - /* 2BD00-2BDFF: page 8 */ - 0x8, - /* 2BE00-2BEFF: page 8 */ - 0x8, - /* 2BF00-2BFFF: page 8 */ - 0x8, - /* 2C000-2C0FF: page 8 */ - 0x8, - /* 2C100-2C1FF: page 8 */ - 0x8, - /* 2C200-2C2FF: page 8 */ - 0x8, - /* 2C300-2C3FF: page 8 */ - 0x8, - /* 2C400-2C4FF: page 8 */ - 0x8, - /* 2C500-2C5FF: page 8 */ - 0x8, - /* 2C600-2C6FF: page 8 */ - 0x8, - /* 2C700-2C7FF: page 8 */ - 0x8, - /* 2C800-2C8FF: page 8 */ - 0x8, - /* 2C900-2C9FF: page 8 */ - 0x8, - /* 2CA00-2CAFF: page 8 */ - 0x8, - /* 2CB00-2CBFF: page 8 */ - 0x8, - /* 2CC00-2CCFF: page 8 */ - 0x8, - /* 2CD00-2CDFF: page 8 */ - 0x8, - /* 2CE00-2CEFF: page 8 */ - 0x8, - /* 2CF00-2CFFF: page 8 */ - 0x8, - /* 2D000-2D0FF: page 8 */ - 0x8, - /* 2D100-2D1FF: page 8 */ - 0x8, - /* 2D200-2D2FF: page 8 */ - 0x8, - /* 2D300-2D3FF: page 8 */ - 0x8, - /* 2D400-2D4FF: page 8 */ - 0x8, - /* 2D500-2D5FF: page 8 */ - 0x8, - /* 2D600-2D6FF: page 8 */ - 0x8, - /* 2D700-2D7FF: page 8 */ - 0x8, - /* 2D800-2D8FF: page 8 */ - 0x8, - /* 2D900-2D9FF: page 8 */ - 0x8, - /* 2DA00-2DAFF: page 8 */ - 0x8, - /* 2DB00-2DBFF: page 8 */ - 0x8, - /* 2DC00-2DCFF: page 8 */ - 0x8, - /* 2DD00-2DDFF: page 8 */ - 0x8, - /* 2DE00-2DEFF: page 8 */ - 0x8, - /* 2DF00-2DFFF: page 8 */ - 0x8, - /* 2E000-2E0FF: page 8 */ - 0x8, - /* 2E100-2E1FF: page 8 */ - 0x8, - /* 2E200-2E2FF: page 8 */ - 0x8, - /* 2E300-2E3FF: page 8 */ - 0x8, - /* 2E400-2E4FF: page 8 */ - 0x8, - /* 2E500-2E5FF: page 8 */ - 0x8, - /* 2E600-2E6FF: page 8 */ - 0x8, - /* 2E700-2E7FF: page 8 */ - 0x8, - /* 2E800-2E8FF: page 8 */ - 0x8, - /* 2E900-2E9FF: page 8 */ - 0x8, - /* 2EA00-2EAFF: page 8 */ - 0x8, - /* 2EB00-2EBFF: page 8 */ - 0x8, - /* 2EC00-2ECFF: page 8 */ - 0x8, - /* 2ED00-2EDFF: page 8 */ - 0x8, - /* 2EE00-2EEFF: page 8 */ - 0x8, - /* 2EF00-2EFFF: page 8 */ - 0x8, - /* 2F000-2F0FF: page 8 */ - 0x8, - /* 2F100-2F1FF: page 8 */ - 0x8, - /* 2F200-2F2FF: page 8 */ - 0x8, - /* 2F300-2F3FF: page 8 */ - 0x8, - /* 2F400-2F4FF: page 8 */ - 0x8, - /* 2F500-2F5FF: page 8 */ - 0x8, - /* 2F600-2F6FF: page 8 */ - 0x8, - /* 2F700-2F7FF: page 8 */ - 0x8, - /* 2F800-2F8FF: page 21 */ - 0x15, - /* 2F900-2F9FF: page 21 */ - 0x15, - /* 2FA00-2FAFF: page 276 */ - 0x114, - /* 2FB00-2FBFF: page 8 */ - 0x8, - /* 2FC00-2FCFF: page 8 */ - 0x8, - /* 2FD00-2FDFF: page 8 */ - 0x8, - /* 2FE00-2FEFF: page 8 */ - 0x8, - /* 2FF00-2FFFF: page 8 */ - 0x8, - /* 30000-300FF: page 8 */ - 0x8, - /* 30100-301FF: page 8 */ - 0x8, - /* 30200-302FF: page 8 */ - 0x8, - /* 30300-303FF: page 8 */ - 0x8, - /* 30400-304FF: page 8 */ - 0x8, - /* 30500-305FF: page 8 */ - 0x8, - /* 30600-306FF: page 8 */ - 0x8, - /* 30700-307FF: page 8 */ - 0x8, - /* 30800-308FF: page 8 */ - 0x8, - /* 30900-309FF: page 8 */ - 0x8, - /* 30A00-30AFF: page 8 */ - 0x8, - /* 30B00-30BFF: page 8 */ - 0x8, - /* 30C00-30CFF: page 8 */ - 0x8, - /* 30D00-30DFF: page 8 */ - 0x8, - /* 30E00-30EFF: page 8 */ - 0x8, - /* 30F00-30FFF: page 8 */ - 0x8, - /* 31000-310FF: page 8 */ - 0x8, - /* 31100-311FF: page 8 */ - 0x8, - /* 31200-312FF: page 8 */ - 0x8, - /* 31300-313FF: page 8 */ - 0x8, - /* 31400-314FF: page 8 */ - 0x8, - /* 31500-315FF: page 8 */ - 0x8, - /* 31600-316FF: page 8 */ - 0x8, - /* 31700-317FF: page 8 */ - 0x8, - /* 31800-318FF: page 8 */ - 0x8, - /* 31900-319FF: page 8 */ - 0x8, - /* 31A00-31AFF: page 8 */ - 0x8, - /* 31B00-31BFF: page 8 */ - 0x8, - /* 31C00-31CFF: page 8 */ - 0x8, - /* 31D00-31DFF: page 8 */ - 0x8, - /* 31E00-31EFF: page 8 */ - 0x8, - /* 31F00-31FFF: page 8 */ - 0x8, - /* 32000-320FF: page 8 */ - 0x8, - /* 32100-321FF: page 8 */ - 0x8, - /* 32200-322FF: page 8 */ - 0x8, - /* 32300-323FF: page 8 */ - 0x8, - /* 32400-324FF: page 8 */ - 0x8, - /* 32500-325FF: page 8 */ - 0x8, - /* 32600-326FF: page 8 */ - 0x8, - /* 32700-327FF: page 8 */ - 0x8, - /* 32800-328FF: page 8 */ - 0x8, - /* 32900-329FF: page 8 */ - 0x8, - /* 32A00-32AFF: page 8 */ - 0x8, - /* 32B00-32BFF: page 8 */ - 0x8, - /* 32C00-32CFF: page 8 */ - 0x8, - /* 32D00-32DFF: page 8 */ - 0x8, - /* 32E00-32EFF: page 8 */ - 0x8, - /* 32F00-32FFF: page 8 */ - 0x8, - /* 33000-330FF: page 8 */ - 0x8, - /* 33100-331FF: page 8 */ - 0x8, - /* 33200-332FF: page 8 */ - 0x8, - /* 33300-333FF: page 8 */ - 0x8, - /* 33400-334FF: page 8 */ - 0x8, - /* 33500-335FF: page 8 */ - 0x8, - /* 33600-336FF: page 8 */ - 0x8, - /* 33700-337FF: page 8 */ - 0x8, - /* 33800-338FF: page 8 */ - 0x8, - /* 33900-339FF: page 8 */ - 0x8, - /* 33A00-33AFF: page 8 */ - 0x8, - /* 33B00-33BFF: page 8 */ - 0x8, - /* 33C00-33CFF: page 8 */ - 0x8, - /* 33D00-33DFF: page 8 */ - 0x8, - /* 33E00-33EFF: page 8 */ - 0x8, - /* 33F00-33FFF: page 8 */ - 0x8, - /* 34000-340FF: page 8 */ - 0x8, - /* 34100-341FF: page 8 */ - 0x8, - /* 34200-342FF: page 8 */ - 0x8, - /* 34300-343FF: page 8 */ - 0x8, - /* 34400-344FF: page 8 */ - 0x8, - /* 34500-345FF: page 8 */ - 0x8, - /* 34600-346FF: page 8 */ - 0x8, - /* 34700-347FF: page 8 */ - 0x8, - /* 34800-348FF: page 8 */ - 0x8, - /* 34900-349FF: page 8 */ - 0x8, - /* 34A00-34AFF: page 8 */ - 0x8, - /* 34B00-34BFF: page 8 */ - 0x8, - /* 34C00-34CFF: page 8 */ - 0x8, - /* 34D00-34DFF: page 8 */ - 0x8, - /* 34E00-34EFF: page 8 */ - 0x8, - /* 34F00-34FFF: page 8 */ - 0x8, - /* 35000-350FF: page 8 */ - 0x8, - /* 35100-351FF: page 8 */ - 0x8, - /* 35200-352FF: page 8 */ - 0x8, - /* 35300-353FF: page 8 */ - 0x8, - /* 35400-354FF: page 8 */ - 0x8, - /* 35500-355FF: page 8 */ - 0x8, - /* 35600-356FF: page 8 */ - 0x8, - /* 35700-357FF: page 8 */ - 0x8, - /* 35800-358FF: page 8 */ - 0x8, - /* 35900-359FF: page 8 */ - 0x8, - /* 35A00-35AFF: page 8 */ - 0x8, - /* 35B00-35BFF: page 8 */ - 0x8, - /* 35C00-35CFF: page 8 */ - 0x8, - /* 35D00-35DFF: page 8 */ - 0x8, - /* 35E00-35EFF: page 8 */ - 0x8, - /* 35F00-35FFF: page 8 */ - 0x8, - /* 36000-360FF: page 8 */ - 0x8, - /* 36100-361FF: page 8 */ - 0x8, - /* 36200-362FF: page 8 */ - 0x8, - /* 36300-363FF: page 8 */ - 0x8, - /* 36400-364FF: page 8 */ - 0x8, - /* 36500-365FF: page 8 */ - 0x8, - /* 36600-366FF: page 8 */ - 0x8, - /* 36700-367FF: page 8 */ - 0x8, - /* 36800-368FF: page 8 */ - 0x8, - /* 36900-369FF: page 8 */ - 0x8, - /* 36A00-36AFF: page 8 */ - 0x8, - /* 36B00-36BFF: page 8 */ - 0x8, - /* 36C00-36CFF: page 8 */ - 0x8, - /* 36D00-36DFF: page 8 */ - 0x8, - /* 36E00-36EFF: page 8 */ - 0x8, - /* 36F00-36FFF: page 8 */ - 0x8, - /* 37000-370FF: page 8 */ - 0x8, - /* 37100-371FF: page 8 */ - 0x8, - /* 37200-372FF: page 8 */ - 0x8, - /* 37300-373FF: page 8 */ - 0x8, - /* 37400-374FF: page 8 */ - 0x8, - /* 37500-375FF: page 8 */ - 0x8, - /* 37600-376FF: page 8 */ - 0x8, - /* 37700-377FF: page 8 */ - 0x8, - /* 37800-378FF: page 8 */ - 0x8, - /* 37900-379FF: page 8 */ - 0x8, - /* 37A00-37AFF: page 8 */ - 0x8, - /* 37B00-37BFF: page 8 */ - 0x8, - /* 37C00-37CFF: page 8 */ - 0x8, - /* 37D00-37DFF: page 8 */ - 0x8, - /* 37E00-37EFF: page 8 */ - 0x8, - /* 37F00-37FFF: page 8 */ - 0x8, - /* 38000-380FF: page 8 */ - 0x8, - /* 38100-381FF: page 8 */ - 0x8, - /* 38200-382FF: page 8 */ - 0x8, - /* 38300-383FF: page 8 */ - 0x8, - /* 38400-384FF: page 8 */ - 0x8, - /* 38500-385FF: page 8 */ - 0x8, - /* 38600-386FF: page 8 */ - 0x8, - /* 38700-387FF: page 8 */ - 0x8, - /* 38800-388FF: page 8 */ - 0x8, - /* 38900-389FF: page 8 */ - 0x8, - /* 38A00-38AFF: page 8 */ - 0x8, - /* 38B00-38BFF: page 8 */ - 0x8, - /* 38C00-38CFF: page 8 */ - 0x8, - /* 38D00-38DFF: page 8 */ - 0x8, - /* 38E00-38EFF: page 8 */ - 0x8, - /* 38F00-38FFF: page 8 */ - 0x8, - /* 39000-390FF: page 8 */ - 0x8, - /* 39100-391FF: page 8 */ - 0x8, - /* 39200-392FF: page 8 */ - 0x8, - /* 39300-393FF: page 8 */ - 0x8, - /* 39400-394FF: page 8 */ - 0x8, - /* 39500-395FF: page 8 */ - 0x8, - /* 39600-396FF: page 8 */ - 0x8, - /* 39700-397FF: page 8 */ - 0x8, - /* 39800-398FF: page 8 */ - 0x8, - /* 39900-399FF: page 8 */ - 0x8, - /* 39A00-39AFF: page 8 */ - 0x8, - /* 39B00-39BFF: page 8 */ - 0x8, - /* 39C00-39CFF: page 8 */ - 0x8, - /* 39D00-39DFF: page 8 */ - 0x8, - /* 39E00-39EFF: page 8 */ - 0x8, - /* 39F00-39FFF: page 8 */ - 0x8, - /* 3A000-3A0FF: page 8 */ - 0x8, - /* 3A100-3A1FF: page 8 */ - 0x8, - /* 3A200-3A2FF: page 8 */ - 0x8, - /* 3A300-3A3FF: page 8 */ - 0x8, - /* 3A400-3A4FF: page 8 */ - 0x8, - /* 3A500-3A5FF: page 8 */ - 0x8, - /* 3A600-3A6FF: page 8 */ - 0x8, - /* 3A700-3A7FF: page 8 */ - 0x8, - /* 3A800-3A8FF: page 8 */ - 0x8, - /* 3A900-3A9FF: page 8 */ - 0x8, - /* 3AA00-3AAFF: page 8 */ - 0x8, - /* 3AB00-3ABFF: page 8 */ - 0x8, - /* 3AC00-3ACFF: page 8 */ - 0x8, - /* 3AD00-3ADFF: page 8 */ - 0x8, - /* 3AE00-3AEFF: page 8 */ - 0x8, - /* 3AF00-3AFFF: page 8 */ - 0x8, - /* 3B000-3B0FF: page 8 */ - 0x8, - /* 3B100-3B1FF: page 8 */ - 0x8, - /* 3B200-3B2FF: page 8 */ - 0x8, - /* 3B300-3B3FF: page 8 */ - 0x8, - /* 3B400-3B4FF: page 8 */ - 0x8, - /* 3B500-3B5FF: page 8 */ - 0x8, - /* 3B600-3B6FF: page 8 */ - 0x8, - /* 3B700-3B7FF: page 8 */ - 0x8, - /* 3B800-3B8FF: page 8 */ - 0x8, - /* 3B900-3B9FF: page 8 */ - 0x8, - /* 3BA00-3BAFF: page 8 */ - 0x8, - /* 3BB00-3BBFF: page 8 */ - 0x8, - /* 3BC00-3BCFF: page 8 */ - 0x8, - /* 3BD00-3BDFF: page 8 */ - 0x8, - /* 3BE00-3BEFF: page 8 */ - 0x8, - /* 3BF00-3BFFF: page 8 */ - 0x8, - /* 3C000-3C0FF: page 8 */ - 0x8, - /* 3C100-3C1FF: page 8 */ - 0x8, - /* 3C200-3C2FF: page 8 */ - 0x8, - /* 3C300-3C3FF: page 8 */ - 0x8, - /* 3C400-3C4FF: page 8 */ - 0x8, - /* 3C500-3C5FF: page 8 */ - 0x8, - /* 3C600-3C6FF: page 8 */ - 0x8, - /* 3C700-3C7FF: page 8 */ - 0x8, - /* 3C800-3C8FF: page 8 */ - 0x8, - /* 3C900-3C9FF: page 8 */ - 0x8, - /* 3CA00-3CAFF: page 8 */ - 0x8, - /* 3CB00-3CBFF: page 8 */ - 0x8, - /* 3CC00-3CCFF: page 8 */ - 0x8, - /* 3CD00-3CDFF: page 8 */ - 0x8, - /* 3CE00-3CEFF: page 8 */ - 0x8, - /* 3CF00-3CFFF: page 8 */ - 0x8, - /* 3D000-3D0FF: page 8 */ - 0x8, - /* 3D100-3D1FF: page 8 */ - 0x8, - /* 3D200-3D2FF: page 8 */ - 0x8, - /* 3D300-3D3FF: page 8 */ - 0x8, - /* 3D400-3D4FF: page 8 */ - 0x8, - /* 3D500-3D5FF: page 8 */ - 0x8, - /* 3D600-3D6FF: page 8 */ - 0x8, - /* 3D700-3D7FF: page 8 */ - 0x8, - /* 3D800-3D8FF: page 8 */ - 0x8, - /* 3D900-3D9FF: page 8 */ - 0x8, - /* 3DA00-3DAFF: page 8 */ - 0x8, - /* 3DB00-3DBFF: page 8 */ - 0x8, - /* 3DC00-3DCFF: page 8 */ - 0x8, - /* 3DD00-3DDFF: page 8 */ - 0x8, - /* 3DE00-3DEFF: page 8 */ - 0x8, - /* 3DF00-3DFFF: page 8 */ - 0x8, - /* 3E000-3E0FF: page 8 */ - 0x8, - /* 3E100-3E1FF: page 8 */ - 0x8, - /* 3E200-3E2FF: page 8 */ - 0x8, - /* 3E300-3E3FF: page 8 */ - 0x8, - /* 3E400-3E4FF: page 8 */ - 0x8, - /* 3E500-3E5FF: page 8 */ - 0x8, - /* 3E600-3E6FF: page 8 */ - 0x8, - /* 3E700-3E7FF: page 8 */ - 0x8, - /* 3E800-3E8FF: page 8 */ - 0x8, - /* 3E900-3E9FF: page 8 */ - 0x8, - /* 3EA00-3EAFF: page 8 */ - 0x8, - /* 3EB00-3EBFF: page 8 */ - 0x8, - /* 3EC00-3ECFF: page 8 */ - 0x8, - /* 3ED00-3EDFF: page 8 */ - 0x8, - /* 3EE00-3EEFF: page 8 */ - 0x8, - /* 3EF00-3EFFF: page 8 */ - 0x8, - /* 3F000-3F0FF: page 8 */ - 0x8, - /* 3F100-3F1FF: page 8 */ - 0x8, - /* 3F200-3F2FF: page 8 */ - 0x8, - /* 3F300-3F3FF: page 8 */ - 0x8, - /* 3F400-3F4FF: page 8 */ - 0x8, - /* 3F500-3F5FF: page 8 */ - 0x8, - /* 3F600-3F6FF: page 8 */ - 0x8, - /* 3F700-3F7FF: page 8 */ - 0x8, - /* 3F800-3F8FF: page 8 */ - 0x8, - /* 3F900-3F9FF: page 8 */ - 0x8, - /* 3FA00-3FAFF: page 8 */ - 0x8, - /* 3FB00-3FBFF: page 8 */ - 0x8, - /* 3FC00-3FCFF: page 8 */ - 0x8, - /* 3FD00-3FDFF: page 8 */ - 0x8, - /* 3FE00-3FEFF: page 8 */ - 0x8, - /* 3FF00-3FFFF: page 8 */ - 0x8, - /* 40000-400FF: page 8 */ - 0x8, - /* 40100-401FF: page 8 */ - 0x8, - /* 40200-402FF: page 8 */ - 0x8, - /* 40300-403FF: page 8 */ - 0x8, - /* 40400-404FF: page 8 */ - 0x8, - /* 40500-405FF: page 8 */ - 0x8, - /* 40600-406FF: page 8 */ - 0x8, - /* 40700-407FF: page 8 */ - 0x8, - /* 40800-408FF: page 8 */ - 0x8, - /* 40900-409FF: page 8 */ - 0x8, - /* 40A00-40AFF: page 8 */ - 0x8, - /* 40B00-40BFF: page 8 */ - 0x8, - /* 40C00-40CFF: page 8 */ - 0x8, - /* 40D00-40DFF: page 8 */ - 0x8, - /* 40E00-40EFF: page 8 */ - 0x8, - /* 40F00-40FFF: page 8 */ - 0x8, - /* 41000-410FF: page 8 */ - 0x8, - /* 41100-411FF: page 8 */ - 0x8, - /* 41200-412FF: page 8 */ - 0x8, - /* 41300-413FF: page 8 */ - 0x8, - /* 41400-414FF: page 8 */ - 0x8, - /* 41500-415FF: page 8 */ - 0x8, - /* 41600-416FF: page 8 */ - 0x8, - /* 41700-417FF: page 8 */ - 0x8, - /* 41800-418FF: page 8 */ - 0x8, - /* 41900-419FF: page 8 */ - 0x8, - /* 41A00-41AFF: page 8 */ - 0x8, - /* 41B00-41BFF: page 8 */ - 0x8, - /* 41C00-41CFF: page 8 */ - 0x8, - /* 41D00-41DFF: page 8 */ - 0x8, - /* 41E00-41EFF: page 8 */ - 0x8, - /* 41F00-41FFF: page 8 */ - 0x8, - /* 42000-420FF: page 8 */ - 0x8, - /* 42100-421FF: page 8 */ - 0x8, - /* 42200-422FF: page 8 */ - 0x8, - /* 42300-423FF: page 8 */ - 0x8, - /* 42400-424FF: page 8 */ - 0x8, - /* 42500-425FF: page 8 */ - 0x8, - /* 42600-426FF: page 8 */ - 0x8, - /* 42700-427FF: page 8 */ - 0x8, - /* 42800-428FF: page 8 */ - 0x8, - /* 42900-429FF: page 8 */ - 0x8, - /* 42A00-42AFF: page 8 */ - 0x8, - /* 42B00-42BFF: page 8 */ - 0x8, - /* 42C00-42CFF: page 8 */ - 0x8, - /* 42D00-42DFF: page 8 */ - 0x8, - /* 42E00-42EFF: page 8 */ - 0x8, - /* 42F00-42FFF: page 8 */ - 0x8, - /* 43000-430FF: page 8 */ - 0x8, - /* 43100-431FF: page 8 */ - 0x8, - /* 43200-432FF: page 8 */ - 0x8, - /* 43300-433FF: page 8 */ - 0x8, - /* 43400-434FF: page 8 */ - 0x8, - /* 43500-435FF: page 8 */ - 0x8, - /* 43600-436FF: page 8 */ - 0x8, - /* 43700-437FF: page 8 */ - 0x8, - /* 43800-438FF: page 8 */ - 0x8, - /* 43900-439FF: page 8 */ - 0x8, - /* 43A00-43AFF: page 8 */ - 0x8, - /* 43B00-43BFF: page 8 */ - 0x8, - /* 43C00-43CFF: page 8 */ - 0x8, - /* 43D00-43DFF: page 8 */ - 0x8, - /* 43E00-43EFF: page 8 */ - 0x8, - /* 43F00-43FFF: page 8 */ - 0x8, - /* 44000-440FF: page 8 */ - 0x8, - /* 44100-441FF: page 8 */ - 0x8, - /* 44200-442FF: page 8 */ - 0x8, - /* 44300-443FF: page 8 */ - 0x8, - /* 44400-444FF: page 8 */ - 0x8, - /* 44500-445FF: page 8 */ - 0x8, - /* 44600-446FF: page 8 */ - 0x8, - /* 44700-447FF: page 8 */ - 0x8, - /* 44800-448FF: page 8 */ - 0x8, - /* 44900-449FF: page 8 */ - 0x8, - /* 44A00-44AFF: page 8 */ - 0x8, - /* 44B00-44BFF: page 8 */ - 0x8, - /* 44C00-44CFF: page 8 */ - 0x8, - /* 44D00-44DFF: page 8 */ - 0x8, - /* 44E00-44EFF: page 8 */ - 0x8, - /* 44F00-44FFF: page 8 */ - 0x8, - /* 45000-450FF: page 8 */ - 0x8, - /* 45100-451FF: page 8 */ - 0x8, - /* 45200-452FF: page 8 */ - 0x8, - /* 45300-453FF: page 8 */ - 0x8, - /* 45400-454FF: page 8 */ - 0x8, - /* 45500-455FF: page 8 */ - 0x8, - /* 45600-456FF: page 8 */ - 0x8, - /* 45700-457FF: page 8 */ - 0x8, - /* 45800-458FF: page 8 */ - 0x8, - /* 45900-459FF: page 8 */ - 0x8, - /* 45A00-45AFF: page 8 */ - 0x8, - /* 45B00-45BFF: page 8 */ - 0x8, - /* 45C00-45CFF: page 8 */ - 0x8, - /* 45D00-45DFF: page 8 */ - 0x8, - /* 45E00-45EFF: page 8 */ - 0x8, - /* 45F00-45FFF: page 8 */ - 0x8, - /* 46000-460FF: page 8 */ - 0x8, - /* 46100-461FF: page 8 */ - 0x8, - /* 46200-462FF: page 8 */ - 0x8, - /* 46300-463FF: page 8 */ - 0x8, - /* 46400-464FF: page 8 */ - 0x8, - /* 46500-465FF: page 8 */ - 0x8, - /* 46600-466FF: page 8 */ - 0x8, - /* 46700-467FF: page 8 */ - 0x8, - /* 46800-468FF: page 8 */ - 0x8, - /* 46900-469FF: page 8 */ - 0x8, - /* 46A00-46AFF: page 8 */ - 0x8, - /* 46B00-46BFF: page 8 */ - 0x8, - /* 46C00-46CFF: page 8 */ - 0x8, - /* 46D00-46DFF: page 8 */ - 0x8, - /* 46E00-46EFF: page 8 */ - 0x8, - /* 46F00-46FFF: page 8 */ - 0x8, - /* 47000-470FF: page 8 */ - 0x8, - /* 47100-471FF: page 8 */ - 0x8, - /* 47200-472FF: page 8 */ - 0x8, - /* 47300-473FF: page 8 */ - 0x8, - /* 47400-474FF: page 8 */ - 0x8, - /* 47500-475FF: page 8 */ - 0x8, - /* 47600-476FF: page 8 */ - 0x8, - /* 47700-477FF: page 8 */ - 0x8, - /* 47800-478FF: page 8 */ - 0x8, - /* 47900-479FF: page 8 */ - 0x8, - /* 47A00-47AFF: page 8 */ - 0x8, - /* 47B00-47BFF: page 8 */ - 0x8, - /* 47C00-47CFF: page 8 */ - 0x8, - /* 47D00-47DFF: page 8 */ - 0x8, - /* 47E00-47EFF: page 8 */ - 0x8, - /* 47F00-47FFF: page 8 */ - 0x8, - /* 48000-480FF: page 8 */ - 0x8, - /* 48100-481FF: page 8 */ - 0x8, - /* 48200-482FF: page 8 */ - 0x8, - /* 48300-483FF: page 8 */ - 0x8, - /* 48400-484FF: page 8 */ - 0x8, - /* 48500-485FF: page 8 */ - 0x8, - /* 48600-486FF: page 8 */ - 0x8, - /* 48700-487FF: page 8 */ - 0x8, - /* 48800-488FF: page 8 */ - 0x8, - /* 48900-489FF: page 8 */ - 0x8, - /* 48A00-48AFF: page 8 */ - 0x8, - /* 48B00-48BFF: page 8 */ - 0x8, - /* 48C00-48CFF: page 8 */ - 0x8, - /* 48D00-48DFF: page 8 */ - 0x8, - /* 48E00-48EFF: page 8 */ - 0x8, - /* 48F00-48FFF: page 8 */ - 0x8, - /* 49000-490FF: page 8 */ - 0x8, - /* 49100-491FF: page 8 */ - 0x8, - /* 49200-492FF: page 8 */ - 0x8, - /* 49300-493FF: page 8 */ - 0x8, - /* 49400-494FF: page 8 */ - 0x8, - /* 49500-495FF: page 8 */ - 0x8, - /* 49600-496FF: page 8 */ - 0x8, - /* 49700-497FF: page 8 */ - 0x8, - /* 49800-498FF: page 8 */ - 0x8, - /* 49900-499FF: page 8 */ - 0x8, - /* 49A00-49AFF: page 8 */ - 0x8, - /* 49B00-49BFF: page 8 */ - 0x8, - /* 49C00-49CFF: page 8 */ - 0x8, - /* 49D00-49DFF: page 8 */ - 0x8, - /* 49E00-49EFF: page 8 */ - 0x8, - /* 49F00-49FFF: page 8 */ - 0x8, - /* 4A000-4A0FF: page 8 */ - 0x8, - /* 4A100-4A1FF: page 8 */ - 0x8, - /* 4A200-4A2FF: page 8 */ - 0x8, - /* 4A300-4A3FF: page 8 */ - 0x8, - /* 4A400-4A4FF: page 8 */ - 0x8, - /* 4A500-4A5FF: page 8 */ - 0x8, - /* 4A600-4A6FF: page 8 */ - 0x8, - /* 4A700-4A7FF: page 8 */ - 0x8, - /* 4A800-4A8FF: page 8 */ - 0x8, - /* 4A900-4A9FF: page 8 */ - 0x8, - /* 4AA00-4AAFF: page 8 */ - 0x8, - /* 4AB00-4ABFF: page 8 */ - 0x8, - /* 4AC00-4ACFF: page 8 */ - 0x8, - /* 4AD00-4ADFF: page 8 */ - 0x8, - /* 4AE00-4AEFF: page 8 */ - 0x8, - /* 4AF00-4AFFF: page 8 */ - 0x8, - /* 4B000-4B0FF: page 8 */ - 0x8, - /* 4B100-4B1FF: page 8 */ - 0x8, - /* 4B200-4B2FF: page 8 */ - 0x8, - /* 4B300-4B3FF: page 8 */ - 0x8, - /* 4B400-4B4FF: page 8 */ - 0x8, - /* 4B500-4B5FF: page 8 */ - 0x8, - /* 4B600-4B6FF: page 8 */ - 0x8, - /* 4B700-4B7FF: page 8 */ - 0x8, - /* 4B800-4B8FF: page 8 */ - 0x8, - /* 4B900-4B9FF: page 8 */ - 0x8, - /* 4BA00-4BAFF: page 8 */ - 0x8, - /* 4BB00-4BBFF: page 8 */ - 0x8, - /* 4BC00-4BCFF: page 8 */ - 0x8, - /* 4BD00-4BDFF: page 8 */ - 0x8, - /* 4BE00-4BEFF: page 8 */ - 0x8, - /* 4BF00-4BFFF: page 8 */ - 0x8, - /* 4C000-4C0FF: page 8 */ - 0x8, - /* 4C100-4C1FF: page 8 */ - 0x8, - /* 4C200-4C2FF: page 8 */ - 0x8, - /* 4C300-4C3FF: page 8 */ - 0x8, - /* 4C400-4C4FF: page 8 */ - 0x8, - /* 4C500-4C5FF: page 8 */ - 0x8, - /* 4C600-4C6FF: page 8 */ - 0x8, - /* 4C700-4C7FF: page 8 */ - 0x8, - /* 4C800-4C8FF: page 8 */ - 0x8, - /* 4C900-4C9FF: page 8 */ - 0x8, - /* 4CA00-4CAFF: page 8 */ - 0x8, - /* 4CB00-4CBFF: page 8 */ - 0x8, - /* 4CC00-4CCFF: page 8 */ - 0x8, - /* 4CD00-4CDFF: page 8 */ - 0x8, - /* 4CE00-4CEFF: page 8 */ - 0x8, - /* 4CF00-4CFFF: page 8 */ - 0x8, - /* 4D000-4D0FF: page 8 */ - 0x8, - /* 4D100-4D1FF: page 8 */ - 0x8, - /* 4D200-4D2FF: page 8 */ - 0x8, - /* 4D300-4D3FF: page 8 */ - 0x8, - /* 4D400-4D4FF: page 8 */ - 0x8, - /* 4D500-4D5FF: page 8 */ - 0x8, - /* 4D600-4D6FF: page 8 */ - 0x8, - /* 4D700-4D7FF: page 8 */ - 0x8, - /* 4D800-4D8FF: page 8 */ - 0x8, - /* 4D900-4D9FF: page 8 */ - 0x8, - /* 4DA00-4DAFF: page 8 */ - 0x8, - /* 4DB00-4DBFF: page 8 */ - 0x8, - /* 4DC00-4DCFF: page 8 */ - 0x8, - /* 4DD00-4DDFF: page 8 */ - 0x8, - /* 4DE00-4DEFF: page 8 */ - 0x8, - /* 4DF00-4DFFF: page 8 */ - 0x8, - /* 4E000-4E0FF: page 8 */ - 0x8, - /* 4E100-4E1FF: page 8 */ - 0x8, - /* 4E200-4E2FF: page 8 */ - 0x8, - /* 4E300-4E3FF: page 8 */ - 0x8, - /* 4E400-4E4FF: page 8 */ - 0x8, - /* 4E500-4E5FF: page 8 */ - 0x8, - /* 4E600-4E6FF: page 8 */ - 0x8, - /* 4E700-4E7FF: page 8 */ - 0x8, - /* 4E800-4E8FF: page 8 */ - 0x8, - /* 4E900-4E9FF: page 8 */ - 0x8, - /* 4EA00-4EAFF: page 8 */ - 0x8, - /* 4EB00-4EBFF: page 8 */ - 0x8, - /* 4EC00-4ECFF: page 8 */ - 0x8, - /* 4ED00-4EDFF: page 8 */ - 0x8, - /* 4EE00-4EEFF: page 8 */ - 0x8, - /* 4EF00-4EFFF: page 8 */ - 0x8, - /* 4F000-4F0FF: page 8 */ - 0x8, - /* 4F100-4F1FF: page 8 */ - 0x8, - /* 4F200-4F2FF: page 8 */ - 0x8, - /* 4F300-4F3FF: page 8 */ - 0x8, - /* 4F400-4F4FF: page 8 */ - 0x8, - /* 4F500-4F5FF: page 8 */ - 0x8, - /* 4F600-4F6FF: page 8 */ - 0x8, - /* 4F700-4F7FF: page 8 */ - 0x8, - /* 4F800-4F8FF: page 8 */ - 0x8, - /* 4F900-4F9FF: page 8 */ - 0x8, - /* 4FA00-4FAFF: page 8 */ - 0x8, - /* 4FB00-4FBFF: page 8 */ - 0x8, - /* 4FC00-4FCFF: page 8 */ - 0x8, - /* 4FD00-4FDFF: page 8 */ - 0x8, - /* 4FE00-4FEFF: page 8 */ - 0x8, - /* 4FF00-4FFFF: page 8 */ - 0x8, - /* 50000-500FF: page 8 */ - 0x8, - /* 50100-501FF: page 8 */ - 0x8, - /* 50200-502FF: page 8 */ - 0x8, - /* 50300-503FF: page 8 */ - 0x8, - /* 50400-504FF: page 8 */ - 0x8, - /* 50500-505FF: page 8 */ - 0x8, - /* 50600-506FF: page 8 */ - 0x8, - /* 50700-507FF: page 8 */ - 0x8, - /* 50800-508FF: page 8 */ - 0x8, - /* 50900-509FF: page 8 */ - 0x8, - /* 50A00-50AFF: page 8 */ - 0x8, - /* 50B00-50BFF: page 8 */ - 0x8, - /* 50C00-50CFF: page 8 */ - 0x8, - /* 50D00-50DFF: page 8 */ - 0x8, - /* 50E00-50EFF: page 8 */ - 0x8, - /* 50F00-50FFF: page 8 */ - 0x8, - /* 51000-510FF: page 8 */ - 0x8, - /* 51100-511FF: page 8 */ - 0x8, - /* 51200-512FF: page 8 */ - 0x8, - /* 51300-513FF: page 8 */ - 0x8, - /* 51400-514FF: page 8 */ - 0x8, - /* 51500-515FF: page 8 */ - 0x8, - /* 51600-516FF: page 8 */ - 0x8, - /* 51700-517FF: page 8 */ - 0x8, - /* 51800-518FF: page 8 */ - 0x8, - /* 51900-519FF: page 8 */ - 0x8, - /* 51A00-51AFF: page 8 */ - 0x8, - /* 51B00-51BFF: page 8 */ - 0x8, - /* 51C00-51CFF: page 8 */ - 0x8, - /* 51D00-51DFF: page 8 */ - 0x8, - /* 51E00-51EFF: page 8 */ - 0x8, - /* 51F00-51FFF: page 8 */ - 0x8, - /* 52000-520FF: page 8 */ - 0x8, - /* 52100-521FF: page 8 */ - 0x8, - /* 52200-522FF: page 8 */ - 0x8, - /* 52300-523FF: page 8 */ - 0x8, - /* 52400-524FF: page 8 */ - 0x8, - /* 52500-525FF: page 8 */ - 0x8, - /* 52600-526FF: page 8 */ - 0x8, - /* 52700-527FF: page 8 */ - 0x8, - /* 52800-528FF: page 8 */ - 0x8, - /* 52900-529FF: page 8 */ - 0x8, - /* 52A00-52AFF: page 8 */ - 0x8, - /* 52B00-52BFF: page 8 */ - 0x8, - /* 52C00-52CFF: page 8 */ - 0x8, - /* 52D00-52DFF: page 8 */ - 0x8, - /* 52E00-52EFF: page 8 */ - 0x8, - /* 52F00-52FFF: page 8 */ - 0x8, - /* 53000-530FF: page 8 */ - 0x8, - /* 53100-531FF: page 8 */ - 0x8, - /* 53200-532FF: page 8 */ - 0x8, - /* 53300-533FF: page 8 */ - 0x8, - /* 53400-534FF: page 8 */ - 0x8, - /* 53500-535FF: page 8 */ - 0x8, - /* 53600-536FF: page 8 */ - 0x8, - /* 53700-537FF: page 8 */ - 0x8, - /* 53800-538FF: page 8 */ - 0x8, - /* 53900-539FF: page 8 */ - 0x8, - /* 53A00-53AFF: page 8 */ - 0x8, - /* 53B00-53BFF: page 8 */ - 0x8, - /* 53C00-53CFF: page 8 */ - 0x8, - /* 53D00-53DFF: page 8 */ - 0x8, - /* 53E00-53EFF: page 8 */ - 0x8, - /* 53F00-53FFF: page 8 */ - 0x8, - /* 54000-540FF: page 8 */ - 0x8, - /* 54100-541FF: page 8 */ - 0x8, - /* 54200-542FF: page 8 */ - 0x8, - /* 54300-543FF: page 8 */ - 0x8, - /* 54400-544FF: page 8 */ - 0x8, - /* 54500-545FF: page 8 */ - 0x8, - /* 54600-546FF: page 8 */ - 0x8, - /* 54700-547FF: page 8 */ - 0x8, - /* 54800-548FF: page 8 */ - 0x8, - /* 54900-549FF: page 8 */ - 0x8, - /* 54A00-54AFF: page 8 */ - 0x8, - /* 54B00-54BFF: page 8 */ - 0x8, - /* 54C00-54CFF: page 8 */ - 0x8, - /* 54D00-54DFF: page 8 */ - 0x8, - /* 54E00-54EFF: page 8 */ - 0x8, - /* 54F00-54FFF: page 8 */ - 0x8, - /* 55000-550FF: page 8 */ - 0x8, - /* 55100-551FF: page 8 */ - 0x8, - /* 55200-552FF: page 8 */ - 0x8, - /* 55300-553FF: page 8 */ - 0x8, - /* 55400-554FF: page 8 */ - 0x8, - /* 55500-555FF: page 8 */ - 0x8, - /* 55600-556FF: page 8 */ - 0x8, - /* 55700-557FF: page 8 */ - 0x8, - /* 55800-558FF: page 8 */ - 0x8, - /* 55900-559FF: page 8 */ - 0x8, - /* 55A00-55AFF: page 8 */ - 0x8, - /* 55B00-55BFF: page 8 */ - 0x8, - /* 55C00-55CFF: page 8 */ - 0x8, - /* 55D00-55DFF: page 8 */ - 0x8, - /* 55E00-55EFF: page 8 */ - 0x8, - /* 55F00-55FFF: page 8 */ - 0x8, - /* 56000-560FF: page 8 */ - 0x8, - /* 56100-561FF: page 8 */ - 0x8, - /* 56200-562FF: page 8 */ - 0x8, - /* 56300-563FF: page 8 */ - 0x8, - /* 56400-564FF: page 8 */ - 0x8, - /* 56500-565FF: page 8 */ - 0x8, - /* 56600-566FF: page 8 */ - 0x8, - /* 56700-567FF: page 8 */ - 0x8, - /* 56800-568FF: page 8 */ - 0x8, - /* 56900-569FF: page 8 */ - 0x8, - /* 56A00-56AFF: page 8 */ - 0x8, - /* 56B00-56BFF: page 8 */ - 0x8, - /* 56C00-56CFF: page 8 */ - 0x8, - /* 56D00-56DFF: page 8 */ - 0x8, - /* 56E00-56EFF: page 8 */ - 0x8, - /* 56F00-56FFF: page 8 */ - 0x8, - /* 57000-570FF: page 8 */ - 0x8, - /* 57100-571FF: page 8 */ - 0x8, - /* 57200-572FF: page 8 */ - 0x8, - /* 57300-573FF: page 8 */ - 0x8, - /* 57400-574FF: page 8 */ - 0x8, - /* 57500-575FF: page 8 */ - 0x8, - /* 57600-576FF: page 8 */ - 0x8, - /* 57700-577FF: page 8 */ - 0x8, - /* 57800-578FF: page 8 */ - 0x8, - /* 57900-579FF: page 8 */ - 0x8, - /* 57A00-57AFF: page 8 */ - 0x8, - /* 57B00-57BFF: page 8 */ - 0x8, - /* 57C00-57CFF: page 8 */ - 0x8, - /* 57D00-57DFF: page 8 */ - 0x8, - /* 57E00-57EFF: page 8 */ - 0x8, - /* 57F00-57FFF: page 8 */ - 0x8, - /* 58000-580FF: page 8 */ - 0x8, - /* 58100-581FF: page 8 */ - 0x8, - /* 58200-582FF: page 8 */ - 0x8, - /* 58300-583FF: page 8 */ - 0x8, - /* 58400-584FF: page 8 */ - 0x8, - /* 58500-585FF: page 8 */ - 0x8, - /* 58600-586FF: page 8 */ - 0x8, - /* 58700-587FF: page 8 */ - 0x8, - /* 58800-588FF: page 8 */ - 0x8, - /* 58900-589FF: page 8 */ - 0x8, - /* 58A00-58AFF: page 8 */ - 0x8, - /* 58B00-58BFF: page 8 */ - 0x8, - /* 58C00-58CFF: page 8 */ - 0x8, - /* 58D00-58DFF: page 8 */ - 0x8, - /* 58E00-58EFF: page 8 */ - 0x8, - /* 58F00-58FFF: page 8 */ - 0x8, - /* 59000-590FF: page 8 */ - 0x8, - /* 59100-591FF: page 8 */ - 0x8, - /* 59200-592FF: page 8 */ - 0x8, - /* 59300-593FF: page 8 */ - 0x8, - /* 59400-594FF: page 8 */ - 0x8, - /* 59500-595FF: page 8 */ - 0x8, - /* 59600-596FF: page 8 */ - 0x8, - /* 59700-597FF: page 8 */ - 0x8, - /* 59800-598FF: page 8 */ - 0x8, - /* 59900-599FF: page 8 */ - 0x8, - /* 59A00-59AFF: page 8 */ - 0x8, - /* 59B00-59BFF: page 8 */ - 0x8, - /* 59C00-59CFF: page 8 */ - 0x8, - /* 59D00-59DFF: page 8 */ - 0x8, - /* 59E00-59EFF: page 8 */ - 0x8, - /* 59F00-59FFF: page 8 */ - 0x8, - /* 5A000-5A0FF: page 8 */ - 0x8, - /* 5A100-5A1FF: page 8 */ - 0x8, - /* 5A200-5A2FF: page 8 */ - 0x8, - /* 5A300-5A3FF: page 8 */ - 0x8, - /* 5A400-5A4FF: page 8 */ - 0x8, - /* 5A500-5A5FF: page 8 */ - 0x8, - /* 5A600-5A6FF: page 8 */ - 0x8, - /* 5A700-5A7FF: page 8 */ - 0x8, - /* 5A800-5A8FF: page 8 */ - 0x8, - /* 5A900-5A9FF: page 8 */ - 0x8, - /* 5AA00-5AAFF: page 8 */ - 0x8, - /* 5AB00-5ABFF: page 8 */ - 0x8, - /* 5AC00-5ACFF: page 8 */ - 0x8, - /* 5AD00-5ADFF: page 8 */ - 0x8, - /* 5AE00-5AEFF: page 8 */ - 0x8, - /* 5AF00-5AFFF: page 8 */ - 0x8, - /* 5B000-5B0FF: page 8 */ - 0x8, - /* 5B100-5B1FF: page 8 */ - 0x8, - /* 5B200-5B2FF: page 8 */ - 0x8, - /* 5B300-5B3FF: page 8 */ - 0x8, - /* 5B400-5B4FF: page 8 */ - 0x8, - /* 5B500-5B5FF: page 8 */ - 0x8, - /* 5B600-5B6FF: page 8 */ - 0x8, - /* 5B700-5B7FF: page 8 */ - 0x8, - /* 5B800-5B8FF: page 8 */ - 0x8, - /* 5B900-5B9FF: page 8 */ - 0x8, - /* 5BA00-5BAFF: page 8 */ - 0x8, - /* 5BB00-5BBFF: page 8 */ - 0x8, - /* 5BC00-5BCFF: page 8 */ - 0x8, - /* 5BD00-5BDFF: page 8 */ - 0x8, - /* 5BE00-5BEFF: page 8 */ - 0x8, - /* 5BF00-5BFFF: page 8 */ - 0x8, - /* 5C000-5C0FF: page 8 */ - 0x8, - /* 5C100-5C1FF: page 8 */ - 0x8, - /* 5C200-5C2FF: page 8 */ - 0x8, - /* 5C300-5C3FF: page 8 */ - 0x8, - /* 5C400-5C4FF: page 8 */ - 0x8, - /* 5C500-5C5FF: page 8 */ - 0x8, - /* 5C600-5C6FF: page 8 */ - 0x8, - /* 5C700-5C7FF: page 8 */ - 0x8, - /* 5C800-5C8FF: page 8 */ - 0x8, - /* 5C900-5C9FF: page 8 */ - 0x8, - /* 5CA00-5CAFF: page 8 */ - 0x8, - /* 5CB00-5CBFF: page 8 */ - 0x8, - /* 5CC00-5CCFF: page 8 */ - 0x8, - /* 5CD00-5CDFF: page 8 */ - 0x8, - /* 5CE00-5CEFF: page 8 */ - 0x8, - /* 5CF00-5CFFF: page 8 */ - 0x8, - /* 5D000-5D0FF: page 8 */ - 0x8, - /* 5D100-5D1FF: page 8 */ - 0x8, - /* 5D200-5D2FF: page 8 */ - 0x8, - /* 5D300-5D3FF: page 8 */ - 0x8, - /* 5D400-5D4FF: page 8 */ - 0x8, - /* 5D500-5D5FF: page 8 */ - 0x8, - /* 5D600-5D6FF: page 8 */ - 0x8, - /* 5D700-5D7FF: page 8 */ - 0x8, - /* 5D800-5D8FF: page 8 */ - 0x8, - /* 5D900-5D9FF: page 8 */ - 0x8, - /* 5DA00-5DAFF: page 8 */ - 0x8, - /* 5DB00-5DBFF: page 8 */ - 0x8, - /* 5DC00-5DCFF: page 8 */ - 0x8, - /* 5DD00-5DDFF: page 8 */ - 0x8, - /* 5DE00-5DEFF: page 8 */ - 0x8, - /* 5DF00-5DFFF: page 8 */ - 0x8, - /* 5E000-5E0FF: page 8 */ - 0x8, - /* 5E100-5E1FF: page 8 */ - 0x8, - /* 5E200-5E2FF: page 8 */ - 0x8, - /* 5E300-5E3FF: page 8 */ - 0x8, - /* 5E400-5E4FF: page 8 */ - 0x8, - /* 5E500-5E5FF: page 8 */ - 0x8, - /* 5E600-5E6FF: page 8 */ - 0x8, - /* 5E700-5E7FF: page 8 */ - 0x8, - /* 5E800-5E8FF: page 8 */ - 0x8, - /* 5E900-5E9FF: page 8 */ - 0x8, - /* 5EA00-5EAFF: page 8 */ - 0x8, - /* 5EB00-5EBFF: page 8 */ - 0x8, - /* 5EC00-5ECFF: page 8 */ - 0x8, - /* 5ED00-5EDFF: page 8 */ - 0x8, - /* 5EE00-5EEFF: page 8 */ - 0x8, - /* 5EF00-5EFFF: page 8 */ - 0x8, - /* 5F000-5F0FF: page 8 */ - 0x8, - /* 5F100-5F1FF: page 8 */ - 0x8, - /* 5F200-5F2FF: page 8 */ - 0x8, - /* 5F300-5F3FF: page 8 */ - 0x8, - /* 5F400-5F4FF: page 8 */ - 0x8, - /* 5F500-5F5FF: page 8 */ - 0x8, - /* 5F600-5F6FF: page 8 */ - 0x8, - /* 5F700-5F7FF: page 8 */ - 0x8, - /* 5F800-5F8FF: page 8 */ - 0x8, - /* 5F900-5F9FF: page 8 */ - 0x8, - /* 5FA00-5FAFF: page 8 */ - 0x8, - /* 5FB00-5FBFF: page 8 */ - 0x8, - /* 5FC00-5FCFF: page 8 */ - 0x8, - /* 5FD00-5FDFF: page 8 */ - 0x8, - /* 5FE00-5FEFF: page 8 */ - 0x8, - /* 5FF00-5FFFF: page 8 */ - 0x8, - /* 60000-600FF: page 8 */ - 0x8, - /* 60100-601FF: page 8 */ - 0x8, - /* 60200-602FF: page 8 */ - 0x8, - /* 60300-603FF: page 8 */ - 0x8, - /* 60400-604FF: page 8 */ - 0x8, - /* 60500-605FF: page 8 */ - 0x8, - /* 60600-606FF: page 8 */ - 0x8, - /* 60700-607FF: page 8 */ - 0x8, - /* 60800-608FF: page 8 */ - 0x8, - /* 60900-609FF: page 8 */ - 0x8, - /* 60A00-60AFF: page 8 */ - 0x8, - /* 60B00-60BFF: page 8 */ - 0x8, - /* 60C00-60CFF: page 8 */ - 0x8, - /* 60D00-60DFF: page 8 */ - 0x8, - /* 60E00-60EFF: page 8 */ - 0x8, - /* 60F00-60FFF: page 8 */ - 0x8, - /* 61000-610FF: page 8 */ - 0x8, - /* 61100-611FF: page 8 */ - 0x8, - /* 61200-612FF: page 8 */ - 0x8, - /* 61300-613FF: page 8 */ - 0x8, - /* 61400-614FF: page 8 */ - 0x8, - /* 61500-615FF: page 8 */ - 0x8, - /* 61600-616FF: page 8 */ - 0x8, - /* 61700-617FF: page 8 */ - 0x8, - /* 61800-618FF: page 8 */ - 0x8, - /* 61900-619FF: page 8 */ - 0x8, - /* 61A00-61AFF: page 8 */ - 0x8, - /* 61B00-61BFF: page 8 */ - 0x8, - /* 61C00-61CFF: page 8 */ - 0x8, - /* 61D00-61DFF: page 8 */ - 0x8, - /* 61E00-61EFF: page 8 */ - 0x8, - /* 61F00-61FFF: page 8 */ - 0x8, - /* 62000-620FF: page 8 */ - 0x8, - /* 62100-621FF: page 8 */ - 0x8, - /* 62200-622FF: page 8 */ - 0x8, - /* 62300-623FF: page 8 */ - 0x8, - /* 62400-624FF: page 8 */ - 0x8, - /* 62500-625FF: page 8 */ - 0x8, - /* 62600-626FF: page 8 */ - 0x8, - /* 62700-627FF: page 8 */ - 0x8, - /* 62800-628FF: page 8 */ - 0x8, - /* 62900-629FF: page 8 */ - 0x8, - /* 62A00-62AFF: page 8 */ - 0x8, - /* 62B00-62BFF: page 8 */ - 0x8, - /* 62C00-62CFF: page 8 */ - 0x8, - /* 62D00-62DFF: page 8 */ - 0x8, - /* 62E00-62EFF: page 8 */ - 0x8, - /* 62F00-62FFF: page 8 */ - 0x8, - /* 63000-630FF: page 8 */ - 0x8, - /* 63100-631FF: page 8 */ - 0x8, - /* 63200-632FF: page 8 */ - 0x8, - /* 63300-633FF: page 8 */ - 0x8, - /* 63400-634FF: page 8 */ - 0x8, - /* 63500-635FF: page 8 */ - 0x8, - /* 63600-636FF: page 8 */ - 0x8, - /* 63700-637FF: page 8 */ - 0x8, - /* 63800-638FF: page 8 */ - 0x8, - /* 63900-639FF: page 8 */ - 0x8, - /* 63A00-63AFF: page 8 */ - 0x8, - /* 63B00-63BFF: page 8 */ - 0x8, - /* 63C00-63CFF: page 8 */ - 0x8, - /* 63D00-63DFF: page 8 */ - 0x8, - /* 63E00-63EFF: page 8 */ - 0x8, - /* 63F00-63FFF: page 8 */ - 0x8, - /* 64000-640FF: page 8 */ - 0x8, - /* 64100-641FF: page 8 */ - 0x8, - /* 64200-642FF: page 8 */ - 0x8, - /* 64300-643FF: page 8 */ - 0x8, - /* 64400-644FF: page 8 */ - 0x8, - /* 64500-645FF: page 8 */ - 0x8, - /* 64600-646FF: page 8 */ - 0x8, - /* 64700-647FF: page 8 */ - 0x8, - /* 64800-648FF: page 8 */ - 0x8, - /* 64900-649FF: page 8 */ - 0x8, - /* 64A00-64AFF: page 8 */ - 0x8, - /* 64B00-64BFF: page 8 */ - 0x8, - /* 64C00-64CFF: page 8 */ - 0x8, - /* 64D00-64DFF: page 8 */ - 0x8, - /* 64E00-64EFF: page 8 */ - 0x8, - /* 64F00-64FFF: page 8 */ - 0x8, - /* 65000-650FF: page 8 */ - 0x8, - /* 65100-651FF: page 8 */ - 0x8, - /* 65200-652FF: page 8 */ - 0x8, - /* 65300-653FF: page 8 */ - 0x8, - /* 65400-654FF: page 8 */ - 0x8, - /* 65500-655FF: page 8 */ - 0x8, - /* 65600-656FF: page 8 */ - 0x8, - /* 65700-657FF: page 8 */ - 0x8, - /* 65800-658FF: page 8 */ - 0x8, - /* 65900-659FF: page 8 */ - 0x8, - /* 65A00-65AFF: page 8 */ - 0x8, - /* 65B00-65BFF: page 8 */ - 0x8, - /* 65C00-65CFF: page 8 */ - 0x8, - /* 65D00-65DFF: page 8 */ - 0x8, - /* 65E00-65EFF: page 8 */ - 0x8, - /* 65F00-65FFF: page 8 */ - 0x8, - /* 66000-660FF: page 8 */ - 0x8, - /* 66100-661FF: page 8 */ - 0x8, - /* 66200-662FF: page 8 */ - 0x8, - /* 66300-663FF: page 8 */ - 0x8, - /* 66400-664FF: page 8 */ - 0x8, - /* 66500-665FF: page 8 */ - 0x8, - /* 66600-666FF: page 8 */ - 0x8, - /* 66700-667FF: page 8 */ - 0x8, - /* 66800-668FF: page 8 */ - 0x8, - /* 66900-669FF: page 8 */ - 0x8, - /* 66A00-66AFF: page 8 */ - 0x8, - /* 66B00-66BFF: page 8 */ - 0x8, - /* 66C00-66CFF: page 8 */ - 0x8, - /* 66D00-66DFF: page 8 */ - 0x8, - /* 66E00-66EFF: page 8 */ - 0x8, - /* 66F00-66FFF: page 8 */ - 0x8, - /* 67000-670FF: page 8 */ - 0x8, - /* 67100-671FF: page 8 */ - 0x8, - /* 67200-672FF: page 8 */ - 0x8, - /* 67300-673FF: page 8 */ - 0x8, - /* 67400-674FF: page 8 */ - 0x8, - /* 67500-675FF: page 8 */ - 0x8, - /* 67600-676FF: page 8 */ - 0x8, - /* 67700-677FF: page 8 */ - 0x8, - /* 67800-678FF: page 8 */ - 0x8, - /* 67900-679FF: page 8 */ - 0x8, - /* 67A00-67AFF: page 8 */ - 0x8, - /* 67B00-67BFF: page 8 */ - 0x8, - /* 67C00-67CFF: page 8 */ - 0x8, - /* 67D00-67DFF: page 8 */ - 0x8, - /* 67E00-67EFF: page 8 */ - 0x8, - /* 67F00-67FFF: page 8 */ - 0x8, - /* 68000-680FF: page 8 */ - 0x8, - /* 68100-681FF: page 8 */ - 0x8, - /* 68200-682FF: page 8 */ - 0x8, - /* 68300-683FF: page 8 */ - 0x8, - /* 68400-684FF: page 8 */ - 0x8, - /* 68500-685FF: page 8 */ - 0x8, - /* 68600-686FF: page 8 */ - 0x8, - /* 68700-687FF: page 8 */ - 0x8, - /* 68800-688FF: page 8 */ - 0x8, - /* 68900-689FF: page 8 */ - 0x8, - /* 68A00-68AFF: page 8 */ - 0x8, - /* 68B00-68BFF: page 8 */ - 0x8, - /* 68C00-68CFF: page 8 */ - 0x8, - /* 68D00-68DFF: page 8 */ - 0x8, - /* 68E00-68EFF: page 8 */ - 0x8, - /* 68F00-68FFF: page 8 */ - 0x8, - /* 69000-690FF: page 8 */ - 0x8, - /* 69100-691FF: page 8 */ - 0x8, - /* 69200-692FF: page 8 */ - 0x8, - /* 69300-693FF: page 8 */ - 0x8, - /* 69400-694FF: page 8 */ - 0x8, - /* 69500-695FF: page 8 */ - 0x8, - /* 69600-696FF: page 8 */ - 0x8, - /* 69700-697FF: page 8 */ - 0x8, - /* 69800-698FF: page 8 */ - 0x8, - /* 69900-699FF: page 8 */ - 0x8, - /* 69A00-69AFF: page 8 */ - 0x8, - /* 69B00-69BFF: page 8 */ - 0x8, - /* 69C00-69CFF: page 8 */ - 0x8, - /* 69D00-69DFF: page 8 */ - 0x8, - /* 69E00-69EFF: page 8 */ - 0x8, - /* 69F00-69FFF: page 8 */ - 0x8, - /* 6A000-6A0FF: page 8 */ - 0x8, - /* 6A100-6A1FF: page 8 */ - 0x8, - /* 6A200-6A2FF: page 8 */ - 0x8, - /* 6A300-6A3FF: page 8 */ - 0x8, - /* 6A400-6A4FF: page 8 */ - 0x8, - /* 6A500-6A5FF: page 8 */ - 0x8, - /* 6A600-6A6FF: page 8 */ - 0x8, - /* 6A700-6A7FF: page 8 */ - 0x8, - /* 6A800-6A8FF: page 8 */ - 0x8, - /* 6A900-6A9FF: page 8 */ - 0x8, - /* 6AA00-6AAFF: page 8 */ - 0x8, - /* 6AB00-6ABFF: page 8 */ - 0x8, - /* 6AC00-6ACFF: page 8 */ - 0x8, - /* 6AD00-6ADFF: page 8 */ - 0x8, - /* 6AE00-6AEFF: page 8 */ - 0x8, - /* 6AF00-6AFFF: page 8 */ - 0x8, - /* 6B000-6B0FF: page 8 */ - 0x8, - /* 6B100-6B1FF: page 8 */ - 0x8, - /* 6B200-6B2FF: page 8 */ - 0x8, - /* 6B300-6B3FF: page 8 */ - 0x8, - /* 6B400-6B4FF: page 8 */ - 0x8, - /* 6B500-6B5FF: page 8 */ - 0x8, - /* 6B600-6B6FF: page 8 */ - 0x8, - /* 6B700-6B7FF: page 8 */ - 0x8, - /* 6B800-6B8FF: page 8 */ - 0x8, - /* 6B900-6B9FF: page 8 */ - 0x8, - /* 6BA00-6BAFF: page 8 */ - 0x8, - /* 6BB00-6BBFF: page 8 */ - 0x8, - /* 6BC00-6BCFF: page 8 */ - 0x8, - /* 6BD00-6BDFF: page 8 */ - 0x8, - /* 6BE00-6BEFF: page 8 */ - 0x8, - /* 6BF00-6BFFF: page 8 */ - 0x8, - /* 6C000-6C0FF: page 8 */ - 0x8, - /* 6C100-6C1FF: page 8 */ - 0x8, - /* 6C200-6C2FF: page 8 */ - 0x8, - /* 6C300-6C3FF: page 8 */ - 0x8, - /* 6C400-6C4FF: page 8 */ - 0x8, - /* 6C500-6C5FF: page 8 */ - 0x8, - /* 6C600-6C6FF: page 8 */ - 0x8, - /* 6C700-6C7FF: page 8 */ - 0x8, - /* 6C800-6C8FF: page 8 */ - 0x8, - /* 6C900-6C9FF: page 8 */ - 0x8, - /* 6CA00-6CAFF: page 8 */ - 0x8, - /* 6CB00-6CBFF: page 8 */ - 0x8, - /* 6CC00-6CCFF: page 8 */ - 0x8, - /* 6CD00-6CDFF: page 8 */ - 0x8, - /* 6CE00-6CEFF: page 8 */ - 0x8, - /* 6CF00-6CFFF: page 8 */ - 0x8, - /* 6D000-6D0FF: page 8 */ - 0x8, - /* 6D100-6D1FF: page 8 */ - 0x8, - /* 6D200-6D2FF: page 8 */ - 0x8, - /* 6D300-6D3FF: page 8 */ - 0x8, - /* 6D400-6D4FF: page 8 */ - 0x8, - /* 6D500-6D5FF: page 8 */ - 0x8, - /* 6D600-6D6FF: page 8 */ - 0x8, - /* 6D700-6D7FF: page 8 */ - 0x8, - /* 6D800-6D8FF: page 8 */ - 0x8, - /* 6D900-6D9FF: page 8 */ - 0x8, - /* 6DA00-6DAFF: page 8 */ - 0x8, - /* 6DB00-6DBFF: page 8 */ - 0x8, - /* 6DC00-6DCFF: page 8 */ - 0x8, - /* 6DD00-6DDFF: page 8 */ - 0x8, - /* 6DE00-6DEFF: page 8 */ - 0x8, - /* 6DF00-6DFFF: page 8 */ - 0x8, - /* 6E000-6E0FF: page 8 */ - 0x8, - /* 6E100-6E1FF: page 8 */ - 0x8, - /* 6E200-6E2FF: page 8 */ - 0x8, - /* 6E300-6E3FF: page 8 */ - 0x8, - /* 6E400-6E4FF: page 8 */ - 0x8, - /* 6E500-6E5FF: page 8 */ - 0x8, - /* 6E600-6E6FF: page 8 */ - 0x8, - /* 6E700-6E7FF: page 8 */ - 0x8, - /* 6E800-6E8FF: page 8 */ - 0x8, - /* 6E900-6E9FF: page 8 */ - 0x8, - /* 6EA00-6EAFF: page 8 */ - 0x8, - /* 6EB00-6EBFF: page 8 */ - 0x8, - /* 6EC00-6ECFF: page 8 */ - 0x8, - /* 6ED00-6EDFF: page 8 */ - 0x8, - /* 6EE00-6EEFF: page 8 */ - 0x8, - /* 6EF00-6EFFF: page 8 */ - 0x8, - /* 6F000-6F0FF: page 8 */ - 0x8, - /* 6F100-6F1FF: page 8 */ - 0x8, - /* 6F200-6F2FF: page 8 */ - 0x8, - /* 6F300-6F3FF: page 8 */ - 0x8, - /* 6F400-6F4FF: page 8 */ - 0x8, - /* 6F500-6F5FF: page 8 */ - 0x8, - /* 6F600-6F6FF: page 8 */ - 0x8, - /* 6F700-6F7FF: page 8 */ - 0x8, - /* 6F800-6F8FF: page 8 */ - 0x8, - /* 6F900-6F9FF: page 8 */ - 0x8, - /* 6FA00-6FAFF: page 8 */ - 0x8, - /* 6FB00-6FBFF: page 8 */ - 0x8, - /* 6FC00-6FCFF: page 8 */ - 0x8, - /* 6FD00-6FDFF: page 8 */ - 0x8, - /* 6FE00-6FEFF: page 8 */ - 0x8, - /* 6FF00-6FFFF: page 8 */ - 0x8, - /* 70000-700FF: page 8 */ - 0x8, - /* 70100-701FF: page 8 */ - 0x8, - /* 70200-702FF: page 8 */ - 0x8, - /* 70300-703FF: page 8 */ - 0x8, - /* 70400-704FF: page 8 */ - 0x8, - /* 70500-705FF: page 8 */ - 0x8, - /* 70600-706FF: page 8 */ - 0x8, - /* 70700-707FF: page 8 */ - 0x8, - /* 70800-708FF: page 8 */ - 0x8, - /* 70900-709FF: page 8 */ - 0x8, - /* 70A00-70AFF: page 8 */ - 0x8, - /* 70B00-70BFF: page 8 */ - 0x8, - /* 70C00-70CFF: page 8 */ - 0x8, - /* 70D00-70DFF: page 8 */ - 0x8, - /* 70E00-70EFF: page 8 */ - 0x8, - /* 70F00-70FFF: page 8 */ - 0x8, - /* 71000-710FF: page 8 */ - 0x8, - /* 71100-711FF: page 8 */ - 0x8, - /* 71200-712FF: page 8 */ - 0x8, - /* 71300-713FF: page 8 */ - 0x8, - /* 71400-714FF: page 8 */ - 0x8, - /* 71500-715FF: page 8 */ - 0x8, - /* 71600-716FF: page 8 */ - 0x8, - /* 71700-717FF: page 8 */ - 0x8, - /* 71800-718FF: page 8 */ - 0x8, - /* 71900-719FF: page 8 */ - 0x8, - /* 71A00-71AFF: page 8 */ - 0x8, - /* 71B00-71BFF: page 8 */ - 0x8, - /* 71C00-71CFF: page 8 */ - 0x8, - /* 71D00-71DFF: page 8 */ - 0x8, - /* 71E00-71EFF: page 8 */ - 0x8, - /* 71F00-71FFF: page 8 */ - 0x8, - /* 72000-720FF: page 8 */ - 0x8, - /* 72100-721FF: page 8 */ - 0x8, - /* 72200-722FF: page 8 */ - 0x8, - /* 72300-723FF: page 8 */ - 0x8, - /* 72400-724FF: page 8 */ - 0x8, - /* 72500-725FF: page 8 */ - 0x8, - /* 72600-726FF: page 8 */ - 0x8, - /* 72700-727FF: page 8 */ - 0x8, - /* 72800-728FF: page 8 */ - 0x8, - /* 72900-729FF: page 8 */ - 0x8, - /* 72A00-72AFF: page 8 */ - 0x8, - /* 72B00-72BFF: page 8 */ - 0x8, - /* 72C00-72CFF: page 8 */ - 0x8, - /* 72D00-72DFF: page 8 */ - 0x8, - /* 72E00-72EFF: page 8 */ - 0x8, - /* 72F00-72FFF: page 8 */ - 0x8, - /* 73000-730FF: page 8 */ - 0x8, - /* 73100-731FF: page 8 */ - 0x8, - /* 73200-732FF: page 8 */ - 0x8, - /* 73300-733FF: page 8 */ - 0x8, - /* 73400-734FF: page 8 */ - 0x8, - /* 73500-735FF: page 8 */ - 0x8, - /* 73600-736FF: page 8 */ - 0x8, - /* 73700-737FF: page 8 */ - 0x8, - /* 73800-738FF: page 8 */ - 0x8, - /* 73900-739FF: page 8 */ - 0x8, - /* 73A00-73AFF: page 8 */ - 0x8, - /* 73B00-73BFF: page 8 */ - 0x8, - /* 73C00-73CFF: page 8 */ - 0x8, - /* 73D00-73DFF: page 8 */ - 0x8, - /* 73E00-73EFF: page 8 */ - 0x8, - /* 73F00-73FFF: page 8 */ - 0x8, - /* 74000-740FF: page 8 */ - 0x8, - /* 74100-741FF: page 8 */ - 0x8, - /* 74200-742FF: page 8 */ - 0x8, - /* 74300-743FF: page 8 */ - 0x8, - /* 74400-744FF: page 8 */ - 0x8, - /* 74500-745FF: page 8 */ - 0x8, - /* 74600-746FF: page 8 */ - 0x8, - /* 74700-747FF: page 8 */ - 0x8, - /* 74800-748FF: page 8 */ - 0x8, - /* 74900-749FF: page 8 */ - 0x8, - /* 74A00-74AFF: page 8 */ - 0x8, - /* 74B00-74BFF: page 8 */ - 0x8, - /* 74C00-74CFF: page 8 */ - 0x8, - /* 74D00-74DFF: page 8 */ - 0x8, - /* 74E00-74EFF: page 8 */ - 0x8, - /* 74F00-74FFF: page 8 */ - 0x8, - /* 75000-750FF: page 8 */ - 0x8, - /* 75100-751FF: page 8 */ - 0x8, - /* 75200-752FF: page 8 */ - 0x8, - /* 75300-753FF: page 8 */ - 0x8, - /* 75400-754FF: page 8 */ - 0x8, - /* 75500-755FF: page 8 */ - 0x8, - /* 75600-756FF: page 8 */ - 0x8, - /* 75700-757FF: page 8 */ - 0x8, - /* 75800-758FF: page 8 */ - 0x8, - /* 75900-759FF: page 8 */ - 0x8, - /* 75A00-75AFF: page 8 */ - 0x8, - /* 75B00-75BFF: page 8 */ - 0x8, - /* 75C00-75CFF: page 8 */ - 0x8, - /* 75D00-75DFF: page 8 */ - 0x8, - /* 75E00-75EFF: page 8 */ - 0x8, - /* 75F00-75FFF: page 8 */ - 0x8, - /* 76000-760FF: page 8 */ - 0x8, - /* 76100-761FF: page 8 */ - 0x8, - /* 76200-762FF: page 8 */ - 0x8, - /* 76300-763FF: page 8 */ - 0x8, - /* 76400-764FF: page 8 */ - 0x8, - /* 76500-765FF: page 8 */ - 0x8, - /* 76600-766FF: page 8 */ - 0x8, - /* 76700-767FF: page 8 */ - 0x8, - /* 76800-768FF: page 8 */ - 0x8, - /* 76900-769FF: page 8 */ - 0x8, - /* 76A00-76AFF: page 8 */ - 0x8, - /* 76B00-76BFF: page 8 */ - 0x8, - /* 76C00-76CFF: page 8 */ - 0x8, - /* 76D00-76DFF: page 8 */ - 0x8, - /* 76E00-76EFF: page 8 */ - 0x8, - /* 76F00-76FFF: page 8 */ - 0x8, - /* 77000-770FF: page 8 */ - 0x8, - /* 77100-771FF: page 8 */ - 0x8, - /* 77200-772FF: page 8 */ - 0x8, - /* 77300-773FF: page 8 */ - 0x8, - /* 77400-774FF: page 8 */ - 0x8, - /* 77500-775FF: page 8 */ - 0x8, - /* 77600-776FF: page 8 */ - 0x8, - /* 77700-777FF: page 8 */ - 0x8, - /* 77800-778FF: page 8 */ - 0x8, - /* 77900-779FF: page 8 */ - 0x8, - /* 77A00-77AFF: page 8 */ - 0x8, - /* 77B00-77BFF: page 8 */ - 0x8, - /* 77C00-77CFF: page 8 */ - 0x8, - /* 77D00-77DFF: page 8 */ - 0x8, - /* 77E00-77EFF: page 8 */ - 0x8, - /* 77F00-77FFF: page 8 */ - 0x8, - /* 78000-780FF: page 8 */ - 0x8, - /* 78100-781FF: page 8 */ - 0x8, - /* 78200-782FF: page 8 */ - 0x8, - /* 78300-783FF: page 8 */ - 0x8, - /* 78400-784FF: page 8 */ - 0x8, - /* 78500-785FF: page 8 */ - 0x8, - /* 78600-786FF: page 8 */ - 0x8, - /* 78700-787FF: page 8 */ - 0x8, - /* 78800-788FF: page 8 */ - 0x8, - /* 78900-789FF: page 8 */ - 0x8, - /* 78A00-78AFF: page 8 */ - 0x8, - /* 78B00-78BFF: page 8 */ - 0x8, - /* 78C00-78CFF: page 8 */ - 0x8, - /* 78D00-78DFF: page 8 */ - 0x8, - /* 78E00-78EFF: page 8 */ - 0x8, - /* 78F00-78FFF: page 8 */ - 0x8, - /* 79000-790FF: page 8 */ - 0x8, - /* 79100-791FF: page 8 */ - 0x8, - /* 79200-792FF: page 8 */ - 0x8, - /* 79300-793FF: page 8 */ - 0x8, - /* 79400-794FF: page 8 */ - 0x8, - /* 79500-795FF: page 8 */ - 0x8, - /* 79600-796FF: page 8 */ - 0x8, - /* 79700-797FF: page 8 */ - 0x8, - /* 79800-798FF: page 8 */ - 0x8, - /* 79900-799FF: page 8 */ - 0x8, - /* 79A00-79AFF: page 8 */ - 0x8, - /* 79B00-79BFF: page 8 */ - 0x8, - /* 79C00-79CFF: page 8 */ - 0x8, - /* 79D00-79DFF: page 8 */ - 0x8, - /* 79E00-79EFF: page 8 */ - 0x8, - /* 79F00-79FFF: page 8 */ - 0x8, - /* 7A000-7A0FF: page 8 */ - 0x8, - /* 7A100-7A1FF: page 8 */ - 0x8, - /* 7A200-7A2FF: page 8 */ - 0x8, - /* 7A300-7A3FF: page 8 */ - 0x8, - /* 7A400-7A4FF: page 8 */ - 0x8, - /* 7A500-7A5FF: page 8 */ - 0x8, - /* 7A600-7A6FF: page 8 */ - 0x8, - /* 7A700-7A7FF: page 8 */ - 0x8, - /* 7A800-7A8FF: page 8 */ - 0x8, - /* 7A900-7A9FF: page 8 */ - 0x8, - /* 7AA00-7AAFF: page 8 */ - 0x8, - /* 7AB00-7ABFF: page 8 */ - 0x8, - /* 7AC00-7ACFF: page 8 */ - 0x8, - /* 7AD00-7ADFF: page 8 */ - 0x8, - /* 7AE00-7AEFF: page 8 */ - 0x8, - /* 7AF00-7AFFF: page 8 */ - 0x8, - /* 7B000-7B0FF: page 8 */ - 0x8, - /* 7B100-7B1FF: page 8 */ - 0x8, - /* 7B200-7B2FF: page 8 */ - 0x8, - /* 7B300-7B3FF: page 8 */ - 0x8, - /* 7B400-7B4FF: page 8 */ - 0x8, - /* 7B500-7B5FF: page 8 */ - 0x8, - /* 7B600-7B6FF: page 8 */ - 0x8, - /* 7B700-7B7FF: page 8 */ - 0x8, - /* 7B800-7B8FF: page 8 */ - 0x8, - /* 7B900-7B9FF: page 8 */ - 0x8, - /* 7BA00-7BAFF: page 8 */ - 0x8, - /* 7BB00-7BBFF: page 8 */ - 0x8, - /* 7BC00-7BCFF: page 8 */ - 0x8, - /* 7BD00-7BDFF: page 8 */ - 0x8, - /* 7BE00-7BEFF: page 8 */ - 0x8, - /* 7BF00-7BFFF: page 8 */ - 0x8, - /* 7C000-7C0FF: page 8 */ - 0x8, - /* 7C100-7C1FF: page 8 */ - 0x8, - /* 7C200-7C2FF: page 8 */ - 0x8, - /* 7C300-7C3FF: page 8 */ - 0x8, - /* 7C400-7C4FF: page 8 */ - 0x8, - /* 7C500-7C5FF: page 8 */ - 0x8, - /* 7C600-7C6FF: page 8 */ - 0x8, - /* 7C700-7C7FF: page 8 */ - 0x8, - /* 7C800-7C8FF: page 8 */ - 0x8, - /* 7C900-7C9FF: page 8 */ - 0x8, - /* 7CA00-7CAFF: page 8 */ - 0x8, - /* 7CB00-7CBFF: page 8 */ - 0x8, - /* 7CC00-7CCFF: page 8 */ - 0x8, - /* 7CD00-7CDFF: page 8 */ - 0x8, - /* 7CE00-7CEFF: page 8 */ - 0x8, - /* 7CF00-7CFFF: page 8 */ - 0x8, - /* 7D000-7D0FF: page 8 */ - 0x8, - /* 7D100-7D1FF: page 8 */ - 0x8, - /* 7D200-7D2FF: page 8 */ - 0x8, - /* 7D300-7D3FF: page 8 */ - 0x8, - /* 7D400-7D4FF: page 8 */ - 0x8, - /* 7D500-7D5FF: page 8 */ - 0x8, - /* 7D600-7D6FF: page 8 */ - 0x8, - /* 7D700-7D7FF: page 8 */ - 0x8, - /* 7D800-7D8FF: page 8 */ - 0x8, - /* 7D900-7D9FF: page 8 */ - 0x8, - /* 7DA00-7DAFF: page 8 */ - 0x8, - /* 7DB00-7DBFF: page 8 */ - 0x8, - /* 7DC00-7DCFF: page 8 */ - 0x8, - /* 7DD00-7DDFF: page 8 */ - 0x8, - /* 7DE00-7DEFF: page 8 */ - 0x8, - /* 7DF00-7DFFF: page 8 */ - 0x8, - /* 7E000-7E0FF: page 8 */ - 0x8, - /* 7E100-7E1FF: page 8 */ - 0x8, - /* 7E200-7E2FF: page 8 */ - 0x8, - /* 7E300-7E3FF: page 8 */ - 0x8, - /* 7E400-7E4FF: page 8 */ - 0x8, - /* 7E500-7E5FF: page 8 */ - 0x8, - /* 7E600-7E6FF: page 8 */ - 0x8, - /* 7E700-7E7FF: page 8 */ - 0x8, - /* 7E800-7E8FF: page 8 */ - 0x8, - /* 7E900-7E9FF: page 8 */ - 0x8, - /* 7EA00-7EAFF: page 8 */ - 0x8, - /* 7EB00-7EBFF: page 8 */ - 0x8, - /* 7EC00-7ECFF: page 8 */ - 0x8, - /* 7ED00-7EDFF: page 8 */ - 0x8, - /* 7EE00-7EEFF: page 8 */ - 0x8, - /* 7EF00-7EFFF: page 8 */ - 0x8, - /* 7F000-7F0FF: page 8 */ - 0x8, - /* 7F100-7F1FF: page 8 */ - 0x8, - /* 7F200-7F2FF: page 8 */ - 0x8, - /* 7F300-7F3FF: page 8 */ - 0x8, - /* 7F400-7F4FF: page 8 */ - 0x8, - /* 7F500-7F5FF: page 8 */ - 0x8, - /* 7F600-7F6FF: page 8 */ - 0x8, - /* 7F700-7F7FF: page 8 */ - 0x8, - /* 7F800-7F8FF: page 8 */ - 0x8, - /* 7F900-7F9FF: page 8 */ - 0x8, - /* 7FA00-7FAFF: page 8 */ - 0x8, - /* 7FB00-7FBFF: page 8 */ - 0x8, - /* 7FC00-7FCFF: page 8 */ - 0x8, - /* 7FD00-7FDFF: page 8 */ - 0x8, - /* 7FE00-7FEFF: page 8 */ - 0x8, - /* 7FF00-7FFFF: page 8 */ - 0x8, - /* 80000-800FF: page 8 */ - 0x8, - /* 80100-801FF: page 8 */ - 0x8, - /* 80200-802FF: page 8 */ - 0x8, - /* 80300-803FF: page 8 */ - 0x8, - /* 80400-804FF: page 8 */ - 0x8, - /* 80500-805FF: page 8 */ - 0x8, - /* 80600-806FF: page 8 */ - 0x8, - /* 80700-807FF: page 8 */ - 0x8, - /* 80800-808FF: page 8 */ - 0x8, - /* 80900-809FF: page 8 */ - 0x8, - /* 80A00-80AFF: page 8 */ - 0x8, - /* 80B00-80BFF: page 8 */ - 0x8, - /* 80C00-80CFF: page 8 */ - 0x8, - /* 80D00-80DFF: page 8 */ - 0x8, - /* 80E00-80EFF: page 8 */ - 0x8, - /* 80F00-80FFF: page 8 */ - 0x8, - /* 81000-810FF: page 8 */ - 0x8, - /* 81100-811FF: page 8 */ - 0x8, - /* 81200-812FF: page 8 */ - 0x8, - /* 81300-813FF: page 8 */ - 0x8, - /* 81400-814FF: page 8 */ - 0x8, - /* 81500-815FF: page 8 */ - 0x8, - /* 81600-816FF: page 8 */ - 0x8, - /* 81700-817FF: page 8 */ - 0x8, - /* 81800-818FF: page 8 */ - 0x8, - /* 81900-819FF: page 8 */ - 0x8, - /* 81A00-81AFF: page 8 */ - 0x8, - /* 81B00-81BFF: page 8 */ - 0x8, - /* 81C00-81CFF: page 8 */ - 0x8, - /* 81D00-81DFF: page 8 */ - 0x8, - /* 81E00-81EFF: page 8 */ - 0x8, - /* 81F00-81FFF: page 8 */ - 0x8, - /* 82000-820FF: page 8 */ - 0x8, - /* 82100-821FF: page 8 */ - 0x8, - /* 82200-822FF: page 8 */ - 0x8, - /* 82300-823FF: page 8 */ - 0x8, - /* 82400-824FF: page 8 */ - 0x8, - /* 82500-825FF: page 8 */ - 0x8, - /* 82600-826FF: page 8 */ - 0x8, - /* 82700-827FF: page 8 */ - 0x8, - /* 82800-828FF: page 8 */ - 0x8, - /* 82900-829FF: page 8 */ - 0x8, - /* 82A00-82AFF: page 8 */ - 0x8, - /* 82B00-82BFF: page 8 */ - 0x8, - /* 82C00-82CFF: page 8 */ - 0x8, - /* 82D00-82DFF: page 8 */ - 0x8, - /* 82E00-82EFF: page 8 */ - 0x8, - /* 82F00-82FFF: page 8 */ - 0x8, - /* 83000-830FF: page 8 */ - 0x8, - /* 83100-831FF: page 8 */ - 0x8, - /* 83200-832FF: page 8 */ - 0x8, - /* 83300-833FF: page 8 */ - 0x8, - /* 83400-834FF: page 8 */ - 0x8, - /* 83500-835FF: page 8 */ - 0x8, - /* 83600-836FF: page 8 */ - 0x8, - /* 83700-837FF: page 8 */ - 0x8, - /* 83800-838FF: page 8 */ - 0x8, - /* 83900-839FF: page 8 */ - 0x8, - /* 83A00-83AFF: page 8 */ - 0x8, - /* 83B00-83BFF: page 8 */ - 0x8, - /* 83C00-83CFF: page 8 */ - 0x8, - /* 83D00-83DFF: page 8 */ - 0x8, - /* 83E00-83EFF: page 8 */ - 0x8, - /* 83F00-83FFF: page 8 */ - 0x8, - /* 84000-840FF: page 8 */ - 0x8, - /* 84100-841FF: page 8 */ - 0x8, - /* 84200-842FF: page 8 */ - 0x8, - /* 84300-843FF: page 8 */ - 0x8, - /* 84400-844FF: page 8 */ - 0x8, - /* 84500-845FF: page 8 */ - 0x8, - /* 84600-846FF: page 8 */ - 0x8, - /* 84700-847FF: page 8 */ - 0x8, - /* 84800-848FF: page 8 */ - 0x8, - /* 84900-849FF: page 8 */ - 0x8, - /* 84A00-84AFF: page 8 */ - 0x8, - /* 84B00-84BFF: page 8 */ - 0x8, - /* 84C00-84CFF: page 8 */ - 0x8, - /* 84D00-84DFF: page 8 */ - 0x8, - /* 84E00-84EFF: page 8 */ - 0x8, - /* 84F00-84FFF: page 8 */ - 0x8, - /* 85000-850FF: page 8 */ - 0x8, - /* 85100-851FF: page 8 */ - 0x8, - /* 85200-852FF: page 8 */ - 0x8, - /* 85300-853FF: page 8 */ - 0x8, - /* 85400-854FF: page 8 */ - 0x8, - /* 85500-855FF: page 8 */ - 0x8, - /* 85600-856FF: page 8 */ - 0x8, - /* 85700-857FF: page 8 */ - 0x8, - /* 85800-858FF: page 8 */ - 0x8, - /* 85900-859FF: page 8 */ - 0x8, - /* 85A00-85AFF: page 8 */ - 0x8, - /* 85B00-85BFF: page 8 */ - 0x8, - /* 85C00-85CFF: page 8 */ - 0x8, - /* 85D00-85DFF: page 8 */ - 0x8, - /* 85E00-85EFF: page 8 */ - 0x8, - /* 85F00-85FFF: page 8 */ - 0x8, - /* 86000-860FF: page 8 */ - 0x8, - /* 86100-861FF: page 8 */ - 0x8, - /* 86200-862FF: page 8 */ - 0x8, - /* 86300-863FF: page 8 */ - 0x8, - /* 86400-864FF: page 8 */ - 0x8, - /* 86500-865FF: page 8 */ - 0x8, - /* 86600-866FF: page 8 */ - 0x8, - /* 86700-867FF: page 8 */ - 0x8, - /* 86800-868FF: page 8 */ - 0x8, - /* 86900-869FF: page 8 */ - 0x8, - /* 86A00-86AFF: page 8 */ - 0x8, - /* 86B00-86BFF: page 8 */ - 0x8, - /* 86C00-86CFF: page 8 */ - 0x8, - /* 86D00-86DFF: page 8 */ - 0x8, - /* 86E00-86EFF: page 8 */ - 0x8, - /* 86F00-86FFF: page 8 */ - 0x8, - /* 87000-870FF: page 8 */ - 0x8, - /* 87100-871FF: page 8 */ - 0x8, - /* 87200-872FF: page 8 */ - 0x8, - /* 87300-873FF: page 8 */ - 0x8, - /* 87400-874FF: page 8 */ - 0x8, - /* 87500-875FF: page 8 */ - 0x8, - /* 87600-876FF: page 8 */ - 0x8, - /* 87700-877FF: page 8 */ - 0x8, - /* 87800-878FF: page 8 */ - 0x8, - /* 87900-879FF: page 8 */ - 0x8, - /* 87A00-87AFF: page 8 */ - 0x8, - /* 87B00-87BFF: page 8 */ - 0x8, - /* 87C00-87CFF: page 8 */ - 0x8, - /* 87D00-87DFF: page 8 */ - 0x8, - /* 87E00-87EFF: page 8 */ - 0x8, - /* 87F00-87FFF: page 8 */ - 0x8, - /* 88000-880FF: page 8 */ - 0x8, - /* 88100-881FF: page 8 */ - 0x8, - /* 88200-882FF: page 8 */ - 0x8, - /* 88300-883FF: page 8 */ - 0x8, - /* 88400-884FF: page 8 */ - 0x8, - /* 88500-885FF: page 8 */ - 0x8, - /* 88600-886FF: page 8 */ - 0x8, - /* 88700-887FF: page 8 */ - 0x8, - /* 88800-888FF: page 8 */ - 0x8, - /* 88900-889FF: page 8 */ - 0x8, - /* 88A00-88AFF: page 8 */ - 0x8, - /* 88B00-88BFF: page 8 */ - 0x8, - /* 88C00-88CFF: page 8 */ - 0x8, - /* 88D00-88DFF: page 8 */ - 0x8, - /* 88E00-88EFF: page 8 */ - 0x8, - /* 88F00-88FFF: page 8 */ - 0x8, - /* 89000-890FF: page 8 */ - 0x8, - /* 89100-891FF: page 8 */ - 0x8, - /* 89200-892FF: page 8 */ - 0x8, - /* 89300-893FF: page 8 */ - 0x8, - /* 89400-894FF: page 8 */ - 0x8, - /* 89500-895FF: page 8 */ - 0x8, - /* 89600-896FF: page 8 */ - 0x8, - /* 89700-897FF: page 8 */ - 0x8, - /* 89800-898FF: page 8 */ - 0x8, - /* 89900-899FF: page 8 */ - 0x8, - /* 89A00-89AFF: page 8 */ - 0x8, - /* 89B00-89BFF: page 8 */ - 0x8, - /* 89C00-89CFF: page 8 */ - 0x8, - /* 89D00-89DFF: page 8 */ - 0x8, - /* 89E00-89EFF: page 8 */ - 0x8, - /* 89F00-89FFF: page 8 */ - 0x8, - /* 8A000-8A0FF: page 8 */ - 0x8, - /* 8A100-8A1FF: page 8 */ - 0x8, - /* 8A200-8A2FF: page 8 */ - 0x8, - /* 8A300-8A3FF: page 8 */ - 0x8, - /* 8A400-8A4FF: page 8 */ - 0x8, - /* 8A500-8A5FF: page 8 */ - 0x8, - /* 8A600-8A6FF: page 8 */ - 0x8, - /* 8A700-8A7FF: page 8 */ - 0x8, - /* 8A800-8A8FF: page 8 */ - 0x8, - /* 8A900-8A9FF: page 8 */ - 0x8, - /* 8AA00-8AAFF: page 8 */ - 0x8, - /* 8AB00-8ABFF: page 8 */ - 0x8, - /* 8AC00-8ACFF: page 8 */ - 0x8, - /* 8AD00-8ADFF: page 8 */ - 0x8, - /* 8AE00-8AEFF: page 8 */ - 0x8, - /* 8AF00-8AFFF: page 8 */ - 0x8, - /* 8B000-8B0FF: page 8 */ - 0x8, - /* 8B100-8B1FF: page 8 */ - 0x8, - /* 8B200-8B2FF: page 8 */ - 0x8, - /* 8B300-8B3FF: page 8 */ - 0x8, - /* 8B400-8B4FF: page 8 */ - 0x8, - /* 8B500-8B5FF: page 8 */ - 0x8, - /* 8B600-8B6FF: page 8 */ - 0x8, - /* 8B700-8B7FF: page 8 */ - 0x8, - /* 8B800-8B8FF: page 8 */ - 0x8, - /* 8B900-8B9FF: page 8 */ - 0x8, - /* 8BA00-8BAFF: page 8 */ - 0x8, - /* 8BB00-8BBFF: page 8 */ - 0x8, - /* 8BC00-8BCFF: page 8 */ - 0x8, - /* 8BD00-8BDFF: page 8 */ - 0x8, - /* 8BE00-8BEFF: page 8 */ - 0x8, - /* 8BF00-8BFFF: page 8 */ - 0x8, - /* 8C000-8C0FF: page 8 */ - 0x8, - /* 8C100-8C1FF: page 8 */ - 0x8, - /* 8C200-8C2FF: page 8 */ - 0x8, - /* 8C300-8C3FF: page 8 */ - 0x8, - /* 8C400-8C4FF: page 8 */ - 0x8, - /* 8C500-8C5FF: page 8 */ - 0x8, - /* 8C600-8C6FF: page 8 */ - 0x8, - /* 8C700-8C7FF: page 8 */ - 0x8, - /* 8C800-8C8FF: page 8 */ - 0x8, - /* 8C900-8C9FF: page 8 */ - 0x8, - /* 8CA00-8CAFF: page 8 */ - 0x8, - /* 8CB00-8CBFF: page 8 */ - 0x8, - /* 8CC00-8CCFF: page 8 */ - 0x8, - /* 8CD00-8CDFF: page 8 */ - 0x8, - /* 8CE00-8CEFF: page 8 */ - 0x8, - /* 8CF00-8CFFF: page 8 */ - 0x8, - /* 8D000-8D0FF: page 8 */ - 0x8, - /* 8D100-8D1FF: page 8 */ - 0x8, - /* 8D200-8D2FF: page 8 */ - 0x8, - /* 8D300-8D3FF: page 8 */ - 0x8, - /* 8D400-8D4FF: page 8 */ - 0x8, - /* 8D500-8D5FF: page 8 */ - 0x8, - /* 8D600-8D6FF: page 8 */ - 0x8, - /* 8D700-8D7FF: page 8 */ - 0x8, - /* 8D800-8D8FF: page 8 */ - 0x8, - /* 8D900-8D9FF: page 8 */ - 0x8, - /* 8DA00-8DAFF: page 8 */ - 0x8, - /* 8DB00-8DBFF: page 8 */ - 0x8, - /* 8DC00-8DCFF: page 8 */ - 0x8, - /* 8DD00-8DDFF: page 8 */ - 0x8, - /* 8DE00-8DEFF: page 8 */ - 0x8, - /* 8DF00-8DFFF: page 8 */ - 0x8, - /* 8E000-8E0FF: page 8 */ - 0x8, - /* 8E100-8E1FF: page 8 */ - 0x8, - /* 8E200-8E2FF: page 8 */ - 0x8, - /* 8E300-8E3FF: page 8 */ - 0x8, - /* 8E400-8E4FF: page 8 */ - 0x8, - /* 8E500-8E5FF: page 8 */ - 0x8, - /* 8E600-8E6FF: page 8 */ - 0x8, - /* 8E700-8E7FF: page 8 */ - 0x8, - /* 8E800-8E8FF: page 8 */ - 0x8, - /* 8E900-8E9FF: page 8 */ - 0x8, - /* 8EA00-8EAFF: page 8 */ - 0x8, - /* 8EB00-8EBFF: page 8 */ - 0x8, - /* 8EC00-8ECFF: page 8 */ - 0x8, - /* 8ED00-8EDFF: page 8 */ - 0x8, - /* 8EE00-8EEFF: page 8 */ - 0x8, - /* 8EF00-8EFFF: page 8 */ - 0x8, - /* 8F000-8F0FF: page 8 */ - 0x8, - /* 8F100-8F1FF: page 8 */ - 0x8, - /* 8F200-8F2FF: page 8 */ - 0x8, - /* 8F300-8F3FF: page 8 */ - 0x8, - /* 8F400-8F4FF: page 8 */ - 0x8, - /* 8F500-8F5FF: page 8 */ - 0x8, - /* 8F600-8F6FF: page 8 */ - 0x8, - /* 8F700-8F7FF: page 8 */ - 0x8, - /* 8F800-8F8FF: page 8 */ - 0x8, - /* 8F900-8F9FF: page 8 */ - 0x8, - /* 8FA00-8FAFF: page 8 */ - 0x8, - /* 8FB00-8FBFF: page 8 */ - 0x8, - /* 8FC00-8FCFF: page 8 */ - 0x8, - /* 8FD00-8FDFF: page 8 */ - 0x8, - /* 8FE00-8FEFF: page 8 */ - 0x8, - /* 8FF00-8FFFF: page 8 */ - 0x8, - /* 90000-900FF: page 8 */ - 0x8, - /* 90100-901FF: page 8 */ - 0x8, - /* 90200-902FF: page 8 */ - 0x8, - /* 90300-903FF: page 8 */ - 0x8, - /* 90400-904FF: page 8 */ - 0x8, - /* 90500-905FF: page 8 */ - 0x8, - /* 90600-906FF: page 8 */ - 0x8, - /* 90700-907FF: page 8 */ - 0x8, - /* 90800-908FF: page 8 */ - 0x8, - /* 90900-909FF: page 8 */ - 0x8, - /* 90A00-90AFF: page 8 */ - 0x8, - /* 90B00-90BFF: page 8 */ - 0x8, - /* 90C00-90CFF: page 8 */ - 0x8, - /* 90D00-90DFF: page 8 */ - 0x8, - /* 90E00-90EFF: page 8 */ - 0x8, - /* 90F00-90FFF: page 8 */ - 0x8, - /* 91000-910FF: page 8 */ - 0x8, - /* 91100-911FF: page 8 */ - 0x8, - /* 91200-912FF: page 8 */ - 0x8, - /* 91300-913FF: page 8 */ - 0x8, - /* 91400-914FF: page 8 */ - 0x8, - /* 91500-915FF: page 8 */ - 0x8, - /* 91600-916FF: page 8 */ - 0x8, - /* 91700-917FF: page 8 */ - 0x8, - /* 91800-918FF: page 8 */ - 0x8, - /* 91900-919FF: page 8 */ - 0x8, - /* 91A00-91AFF: page 8 */ - 0x8, - /* 91B00-91BFF: page 8 */ - 0x8, - /* 91C00-91CFF: page 8 */ - 0x8, - /* 91D00-91DFF: page 8 */ - 0x8, - /* 91E00-91EFF: page 8 */ - 0x8, - /* 91F00-91FFF: page 8 */ - 0x8, - /* 92000-920FF: page 8 */ - 0x8, - /* 92100-921FF: page 8 */ - 0x8, - /* 92200-922FF: page 8 */ - 0x8, - /* 92300-923FF: page 8 */ - 0x8, - /* 92400-924FF: page 8 */ - 0x8, - /* 92500-925FF: page 8 */ - 0x8, - /* 92600-926FF: page 8 */ - 0x8, - /* 92700-927FF: page 8 */ - 0x8, - /* 92800-928FF: page 8 */ - 0x8, - /* 92900-929FF: page 8 */ - 0x8, - /* 92A00-92AFF: page 8 */ - 0x8, - /* 92B00-92BFF: page 8 */ - 0x8, - /* 92C00-92CFF: page 8 */ - 0x8, - /* 92D00-92DFF: page 8 */ - 0x8, - /* 92E00-92EFF: page 8 */ - 0x8, - /* 92F00-92FFF: page 8 */ - 0x8, - /* 93000-930FF: page 8 */ - 0x8, - /* 93100-931FF: page 8 */ - 0x8, - /* 93200-932FF: page 8 */ - 0x8, - /* 93300-933FF: page 8 */ - 0x8, - /* 93400-934FF: page 8 */ - 0x8, - /* 93500-935FF: page 8 */ - 0x8, - /* 93600-936FF: page 8 */ - 0x8, - /* 93700-937FF: page 8 */ - 0x8, - /* 93800-938FF: page 8 */ - 0x8, - /* 93900-939FF: page 8 */ - 0x8, - /* 93A00-93AFF: page 8 */ - 0x8, - /* 93B00-93BFF: page 8 */ - 0x8, - /* 93C00-93CFF: page 8 */ - 0x8, - /* 93D00-93DFF: page 8 */ - 0x8, - /* 93E00-93EFF: page 8 */ - 0x8, - /* 93F00-93FFF: page 8 */ - 0x8, - /* 94000-940FF: page 8 */ - 0x8, - /* 94100-941FF: page 8 */ - 0x8, - /* 94200-942FF: page 8 */ - 0x8, - /* 94300-943FF: page 8 */ - 0x8, - /* 94400-944FF: page 8 */ - 0x8, - /* 94500-945FF: page 8 */ - 0x8, - /* 94600-946FF: page 8 */ - 0x8, - /* 94700-947FF: page 8 */ - 0x8, - /* 94800-948FF: page 8 */ - 0x8, - /* 94900-949FF: page 8 */ - 0x8, - /* 94A00-94AFF: page 8 */ - 0x8, - /* 94B00-94BFF: page 8 */ - 0x8, - /* 94C00-94CFF: page 8 */ - 0x8, - /* 94D00-94DFF: page 8 */ - 0x8, - /* 94E00-94EFF: page 8 */ - 0x8, - /* 94F00-94FFF: page 8 */ - 0x8, - /* 95000-950FF: page 8 */ - 0x8, - /* 95100-951FF: page 8 */ - 0x8, - /* 95200-952FF: page 8 */ - 0x8, - /* 95300-953FF: page 8 */ - 0x8, - /* 95400-954FF: page 8 */ - 0x8, - /* 95500-955FF: page 8 */ - 0x8, - /* 95600-956FF: page 8 */ - 0x8, - /* 95700-957FF: page 8 */ - 0x8, - /* 95800-958FF: page 8 */ - 0x8, - /* 95900-959FF: page 8 */ - 0x8, - /* 95A00-95AFF: page 8 */ - 0x8, - /* 95B00-95BFF: page 8 */ - 0x8, - /* 95C00-95CFF: page 8 */ - 0x8, - /* 95D00-95DFF: page 8 */ - 0x8, - /* 95E00-95EFF: page 8 */ - 0x8, - /* 95F00-95FFF: page 8 */ - 0x8, - /* 96000-960FF: page 8 */ - 0x8, - /* 96100-961FF: page 8 */ - 0x8, - /* 96200-962FF: page 8 */ - 0x8, - /* 96300-963FF: page 8 */ - 0x8, - /* 96400-964FF: page 8 */ - 0x8, - /* 96500-965FF: page 8 */ - 0x8, - /* 96600-966FF: page 8 */ - 0x8, - /* 96700-967FF: page 8 */ - 0x8, - /* 96800-968FF: page 8 */ - 0x8, - /* 96900-969FF: page 8 */ - 0x8, - /* 96A00-96AFF: page 8 */ - 0x8, - /* 96B00-96BFF: page 8 */ - 0x8, - /* 96C00-96CFF: page 8 */ - 0x8, - /* 96D00-96DFF: page 8 */ - 0x8, - /* 96E00-96EFF: page 8 */ - 0x8, - /* 96F00-96FFF: page 8 */ - 0x8, - /* 97000-970FF: page 8 */ - 0x8, - /* 97100-971FF: page 8 */ - 0x8, - /* 97200-972FF: page 8 */ - 0x8, - /* 97300-973FF: page 8 */ - 0x8, - /* 97400-974FF: page 8 */ - 0x8, - /* 97500-975FF: page 8 */ - 0x8, - /* 97600-976FF: page 8 */ - 0x8, - /* 97700-977FF: page 8 */ - 0x8, - /* 97800-978FF: page 8 */ - 0x8, - /* 97900-979FF: page 8 */ - 0x8, - /* 97A00-97AFF: page 8 */ - 0x8, - /* 97B00-97BFF: page 8 */ - 0x8, - /* 97C00-97CFF: page 8 */ - 0x8, - /* 97D00-97DFF: page 8 */ - 0x8, - /* 97E00-97EFF: page 8 */ - 0x8, - /* 97F00-97FFF: page 8 */ - 0x8, - /* 98000-980FF: page 8 */ - 0x8, - /* 98100-981FF: page 8 */ - 0x8, - /* 98200-982FF: page 8 */ - 0x8, - /* 98300-983FF: page 8 */ - 0x8, - /* 98400-984FF: page 8 */ - 0x8, - /* 98500-985FF: page 8 */ - 0x8, - /* 98600-986FF: page 8 */ - 0x8, - /* 98700-987FF: page 8 */ - 0x8, - /* 98800-988FF: page 8 */ - 0x8, - /* 98900-989FF: page 8 */ - 0x8, - /* 98A00-98AFF: page 8 */ - 0x8, - /* 98B00-98BFF: page 8 */ - 0x8, - /* 98C00-98CFF: page 8 */ - 0x8, - /* 98D00-98DFF: page 8 */ - 0x8, - /* 98E00-98EFF: page 8 */ - 0x8, - /* 98F00-98FFF: page 8 */ - 0x8, - /* 99000-990FF: page 8 */ - 0x8, - /* 99100-991FF: page 8 */ - 0x8, - /* 99200-992FF: page 8 */ - 0x8, - /* 99300-993FF: page 8 */ - 0x8, - /* 99400-994FF: page 8 */ - 0x8, - /* 99500-995FF: page 8 */ - 0x8, - /* 99600-996FF: page 8 */ - 0x8, - /* 99700-997FF: page 8 */ - 0x8, - /* 99800-998FF: page 8 */ - 0x8, - /* 99900-999FF: page 8 */ - 0x8, - /* 99A00-99AFF: page 8 */ - 0x8, - /* 99B00-99BFF: page 8 */ - 0x8, - /* 99C00-99CFF: page 8 */ - 0x8, - /* 99D00-99DFF: page 8 */ - 0x8, - /* 99E00-99EFF: page 8 */ - 0x8, - /* 99F00-99FFF: page 8 */ - 0x8, - /* 9A000-9A0FF: page 8 */ - 0x8, - /* 9A100-9A1FF: page 8 */ - 0x8, - /* 9A200-9A2FF: page 8 */ - 0x8, - /* 9A300-9A3FF: page 8 */ - 0x8, - /* 9A400-9A4FF: page 8 */ - 0x8, - /* 9A500-9A5FF: page 8 */ - 0x8, - /* 9A600-9A6FF: page 8 */ - 0x8, - /* 9A700-9A7FF: page 8 */ - 0x8, - /* 9A800-9A8FF: page 8 */ - 0x8, - /* 9A900-9A9FF: page 8 */ - 0x8, - /* 9AA00-9AAFF: page 8 */ - 0x8, - /* 9AB00-9ABFF: page 8 */ - 0x8, - /* 9AC00-9ACFF: page 8 */ - 0x8, - /* 9AD00-9ADFF: page 8 */ - 0x8, - /* 9AE00-9AEFF: page 8 */ - 0x8, - /* 9AF00-9AFFF: page 8 */ - 0x8, - /* 9B000-9B0FF: page 8 */ - 0x8, - /* 9B100-9B1FF: page 8 */ - 0x8, - /* 9B200-9B2FF: page 8 */ - 0x8, - /* 9B300-9B3FF: page 8 */ - 0x8, - /* 9B400-9B4FF: page 8 */ - 0x8, - /* 9B500-9B5FF: page 8 */ - 0x8, - /* 9B600-9B6FF: page 8 */ - 0x8, - /* 9B700-9B7FF: page 8 */ - 0x8, - /* 9B800-9B8FF: page 8 */ - 0x8, - /* 9B900-9B9FF: page 8 */ - 0x8, - /* 9BA00-9BAFF: page 8 */ - 0x8, - /* 9BB00-9BBFF: page 8 */ - 0x8, - /* 9BC00-9BCFF: page 8 */ - 0x8, - /* 9BD00-9BDFF: page 8 */ - 0x8, - /* 9BE00-9BEFF: page 8 */ - 0x8, - /* 9BF00-9BFFF: page 8 */ - 0x8, - /* 9C000-9C0FF: page 8 */ - 0x8, - /* 9C100-9C1FF: page 8 */ - 0x8, - /* 9C200-9C2FF: page 8 */ - 0x8, - /* 9C300-9C3FF: page 8 */ - 0x8, - /* 9C400-9C4FF: page 8 */ - 0x8, - /* 9C500-9C5FF: page 8 */ - 0x8, - /* 9C600-9C6FF: page 8 */ - 0x8, - /* 9C700-9C7FF: page 8 */ - 0x8, - /* 9C800-9C8FF: page 8 */ - 0x8, - /* 9C900-9C9FF: page 8 */ - 0x8, - /* 9CA00-9CAFF: page 8 */ - 0x8, - /* 9CB00-9CBFF: page 8 */ - 0x8, - /* 9CC00-9CCFF: page 8 */ - 0x8, - /* 9CD00-9CDFF: page 8 */ - 0x8, - /* 9CE00-9CEFF: page 8 */ - 0x8, - /* 9CF00-9CFFF: page 8 */ - 0x8, - /* 9D000-9D0FF: page 8 */ - 0x8, - /* 9D100-9D1FF: page 8 */ - 0x8, - /* 9D200-9D2FF: page 8 */ - 0x8, - /* 9D300-9D3FF: page 8 */ - 0x8, - /* 9D400-9D4FF: page 8 */ - 0x8, - /* 9D500-9D5FF: page 8 */ - 0x8, - /* 9D600-9D6FF: page 8 */ - 0x8, - /* 9D700-9D7FF: page 8 */ - 0x8, - /* 9D800-9D8FF: page 8 */ - 0x8, - /* 9D900-9D9FF: page 8 */ - 0x8, - /* 9DA00-9DAFF: page 8 */ - 0x8, - /* 9DB00-9DBFF: page 8 */ - 0x8, - /* 9DC00-9DCFF: page 8 */ - 0x8, - /* 9DD00-9DDFF: page 8 */ - 0x8, - /* 9DE00-9DEFF: page 8 */ - 0x8, - /* 9DF00-9DFFF: page 8 */ - 0x8, - /* 9E000-9E0FF: page 8 */ - 0x8, - /* 9E100-9E1FF: page 8 */ - 0x8, - /* 9E200-9E2FF: page 8 */ - 0x8, - /* 9E300-9E3FF: page 8 */ - 0x8, - /* 9E400-9E4FF: page 8 */ - 0x8, - /* 9E500-9E5FF: page 8 */ - 0x8, - /* 9E600-9E6FF: page 8 */ - 0x8, - /* 9E700-9E7FF: page 8 */ - 0x8, - /* 9E800-9E8FF: page 8 */ - 0x8, - /* 9E900-9E9FF: page 8 */ - 0x8, - /* 9EA00-9EAFF: page 8 */ - 0x8, - /* 9EB00-9EBFF: page 8 */ - 0x8, - /* 9EC00-9ECFF: page 8 */ - 0x8, - /* 9ED00-9EDFF: page 8 */ - 0x8, - /* 9EE00-9EEFF: page 8 */ - 0x8, - /* 9EF00-9EFFF: page 8 */ - 0x8, - /* 9F000-9F0FF: page 8 */ - 0x8, - /* 9F100-9F1FF: page 8 */ - 0x8, - /* 9F200-9F2FF: page 8 */ - 0x8, - /* 9F300-9F3FF: page 8 */ - 0x8, - /* 9F400-9F4FF: page 8 */ - 0x8, - /* 9F500-9F5FF: page 8 */ - 0x8, - /* 9F600-9F6FF: page 8 */ - 0x8, - /* 9F700-9F7FF: page 8 */ - 0x8, - /* 9F800-9F8FF: page 8 */ - 0x8, - /* 9F900-9F9FF: page 8 */ - 0x8, - /* 9FA00-9FAFF: page 8 */ - 0x8, - /* 9FB00-9FBFF: page 8 */ - 0x8, - /* 9FC00-9FCFF: page 8 */ - 0x8, - /* 9FD00-9FDFF: page 8 */ - 0x8, - /* 9FE00-9FEFF: page 8 */ - 0x8, - /* 9FF00-9FFFF: page 8 */ - 0x8, - /* A0000-A00FF: page 8 */ - 0x8, - /* A0100-A01FF: page 8 */ - 0x8, - /* A0200-A02FF: page 8 */ - 0x8, - /* A0300-A03FF: page 8 */ - 0x8, - /* A0400-A04FF: page 8 */ - 0x8, - /* A0500-A05FF: page 8 */ - 0x8, - /* A0600-A06FF: page 8 */ - 0x8, - /* A0700-A07FF: page 8 */ - 0x8, - /* A0800-A08FF: page 8 */ - 0x8, - /* A0900-A09FF: page 8 */ - 0x8, - /* A0A00-A0AFF: page 8 */ - 0x8, - /* A0B00-A0BFF: page 8 */ - 0x8, - /* A0C00-A0CFF: page 8 */ - 0x8, - /* A0D00-A0DFF: page 8 */ - 0x8, - /* A0E00-A0EFF: page 8 */ - 0x8, - /* A0F00-A0FFF: page 8 */ - 0x8, - /* A1000-A10FF: page 8 */ - 0x8, - /* A1100-A11FF: page 8 */ - 0x8, - /* A1200-A12FF: page 8 */ - 0x8, - /* A1300-A13FF: page 8 */ - 0x8, - /* A1400-A14FF: page 8 */ - 0x8, - /* A1500-A15FF: page 8 */ - 0x8, - /* A1600-A16FF: page 8 */ - 0x8, - /* A1700-A17FF: page 8 */ - 0x8, - /* A1800-A18FF: page 8 */ - 0x8, - /* A1900-A19FF: page 8 */ - 0x8, - /* A1A00-A1AFF: page 8 */ - 0x8, - /* A1B00-A1BFF: page 8 */ - 0x8, - /* A1C00-A1CFF: page 8 */ - 0x8, - /* A1D00-A1DFF: page 8 */ - 0x8, - /* A1E00-A1EFF: page 8 */ - 0x8, - /* A1F00-A1FFF: page 8 */ - 0x8, - /* A2000-A20FF: page 8 */ - 0x8, - /* A2100-A21FF: page 8 */ - 0x8, - /* A2200-A22FF: page 8 */ - 0x8, - /* A2300-A23FF: page 8 */ - 0x8, - /* A2400-A24FF: page 8 */ - 0x8, - /* A2500-A25FF: page 8 */ - 0x8, - /* A2600-A26FF: page 8 */ - 0x8, - /* A2700-A27FF: page 8 */ - 0x8, - /* A2800-A28FF: page 8 */ - 0x8, - /* A2900-A29FF: page 8 */ - 0x8, - /* A2A00-A2AFF: page 8 */ - 0x8, - /* A2B00-A2BFF: page 8 */ - 0x8, - /* A2C00-A2CFF: page 8 */ - 0x8, - /* A2D00-A2DFF: page 8 */ - 0x8, - /* A2E00-A2EFF: page 8 */ - 0x8, - /* A2F00-A2FFF: page 8 */ - 0x8, - /* A3000-A30FF: page 8 */ - 0x8, - /* A3100-A31FF: page 8 */ - 0x8, - /* A3200-A32FF: page 8 */ - 0x8, - /* A3300-A33FF: page 8 */ - 0x8, - /* A3400-A34FF: page 8 */ - 0x8, - /* A3500-A35FF: page 8 */ - 0x8, - /* A3600-A36FF: page 8 */ - 0x8, - /* A3700-A37FF: page 8 */ - 0x8, - /* A3800-A38FF: page 8 */ - 0x8, - /* A3900-A39FF: page 8 */ - 0x8, - /* A3A00-A3AFF: page 8 */ - 0x8, - /* A3B00-A3BFF: page 8 */ - 0x8, - /* A3C00-A3CFF: page 8 */ - 0x8, - /* A3D00-A3DFF: page 8 */ - 0x8, - /* A3E00-A3EFF: page 8 */ - 0x8, - /* A3F00-A3FFF: page 8 */ - 0x8, - /* A4000-A40FF: page 8 */ - 0x8, - /* A4100-A41FF: page 8 */ - 0x8, - /* A4200-A42FF: page 8 */ - 0x8, - /* A4300-A43FF: page 8 */ - 0x8, - /* A4400-A44FF: page 8 */ - 0x8, - /* A4500-A45FF: page 8 */ - 0x8, - /* A4600-A46FF: page 8 */ - 0x8, - /* A4700-A47FF: page 8 */ - 0x8, - /* A4800-A48FF: page 8 */ - 0x8, - /* A4900-A49FF: page 8 */ - 0x8, - /* A4A00-A4AFF: page 8 */ - 0x8, - /* A4B00-A4BFF: page 8 */ - 0x8, - /* A4C00-A4CFF: page 8 */ - 0x8, - /* A4D00-A4DFF: page 8 */ - 0x8, - /* A4E00-A4EFF: page 8 */ - 0x8, - /* A4F00-A4FFF: page 8 */ - 0x8, - /* A5000-A50FF: page 8 */ - 0x8, - /* A5100-A51FF: page 8 */ - 0x8, - /* A5200-A52FF: page 8 */ - 0x8, - /* A5300-A53FF: page 8 */ - 0x8, - /* A5400-A54FF: page 8 */ - 0x8, - /* A5500-A55FF: page 8 */ - 0x8, - /* A5600-A56FF: page 8 */ - 0x8, - /* A5700-A57FF: page 8 */ - 0x8, - /* A5800-A58FF: page 8 */ - 0x8, - /* A5900-A59FF: page 8 */ - 0x8, - /* A5A00-A5AFF: page 8 */ - 0x8, - /* A5B00-A5BFF: page 8 */ - 0x8, - /* A5C00-A5CFF: page 8 */ - 0x8, - /* A5D00-A5DFF: page 8 */ - 0x8, - /* A5E00-A5EFF: page 8 */ - 0x8, - /* A5F00-A5FFF: page 8 */ - 0x8, - /* A6000-A60FF: page 8 */ - 0x8, - /* A6100-A61FF: page 8 */ - 0x8, - /* A6200-A62FF: page 8 */ - 0x8, - /* A6300-A63FF: page 8 */ - 0x8, - /* A6400-A64FF: page 8 */ - 0x8, - /* A6500-A65FF: page 8 */ - 0x8, - /* A6600-A66FF: page 8 */ - 0x8, - /* A6700-A67FF: page 8 */ - 0x8, - /* A6800-A68FF: page 8 */ - 0x8, - /* A6900-A69FF: page 8 */ - 0x8, - /* A6A00-A6AFF: page 8 */ - 0x8, - /* A6B00-A6BFF: page 8 */ - 0x8, - /* A6C00-A6CFF: page 8 */ - 0x8, - /* A6D00-A6DFF: page 8 */ - 0x8, - /* A6E00-A6EFF: page 8 */ - 0x8, - /* A6F00-A6FFF: page 8 */ - 0x8, - /* A7000-A70FF: page 8 */ - 0x8, - /* A7100-A71FF: page 8 */ - 0x8, - /* A7200-A72FF: page 8 */ - 0x8, - /* A7300-A73FF: page 8 */ - 0x8, - /* A7400-A74FF: page 8 */ - 0x8, - /* A7500-A75FF: page 8 */ - 0x8, - /* A7600-A76FF: page 8 */ - 0x8, - /* A7700-A77FF: page 8 */ - 0x8, - /* A7800-A78FF: page 8 */ - 0x8, - /* A7900-A79FF: page 8 */ - 0x8, - /* A7A00-A7AFF: page 8 */ - 0x8, - /* A7B00-A7BFF: page 8 */ - 0x8, - /* A7C00-A7CFF: page 8 */ - 0x8, - /* A7D00-A7DFF: page 8 */ - 0x8, - /* A7E00-A7EFF: page 8 */ - 0x8, - /* A7F00-A7FFF: page 8 */ - 0x8, - /* A8000-A80FF: page 8 */ - 0x8, - /* A8100-A81FF: page 8 */ - 0x8, - /* A8200-A82FF: page 8 */ - 0x8, - /* A8300-A83FF: page 8 */ - 0x8, - /* A8400-A84FF: page 8 */ - 0x8, - /* A8500-A85FF: page 8 */ - 0x8, - /* A8600-A86FF: page 8 */ - 0x8, - /* A8700-A87FF: page 8 */ - 0x8, - /* A8800-A88FF: page 8 */ - 0x8, - /* A8900-A89FF: page 8 */ - 0x8, - /* A8A00-A8AFF: page 8 */ - 0x8, - /* A8B00-A8BFF: page 8 */ - 0x8, - /* A8C00-A8CFF: page 8 */ - 0x8, - /* A8D00-A8DFF: page 8 */ - 0x8, - /* A8E00-A8EFF: page 8 */ - 0x8, - /* A8F00-A8FFF: page 8 */ - 0x8, - /* A9000-A90FF: page 8 */ - 0x8, - /* A9100-A91FF: page 8 */ - 0x8, - /* A9200-A92FF: page 8 */ - 0x8, - /* A9300-A93FF: page 8 */ - 0x8, - /* A9400-A94FF: page 8 */ - 0x8, - /* A9500-A95FF: page 8 */ - 0x8, - /* A9600-A96FF: page 8 */ - 0x8, - /* A9700-A97FF: page 8 */ - 0x8, - /* A9800-A98FF: page 8 */ - 0x8, - /* A9900-A99FF: page 8 */ - 0x8, - /* A9A00-A9AFF: page 8 */ - 0x8, - /* A9B00-A9BFF: page 8 */ - 0x8, - /* A9C00-A9CFF: page 8 */ - 0x8, - /* A9D00-A9DFF: page 8 */ - 0x8, - /* A9E00-A9EFF: page 8 */ - 0x8, - /* A9F00-A9FFF: page 8 */ - 0x8, - /* AA000-AA0FF: page 8 */ - 0x8, - /* AA100-AA1FF: page 8 */ - 0x8, - /* AA200-AA2FF: page 8 */ - 0x8, - /* AA300-AA3FF: page 8 */ - 0x8, - /* AA400-AA4FF: page 8 */ - 0x8, - /* AA500-AA5FF: page 8 */ - 0x8, - /* AA600-AA6FF: page 8 */ - 0x8, - /* AA700-AA7FF: page 8 */ - 0x8, - /* AA800-AA8FF: page 8 */ - 0x8, - /* AA900-AA9FF: page 8 */ - 0x8, - /* AAA00-AAAFF: page 8 */ - 0x8, - /* AAB00-AABFF: page 8 */ - 0x8, - /* AAC00-AACFF: page 8 */ - 0x8, - /* AAD00-AADFF: page 8 */ - 0x8, - /* AAE00-AAEFF: page 8 */ - 0x8, - /* AAF00-AAFFF: page 8 */ - 0x8, - /* AB000-AB0FF: page 8 */ - 0x8, - /* AB100-AB1FF: page 8 */ - 0x8, - /* AB200-AB2FF: page 8 */ - 0x8, - /* AB300-AB3FF: page 8 */ - 0x8, - /* AB400-AB4FF: page 8 */ - 0x8, - /* AB500-AB5FF: page 8 */ - 0x8, - /* AB600-AB6FF: page 8 */ - 0x8, - /* AB700-AB7FF: page 8 */ - 0x8, - /* AB800-AB8FF: page 8 */ - 0x8, - /* AB900-AB9FF: page 8 */ - 0x8, - /* ABA00-ABAFF: page 8 */ - 0x8, - /* ABB00-ABBFF: page 8 */ - 0x8, - /* ABC00-ABCFF: page 8 */ - 0x8, - /* ABD00-ABDFF: page 8 */ - 0x8, - /* ABE00-ABEFF: page 8 */ - 0x8, - /* ABF00-ABFFF: page 8 */ - 0x8, - /* AC000-AC0FF: page 8 */ - 0x8, - /* AC100-AC1FF: page 8 */ - 0x8, - /* AC200-AC2FF: page 8 */ - 0x8, - /* AC300-AC3FF: page 8 */ - 0x8, - /* AC400-AC4FF: page 8 */ - 0x8, - /* AC500-AC5FF: page 8 */ - 0x8, - /* AC600-AC6FF: page 8 */ - 0x8, - /* AC700-AC7FF: page 8 */ - 0x8, - /* AC800-AC8FF: page 8 */ - 0x8, - /* AC900-AC9FF: page 8 */ - 0x8, - /* ACA00-ACAFF: page 8 */ - 0x8, - /* ACB00-ACBFF: page 8 */ - 0x8, - /* ACC00-ACCFF: page 8 */ - 0x8, - /* ACD00-ACDFF: page 8 */ - 0x8, - /* ACE00-ACEFF: page 8 */ - 0x8, - /* ACF00-ACFFF: page 8 */ - 0x8, - /* AD000-AD0FF: page 8 */ - 0x8, - /* AD100-AD1FF: page 8 */ - 0x8, - /* AD200-AD2FF: page 8 */ - 0x8, - /* AD300-AD3FF: page 8 */ - 0x8, - /* AD400-AD4FF: page 8 */ - 0x8, - /* AD500-AD5FF: page 8 */ - 0x8, - /* AD600-AD6FF: page 8 */ - 0x8, - /* AD700-AD7FF: page 8 */ - 0x8, - /* AD800-AD8FF: page 8 */ - 0x8, - /* AD900-AD9FF: page 8 */ - 0x8, - /* ADA00-ADAFF: page 8 */ - 0x8, - /* ADB00-ADBFF: page 8 */ - 0x8, - /* ADC00-ADCFF: page 8 */ - 0x8, - /* ADD00-ADDFF: page 8 */ - 0x8, - /* ADE00-ADEFF: page 8 */ - 0x8, - /* ADF00-ADFFF: page 8 */ - 0x8, - /* AE000-AE0FF: page 8 */ - 0x8, - /* AE100-AE1FF: page 8 */ - 0x8, - /* AE200-AE2FF: page 8 */ - 0x8, - /* AE300-AE3FF: page 8 */ - 0x8, - /* AE400-AE4FF: page 8 */ - 0x8, - /* AE500-AE5FF: page 8 */ - 0x8, - /* AE600-AE6FF: page 8 */ - 0x8, - /* AE700-AE7FF: page 8 */ - 0x8, - /* AE800-AE8FF: page 8 */ - 0x8, - /* AE900-AE9FF: page 8 */ - 0x8, - /* AEA00-AEAFF: page 8 */ - 0x8, - /* AEB00-AEBFF: page 8 */ - 0x8, - /* AEC00-AECFF: page 8 */ - 0x8, - /* AED00-AEDFF: page 8 */ - 0x8, - /* AEE00-AEEFF: page 8 */ - 0x8, - /* AEF00-AEFFF: page 8 */ - 0x8, - /* AF000-AF0FF: page 8 */ - 0x8, - /* AF100-AF1FF: page 8 */ - 0x8, - /* AF200-AF2FF: page 8 */ - 0x8, - /* AF300-AF3FF: page 8 */ - 0x8, - /* AF400-AF4FF: page 8 */ - 0x8, - /* AF500-AF5FF: page 8 */ - 0x8, - /* AF600-AF6FF: page 8 */ - 0x8, - /* AF700-AF7FF: page 8 */ - 0x8, - /* AF800-AF8FF: page 8 */ - 0x8, - /* AF900-AF9FF: page 8 */ - 0x8, - /* AFA00-AFAFF: page 8 */ - 0x8, - /* AFB00-AFBFF: page 8 */ - 0x8, - /* AFC00-AFCFF: page 8 */ - 0x8, - /* AFD00-AFDFF: page 8 */ - 0x8, - /* AFE00-AFEFF: page 8 */ - 0x8, - /* AFF00-AFFFF: page 8 */ - 0x8, - /* B0000-B00FF: page 8 */ - 0x8, - /* B0100-B01FF: page 8 */ - 0x8, - /* B0200-B02FF: page 8 */ - 0x8, - /* B0300-B03FF: page 8 */ - 0x8, - /* B0400-B04FF: page 8 */ - 0x8, - /* B0500-B05FF: page 8 */ - 0x8, - /* B0600-B06FF: page 8 */ - 0x8, - /* B0700-B07FF: page 8 */ - 0x8, - /* B0800-B08FF: page 8 */ - 0x8, - /* B0900-B09FF: page 8 */ - 0x8, - /* B0A00-B0AFF: page 8 */ - 0x8, - /* B0B00-B0BFF: page 8 */ - 0x8, - /* B0C00-B0CFF: page 8 */ - 0x8, - /* B0D00-B0DFF: page 8 */ - 0x8, - /* B0E00-B0EFF: page 8 */ - 0x8, - /* B0F00-B0FFF: page 8 */ - 0x8, - /* B1000-B10FF: page 8 */ - 0x8, - /* B1100-B11FF: page 8 */ - 0x8, - /* B1200-B12FF: page 8 */ - 0x8, - /* B1300-B13FF: page 8 */ - 0x8, - /* B1400-B14FF: page 8 */ - 0x8, - /* B1500-B15FF: page 8 */ - 0x8, - /* B1600-B16FF: page 8 */ - 0x8, - /* B1700-B17FF: page 8 */ - 0x8, - /* B1800-B18FF: page 8 */ - 0x8, - /* B1900-B19FF: page 8 */ - 0x8, - /* B1A00-B1AFF: page 8 */ - 0x8, - /* B1B00-B1BFF: page 8 */ - 0x8, - /* B1C00-B1CFF: page 8 */ - 0x8, - /* B1D00-B1DFF: page 8 */ - 0x8, - /* B1E00-B1EFF: page 8 */ - 0x8, - /* B1F00-B1FFF: page 8 */ - 0x8, - /* B2000-B20FF: page 8 */ - 0x8, - /* B2100-B21FF: page 8 */ - 0x8, - /* B2200-B22FF: page 8 */ - 0x8, - /* B2300-B23FF: page 8 */ - 0x8, - /* B2400-B24FF: page 8 */ - 0x8, - /* B2500-B25FF: page 8 */ - 0x8, - /* B2600-B26FF: page 8 */ - 0x8, - /* B2700-B27FF: page 8 */ - 0x8, - /* B2800-B28FF: page 8 */ - 0x8, - /* B2900-B29FF: page 8 */ - 0x8, - /* B2A00-B2AFF: page 8 */ - 0x8, - /* B2B00-B2BFF: page 8 */ - 0x8, - /* B2C00-B2CFF: page 8 */ - 0x8, - /* B2D00-B2DFF: page 8 */ - 0x8, - /* B2E00-B2EFF: page 8 */ - 0x8, - /* B2F00-B2FFF: page 8 */ - 0x8, - /* B3000-B30FF: page 8 */ - 0x8, - /* B3100-B31FF: page 8 */ - 0x8, - /* B3200-B32FF: page 8 */ - 0x8, - /* B3300-B33FF: page 8 */ - 0x8, - /* B3400-B34FF: page 8 */ - 0x8, - /* B3500-B35FF: page 8 */ - 0x8, - /* B3600-B36FF: page 8 */ - 0x8, - /* B3700-B37FF: page 8 */ - 0x8, - /* B3800-B38FF: page 8 */ - 0x8, - /* B3900-B39FF: page 8 */ - 0x8, - /* B3A00-B3AFF: page 8 */ - 0x8, - /* B3B00-B3BFF: page 8 */ - 0x8, - /* B3C00-B3CFF: page 8 */ - 0x8, - /* B3D00-B3DFF: page 8 */ - 0x8, - /* B3E00-B3EFF: page 8 */ - 0x8, - /* B3F00-B3FFF: page 8 */ - 0x8, - /* B4000-B40FF: page 8 */ - 0x8, - /* B4100-B41FF: page 8 */ - 0x8, - /* B4200-B42FF: page 8 */ - 0x8, - /* B4300-B43FF: page 8 */ - 0x8, - /* B4400-B44FF: page 8 */ - 0x8, - /* B4500-B45FF: page 8 */ - 0x8, - /* B4600-B46FF: page 8 */ - 0x8, - /* B4700-B47FF: page 8 */ - 0x8, - /* B4800-B48FF: page 8 */ - 0x8, - /* B4900-B49FF: page 8 */ - 0x8, - /* B4A00-B4AFF: page 8 */ - 0x8, - /* B4B00-B4BFF: page 8 */ - 0x8, - /* B4C00-B4CFF: page 8 */ - 0x8, - /* B4D00-B4DFF: page 8 */ - 0x8, - /* B4E00-B4EFF: page 8 */ - 0x8, - /* B4F00-B4FFF: page 8 */ - 0x8, - /* B5000-B50FF: page 8 */ - 0x8, - /* B5100-B51FF: page 8 */ - 0x8, - /* B5200-B52FF: page 8 */ - 0x8, - /* B5300-B53FF: page 8 */ - 0x8, - /* B5400-B54FF: page 8 */ - 0x8, - /* B5500-B55FF: page 8 */ - 0x8, - /* B5600-B56FF: page 8 */ - 0x8, - /* B5700-B57FF: page 8 */ - 0x8, - /* B5800-B58FF: page 8 */ - 0x8, - /* B5900-B59FF: page 8 */ - 0x8, - /* B5A00-B5AFF: page 8 */ - 0x8, - /* B5B00-B5BFF: page 8 */ - 0x8, - /* B5C00-B5CFF: page 8 */ - 0x8, - /* B5D00-B5DFF: page 8 */ - 0x8, - /* B5E00-B5EFF: page 8 */ - 0x8, - /* B5F00-B5FFF: page 8 */ - 0x8, - /* B6000-B60FF: page 8 */ - 0x8, - /* B6100-B61FF: page 8 */ - 0x8, - /* B6200-B62FF: page 8 */ - 0x8, - /* B6300-B63FF: page 8 */ - 0x8, - /* B6400-B64FF: page 8 */ - 0x8, - /* B6500-B65FF: page 8 */ - 0x8, - /* B6600-B66FF: page 8 */ - 0x8, - /* B6700-B67FF: page 8 */ - 0x8, - /* B6800-B68FF: page 8 */ - 0x8, - /* B6900-B69FF: page 8 */ - 0x8, - /* B6A00-B6AFF: page 8 */ - 0x8, - /* B6B00-B6BFF: page 8 */ - 0x8, - /* B6C00-B6CFF: page 8 */ - 0x8, - /* B6D00-B6DFF: page 8 */ - 0x8, - /* B6E00-B6EFF: page 8 */ - 0x8, - /* B6F00-B6FFF: page 8 */ - 0x8, - /* B7000-B70FF: page 8 */ - 0x8, - /* B7100-B71FF: page 8 */ - 0x8, - /* B7200-B72FF: page 8 */ - 0x8, - /* B7300-B73FF: page 8 */ - 0x8, - /* B7400-B74FF: page 8 */ - 0x8, - /* B7500-B75FF: page 8 */ - 0x8, - /* B7600-B76FF: page 8 */ - 0x8, - /* B7700-B77FF: page 8 */ - 0x8, - /* B7800-B78FF: page 8 */ - 0x8, - /* B7900-B79FF: page 8 */ - 0x8, - /* B7A00-B7AFF: page 8 */ - 0x8, - /* B7B00-B7BFF: page 8 */ - 0x8, - /* B7C00-B7CFF: page 8 */ - 0x8, - /* B7D00-B7DFF: page 8 */ - 0x8, - /* B7E00-B7EFF: page 8 */ - 0x8, - /* B7F00-B7FFF: page 8 */ - 0x8, - /* B8000-B80FF: page 8 */ - 0x8, - /* B8100-B81FF: page 8 */ - 0x8, - /* B8200-B82FF: page 8 */ - 0x8, - /* B8300-B83FF: page 8 */ - 0x8, - /* B8400-B84FF: page 8 */ - 0x8, - /* B8500-B85FF: page 8 */ - 0x8, - /* B8600-B86FF: page 8 */ - 0x8, - /* B8700-B87FF: page 8 */ - 0x8, - /* B8800-B88FF: page 8 */ - 0x8, - /* B8900-B89FF: page 8 */ - 0x8, - /* B8A00-B8AFF: page 8 */ - 0x8, - /* B8B00-B8BFF: page 8 */ - 0x8, - /* B8C00-B8CFF: page 8 */ - 0x8, - /* B8D00-B8DFF: page 8 */ - 0x8, - /* B8E00-B8EFF: page 8 */ - 0x8, - /* B8F00-B8FFF: page 8 */ - 0x8, - /* B9000-B90FF: page 8 */ - 0x8, - /* B9100-B91FF: page 8 */ - 0x8, - /* B9200-B92FF: page 8 */ - 0x8, - /* B9300-B93FF: page 8 */ - 0x8, - /* B9400-B94FF: page 8 */ - 0x8, - /* B9500-B95FF: page 8 */ - 0x8, - /* B9600-B96FF: page 8 */ - 0x8, - /* B9700-B97FF: page 8 */ - 0x8, - /* B9800-B98FF: page 8 */ - 0x8, - /* B9900-B99FF: page 8 */ - 0x8, - /* B9A00-B9AFF: page 8 */ - 0x8, - /* B9B00-B9BFF: page 8 */ - 0x8, - /* B9C00-B9CFF: page 8 */ - 0x8, - /* B9D00-B9DFF: page 8 */ - 0x8, - /* B9E00-B9EFF: page 8 */ - 0x8, - /* B9F00-B9FFF: page 8 */ - 0x8, - /* BA000-BA0FF: page 8 */ - 0x8, - /* BA100-BA1FF: page 8 */ - 0x8, - /* BA200-BA2FF: page 8 */ - 0x8, - /* BA300-BA3FF: page 8 */ - 0x8, - /* BA400-BA4FF: page 8 */ - 0x8, - /* BA500-BA5FF: page 8 */ - 0x8, - /* BA600-BA6FF: page 8 */ - 0x8, - /* BA700-BA7FF: page 8 */ - 0x8, - /* BA800-BA8FF: page 8 */ - 0x8, - /* BA900-BA9FF: page 8 */ - 0x8, - /* BAA00-BAAFF: page 8 */ - 0x8, - /* BAB00-BABFF: page 8 */ - 0x8, - /* BAC00-BACFF: page 8 */ - 0x8, - /* BAD00-BADFF: page 8 */ - 0x8, - /* BAE00-BAEFF: page 8 */ - 0x8, - /* BAF00-BAFFF: page 8 */ - 0x8, - /* BB000-BB0FF: page 8 */ - 0x8, - /* BB100-BB1FF: page 8 */ - 0x8, - /* BB200-BB2FF: page 8 */ - 0x8, - /* BB300-BB3FF: page 8 */ - 0x8, - /* BB400-BB4FF: page 8 */ - 0x8, - /* BB500-BB5FF: page 8 */ - 0x8, - /* BB600-BB6FF: page 8 */ - 0x8, - /* BB700-BB7FF: page 8 */ - 0x8, - /* BB800-BB8FF: page 8 */ - 0x8, - /* BB900-BB9FF: page 8 */ - 0x8, - /* BBA00-BBAFF: page 8 */ - 0x8, - /* BBB00-BBBFF: page 8 */ - 0x8, - /* BBC00-BBCFF: page 8 */ - 0x8, - /* BBD00-BBDFF: page 8 */ - 0x8, - /* BBE00-BBEFF: page 8 */ - 0x8, - /* BBF00-BBFFF: page 8 */ - 0x8, - /* BC000-BC0FF: page 8 */ - 0x8, - /* BC100-BC1FF: page 8 */ - 0x8, - /* BC200-BC2FF: page 8 */ - 0x8, - /* BC300-BC3FF: page 8 */ - 0x8, - /* BC400-BC4FF: page 8 */ - 0x8, - /* BC500-BC5FF: page 8 */ - 0x8, - /* BC600-BC6FF: page 8 */ - 0x8, - /* BC700-BC7FF: page 8 */ - 0x8, - /* BC800-BC8FF: page 8 */ - 0x8, - /* BC900-BC9FF: page 8 */ - 0x8, - /* BCA00-BCAFF: page 8 */ - 0x8, - /* BCB00-BCBFF: page 8 */ - 0x8, - /* BCC00-BCCFF: page 8 */ - 0x8, - /* BCD00-BCDFF: page 8 */ - 0x8, - /* BCE00-BCEFF: page 8 */ - 0x8, - /* BCF00-BCFFF: page 8 */ - 0x8, - /* BD000-BD0FF: page 8 */ - 0x8, - /* BD100-BD1FF: page 8 */ - 0x8, - /* BD200-BD2FF: page 8 */ - 0x8, - /* BD300-BD3FF: page 8 */ - 0x8, - /* BD400-BD4FF: page 8 */ - 0x8, - /* BD500-BD5FF: page 8 */ - 0x8, - /* BD600-BD6FF: page 8 */ - 0x8, - /* BD700-BD7FF: page 8 */ - 0x8, - /* BD800-BD8FF: page 8 */ - 0x8, - /* BD900-BD9FF: page 8 */ - 0x8, - /* BDA00-BDAFF: page 8 */ - 0x8, - /* BDB00-BDBFF: page 8 */ - 0x8, - /* BDC00-BDCFF: page 8 */ - 0x8, - /* BDD00-BDDFF: page 8 */ - 0x8, - /* BDE00-BDEFF: page 8 */ - 0x8, - /* BDF00-BDFFF: page 8 */ - 0x8, - /* BE000-BE0FF: page 8 */ - 0x8, - /* BE100-BE1FF: page 8 */ - 0x8, - /* BE200-BE2FF: page 8 */ - 0x8, - /* BE300-BE3FF: page 8 */ - 0x8, - /* BE400-BE4FF: page 8 */ - 0x8, - /* BE500-BE5FF: page 8 */ - 0x8, - /* BE600-BE6FF: page 8 */ - 0x8, - /* BE700-BE7FF: page 8 */ - 0x8, - /* BE800-BE8FF: page 8 */ - 0x8, - /* BE900-BE9FF: page 8 */ - 0x8, - /* BEA00-BEAFF: page 8 */ - 0x8, - /* BEB00-BEBFF: page 8 */ - 0x8, - /* BEC00-BECFF: page 8 */ - 0x8, - /* BED00-BEDFF: page 8 */ - 0x8, - /* BEE00-BEEFF: page 8 */ - 0x8, - /* BEF00-BEFFF: page 8 */ - 0x8, - /* BF000-BF0FF: page 8 */ - 0x8, - /* BF100-BF1FF: page 8 */ - 0x8, - /* BF200-BF2FF: page 8 */ - 0x8, - /* BF300-BF3FF: page 8 */ - 0x8, - /* BF400-BF4FF: page 8 */ - 0x8, - /* BF500-BF5FF: page 8 */ - 0x8, - /* BF600-BF6FF: page 8 */ - 0x8, - /* BF700-BF7FF: page 8 */ - 0x8, - /* BF800-BF8FF: page 8 */ - 0x8, - /* BF900-BF9FF: page 8 */ - 0x8, - /* BFA00-BFAFF: page 8 */ - 0x8, - /* BFB00-BFBFF: page 8 */ - 0x8, - /* BFC00-BFCFF: page 8 */ - 0x8, - /* BFD00-BFDFF: page 8 */ - 0x8, - /* BFE00-BFEFF: page 8 */ - 0x8, - /* BFF00-BFFFF: page 8 */ - 0x8, - /* C0000-C00FF: page 8 */ - 0x8, - /* C0100-C01FF: page 8 */ - 0x8, - /* C0200-C02FF: page 8 */ - 0x8, - /* C0300-C03FF: page 8 */ - 0x8, - /* C0400-C04FF: page 8 */ - 0x8, - /* C0500-C05FF: page 8 */ - 0x8, - /* C0600-C06FF: page 8 */ - 0x8, - /* C0700-C07FF: page 8 */ - 0x8, - /* C0800-C08FF: page 8 */ - 0x8, - /* C0900-C09FF: page 8 */ - 0x8, - /* C0A00-C0AFF: page 8 */ - 0x8, - /* C0B00-C0BFF: page 8 */ - 0x8, - /* C0C00-C0CFF: page 8 */ - 0x8, - /* C0D00-C0DFF: page 8 */ - 0x8, - /* C0E00-C0EFF: page 8 */ - 0x8, - /* C0F00-C0FFF: page 8 */ - 0x8, - /* C1000-C10FF: page 8 */ - 0x8, - /* C1100-C11FF: page 8 */ - 0x8, - /* C1200-C12FF: page 8 */ - 0x8, - /* C1300-C13FF: page 8 */ - 0x8, - /* C1400-C14FF: page 8 */ - 0x8, - /* C1500-C15FF: page 8 */ - 0x8, - /* C1600-C16FF: page 8 */ - 0x8, - /* C1700-C17FF: page 8 */ - 0x8, - /* C1800-C18FF: page 8 */ - 0x8, - /* C1900-C19FF: page 8 */ - 0x8, - /* C1A00-C1AFF: page 8 */ - 0x8, - /* C1B00-C1BFF: page 8 */ - 0x8, - /* C1C00-C1CFF: page 8 */ - 0x8, - /* C1D00-C1DFF: page 8 */ - 0x8, - /* C1E00-C1EFF: page 8 */ - 0x8, - /* C1F00-C1FFF: page 8 */ - 0x8, - /* C2000-C20FF: page 8 */ - 0x8, - /* C2100-C21FF: page 8 */ - 0x8, - /* C2200-C22FF: page 8 */ - 0x8, - /* C2300-C23FF: page 8 */ - 0x8, - /* C2400-C24FF: page 8 */ - 0x8, - /* C2500-C25FF: page 8 */ - 0x8, - /* C2600-C26FF: page 8 */ - 0x8, - /* C2700-C27FF: page 8 */ - 0x8, - /* C2800-C28FF: page 8 */ - 0x8, - /* C2900-C29FF: page 8 */ - 0x8, - /* C2A00-C2AFF: page 8 */ - 0x8, - /* C2B00-C2BFF: page 8 */ - 0x8, - /* C2C00-C2CFF: page 8 */ - 0x8, - /* C2D00-C2DFF: page 8 */ - 0x8, - /* C2E00-C2EFF: page 8 */ - 0x8, - /* C2F00-C2FFF: page 8 */ - 0x8, - /* C3000-C30FF: page 8 */ - 0x8, - /* C3100-C31FF: page 8 */ - 0x8, - /* C3200-C32FF: page 8 */ - 0x8, - /* C3300-C33FF: page 8 */ - 0x8, - /* C3400-C34FF: page 8 */ - 0x8, - /* C3500-C35FF: page 8 */ - 0x8, - /* C3600-C36FF: page 8 */ - 0x8, - /* C3700-C37FF: page 8 */ - 0x8, - /* C3800-C38FF: page 8 */ - 0x8, - /* C3900-C39FF: page 8 */ - 0x8, - /* C3A00-C3AFF: page 8 */ - 0x8, - /* C3B00-C3BFF: page 8 */ - 0x8, - /* C3C00-C3CFF: page 8 */ - 0x8, - /* C3D00-C3DFF: page 8 */ - 0x8, - /* C3E00-C3EFF: page 8 */ - 0x8, - /* C3F00-C3FFF: page 8 */ - 0x8, - /* C4000-C40FF: page 8 */ - 0x8, - /* C4100-C41FF: page 8 */ - 0x8, - /* C4200-C42FF: page 8 */ - 0x8, - /* C4300-C43FF: page 8 */ - 0x8, - /* C4400-C44FF: page 8 */ - 0x8, - /* C4500-C45FF: page 8 */ - 0x8, - /* C4600-C46FF: page 8 */ - 0x8, - /* C4700-C47FF: page 8 */ - 0x8, - /* C4800-C48FF: page 8 */ - 0x8, - /* C4900-C49FF: page 8 */ - 0x8, - /* C4A00-C4AFF: page 8 */ - 0x8, - /* C4B00-C4BFF: page 8 */ - 0x8, - /* C4C00-C4CFF: page 8 */ - 0x8, - /* C4D00-C4DFF: page 8 */ - 0x8, - /* C4E00-C4EFF: page 8 */ - 0x8, - /* C4F00-C4FFF: page 8 */ - 0x8, - /* C5000-C50FF: page 8 */ - 0x8, - /* C5100-C51FF: page 8 */ - 0x8, - /* C5200-C52FF: page 8 */ - 0x8, - /* C5300-C53FF: page 8 */ - 0x8, - /* C5400-C54FF: page 8 */ - 0x8, - /* C5500-C55FF: page 8 */ - 0x8, - /* C5600-C56FF: page 8 */ - 0x8, - /* C5700-C57FF: page 8 */ - 0x8, - /* C5800-C58FF: page 8 */ - 0x8, - /* C5900-C59FF: page 8 */ - 0x8, - /* C5A00-C5AFF: page 8 */ - 0x8, - /* C5B00-C5BFF: page 8 */ - 0x8, - /* C5C00-C5CFF: page 8 */ - 0x8, - /* C5D00-C5DFF: page 8 */ - 0x8, - /* C5E00-C5EFF: page 8 */ - 0x8, - /* C5F00-C5FFF: page 8 */ - 0x8, - /* C6000-C60FF: page 8 */ - 0x8, - /* C6100-C61FF: page 8 */ - 0x8, - /* C6200-C62FF: page 8 */ - 0x8, - /* C6300-C63FF: page 8 */ - 0x8, - /* C6400-C64FF: page 8 */ - 0x8, - /* C6500-C65FF: page 8 */ - 0x8, - /* C6600-C66FF: page 8 */ - 0x8, - /* C6700-C67FF: page 8 */ - 0x8, - /* C6800-C68FF: page 8 */ - 0x8, - /* C6900-C69FF: page 8 */ - 0x8, - /* C6A00-C6AFF: page 8 */ - 0x8, - /* C6B00-C6BFF: page 8 */ - 0x8, - /* C6C00-C6CFF: page 8 */ - 0x8, - /* C6D00-C6DFF: page 8 */ - 0x8, - /* C6E00-C6EFF: page 8 */ - 0x8, - /* C6F00-C6FFF: page 8 */ - 0x8, - /* C7000-C70FF: page 8 */ - 0x8, - /* C7100-C71FF: page 8 */ - 0x8, - /* C7200-C72FF: page 8 */ - 0x8, - /* C7300-C73FF: page 8 */ - 0x8, - /* C7400-C74FF: page 8 */ - 0x8, - /* C7500-C75FF: page 8 */ - 0x8, - /* C7600-C76FF: page 8 */ - 0x8, - /* C7700-C77FF: page 8 */ - 0x8, - /* C7800-C78FF: page 8 */ - 0x8, - /* C7900-C79FF: page 8 */ - 0x8, - /* C7A00-C7AFF: page 8 */ - 0x8, - /* C7B00-C7BFF: page 8 */ - 0x8, - /* C7C00-C7CFF: page 8 */ - 0x8, - /* C7D00-C7DFF: page 8 */ - 0x8, - /* C7E00-C7EFF: page 8 */ - 0x8, - /* C7F00-C7FFF: page 8 */ - 0x8, - /* C8000-C80FF: page 8 */ - 0x8, - /* C8100-C81FF: page 8 */ - 0x8, - /* C8200-C82FF: page 8 */ - 0x8, - /* C8300-C83FF: page 8 */ - 0x8, - /* C8400-C84FF: page 8 */ - 0x8, - /* C8500-C85FF: page 8 */ - 0x8, - /* C8600-C86FF: page 8 */ - 0x8, - /* C8700-C87FF: page 8 */ - 0x8, - /* C8800-C88FF: page 8 */ - 0x8, - /* C8900-C89FF: page 8 */ - 0x8, - /* C8A00-C8AFF: page 8 */ - 0x8, - /* C8B00-C8BFF: page 8 */ - 0x8, - /* C8C00-C8CFF: page 8 */ - 0x8, - /* C8D00-C8DFF: page 8 */ - 0x8, - /* C8E00-C8EFF: page 8 */ - 0x8, - /* C8F00-C8FFF: page 8 */ - 0x8, - /* C9000-C90FF: page 8 */ - 0x8, - /* C9100-C91FF: page 8 */ - 0x8, - /* C9200-C92FF: page 8 */ - 0x8, - /* C9300-C93FF: page 8 */ - 0x8, - /* C9400-C94FF: page 8 */ - 0x8, - /* C9500-C95FF: page 8 */ - 0x8, - /* C9600-C96FF: page 8 */ - 0x8, - /* C9700-C97FF: page 8 */ - 0x8, - /* C9800-C98FF: page 8 */ - 0x8, - /* C9900-C99FF: page 8 */ - 0x8, - /* C9A00-C9AFF: page 8 */ - 0x8, - /* C9B00-C9BFF: page 8 */ - 0x8, - /* C9C00-C9CFF: page 8 */ - 0x8, - /* C9D00-C9DFF: page 8 */ - 0x8, - /* C9E00-C9EFF: page 8 */ - 0x8, - /* C9F00-C9FFF: page 8 */ - 0x8, - /* CA000-CA0FF: page 8 */ - 0x8, - /* CA100-CA1FF: page 8 */ - 0x8, - /* CA200-CA2FF: page 8 */ - 0x8, - /* CA300-CA3FF: page 8 */ - 0x8, - /* CA400-CA4FF: page 8 */ - 0x8, - /* CA500-CA5FF: page 8 */ - 0x8, - /* CA600-CA6FF: page 8 */ - 0x8, - /* CA700-CA7FF: page 8 */ - 0x8, - /* CA800-CA8FF: page 8 */ - 0x8, - /* CA900-CA9FF: page 8 */ - 0x8, - /* CAA00-CAAFF: page 8 */ - 0x8, - /* CAB00-CABFF: page 8 */ - 0x8, - /* CAC00-CACFF: page 8 */ - 0x8, - /* CAD00-CADFF: page 8 */ - 0x8, - /* CAE00-CAEFF: page 8 */ - 0x8, - /* CAF00-CAFFF: page 8 */ - 0x8, - /* CB000-CB0FF: page 8 */ - 0x8, - /* CB100-CB1FF: page 8 */ - 0x8, - /* CB200-CB2FF: page 8 */ - 0x8, - /* CB300-CB3FF: page 8 */ - 0x8, - /* CB400-CB4FF: page 8 */ - 0x8, - /* CB500-CB5FF: page 8 */ - 0x8, - /* CB600-CB6FF: page 8 */ - 0x8, - /* CB700-CB7FF: page 8 */ - 0x8, - /* CB800-CB8FF: page 8 */ - 0x8, - /* CB900-CB9FF: page 8 */ - 0x8, - /* CBA00-CBAFF: page 8 */ - 0x8, - /* CBB00-CBBFF: page 8 */ - 0x8, - /* CBC00-CBCFF: page 8 */ - 0x8, - /* CBD00-CBDFF: page 8 */ - 0x8, - /* CBE00-CBEFF: page 8 */ - 0x8, - /* CBF00-CBFFF: page 8 */ - 0x8, - /* CC000-CC0FF: page 8 */ - 0x8, - /* CC100-CC1FF: page 8 */ - 0x8, - /* CC200-CC2FF: page 8 */ - 0x8, - /* CC300-CC3FF: page 8 */ - 0x8, - /* CC400-CC4FF: page 8 */ - 0x8, - /* CC500-CC5FF: page 8 */ - 0x8, - /* CC600-CC6FF: page 8 */ - 0x8, - /* CC700-CC7FF: page 8 */ - 0x8, - /* CC800-CC8FF: page 8 */ - 0x8, - /* CC900-CC9FF: page 8 */ - 0x8, - /* CCA00-CCAFF: page 8 */ - 0x8, - /* CCB00-CCBFF: page 8 */ - 0x8, - /* CCC00-CCCFF: page 8 */ - 0x8, - /* CCD00-CCDFF: page 8 */ - 0x8, - /* CCE00-CCEFF: page 8 */ - 0x8, - /* CCF00-CCFFF: page 8 */ - 0x8, - /* CD000-CD0FF: page 8 */ - 0x8, - /* CD100-CD1FF: page 8 */ - 0x8, - /* CD200-CD2FF: page 8 */ - 0x8, - /* CD300-CD3FF: page 8 */ - 0x8, - /* CD400-CD4FF: page 8 */ - 0x8, - /* CD500-CD5FF: page 8 */ - 0x8, - /* CD600-CD6FF: page 8 */ - 0x8, - /* CD700-CD7FF: page 8 */ - 0x8, - /* CD800-CD8FF: page 8 */ - 0x8, - /* CD900-CD9FF: page 8 */ - 0x8, - /* CDA00-CDAFF: page 8 */ - 0x8, - /* CDB00-CDBFF: page 8 */ - 0x8, - /* CDC00-CDCFF: page 8 */ - 0x8, - /* CDD00-CDDFF: page 8 */ - 0x8, - /* CDE00-CDEFF: page 8 */ - 0x8, - /* CDF00-CDFFF: page 8 */ - 0x8, - /* CE000-CE0FF: page 8 */ - 0x8, - /* CE100-CE1FF: page 8 */ - 0x8, - /* CE200-CE2FF: page 8 */ - 0x8, - /* CE300-CE3FF: page 8 */ - 0x8, - /* CE400-CE4FF: page 8 */ - 0x8, - /* CE500-CE5FF: page 8 */ - 0x8, - /* CE600-CE6FF: page 8 */ - 0x8, - /* CE700-CE7FF: page 8 */ - 0x8, - /* CE800-CE8FF: page 8 */ - 0x8, - /* CE900-CE9FF: page 8 */ - 0x8, - /* CEA00-CEAFF: page 8 */ - 0x8, - /* CEB00-CEBFF: page 8 */ - 0x8, - /* CEC00-CECFF: page 8 */ - 0x8, - /* CED00-CEDFF: page 8 */ - 0x8, - /* CEE00-CEEFF: page 8 */ - 0x8, - /* CEF00-CEFFF: page 8 */ - 0x8, - /* CF000-CF0FF: page 8 */ - 0x8, - /* CF100-CF1FF: page 8 */ - 0x8, - /* CF200-CF2FF: page 8 */ - 0x8, - /* CF300-CF3FF: page 8 */ - 0x8, - /* CF400-CF4FF: page 8 */ - 0x8, - /* CF500-CF5FF: page 8 */ - 0x8, - /* CF600-CF6FF: page 8 */ - 0x8, - /* CF700-CF7FF: page 8 */ - 0x8, - /* CF800-CF8FF: page 8 */ - 0x8, - /* CF900-CF9FF: page 8 */ - 0x8, - /* CFA00-CFAFF: page 8 */ - 0x8, - /* CFB00-CFBFF: page 8 */ - 0x8, - /* CFC00-CFCFF: page 8 */ - 0x8, - /* CFD00-CFDFF: page 8 */ - 0x8, - /* CFE00-CFEFF: page 8 */ - 0x8, - /* CFF00-CFFFF: page 8 */ - 0x8, - /* D0000-D00FF: page 8 */ - 0x8, - /* D0100-D01FF: page 8 */ - 0x8, - /* D0200-D02FF: page 8 */ - 0x8, - /* D0300-D03FF: page 8 */ - 0x8, - /* D0400-D04FF: page 8 */ - 0x8, - /* D0500-D05FF: page 8 */ - 0x8, - /* D0600-D06FF: page 8 */ - 0x8, - /* D0700-D07FF: page 8 */ - 0x8, - /* D0800-D08FF: page 8 */ - 0x8, - /* D0900-D09FF: page 8 */ - 0x8, - /* D0A00-D0AFF: page 8 */ - 0x8, - /* D0B00-D0BFF: page 8 */ - 0x8, - /* D0C00-D0CFF: page 8 */ - 0x8, - /* D0D00-D0DFF: page 8 */ - 0x8, - /* D0E00-D0EFF: page 8 */ - 0x8, - /* D0F00-D0FFF: page 8 */ - 0x8, - /* D1000-D10FF: page 8 */ - 0x8, - /* D1100-D11FF: page 8 */ - 0x8, - /* D1200-D12FF: page 8 */ - 0x8, - /* D1300-D13FF: page 8 */ - 0x8, - /* D1400-D14FF: page 8 */ - 0x8, - /* D1500-D15FF: page 8 */ - 0x8, - /* D1600-D16FF: page 8 */ - 0x8, - /* D1700-D17FF: page 8 */ - 0x8, - /* D1800-D18FF: page 8 */ - 0x8, - /* D1900-D19FF: page 8 */ - 0x8, - /* D1A00-D1AFF: page 8 */ - 0x8, - /* D1B00-D1BFF: page 8 */ - 0x8, - /* D1C00-D1CFF: page 8 */ - 0x8, - /* D1D00-D1DFF: page 8 */ - 0x8, - /* D1E00-D1EFF: page 8 */ - 0x8, - /* D1F00-D1FFF: page 8 */ - 0x8, - /* D2000-D20FF: page 8 */ - 0x8, - /* D2100-D21FF: page 8 */ - 0x8, - /* D2200-D22FF: page 8 */ - 0x8, - /* D2300-D23FF: page 8 */ - 0x8, - /* D2400-D24FF: page 8 */ - 0x8, - /* D2500-D25FF: page 8 */ - 0x8, - /* D2600-D26FF: page 8 */ - 0x8, - /* D2700-D27FF: page 8 */ - 0x8, - /* D2800-D28FF: page 8 */ - 0x8, - /* D2900-D29FF: page 8 */ - 0x8, - /* D2A00-D2AFF: page 8 */ - 0x8, - /* D2B00-D2BFF: page 8 */ - 0x8, - /* D2C00-D2CFF: page 8 */ - 0x8, - /* D2D00-D2DFF: page 8 */ - 0x8, - /* D2E00-D2EFF: page 8 */ - 0x8, - /* D2F00-D2FFF: page 8 */ - 0x8, - /* D3000-D30FF: page 8 */ - 0x8, - /* D3100-D31FF: page 8 */ - 0x8, - /* D3200-D32FF: page 8 */ - 0x8, - /* D3300-D33FF: page 8 */ - 0x8, - /* D3400-D34FF: page 8 */ - 0x8, - /* D3500-D35FF: page 8 */ - 0x8, - /* D3600-D36FF: page 8 */ - 0x8, - /* D3700-D37FF: page 8 */ - 0x8, - /* D3800-D38FF: page 8 */ - 0x8, - /* D3900-D39FF: page 8 */ - 0x8, - /* D3A00-D3AFF: page 8 */ - 0x8, - /* D3B00-D3BFF: page 8 */ - 0x8, - /* D3C00-D3CFF: page 8 */ - 0x8, - /* D3D00-D3DFF: page 8 */ - 0x8, - /* D3E00-D3EFF: page 8 */ - 0x8, - /* D3F00-D3FFF: page 8 */ - 0x8, - /* D4000-D40FF: page 8 */ - 0x8, - /* D4100-D41FF: page 8 */ - 0x8, - /* D4200-D42FF: page 8 */ - 0x8, - /* D4300-D43FF: page 8 */ - 0x8, - /* D4400-D44FF: page 8 */ - 0x8, - /* D4500-D45FF: page 8 */ - 0x8, - /* D4600-D46FF: page 8 */ - 0x8, - /* D4700-D47FF: page 8 */ - 0x8, - /* D4800-D48FF: page 8 */ - 0x8, - /* D4900-D49FF: page 8 */ - 0x8, - /* D4A00-D4AFF: page 8 */ - 0x8, - /* D4B00-D4BFF: page 8 */ - 0x8, - /* D4C00-D4CFF: page 8 */ - 0x8, - /* D4D00-D4DFF: page 8 */ - 0x8, - /* D4E00-D4EFF: page 8 */ - 0x8, - /* D4F00-D4FFF: page 8 */ - 0x8, - /* D5000-D50FF: page 8 */ - 0x8, - /* D5100-D51FF: page 8 */ - 0x8, - /* D5200-D52FF: page 8 */ - 0x8, - /* D5300-D53FF: page 8 */ - 0x8, - /* D5400-D54FF: page 8 */ - 0x8, - /* D5500-D55FF: page 8 */ - 0x8, - /* D5600-D56FF: page 8 */ - 0x8, - /* D5700-D57FF: page 8 */ - 0x8, - /* D5800-D58FF: page 8 */ - 0x8, - /* D5900-D59FF: page 8 */ - 0x8, - /* D5A00-D5AFF: page 8 */ - 0x8, - /* D5B00-D5BFF: page 8 */ - 0x8, - /* D5C00-D5CFF: page 8 */ - 0x8, - /* D5D00-D5DFF: page 8 */ - 0x8, - /* D5E00-D5EFF: page 8 */ - 0x8, - /* D5F00-D5FFF: page 8 */ - 0x8, - /* D6000-D60FF: page 8 */ - 0x8, - /* D6100-D61FF: page 8 */ - 0x8, - /* D6200-D62FF: page 8 */ - 0x8, - /* D6300-D63FF: page 8 */ - 0x8, - /* D6400-D64FF: page 8 */ - 0x8, - /* D6500-D65FF: page 8 */ - 0x8, - /* D6600-D66FF: page 8 */ - 0x8, - /* D6700-D67FF: page 8 */ - 0x8, - /* D6800-D68FF: page 8 */ - 0x8, - /* D6900-D69FF: page 8 */ - 0x8, - /* D6A00-D6AFF: page 8 */ - 0x8, - /* D6B00-D6BFF: page 8 */ - 0x8, - /* D6C00-D6CFF: page 8 */ - 0x8, - /* D6D00-D6DFF: page 8 */ - 0x8, - /* D6E00-D6EFF: page 8 */ - 0x8, - /* D6F00-D6FFF: page 8 */ - 0x8, - /* D7000-D70FF: page 8 */ - 0x8, - /* D7100-D71FF: page 8 */ - 0x8, - /* D7200-D72FF: page 8 */ - 0x8, - /* D7300-D73FF: page 8 */ - 0x8, - /* D7400-D74FF: page 8 */ - 0x8, - /* D7500-D75FF: page 8 */ - 0x8, - /* D7600-D76FF: page 8 */ - 0x8, - /* D7700-D77FF: page 8 */ - 0x8, - /* D7800-D78FF: page 8 */ - 0x8, - /* D7900-D79FF: page 8 */ - 0x8, - /* D7A00-D7AFF: page 8 */ - 0x8, - /* D7B00-D7BFF: page 8 */ - 0x8, - /* D7C00-D7CFF: page 8 */ - 0x8, - /* D7D00-D7DFF: page 8 */ - 0x8, - /* D7E00-D7EFF: page 8 */ - 0x8, - /* D7F00-D7FFF: page 8 */ - 0x8, - /* D8000-D80FF: page 8 */ - 0x8, - /* D8100-D81FF: page 8 */ - 0x8, - /* D8200-D82FF: page 8 */ - 0x8, - /* D8300-D83FF: page 8 */ - 0x8, - /* D8400-D84FF: page 8 */ - 0x8, - /* D8500-D85FF: page 8 */ - 0x8, - /* D8600-D86FF: page 8 */ - 0x8, - /* D8700-D87FF: page 8 */ - 0x8, - /* D8800-D88FF: page 8 */ - 0x8, - /* D8900-D89FF: page 8 */ - 0x8, - /* D8A00-D8AFF: page 8 */ - 0x8, - /* D8B00-D8BFF: page 8 */ - 0x8, - /* D8C00-D8CFF: page 8 */ - 0x8, - /* D8D00-D8DFF: page 8 */ - 0x8, - /* D8E00-D8EFF: page 8 */ - 0x8, - /* D8F00-D8FFF: page 8 */ - 0x8, - /* D9000-D90FF: page 8 */ - 0x8, - /* D9100-D91FF: page 8 */ - 0x8, - /* D9200-D92FF: page 8 */ - 0x8, - /* D9300-D93FF: page 8 */ - 0x8, - /* D9400-D94FF: page 8 */ - 0x8, - /* D9500-D95FF: page 8 */ - 0x8, - /* D9600-D96FF: page 8 */ - 0x8, - /* D9700-D97FF: page 8 */ - 0x8, - /* D9800-D98FF: page 8 */ - 0x8, - /* D9900-D99FF: page 8 */ - 0x8, - /* D9A00-D9AFF: page 8 */ - 0x8, - /* D9B00-D9BFF: page 8 */ - 0x8, - /* D9C00-D9CFF: page 8 */ - 0x8, - /* D9D00-D9DFF: page 8 */ - 0x8, - /* D9E00-D9EFF: page 8 */ - 0x8, - /* D9F00-D9FFF: page 8 */ - 0x8, - /* DA000-DA0FF: page 8 */ - 0x8, - /* DA100-DA1FF: page 8 */ - 0x8, - /* DA200-DA2FF: page 8 */ - 0x8, - /* DA300-DA3FF: page 8 */ - 0x8, - /* DA400-DA4FF: page 8 */ - 0x8, - /* DA500-DA5FF: page 8 */ - 0x8, - /* DA600-DA6FF: page 8 */ - 0x8, - /* DA700-DA7FF: page 8 */ - 0x8, - /* DA800-DA8FF: page 8 */ - 0x8, - /* DA900-DA9FF: page 8 */ - 0x8, - /* DAA00-DAAFF: page 8 */ - 0x8, - /* DAB00-DABFF: page 8 */ - 0x8, - /* DAC00-DACFF: page 8 */ - 0x8, - /* DAD00-DADFF: page 8 */ - 0x8, - /* DAE00-DAEFF: page 8 */ - 0x8, - /* DAF00-DAFFF: page 8 */ - 0x8, - /* DB000-DB0FF: page 8 */ - 0x8, - /* DB100-DB1FF: page 8 */ - 0x8, - /* DB200-DB2FF: page 8 */ - 0x8, - /* DB300-DB3FF: page 8 */ - 0x8, - /* DB400-DB4FF: page 8 */ - 0x8, - /* DB500-DB5FF: page 8 */ - 0x8, - /* DB600-DB6FF: page 8 */ - 0x8, - /* DB700-DB7FF: page 8 */ - 0x8, - /* DB800-DB8FF: page 8 */ - 0x8, - /* DB900-DB9FF: page 8 */ - 0x8, - /* DBA00-DBAFF: page 8 */ - 0x8, - /* DBB00-DBBFF: page 8 */ - 0x8, - /* DBC00-DBCFF: page 8 */ - 0x8, - /* DBD00-DBDFF: page 8 */ - 0x8, - /* DBE00-DBEFF: page 8 */ - 0x8, - /* DBF00-DBFFF: page 8 */ - 0x8, - /* DC000-DC0FF: page 8 */ - 0x8, - /* DC100-DC1FF: page 8 */ - 0x8, - /* DC200-DC2FF: page 8 */ - 0x8, - /* DC300-DC3FF: page 8 */ - 0x8, - /* DC400-DC4FF: page 8 */ - 0x8, - /* DC500-DC5FF: page 8 */ - 0x8, - /* DC600-DC6FF: page 8 */ - 0x8, - /* DC700-DC7FF: page 8 */ - 0x8, - /* DC800-DC8FF: page 8 */ - 0x8, - /* DC900-DC9FF: page 8 */ - 0x8, - /* DCA00-DCAFF: page 8 */ - 0x8, - /* DCB00-DCBFF: page 8 */ - 0x8, - /* DCC00-DCCFF: page 8 */ - 0x8, - /* DCD00-DCDFF: page 8 */ - 0x8, - /* DCE00-DCEFF: page 8 */ - 0x8, - /* DCF00-DCFFF: page 8 */ - 0x8, - /* DD000-DD0FF: page 8 */ - 0x8, - /* DD100-DD1FF: page 8 */ - 0x8, - /* DD200-DD2FF: page 8 */ - 0x8, - /* DD300-DD3FF: page 8 */ - 0x8, - /* DD400-DD4FF: page 8 */ - 0x8, - /* DD500-DD5FF: page 8 */ - 0x8, - /* DD600-DD6FF: page 8 */ - 0x8, - /* DD700-DD7FF: page 8 */ - 0x8, - /* DD800-DD8FF: page 8 */ - 0x8, - /* DD900-DD9FF: page 8 */ - 0x8, - /* DDA00-DDAFF: page 8 */ - 0x8, - /* DDB00-DDBFF: page 8 */ - 0x8, - /* DDC00-DDCFF: page 8 */ - 0x8, - /* DDD00-DDDFF: page 8 */ - 0x8, - /* DDE00-DDEFF: page 8 */ - 0x8, - /* DDF00-DDFFF: page 8 */ - 0x8, - /* DE000-DE0FF: page 8 */ - 0x8, - /* DE100-DE1FF: page 8 */ - 0x8, - /* DE200-DE2FF: page 8 */ - 0x8, - /* DE300-DE3FF: page 8 */ - 0x8, - /* DE400-DE4FF: page 8 */ - 0x8, - /* DE500-DE5FF: page 8 */ - 0x8, - /* DE600-DE6FF: page 8 */ - 0x8, - /* DE700-DE7FF: page 8 */ - 0x8, - /* DE800-DE8FF: page 8 */ - 0x8, - /* DE900-DE9FF: page 8 */ - 0x8, - /* DEA00-DEAFF: page 8 */ - 0x8, - /* DEB00-DEBFF: page 8 */ - 0x8, - /* DEC00-DECFF: page 8 */ - 0x8, - /* DED00-DEDFF: page 8 */ - 0x8, - /* DEE00-DEEFF: page 8 */ - 0x8, - /* DEF00-DEFFF: page 8 */ - 0x8, - /* DF000-DF0FF: page 8 */ - 0x8, - /* DF100-DF1FF: page 8 */ - 0x8, - /* DF200-DF2FF: page 8 */ - 0x8, - /* DF300-DF3FF: page 8 */ - 0x8, - /* DF400-DF4FF: page 8 */ - 0x8, - /* DF500-DF5FF: page 8 */ - 0x8, - /* DF600-DF6FF: page 8 */ - 0x8, - /* DF700-DF7FF: page 8 */ - 0x8, - /* DF800-DF8FF: page 8 */ - 0x8, - /* DF900-DF9FF: page 8 */ - 0x8, - /* DFA00-DFAFF: page 8 */ - 0x8, - /* DFB00-DFBFF: page 8 */ - 0x8, - /* DFC00-DFCFF: page 8 */ - 0x8, - /* DFD00-DFDFF: page 8 */ - 0x8, - /* DFE00-DFEFF: page 8 */ - 0x8, - /* DFF00-DFFFF: page 8 */ - 0x8, - /* E0000-E00FF: page 277 */ - 0x115, - /* E0100-E01FF: page 278 */ - 0x116, - /* E0200-E02FF: page 8 */ - 0x8, - /* E0300-E03FF: page 8 */ - 0x8, - /* E0400-E04FF: page 8 */ - 0x8, - /* E0500-E05FF: page 8 */ - 0x8, - /* E0600-E06FF: page 8 */ - 0x8, - /* E0700-E07FF: page 8 */ - 0x8, - /* E0800-E08FF: page 8 */ - 0x8, - /* E0900-E09FF: page 8 */ - 0x8, - /* E0A00-E0AFF: page 8 */ - 0x8, - /* E0B00-E0BFF: page 8 */ - 0x8, - /* E0C00-E0CFF: page 8 */ - 0x8, - /* E0D00-E0DFF: page 8 */ - 0x8, - /* E0E00-E0EFF: page 8 */ - 0x8, - /* E0F00-E0FFF: page 8 */ - 0x8, - /* E1000-E10FF: page 8 */ - 0x8, - /* E1100-E11FF: page 8 */ - 0x8, - /* E1200-E12FF: page 8 */ - 0x8, - /* E1300-E13FF: page 8 */ - 0x8, - /* E1400-E14FF: page 8 */ - 0x8, - /* E1500-E15FF: page 8 */ - 0x8, - /* E1600-E16FF: page 8 */ - 0x8, - /* E1700-E17FF: page 8 */ - 0x8, - /* E1800-E18FF: page 8 */ - 0x8, - /* E1900-E19FF: page 8 */ - 0x8, - /* E1A00-E1AFF: page 8 */ - 0x8, - /* E1B00-E1BFF: page 8 */ - 0x8, - /* E1C00-E1CFF: page 8 */ - 0x8, - /* E1D00-E1DFF: page 8 */ - 0x8, - /* E1E00-E1EFF: page 8 */ - 0x8, - /* E1F00-E1FFF: page 8 */ - 0x8, - /* E2000-E20FF: page 8 */ - 0x8, - /* E2100-E21FF: page 8 */ - 0x8, - /* E2200-E22FF: page 8 */ - 0x8, - /* E2300-E23FF: page 8 */ - 0x8, - /* E2400-E24FF: page 8 */ - 0x8, - /* E2500-E25FF: page 8 */ - 0x8, - /* E2600-E26FF: page 8 */ - 0x8, - /* E2700-E27FF: page 8 */ - 0x8, - /* E2800-E28FF: page 8 */ - 0x8, - /* E2900-E29FF: page 8 */ - 0x8, - /* E2A00-E2AFF: page 8 */ - 0x8, - /* E2B00-E2BFF: page 8 */ - 0x8, - /* E2C00-E2CFF: page 8 */ - 0x8, - /* E2D00-E2DFF: page 8 */ - 0x8, - /* E2E00-E2EFF: page 8 */ - 0x8, - /* E2F00-E2FFF: page 8 */ - 0x8, - /* E3000-E30FF: page 8 */ - 0x8, - /* E3100-E31FF: page 8 */ - 0x8, - /* E3200-E32FF: page 8 */ - 0x8, - /* E3300-E33FF: page 8 */ - 0x8, - /* E3400-E34FF: page 8 */ - 0x8, - /* E3500-E35FF: page 8 */ - 0x8, - /* E3600-E36FF: page 8 */ - 0x8, - /* E3700-E37FF: page 8 */ - 0x8, - /* E3800-E38FF: page 8 */ - 0x8, - /* E3900-E39FF: page 8 */ - 0x8, - /* E3A00-E3AFF: page 8 */ - 0x8, - /* E3B00-E3BFF: page 8 */ - 0x8, - /* E3C00-E3CFF: page 8 */ - 0x8, - /* E3D00-E3DFF: page 8 */ - 0x8, - /* E3E00-E3EFF: page 8 */ - 0x8, - /* E3F00-E3FFF: page 8 */ - 0x8, - /* E4000-E40FF: page 8 */ - 0x8, - /* E4100-E41FF: page 8 */ - 0x8, - /* E4200-E42FF: page 8 */ - 0x8, - /* E4300-E43FF: page 8 */ - 0x8, - /* E4400-E44FF: page 8 */ - 0x8, - /* E4500-E45FF: page 8 */ - 0x8, - /* E4600-E46FF: page 8 */ - 0x8, - /* E4700-E47FF: page 8 */ - 0x8, - /* E4800-E48FF: page 8 */ - 0x8, - /* E4900-E49FF: page 8 */ - 0x8, - /* E4A00-E4AFF: page 8 */ - 0x8, - /* E4B00-E4BFF: page 8 */ - 0x8, - /* E4C00-E4CFF: page 8 */ - 0x8, - /* E4D00-E4DFF: page 8 */ - 0x8, - /* E4E00-E4EFF: page 8 */ - 0x8, - /* E4F00-E4FFF: page 8 */ - 0x8, - /* E5000-E50FF: page 8 */ - 0x8, - /* E5100-E51FF: page 8 */ - 0x8, - /* E5200-E52FF: page 8 */ - 0x8, - /* E5300-E53FF: page 8 */ - 0x8, - /* E5400-E54FF: page 8 */ - 0x8, - /* E5500-E55FF: page 8 */ - 0x8, - /* E5600-E56FF: page 8 */ - 0x8, - /* E5700-E57FF: page 8 */ - 0x8, - /* E5800-E58FF: page 8 */ - 0x8, - /* E5900-E59FF: page 8 */ - 0x8, - /* E5A00-E5AFF: page 8 */ - 0x8, - /* E5B00-E5BFF: page 8 */ - 0x8, - /* E5C00-E5CFF: page 8 */ - 0x8, - /* E5D00-E5DFF: page 8 */ - 0x8, - /* E5E00-E5EFF: page 8 */ - 0x8, - /* E5F00-E5FFF: page 8 */ - 0x8, - /* E6000-E60FF: page 8 */ - 0x8, - /* E6100-E61FF: page 8 */ - 0x8, - /* E6200-E62FF: page 8 */ - 0x8, - /* E6300-E63FF: page 8 */ - 0x8, - /* E6400-E64FF: page 8 */ - 0x8, - /* E6500-E65FF: page 8 */ - 0x8, - /* E6600-E66FF: page 8 */ - 0x8, - /* E6700-E67FF: page 8 */ - 0x8, - /* E6800-E68FF: page 8 */ - 0x8, - /* E6900-E69FF: page 8 */ - 0x8, - /* E6A00-E6AFF: page 8 */ - 0x8, - /* E6B00-E6BFF: page 8 */ - 0x8, - /* E6C00-E6CFF: page 8 */ - 0x8, - /* E6D00-E6DFF: page 8 */ - 0x8, - /* E6E00-E6EFF: page 8 */ - 0x8, - /* E6F00-E6FFF: page 8 */ - 0x8, - /* E7000-E70FF: page 8 */ - 0x8, - /* E7100-E71FF: page 8 */ - 0x8, - /* E7200-E72FF: page 8 */ - 0x8, - /* E7300-E73FF: page 8 */ - 0x8, - /* E7400-E74FF: page 8 */ - 0x8, - /* E7500-E75FF: page 8 */ - 0x8, - /* E7600-E76FF: page 8 */ - 0x8, - /* E7700-E77FF: page 8 */ - 0x8, - /* E7800-E78FF: page 8 */ - 0x8, - /* E7900-E79FF: page 8 */ - 0x8, - /* E7A00-E7AFF: page 8 */ - 0x8, - /* E7B00-E7BFF: page 8 */ - 0x8, - /* E7C00-E7CFF: page 8 */ - 0x8, - /* E7D00-E7DFF: page 8 */ - 0x8, - /* E7E00-E7EFF: page 8 */ - 0x8, - /* E7F00-E7FFF: page 8 */ - 0x8, - /* E8000-E80FF: page 8 */ - 0x8, - /* E8100-E81FF: page 8 */ - 0x8, - /* E8200-E82FF: page 8 */ - 0x8, - /* E8300-E83FF: page 8 */ - 0x8, - /* E8400-E84FF: page 8 */ - 0x8, - /* E8500-E85FF: page 8 */ - 0x8, - /* E8600-E86FF: page 8 */ - 0x8, - /* E8700-E87FF: page 8 */ - 0x8, - /* E8800-E88FF: page 8 */ - 0x8, - /* E8900-E89FF: page 8 */ - 0x8, - /* E8A00-E8AFF: page 8 */ - 0x8, - /* E8B00-E8BFF: page 8 */ - 0x8, - /* E8C00-E8CFF: page 8 */ - 0x8, - /* E8D00-E8DFF: page 8 */ - 0x8, - /* E8E00-E8EFF: page 8 */ - 0x8, - /* E8F00-E8FFF: page 8 */ - 0x8, - /* E9000-E90FF: page 8 */ - 0x8, - /* E9100-E91FF: page 8 */ - 0x8, - /* E9200-E92FF: page 8 */ - 0x8, - /* E9300-E93FF: page 8 */ - 0x8, - /* E9400-E94FF: page 8 */ - 0x8, - /* E9500-E95FF: page 8 */ - 0x8, - /* E9600-E96FF: page 8 */ - 0x8, - /* E9700-E97FF: page 8 */ - 0x8, - /* E9800-E98FF: page 8 */ - 0x8, - /* E9900-E99FF: page 8 */ - 0x8, - /* E9A00-E9AFF: page 8 */ - 0x8, - /* E9B00-E9BFF: page 8 */ - 0x8, - /* E9C00-E9CFF: page 8 */ - 0x8, - /* E9D00-E9DFF: page 8 */ - 0x8, - /* E9E00-E9EFF: page 8 */ - 0x8, - /* E9F00-E9FFF: page 8 */ - 0x8, - /* EA000-EA0FF: page 8 */ - 0x8, - /* EA100-EA1FF: page 8 */ - 0x8, - /* EA200-EA2FF: page 8 */ - 0x8, - /* EA300-EA3FF: page 8 */ - 0x8, - /* EA400-EA4FF: page 8 */ - 0x8, - /* EA500-EA5FF: page 8 */ - 0x8, - /* EA600-EA6FF: page 8 */ - 0x8, - /* EA700-EA7FF: page 8 */ - 0x8, - /* EA800-EA8FF: page 8 */ - 0x8, - /* EA900-EA9FF: page 8 */ - 0x8, - /* EAA00-EAAFF: page 8 */ - 0x8, - /* EAB00-EABFF: page 8 */ - 0x8, - /* EAC00-EACFF: page 8 */ - 0x8, - /* EAD00-EADFF: page 8 */ - 0x8, - /* EAE00-EAEFF: page 8 */ - 0x8, - /* EAF00-EAFFF: page 8 */ - 0x8, - /* EB000-EB0FF: page 8 */ - 0x8, - /* EB100-EB1FF: page 8 */ - 0x8, - /* EB200-EB2FF: page 8 */ - 0x8, - /* EB300-EB3FF: page 8 */ - 0x8, - /* EB400-EB4FF: page 8 */ - 0x8, - /* EB500-EB5FF: page 8 */ - 0x8, - /* EB600-EB6FF: page 8 */ - 0x8, - /* EB700-EB7FF: page 8 */ - 0x8, - /* EB800-EB8FF: page 8 */ - 0x8, - /* EB900-EB9FF: page 8 */ - 0x8, - /* EBA00-EBAFF: page 8 */ - 0x8, - /* EBB00-EBBFF: page 8 */ - 0x8, - /* EBC00-EBCFF: page 8 */ - 0x8, - /* EBD00-EBDFF: page 8 */ - 0x8, - /* EBE00-EBEFF: page 8 */ - 0x8, - /* EBF00-EBFFF: page 8 */ - 0x8, - /* EC000-EC0FF: page 8 */ - 0x8, - /* EC100-EC1FF: page 8 */ - 0x8, - /* EC200-EC2FF: page 8 */ - 0x8, - /* EC300-EC3FF: page 8 */ - 0x8, - /* EC400-EC4FF: page 8 */ - 0x8, - /* EC500-EC5FF: page 8 */ - 0x8, - /* EC600-EC6FF: page 8 */ - 0x8, - /* EC700-EC7FF: page 8 */ - 0x8, - /* EC800-EC8FF: page 8 */ - 0x8, - /* EC900-EC9FF: page 8 */ - 0x8, - /* ECA00-ECAFF: page 8 */ - 0x8, - /* ECB00-ECBFF: page 8 */ - 0x8, - /* ECC00-ECCFF: page 8 */ - 0x8, - /* ECD00-ECDFF: page 8 */ - 0x8, - /* ECE00-ECEFF: page 8 */ - 0x8, - /* ECF00-ECFFF: page 8 */ - 0x8, - /* ED000-ED0FF: page 8 */ - 0x8, - /* ED100-ED1FF: page 8 */ - 0x8, - /* ED200-ED2FF: page 8 */ - 0x8, - /* ED300-ED3FF: page 8 */ - 0x8, - /* ED400-ED4FF: page 8 */ - 0x8, - /* ED500-ED5FF: page 8 */ - 0x8, - /* ED600-ED6FF: page 8 */ - 0x8, - /* ED700-ED7FF: page 8 */ - 0x8, - /* ED800-ED8FF: page 8 */ - 0x8, - /* ED900-ED9FF: page 8 */ - 0x8, - /* EDA00-EDAFF: page 8 */ - 0x8, - /* EDB00-EDBFF: page 8 */ - 0x8, - /* EDC00-EDCFF: page 8 */ - 0x8, - /* EDD00-EDDFF: page 8 */ - 0x8, - /* EDE00-EDEFF: page 8 */ - 0x8, - /* EDF00-EDFFF: page 8 */ - 0x8, - /* EE000-EE0FF: page 8 */ - 0x8, - /* EE100-EE1FF: page 8 */ - 0x8, - /* EE200-EE2FF: page 8 */ - 0x8, - /* EE300-EE3FF: page 8 */ - 0x8, - /* EE400-EE4FF: page 8 */ - 0x8, - /* EE500-EE5FF: page 8 */ - 0x8, - /* EE600-EE6FF: page 8 */ - 0x8, - /* EE700-EE7FF: page 8 */ - 0x8, - /* EE800-EE8FF: page 8 */ - 0x8, - /* EE900-EE9FF: page 8 */ - 0x8, - /* EEA00-EEAFF: page 8 */ - 0x8, - /* EEB00-EEBFF: page 8 */ - 0x8, - /* EEC00-EECFF: page 8 */ - 0x8, - /* EED00-EEDFF: page 8 */ - 0x8, - /* EEE00-EEEFF: page 8 */ - 0x8, - /* EEF00-EEFFF: page 8 */ - 0x8, - /* EF000-EF0FF: page 8 */ - 0x8, - /* EF100-EF1FF: page 8 */ - 0x8, - /* EF200-EF2FF: page 8 */ - 0x8, - /* EF300-EF3FF: page 8 */ - 0x8, - /* EF400-EF4FF: page 8 */ - 0x8, - /* EF500-EF5FF: page 8 */ - 0x8, - /* EF600-EF6FF: page 8 */ - 0x8, - /* EF700-EF7FF: page 8 */ - 0x8, - /* EF800-EF8FF: page 8 */ - 0x8, - /* EF900-EF9FF: page 8 */ - 0x8, - /* EFA00-EFAFF: page 8 */ - 0x8, - /* EFB00-EFBFF: page 8 */ - 0x8, - /* EFC00-EFCFF: page 8 */ - 0x8, - /* EFD00-EFDFF: page 8 */ - 0x8, - /* EFE00-EFEFF: page 8 */ - 0x8, - /* EFF00-EFFFF: page 8 */ - 0x8, - /* F0000-F00FF: page 224 */ - 0xE0, - /* F0100-F01FF: page 224 */ - 0xE0, - /* F0200-F02FF: page 224 */ - 0xE0, - /* F0300-F03FF: page 224 */ - 0xE0, - /* F0400-F04FF: page 224 */ - 0xE0, - /* F0500-F05FF: page 224 */ - 0xE0, - /* F0600-F06FF: page 224 */ - 0xE0, - /* F0700-F07FF: page 224 */ - 0xE0, - /* F0800-F08FF: page 224 */ - 0xE0, - /* F0900-F09FF: page 224 */ - 0xE0, - /* F0A00-F0AFF: page 224 */ - 0xE0, - /* F0B00-F0BFF: page 224 */ - 0xE0, - /* F0C00-F0CFF: page 224 */ - 0xE0, - /* F0D00-F0DFF: page 224 */ - 0xE0, - /* F0E00-F0EFF: page 224 */ - 0xE0, - /* F0F00-F0FFF: page 224 */ - 0xE0, - /* F1000-F10FF: page 224 */ - 0xE0, - /* F1100-F11FF: page 224 */ - 0xE0, - /* F1200-F12FF: page 224 */ - 0xE0, - /* F1300-F13FF: page 224 */ - 0xE0, - /* F1400-F14FF: page 224 */ - 0xE0, - /* F1500-F15FF: page 224 */ - 0xE0, - /* F1600-F16FF: page 224 */ - 0xE0, - /* F1700-F17FF: page 224 */ - 0xE0, - /* F1800-F18FF: page 224 */ - 0xE0, - /* F1900-F19FF: page 224 */ - 0xE0, - /* F1A00-F1AFF: page 224 */ - 0xE0, - /* F1B00-F1BFF: page 224 */ - 0xE0, - /* F1C00-F1CFF: page 224 */ - 0xE0, - /* F1D00-F1DFF: page 224 */ - 0xE0, - /* F1E00-F1EFF: page 224 */ - 0xE0, - /* F1F00-F1FFF: page 224 */ - 0xE0, - /* F2000-F20FF: page 224 */ - 0xE0, - /* F2100-F21FF: page 224 */ - 0xE0, - /* F2200-F22FF: page 224 */ - 0xE0, - /* F2300-F23FF: page 224 */ - 0xE0, - /* F2400-F24FF: page 224 */ - 0xE0, - /* F2500-F25FF: page 224 */ - 0xE0, - /* F2600-F26FF: page 224 */ - 0xE0, - /* F2700-F27FF: page 224 */ - 0xE0, - /* F2800-F28FF: page 224 */ - 0xE0, - /* F2900-F29FF: page 224 */ - 0xE0, - /* F2A00-F2AFF: page 224 */ - 0xE0, - /* F2B00-F2BFF: page 224 */ - 0xE0, - /* F2C00-F2CFF: page 224 */ - 0xE0, - /* F2D00-F2DFF: page 224 */ - 0xE0, - /* F2E00-F2EFF: page 224 */ - 0xE0, - /* F2F00-F2FFF: page 224 */ - 0xE0, - /* F3000-F30FF: page 224 */ - 0xE0, - /* F3100-F31FF: page 224 */ - 0xE0, - /* F3200-F32FF: page 224 */ - 0xE0, - /* F3300-F33FF: page 224 */ - 0xE0, - /* F3400-F34FF: page 224 */ - 0xE0, - /* F3500-F35FF: page 224 */ - 0xE0, - /* F3600-F36FF: page 224 */ - 0xE0, - /* F3700-F37FF: page 224 */ - 0xE0, - /* F3800-F38FF: page 224 */ - 0xE0, - /* F3900-F39FF: page 224 */ - 0xE0, - /* F3A00-F3AFF: page 224 */ - 0xE0, - /* F3B00-F3BFF: page 224 */ - 0xE0, - /* F3C00-F3CFF: page 224 */ - 0xE0, - /* F3D00-F3DFF: page 224 */ - 0xE0, - /* F3E00-F3EFF: page 224 */ - 0xE0, - /* F3F00-F3FFF: page 224 */ - 0xE0, - /* F4000-F40FF: page 224 */ - 0xE0, - /* F4100-F41FF: page 224 */ - 0xE0, - /* F4200-F42FF: page 224 */ - 0xE0, - /* F4300-F43FF: page 224 */ - 0xE0, - /* F4400-F44FF: page 224 */ - 0xE0, - /* F4500-F45FF: page 224 */ - 0xE0, - /* F4600-F46FF: page 224 */ - 0xE0, - /* F4700-F47FF: page 224 */ - 0xE0, - /* F4800-F48FF: page 224 */ - 0xE0, - /* F4900-F49FF: page 224 */ - 0xE0, - /* F4A00-F4AFF: page 224 */ - 0xE0, - /* F4B00-F4BFF: page 224 */ - 0xE0, - /* F4C00-F4CFF: page 224 */ - 0xE0, - /* F4D00-F4DFF: page 224 */ - 0xE0, - /* F4E00-F4EFF: page 224 */ - 0xE0, - /* F4F00-F4FFF: page 224 */ - 0xE0, - /* F5000-F50FF: page 224 */ - 0xE0, - /* F5100-F51FF: page 224 */ - 0xE0, - /* F5200-F52FF: page 224 */ - 0xE0, - /* F5300-F53FF: page 224 */ - 0xE0, - /* F5400-F54FF: page 224 */ - 0xE0, - /* F5500-F55FF: page 224 */ - 0xE0, - /* F5600-F56FF: page 224 */ - 0xE0, - /* F5700-F57FF: page 224 */ - 0xE0, - /* F5800-F58FF: page 224 */ - 0xE0, - /* F5900-F59FF: page 224 */ - 0xE0, - /* F5A00-F5AFF: page 224 */ - 0xE0, - /* F5B00-F5BFF: page 224 */ - 0xE0, - /* F5C00-F5CFF: page 224 */ - 0xE0, - /* F5D00-F5DFF: page 224 */ - 0xE0, - /* F5E00-F5EFF: page 224 */ - 0xE0, - /* F5F00-F5FFF: page 224 */ - 0xE0, - /* F6000-F60FF: page 224 */ - 0xE0, - /* F6100-F61FF: page 224 */ - 0xE0, - /* F6200-F62FF: page 224 */ - 0xE0, - /* F6300-F63FF: page 224 */ - 0xE0, - /* F6400-F64FF: page 224 */ - 0xE0, - /* F6500-F65FF: page 224 */ - 0xE0, - /* F6600-F66FF: page 224 */ - 0xE0, - /* F6700-F67FF: page 224 */ - 0xE0, - /* F6800-F68FF: page 224 */ - 0xE0, - /* F6900-F69FF: page 224 */ - 0xE0, - /* F6A00-F6AFF: page 224 */ - 0xE0, - /* F6B00-F6BFF: page 224 */ - 0xE0, - /* F6C00-F6CFF: page 224 */ - 0xE0, - /* F6D00-F6DFF: page 224 */ - 0xE0, - /* F6E00-F6EFF: page 224 */ - 0xE0, - /* F6F00-F6FFF: page 224 */ - 0xE0, - /* F7000-F70FF: page 224 */ - 0xE0, - /* F7100-F71FF: page 224 */ - 0xE0, - /* F7200-F72FF: page 224 */ - 0xE0, - /* F7300-F73FF: page 224 */ - 0xE0, - /* F7400-F74FF: page 224 */ - 0xE0, - /* F7500-F75FF: page 224 */ - 0xE0, - /* F7600-F76FF: page 224 */ - 0xE0, - /* F7700-F77FF: page 224 */ - 0xE0, - /* F7800-F78FF: page 224 */ - 0xE0, - /* F7900-F79FF: page 224 */ - 0xE0, - /* F7A00-F7AFF: page 224 */ - 0xE0, - /* F7B00-F7BFF: page 224 */ - 0xE0, - /* F7C00-F7CFF: page 224 */ - 0xE0, - /* F7D00-F7DFF: page 224 */ - 0xE0, - /* F7E00-F7EFF: page 224 */ - 0xE0, - /* F7F00-F7FFF: page 224 */ - 0xE0, - /* F8000-F80FF: page 224 */ - 0xE0, - /* F8100-F81FF: page 224 */ - 0xE0, - /* F8200-F82FF: page 224 */ - 0xE0, - /* F8300-F83FF: page 224 */ - 0xE0, - /* F8400-F84FF: page 224 */ - 0xE0, - /* F8500-F85FF: page 224 */ - 0xE0, - /* F8600-F86FF: page 224 */ - 0xE0, - /* F8700-F87FF: page 224 */ - 0xE0, - /* F8800-F88FF: page 224 */ - 0xE0, - /* F8900-F89FF: page 224 */ - 0xE0, - /* F8A00-F8AFF: page 224 */ - 0xE0, - /* F8B00-F8BFF: page 224 */ - 0xE0, - /* F8C00-F8CFF: page 224 */ - 0xE0, - /* F8D00-F8DFF: page 224 */ - 0xE0, - /* F8E00-F8EFF: page 224 */ - 0xE0, - /* F8F00-F8FFF: page 224 */ - 0xE0, - /* F9000-F90FF: page 224 */ - 0xE0, - /* F9100-F91FF: page 224 */ - 0xE0, - /* F9200-F92FF: page 224 */ - 0xE0, - /* F9300-F93FF: page 224 */ - 0xE0, - /* F9400-F94FF: page 224 */ - 0xE0, - /* F9500-F95FF: page 224 */ - 0xE0, - /* F9600-F96FF: page 224 */ - 0xE0, - /* F9700-F97FF: page 224 */ - 0xE0, - /* F9800-F98FF: page 224 */ - 0xE0, - /* F9900-F99FF: page 224 */ - 0xE0, - /* F9A00-F9AFF: page 224 */ - 0xE0, - /* F9B00-F9BFF: page 224 */ - 0xE0, - /* F9C00-F9CFF: page 224 */ - 0xE0, - /* F9D00-F9DFF: page 224 */ - 0xE0, - /* F9E00-F9EFF: page 224 */ - 0xE0, - /* F9F00-F9FFF: page 224 */ - 0xE0, - /* FA000-FA0FF: page 224 */ - 0xE0, - /* FA100-FA1FF: page 224 */ - 0xE0, - /* FA200-FA2FF: page 224 */ - 0xE0, - /* FA300-FA3FF: page 224 */ - 0xE0, - /* FA400-FA4FF: page 224 */ - 0xE0, - /* FA500-FA5FF: page 224 */ - 0xE0, - /* FA600-FA6FF: page 224 */ - 0xE0, - /* FA700-FA7FF: page 224 */ - 0xE0, - /* FA800-FA8FF: page 224 */ - 0xE0, - /* FA900-FA9FF: page 224 */ - 0xE0, - /* FAA00-FAAFF: page 224 */ - 0xE0, - /* FAB00-FABFF: page 224 */ - 0xE0, - /* FAC00-FACFF: page 224 */ - 0xE0, - /* FAD00-FADFF: page 224 */ - 0xE0, - /* FAE00-FAEFF: page 224 */ - 0xE0, - /* FAF00-FAFFF: page 224 */ - 0xE0, - /* FB000-FB0FF: page 224 */ - 0xE0, - /* FB100-FB1FF: page 224 */ - 0xE0, - /* FB200-FB2FF: page 224 */ - 0xE0, - /* FB300-FB3FF: page 224 */ - 0xE0, - /* FB400-FB4FF: page 224 */ - 0xE0, - /* FB500-FB5FF: page 224 */ - 0xE0, - /* FB600-FB6FF: page 224 */ - 0xE0, - /* FB700-FB7FF: page 224 */ - 0xE0, - /* FB800-FB8FF: page 224 */ - 0xE0, - /* FB900-FB9FF: page 224 */ - 0xE0, - /* FBA00-FBAFF: page 224 */ - 0xE0, - /* FBB00-FBBFF: page 224 */ - 0xE0, - /* FBC00-FBCFF: page 224 */ - 0xE0, - /* FBD00-FBDFF: page 224 */ - 0xE0, - /* FBE00-FBEFF: page 224 */ - 0xE0, - /* FBF00-FBFFF: page 224 */ - 0xE0, - /* FC000-FC0FF: page 224 */ - 0xE0, - /* FC100-FC1FF: page 224 */ - 0xE0, - /* FC200-FC2FF: page 224 */ - 0xE0, - /* FC300-FC3FF: page 224 */ - 0xE0, - /* FC400-FC4FF: page 224 */ - 0xE0, - /* FC500-FC5FF: page 224 */ - 0xE0, - /* FC600-FC6FF: page 224 */ - 0xE0, - /* FC700-FC7FF: page 224 */ - 0xE0, - /* FC800-FC8FF: page 224 */ - 0xE0, - /* FC900-FC9FF: page 224 */ - 0xE0, - /* FCA00-FCAFF: page 224 */ - 0xE0, - /* FCB00-FCBFF: page 224 */ - 0xE0, - /* FCC00-FCCFF: page 224 */ - 0xE0, - /* FCD00-FCDFF: page 224 */ - 0xE0, - /* FCE00-FCEFF: page 224 */ - 0xE0, - /* FCF00-FCFFF: page 224 */ - 0xE0, - /* FD000-FD0FF: page 224 */ - 0xE0, - /* FD100-FD1FF: page 224 */ - 0xE0, - /* FD200-FD2FF: page 224 */ - 0xE0, - /* FD300-FD3FF: page 224 */ - 0xE0, - /* FD400-FD4FF: page 224 */ - 0xE0, - /* FD500-FD5FF: page 224 */ - 0xE0, - /* FD600-FD6FF: page 224 */ - 0xE0, - /* FD700-FD7FF: page 224 */ - 0xE0, - /* FD800-FD8FF: page 224 */ - 0xE0, - /* FD900-FD9FF: page 224 */ - 0xE0, - /* FDA00-FDAFF: page 224 */ - 0xE0, - /* FDB00-FDBFF: page 224 */ - 0xE0, - /* FDC00-FDCFF: page 224 */ - 0xE0, - /* FDD00-FDDFF: page 224 */ - 0xE0, - /* FDE00-FDEFF: page 224 */ - 0xE0, - /* FDF00-FDFFF: page 224 */ - 0xE0, - /* FE000-FE0FF: page 224 */ - 0xE0, - /* FE100-FE1FF: page 224 */ - 0xE0, - /* FE200-FE2FF: page 224 */ - 0xE0, - /* FE300-FE3FF: page 224 */ - 0xE0, - /* FE400-FE4FF: page 224 */ - 0xE0, - /* FE500-FE5FF: page 224 */ - 0xE0, - /* FE600-FE6FF: page 224 */ - 0xE0, - /* FE700-FE7FF: page 224 */ - 0xE0, - /* FE800-FE8FF: page 224 */ - 0xE0, - /* FE900-FE9FF: page 224 */ - 0xE0, - /* FEA00-FEAFF: page 224 */ - 0xE0, - /* FEB00-FEBFF: page 224 */ - 0xE0, - /* FEC00-FECFF: page 224 */ - 0xE0, - /* FED00-FEDFF: page 224 */ - 0xE0, - /* FEE00-FEEFF: page 224 */ - 0xE0, - /* FEF00-FEFFF: page 224 */ - 0xE0, - /* FF000-FF0FF: page 224 */ - 0xE0, - /* FF100-FF1FF: page 224 */ - 0xE0, - /* FF200-FF2FF: page 224 */ - 0xE0, - /* FF300-FF3FF: page 224 */ - 0xE0, - /* FF400-FF4FF: page 224 */ - 0xE0, - /* FF500-FF5FF: page 224 */ - 0xE0, - /* FF600-FF6FF: page 224 */ - 0xE0, - /* FF700-FF7FF: page 224 */ - 0xE0, - /* FF800-FF8FF: page 224 */ - 0xE0, - /* FF900-FF9FF: page 224 */ - 0xE0, - /* FFA00-FFAFF: page 224 */ - 0xE0, - /* FFB00-FFBFF: page 224 */ - 0xE0, - /* FFC00-FFCFF: page 224 */ - 0xE0, - /* FFD00-FFDFF: page 224 */ - 0xE0, - /* FFE00-FFEFF: page 224 */ - 0xE0, - /* FFF00-FFFFF: page 279 */ - 0x117, - /* 100000-1000FF: page 224 */ - 0xE0, - /* 100100-1001FF: page 224 */ - 0xE0, - /* 100200-1002FF: page 224 */ - 0xE0, - /* 100300-1003FF: page 224 */ - 0xE0, - /* 100400-1004FF: page 224 */ - 0xE0, - /* 100500-1005FF: page 224 */ - 0xE0, - /* 100600-1006FF: page 224 */ - 0xE0, - /* 100700-1007FF: page 224 */ - 0xE0, - /* 100800-1008FF: page 224 */ - 0xE0, - /* 100900-1009FF: page 224 */ - 0xE0, - /* 100A00-100AFF: page 224 */ - 0xE0, - /* 100B00-100BFF: page 224 */ - 0xE0, - /* 100C00-100CFF: page 224 */ - 0xE0, - /* 100D00-100DFF: page 224 */ - 0xE0, - /* 100E00-100EFF: page 224 */ - 0xE0, - /* 100F00-100FFF: page 224 */ - 0xE0, - /* 101000-1010FF: page 224 */ - 0xE0, - /* 101100-1011FF: page 224 */ - 0xE0, - /* 101200-1012FF: page 224 */ - 0xE0, - /* 101300-1013FF: page 224 */ - 0xE0, - /* 101400-1014FF: page 224 */ - 0xE0, - /* 101500-1015FF: page 224 */ - 0xE0, - /* 101600-1016FF: page 224 */ - 0xE0, - /* 101700-1017FF: page 224 */ - 0xE0, - /* 101800-1018FF: page 224 */ - 0xE0, - /* 101900-1019FF: page 224 */ - 0xE0, - /* 101A00-101AFF: page 224 */ - 0xE0, - /* 101B00-101BFF: page 224 */ - 0xE0, - /* 101C00-101CFF: page 224 */ - 0xE0, - /* 101D00-101DFF: page 224 */ - 0xE0, - /* 101E00-101EFF: page 224 */ - 0xE0, - /* 101F00-101FFF: page 224 */ - 0xE0, - /* 102000-1020FF: page 224 */ - 0xE0, - /* 102100-1021FF: page 224 */ - 0xE0, - /* 102200-1022FF: page 224 */ - 0xE0, - /* 102300-1023FF: page 224 */ - 0xE0, - /* 102400-1024FF: page 224 */ - 0xE0, - /* 102500-1025FF: page 224 */ - 0xE0, - /* 102600-1026FF: page 224 */ - 0xE0, - /* 102700-1027FF: page 224 */ - 0xE0, - /* 102800-1028FF: page 224 */ - 0xE0, - /* 102900-1029FF: page 224 */ - 0xE0, - /* 102A00-102AFF: page 224 */ - 0xE0, - /* 102B00-102BFF: page 224 */ - 0xE0, - /* 102C00-102CFF: page 224 */ - 0xE0, - /* 102D00-102DFF: page 224 */ - 0xE0, - /* 102E00-102EFF: page 224 */ - 0xE0, - /* 102F00-102FFF: page 224 */ - 0xE0, - /* 103000-1030FF: page 224 */ - 0xE0, - /* 103100-1031FF: page 224 */ - 0xE0, - /* 103200-1032FF: page 224 */ - 0xE0, - /* 103300-1033FF: page 224 */ - 0xE0, - /* 103400-1034FF: page 224 */ - 0xE0, - /* 103500-1035FF: page 224 */ - 0xE0, - /* 103600-1036FF: page 224 */ - 0xE0, - /* 103700-1037FF: page 224 */ - 0xE0, - /* 103800-1038FF: page 224 */ - 0xE0, - /* 103900-1039FF: page 224 */ - 0xE0, - /* 103A00-103AFF: page 224 */ - 0xE0, - /* 103B00-103BFF: page 224 */ - 0xE0, - /* 103C00-103CFF: page 224 */ - 0xE0, - /* 103D00-103DFF: page 224 */ - 0xE0, - /* 103E00-103EFF: page 224 */ - 0xE0, - /* 103F00-103FFF: page 224 */ - 0xE0, - /* 104000-1040FF: page 224 */ - 0xE0, - /* 104100-1041FF: page 224 */ - 0xE0, - /* 104200-1042FF: page 224 */ - 0xE0, - /* 104300-1043FF: page 224 */ - 0xE0, - /* 104400-1044FF: page 224 */ - 0xE0, - /* 104500-1045FF: page 224 */ - 0xE0, - /* 104600-1046FF: page 224 */ - 0xE0, - /* 104700-1047FF: page 224 */ - 0xE0, - /* 104800-1048FF: page 224 */ - 0xE0, - /* 104900-1049FF: page 224 */ - 0xE0, - /* 104A00-104AFF: page 224 */ - 0xE0, - /* 104B00-104BFF: page 224 */ - 0xE0, - /* 104C00-104CFF: page 224 */ - 0xE0, - /* 104D00-104DFF: page 224 */ - 0xE0, - /* 104E00-104EFF: page 224 */ - 0xE0, - /* 104F00-104FFF: page 224 */ - 0xE0, - /* 105000-1050FF: page 224 */ - 0xE0, - /* 105100-1051FF: page 224 */ - 0xE0, - /* 105200-1052FF: page 224 */ - 0xE0, - /* 105300-1053FF: page 224 */ - 0xE0, - /* 105400-1054FF: page 224 */ - 0xE0, - /* 105500-1055FF: page 224 */ - 0xE0, - /* 105600-1056FF: page 224 */ - 0xE0, - /* 105700-1057FF: page 224 */ - 0xE0, - /* 105800-1058FF: page 224 */ - 0xE0, - /* 105900-1059FF: page 224 */ - 0xE0, - /* 105A00-105AFF: page 224 */ - 0xE0, - /* 105B00-105BFF: page 224 */ - 0xE0, - /* 105C00-105CFF: page 224 */ - 0xE0, - /* 105D00-105DFF: page 224 */ - 0xE0, - /* 105E00-105EFF: page 224 */ - 0xE0, - /* 105F00-105FFF: page 224 */ - 0xE0, - /* 106000-1060FF: page 224 */ - 0xE0, - /* 106100-1061FF: page 224 */ - 0xE0, - /* 106200-1062FF: page 224 */ - 0xE0, - /* 106300-1063FF: page 224 */ - 0xE0, - /* 106400-1064FF: page 224 */ - 0xE0, - /* 106500-1065FF: page 224 */ - 0xE0, - /* 106600-1066FF: page 224 */ - 0xE0, - /* 106700-1067FF: page 224 */ - 0xE0, - /* 106800-1068FF: page 224 */ - 0xE0, - /* 106900-1069FF: page 224 */ - 0xE0, - /* 106A00-106AFF: page 224 */ - 0xE0, - /* 106B00-106BFF: page 224 */ - 0xE0, - /* 106C00-106CFF: page 224 */ - 0xE0, - /* 106D00-106DFF: page 224 */ - 0xE0, - /* 106E00-106EFF: page 224 */ - 0xE0, - /* 106F00-106FFF: page 224 */ - 0xE0, - /* 107000-1070FF: page 224 */ - 0xE0, - /* 107100-1071FF: page 224 */ - 0xE0, - /* 107200-1072FF: page 224 */ - 0xE0, - /* 107300-1073FF: page 224 */ - 0xE0, - /* 107400-1074FF: page 224 */ - 0xE0, - /* 107500-1075FF: page 224 */ - 0xE0, - /* 107600-1076FF: page 224 */ - 0xE0, - /* 107700-1077FF: page 224 */ - 0xE0, - /* 107800-1078FF: page 224 */ - 0xE0, - /* 107900-1079FF: page 224 */ - 0xE0, - /* 107A00-107AFF: page 224 */ - 0xE0, - /* 107B00-107BFF: page 224 */ - 0xE0, - /* 107C00-107CFF: page 224 */ - 0xE0, - /* 107D00-107DFF: page 224 */ - 0xE0, - /* 107E00-107EFF: page 224 */ - 0xE0, - /* 107F00-107FFF: page 224 */ - 0xE0, - /* 108000-1080FF: page 224 */ - 0xE0, - /* 108100-1081FF: page 224 */ - 0xE0, - /* 108200-1082FF: page 224 */ - 0xE0, - /* 108300-1083FF: page 224 */ - 0xE0, - /* 108400-1084FF: page 224 */ - 0xE0, - /* 108500-1085FF: page 224 */ - 0xE0, - /* 108600-1086FF: page 224 */ - 0xE0, - /* 108700-1087FF: page 224 */ - 0xE0, - /* 108800-1088FF: page 224 */ - 0xE0, - /* 108900-1089FF: page 224 */ - 0xE0, - /* 108A00-108AFF: page 224 */ - 0xE0, - /* 108B00-108BFF: page 224 */ - 0xE0, - /* 108C00-108CFF: page 224 */ - 0xE0, - /* 108D00-108DFF: page 224 */ - 0xE0, - /* 108E00-108EFF: page 224 */ - 0xE0, - /* 108F00-108FFF: page 224 */ - 0xE0, - /* 109000-1090FF: page 224 */ - 0xE0, - /* 109100-1091FF: page 224 */ - 0xE0, - /* 109200-1092FF: page 224 */ - 0xE0, - /* 109300-1093FF: page 224 */ - 0xE0, - /* 109400-1094FF: page 224 */ - 0xE0, - /* 109500-1095FF: page 224 */ - 0xE0, - /* 109600-1096FF: page 224 */ - 0xE0, - /* 109700-1097FF: page 224 */ - 0xE0, - /* 109800-1098FF: page 224 */ - 0xE0, - /* 109900-1099FF: page 224 */ - 0xE0, - /* 109A00-109AFF: page 224 */ - 0xE0, - /* 109B00-109BFF: page 224 */ - 0xE0, - /* 109C00-109CFF: page 224 */ - 0xE0, - /* 109D00-109DFF: page 224 */ - 0xE0, - /* 109E00-109EFF: page 224 */ - 0xE0, - /* 109F00-109FFF: page 224 */ - 0xE0, - /* 10A000-10A0FF: page 224 */ - 0xE0, - /* 10A100-10A1FF: page 224 */ - 0xE0, - /* 10A200-10A2FF: page 224 */ - 0xE0, - /* 10A300-10A3FF: page 224 */ - 0xE0, - /* 10A400-10A4FF: page 224 */ - 0xE0, - /* 10A500-10A5FF: page 224 */ - 0xE0, - /* 10A600-10A6FF: page 224 */ - 0xE0, - /* 10A700-10A7FF: page 224 */ - 0xE0, - /* 10A800-10A8FF: page 224 */ - 0xE0, - /* 10A900-10A9FF: page 224 */ - 0xE0, - /* 10AA00-10AAFF: page 224 */ - 0xE0, - /* 10AB00-10ABFF: page 224 */ - 0xE0, - /* 10AC00-10ACFF: page 224 */ - 0xE0, - /* 10AD00-10ADFF: page 224 */ - 0xE0, - /* 10AE00-10AEFF: page 224 */ - 0xE0, - /* 10AF00-10AFFF: page 224 */ - 0xE0, - /* 10B000-10B0FF: page 224 */ - 0xE0, - /* 10B100-10B1FF: page 224 */ - 0xE0, - /* 10B200-10B2FF: page 224 */ - 0xE0, - /* 10B300-10B3FF: page 224 */ - 0xE0, - /* 10B400-10B4FF: page 224 */ - 0xE0, - /* 10B500-10B5FF: page 224 */ - 0xE0, - /* 10B600-10B6FF: page 224 */ - 0xE0, - /* 10B700-10B7FF: page 224 */ - 0xE0, - /* 10B800-10B8FF: page 224 */ - 0xE0, - /* 10B900-10B9FF: page 224 */ - 0xE0, - /* 10BA00-10BAFF: page 224 */ - 0xE0, - /* 10BB00-10BBFF: page 224 */ - 0xE0, - /* 10BC00-10BCFF: page 224 */ - 0xE0, - /* 10BD00-10BDFF: page 224 */ - 0xE0, - /* 10BE00-10BEFF: page 224 */ - 0xE0, - /* 10BF00-10BFFF: page 224 */ - 0xE0, - /* 10C000-10C0FF: page 224 */ - 0xE0, - /* 10C100-10C1FF: page 224 */ - 0xE0, - /* 10C200-10C2FF: page 224 */ - 0xE0, - /* 10C300-10C3FF: page 224 */ - 0xE0, - /* 10C400-10C4FF: page 224 */ - 0xE0, - /* 10C500-10C5FF: page 224 */ - 0xE0, - /* 10C600-10C6FF: page 224 */ - 0xE0, - /* 10C700-10C7FF: page 224 */ - 0xE0, - /* 10C800-10C8FF: page 224 */ - 0xE0, - /* 10C900-10C9FF: page 224 */ - 0xE0, - /* 10CA00-10CAFF: page 224 */ - 0xE0, - /* 10CB00-10CBFF: page 224 */ - 0xE0, - /* 10CC00-10CCFF: page 224 */ - 0xE0, - /* 10CD00-10CDFF: page 224 */ - 0xE0, - /* 10CE00-10CEFF: page 224 */ - 0xE0, - /* 10CF00-10CFFF: page 224 */ - 0xE0, - /* 10D000-10D0FF: page 224 */ - 0xE0, - /* 10D100-10D1FF: page 224 */ - 0xE0, - /* 10D200-10D2FF: page 224 */ - 0xE0, - /* 10D300-10D3FF: page 224 */ - 0xE0, - /* 10D400-10D4FF: page 224 */ - 0xE0, - /* 10D500-10D5FF: page 224 */ - 0xE0, - /* 10D600-10D6FF: page 224 */ - 0xE0, - /* 10D700-10D7FF: page 224 */ - 0xE0, - /* 10D800-10D8FF: page 224 */ - 0xE0, - /* 10D900-10D9FF: page 224 */ - 0xE0, - /* 10DA00-10DAFF: page 224 */ - 0xE0, - /* 10DB00-10DBFF: page 224 */ - 0xE0, - /* 10DC00-10DCFF: page 224 */ - 0xE0, - /* 10DD00-10DDFF: page 224 */ - 0xE0, - /* 10DE00-10DEFF: page 224 */ - 0xE0, - /* 10DF00-10DFFF: page 224 */ - 0xE0, - /* 10E000-10E0FF: page 224 */ - 0xE0, - /* 10E100-10E1FF: page 224 */ - 0xE0, - /* 10E200-10E2FF: page 224 */ - 0xE0, - /* 10E300-10E3FF: page 224 */ - 0xE0, - /* 10E400-10E4FF: page 224 */ - 0xE0, - /* 10E500-10E5FF: page 224 */ - 0xE0, - /* 10E600-10E6FF: page 224 */ - 0xE0, - /* 10E700-10E7FF: page 224 */ - 0xE0, - /* 10E800-10E8FF: page 224 */ - 0xE0, - /* 10E900-10E9FF: page 224 */ - 0xE0, - /* 10EA00-10EAFF: page 224 */ - 0xE0, - /* 10EB00-10EBFF: page 224 */ - 0xE0, - /* 10EC00-10ECFF: page 224 */ - 0xE0, - /* 10ED00-10EDFF: page 224 */ - 0xE0, - /* 10EE00-10EEFF: page 224 */ - 0xE0, - /* 10EF00-10EFFF: page 224 */ - 0xE0, - /* 10F000-10F0FF: page 224 */ - 0xE0, - /* 10F100-10F1FF: page 224 */ - 0xE0, - /* 10F200-10F2FF: page 224 */ - 0xE0, - /* 10F300-10F3FF: page 224 */ - 0xE0, - /* 10F400-10F4FF: page 224 */ - 0xE0, - /* 10F500-10F5FF: page 224 */ - 0xE0, - /* 10F600-10F6FF: page 224 */ - 0xE0, - /* 10F700-10F7FF: page 224 */ - 0xE0, - /* 10F800-10F8FF: page 224 */ - 0xE0, - /* 10F900-10F9FF: page 224 */ - 0xE0, - /* 10FA00-10FAFF: page 224 */ - 0xE0, - /* 10FB00-10FBFF: page 224 */ - 0xE0, - /* 10FC00-10FCFF: page 224 */ - 0xE0, - /* 10FD00-10FDFF: page 224 */ - 0xE0, - /* 10FE00-10FEFF: page 224 */ - 0xE0, - /* 10FF00-10FFFF: page 279 */ - 0x117 -}; -#endif - -#endif /* DISABLE_NET_4_0 */ - -static const guint8 NumericData [] = { - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,1, - 2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,2,3,57,57,57,57,57,1,57,57,44,33,45,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,1,2, - 3,4,57,16,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,1,2,3, - 4,5,6,7,8,9,10,28,30,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7, - 8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,33,34,35,36,37,38,39,40,41,56,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,1,2,3,4,5,6,7,8,9,10,20,21,22,23,24,25,26,27,28,32,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,17,18,19,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,0,57,57,57,4,5,6,7,8,9,57,57,57,57,57,57,0,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,42,43,46,47,48,49,50,51,52,53,54,55,1,1,2,3,4,5,6, - 7,8,9,10,11,12,23,28,29,30,1,2,3,4,5,6,7,8,9,10,11,12,23,28,29,30,30,31,32,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, - 19,20,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 0,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,1,2,3,4,5,6,7,8,9,57,57,57,57,57,57,57,57,57,57,57,57,57,57,10,20,21,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,1,2,3,4,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,1,2,3,4,5,6,7,8,9,10,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,1,2,3,4,5,6,7,8,9,10 -}; - -static const gdouble NumericDataValues [] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 30, 40, 50, 60, 70, 80, 90,100,500, - 1000, 5000, 10000, 1/2, 3/2, 5/2, 7/2, 9/2, 11/2, 13/2, - 15/2, 17/2, 1/3, 2/3, 1/4, 3/4, 1/5, 2/5, 3/5, 4/5, - 1/6, 5/6, 1/8, 3/8, 5/8, 7/8, -1/2, -1 -}; - static const guint16 ToLowerDataLow [] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49, 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,91,92,93,94,95,96,97,98,99, diff --git a/mta-mono/vendor/mono/metadata/class-internals.h b/mta-mono/vendor/mono/metadata/class-internals.h index 2bf9041..98585a4 100644 --- a/mta-mono/vendor/mono/metadata/class-internals.h +++ b/mta-mono/vendor/mono/metadata/class-internals.h @@ -209,7 +209,9 @@ enum { MONO_EXCEPTION_BAD_IMAGE = 12, MONO_EXCEPTION_OBJECT_SUPPLIED = 13, /*The exception object is already created.*/ MONO_EXCEPTION_OUT_OF_MEMORY = 14, - MONO_EXCEPTION_INLINE_FAILED = 15 + MONO_EXCEPTION_INLINE_FAILED = 15, + MONO_EXCEPTION_MONO_ERROR = 16, + /* add other exception type */ }; /* This struct collects the info needed for the runtime use of a class, @@ -559,7 +561,11 @@ struct _MonoDynamicGenericClass { * A type parameter. */ struct _MonoGenericParam { - MonoGenericContainer *owner; /* Type or method this parameter was defined in. */ + /* + * Type or method this parameter was defined in. + * If this is non-null, this is a MonoGenericParamFull structure. + */ + MonoGenericContainer *owner; guint16 num; /* For internal runtime use, used to make different versions of the same param */ guint16 serial; @@ -657,6 +663,8 @@ typedef struct { gconstpointer trampoline; MonoMethodSignature *sig; const char *c_symbol; + MonoMethod *wrapper_method; + gboolean no_raise; } MonoJitICallInfo; typedef struct { @@ -1025,6 +1033,9 @@ mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hin MonoMethod* mono_class_inflate_generic_method_full_checked (MonoMethod *method, MonoClass *klass_hint, MonoGenericContext *context, MonoError *error) MONO_INTERNAL; +MonoMethod * +mono_class_inflate_generic_method_checked (MonoMethod *method, MonoGenericContext *context, MonoError *error) MONO_INTERNAL; + MonoMethodInflated* mono_method_inflated_lookup (MonoMethodInflated* method, gboolean cache) MONO_INTERNAL; @@ -1239,7 +1250,7 @@ MonoJitICallInfo * mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save) MONO_INTERNAL; MonoJitICallInfo * -mono_register_jit_icall_full (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save, const char *c_symbol) MONO_INTERNAL; +mono_register_jit_icall_full (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save, gboolean no_raise, const char *c_symbol) MONO_INTERNAL; void mono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper) MONO_INTERNAL; @@ -1394,4 +1405,10 @@ mono_class_get_and_inflate_typespec_checked (MonoImage *image, guint32 type_toke MonoClass * mono_class_from_name_case_checked (MonoImage *image, const char* name_space, const char *name, MonoError *error) MONO_INTERNAL; +MonoClassField* +mono_field_from_token_checked (MonoImage *image, uint32_t token, MonoClass **retklass, MonoGenericContext *context, MonoError *error) MONO_INTERNAL; + +gpointer +mono_ldtoken_checked (MonoImage *image, guint32 token, MonoClass **handle_class, MonoGenericContext *context, MonoError *error) MONO_INTERNAL; + #endif /* __MONO_METADATA_CLASS_INTERBALS_H__ */ diff --git a/mta-mono/vendor/mono/metadata/class.c b/mta-mono/vendor/mono/metadata/class.c index e9ff582..b70897d 100644 --- a/mta-mono/vendor/mono/metadata/class.c +++ b/mta-mono/vendor/mono/metadata/class.c @@ -72,10 +72,6 @@ static guint32 mono_field_resolve_flags (MonoClassField *field); static void mono_class_setup_vtable_full (MonoClass *class, GList *in_setup); static void mono_generic_class_setup_parent (MonoClass *klass, MonoClass *gklass); - -void (*mono_debugger_class_init_func) (MonoClass *klass) = NULL; - - /* We use gclass recording to allow recursive system f types to be referenced by a parent. @@ -270,15 +266,21 @@ mono_class_from_typeref_checked (MonoImage *image, guint32 type_token, MonoError return NULL; } + /* FIXME this leaks loader errors */ res = mono_class_from_name (image->references [idx - 1]->image, nspace, name); done: /* Generic case, should be avoided for when a better error is possible. */ if (!res && mono_error_ok (error)) { - char *name = mono_class_name_from_token (image, type_token); - char *assembly = mono_assembly_name_from_token (image, type_token); - mono_error_set_type_load_name (error, name, assembly, "Could not resolve type with token %08x", type_token); + if (mono_loader_get_last_error ()) { /*FIXME plug the above to not leak errors*/ + mono_error_set_from_loader_error (error); + } else { + char *name = mono_class_name_from_token (image, type_token); + char *assembly = mono_assembly_name_from_token (image, type_token); + mono_error_set_type_load_name (error, name, assembly, "Could not resolve type with token %08x", type_token); + } } + g_assert (!mono_loader_get_last_error ()); return res; } @@ -970,6 +972,12 @@ mono_class_inflate_generic_method (MonoMethod *method, MonoGenericContext *conte return mono_class_inflate_generic_method_full (method, NULL, context); } +MonoMethod * +mono_class_inflate_generic_method_checked (MonoMethod *method, MonoGenericContext *context, MonoError *error) +{ + return mono_class_inflate_generic_method_full_checked (method, NULL, context, error); +} + /** * mono_class_inflate_generic_method_full: * @@ -1082,10 +1090,8 @@ mono_class_inflate_generic_method_full_checked (MonoMethod *method, MonoClass *k iresult->context.class_inst = iresult->declaring->klass->generic_class->context.class_inst; } - mono_loader_lock (); cached = mono_method_inflated_lookup (iresult, FALSE); if (cached) { - mono_loader_unlock (); g_free (iresult); return (MonoMethod*)cached; } @@ -1156,12 +1162,9 @@ mono_class_inflate_generic_method_full_checked (MonoMethod *method, MonoClass *k * is_generic_method_definition(). */ - mono_method_inflated_lookup (iresult, TRUE); - mono_loader_unlock (); - return result; + return (MonoMethod*)mono_method_inflated_lookup (iresult, TRUE); fail: - mono_loader_unlock (); g_free (iresult); return NULL; } @@ -1241,7 +1244,7 @@ mono_method_get_generic_container (MonoMethod *method) * mono_method_set_generic_container: * * Sets the generic container of METHOD to CONTAINER. - * LOCKING: Acquires the loader lock. + * LOCKING: Acquires the image lock. */ void mono_method_set_generic_container (MonoMethod *method, MonoGenericContainer* container) @@ -1568,8 +1571,8 @@ mono_class_setup_fields (MonoClass *class) explicit_size = mono_metadata_packing_from_typedef (class->image, class->type_token, &packing_size, &real_size); if (explicit_size) { - if ((packing_size & 0xfffffff0) != 0) { - char *err_msg = g_strdup_printf ("Could not load struct '%s' with packing size %d >= 16", class->name, packing_size); + if ((packing_size & 0xffffff00) != 0) { + char *err_msg = g_strdup_printf ("Could not load struct '%s' with packing size %d >= 256", class->name, packing_size); mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, err_msg); return; } @@ -2157,12 +2160,18 @@ mono_class_setup_methods (MonoClass *class) MonoMethodSignature *sig; int count_generic = 0, first_generic = 0; int method_num = 0; + gboolean jagged_ctor = FALSE; count = 3 + (class->rank > 1? 2: 1); mono_class_setup_interfaces (class, &error); g_assert (mono_error_ok (&error)); /*FIXME can this fail for array types?*/ + if (class->rank == 1 && class->element_class->rank) { + jagged_ctor = TRUE; + class->method.count ++; + } + if (class->interface_count) { count_generic = generic_array_methods (class); first_generic = count; @@ -2191,6 +2200,19 @@ mono_class_setup_methods (MonoClass *class) amethod = create_array_method (class, ".ctor", sig); methods [method_num++] = amethod; } + + if (jagged_ctor) { + /* Jagged arrays have an extra ctor in .net which creates an array of arrays */ + sig = mono_metadata_signature_alloc (class->image, class->rank + 1); + sig->ret = &mono_defaults.void_class->byval_arg; + sig->pinvoke = TRUE; + sig->hasthis = TRUE; + for (i = 0; i < class->rank + 1; ++i) + sig->params [i] = &mono_defaults.int32_class->byval_arg; + amethod = create_array_method (class, ".ctor", sig); + methods [method_num++] = amethod; + } + /* element Get (idx11, [idx2, ...]) */ sig = mono_metadata_signature_alloc (class->image, class->rank); sig->ret = &class->element_class->byval_arg; @@ -2223,11 +2245,17 @@ mono_class_setup_methods (MonoClass *class) for (i = 0; i < class->interface_count; i++) setup_generic_array_ifaces (class, class->interfaces [i], methods, first_generic + i * count_generic); } else { + MonoError error; + count = class->method.count; methods = mono_class_alloc (class, sizeof (MonoMethod*) * count); for (i = 0; i < count; ++i) { int idx = mono_metadata_translate_token_index (class->image, MONO_TABLE_METHOD, class->method.first + i + 1); - methods [i] = mono_get_method (class->image, MONO_TOKEN_METHOD_DEF | idx, class); + methods [i] = mono_get_method_checked (class->image, MONO_TOKEN_METHOD_DEF | idx, class, NULL, &error); + if (!methods [i]) { + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Could not load method %d due to %s", i, mono_error_get_message (&error))); + mono_error_cleanup (&error); + } } } @@ -2264,13 +2292,15 @@ mono_class_setup_methods (MonoClass *class) MonoMethod* mono_class_get_method_by_index (MonoClass *class, int index) { + MonoError error; /* Avoid calling setup_methods () if possible */ if (class->generic_class && !class->methods) { MonoClass *gklass = class->generic_class->container_class; MonoMethod *m; - m = mono_class_inflate_generic_method_full ( - gklass->methods [index], class, mono_class_get_context (class)); + m = mono_class_inflate_generic_method_full_checked ( + gklass->methods [index], class, mono_class_get_context (class), &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ /* * If setup_methods () is called later for this class, no duplicates are created, * since inflate_generic_method guarantees that only one instance of a method @@ -2309,10 +2339,14 @@ mono_class_get_inflated_method (MonoClass *class, MonoMethod *method) for (i = 0; i < gklass->method.count; ++i) { if (gklass->methods [i] == method) { - if (class->methods) + if (class->methods) { return class->methods [i]; - else - return mono_class_inflate_generic_method_full (gklass->methods [i], class, mono_class_get_context (class)); + } else { + MonoError error; + MonoMethod *result = mono_class_inflate_generic_method_full_checked (gklass->methods [i], class, mono_class_get_context (class), &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow this error */ + return result; + } } } @@ -2341,11 +2375,13 @@ mono_class_get_vtable_entry (MonoClass *class, int offset) } if (class->generic_class) { + MonoError error; MonoClass *gklass = class->generic_class->container_class; mono_class_setup_vtable (gklass); m = gklass->vtable [offset]; - m = mono_class_inflate_generic_method_full (m, class, mono_class_get_context (class)); + m = mono_class_inflate_generic_method_full_checked (m, class, mono_class_get_context (class), &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow this error */ } else { mono_class_setup_vtable (class); if (class->exception_type) @@ -2402,17 +2438,19 @@ mono_class_setup_properties (MonoClass *class) properties = mono_class_new0 (class, MonoProperty, gklass->ext->property.count + 1); for (i = 0; i < gklass->ext->property.count; i++) { + MonoError error; MonoProperty *prop = &properties [i]; *prop = gklass->ext->properties [i]; if (prop->get) - prop->get = mono_class_inflate_generic_method_full ( - prop->get, class, mono_class_get_context (class)); + prop->get = mono_class_inflate_generic_method_full_checked ( + prop->get, class, mono_class_get_context (class), &error); if (prop->set) - prop->set = mono_class_inflate_generic_method_full ( - prop->set, class, mono_class_get_context (class)); + prop->set = mono_class_inflate_generic_method_full_checked ( + prop->set, class, mono_class_get_context (class), &error); + g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/ prop->parent = class; } @@ -2441,11 +2479,14 @@ mono_class_setup_properties (MonoClass *class) mono_metadata_decode_row (msemt, j, cols, MONO_METHOD_SEMA_SIZE); - if (class->image->uncompressed_metadata) + if (class->image->uncompressed_metadata) { + MonoError error; /* It seems like the MONO_METHOD_SEMA_METHOD column needs no remapping */ - method = mono_get_method (class->image, MONO_TOKEN_METHOD_DEF | cols [MONO_METHOD_SEMA_METHOD], class); - else + method = mono_get_method_checked (class->image, MONO_TOKEN_METHOD_DEF | cols [MONO_METHOD_SEMA_METHOD], class, NULL, &error); + mono_error_cleanup (&error); /* FIXME don't swallow this error */ + } else { method = class->methods [cols [MONO_METHOD_SEMA_METHOD] - 1 - class->method.first]; + } switch (cols [MONO_METHOD_SEMA_SEMANTICS]) { case METHOD_SEMANTIC_SETTER: @@ -2494,8 +2535,11 @@ inflate_method_listz (MonoMethod **methods, MonoClass *class, MonoGenericContext retval = g_new0 (MonoMethod*, count + 1); count = 0; - for (om = methods, count = 0; *om; ++om, ++count) - retval [count] = mono_class_inflate_generic_method_full (*om, class, context); + for (om = methods, count = 0; *om; ++om, ++count) { + MonoError error; + retval [count] = mono_class_inflate_generic_method_full_checked (*om, class, context, &error); + g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/ + } return retval; } @@ -2533,14 +2577,21 @@ mono_class_setup_events (MonoClass *class) context = mono_class_get_context (class); for (i = 0; i < count; i++) { + MonoError error; MonoEvent *event = &events [i]; MonoEvent *gevent = &gklass->ext->events [i]; + mono_error_init (&error); //since we do conditional calls, we must ensure the default value is ok + event->parent = class; event->name = gevent->name; - event->add = gevent->add ? mono_class_inflate_generic_method_full (gevent->add, class, context) : NULL; - event->remove = gevent->remove ? mono_class_inflate_generic_method_full (gevent->remove, class, context) : NULL; - event->raise = gevent->raise ? mono_class_inflate_generic_method_full (gevent->raise, class, context) : NULL; + event->add = gevent->add ? mono_class_inflate_generic_method_full_checked (gevent->add, class, context, &error) : NULL; + g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/ + event->remove = gevent->remove ? mono_class_inflate_generic_method_full_checked (gevent->remove, class, context, &error) : NULL; + g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/ + event->raise = gevent->raise ? mono_class_inflate_generic_method_full_checked (gevent->raise, class, context, &error) : NULL; + g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/ + #ifndef MONO_SMALL_CONFIG event->other = gevent->other ? inflate_method_listz (gevent->other, class, context) : NULL; #endif @@ -2573,11 +2624,14 @@ mono_class_setup_events (MonoClass *class) mono_metadata_decode_row (msemt, j, cols, MONO_METHOD_SEMA_SIZE); - if (class->image->uncompressed_metadata) + if (class->image->uncompressed_metadata) { + MonoError error; /* It seems like the MONO_METHOD_SEMA_METHOD column needs no remapping */ - method = mono_get_method (class->image, MONO_TOKEN_METHOD_DEF | cols [MONO_METHOD_SEMA_METHOD], class); - else + method = mono_get_method_checked (class->image, MONO_TOKEN_METHOD_DEF | cols [MONO_METHOD_SEMA_METHOD], class, NULL, &error); + mono_error_cleanup (&error); /* FIXME don't swallow this error */ + } else { method = class->methods [cols [MONO_METHOD_SEMA_METHOD] - 1 - class->method.first]; + } switch (cols [MONO_METHOD_SEMA_SEMANTICS]) { case METHOD_SEMANTIC_ADD_ON: @@ -4914,10 +4968,12 @@ setup_generic_array_ifaces (MonoClass *class, MonoClass *iface, MonoMethod **met //g_print ("setting up array interface: %s\n", mono_type_get_name_full (&iface->byval_arg, 0)); for (i = 0; i < generic_array_method_num; i++) { + MonoError error; MonoMethod *m = generic_array_method_info [i].array_method; MonoMethod *inflated; - inflated = mono_class_inflate_generic_method (m, &tmp_context); + inflated = mono_class_inflate_generic_method_checked (m, &tmp_context, &error); + g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/ methods [pos++] = mono_marshal_get_generic_array_helper (class, iface, generic_array_method_info [i].name, inflated); } } @@ -5251,9 +5307,6 @@ mono_class_init (MonoClass *class) mono_loader_unlock (); - if (mono_debugger_class_init_func) - mono_debugger_class_init_func (class); - return class->exception_type == MONO_EXCEPTION_NONE; } @@ -5798,8 +5851,9 @@ mono_class_create_from_typedef (MonoImage *image, guint32 type_token, MonoError if (!class->enumtype) { if (!mono_metadata_interfaces_from_typedef_full ( - image, type_token, &interfaces, &icount, FALSE, context)){ - mono_class_set_failure_from_loader_error (class, error, g_strdup ("Could not load interfaces")); + image, type_token, &interfaces, &icount, FALSE, context, error)){ + + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup (mono_error_get_message (error))); mono_loader_unlock (); mono_profiler_class_loaded (class, MONO_PROFILE_FAILED); return NULL; @@ -6118,8 +6172,11 @@ make_generic_param_class (MonoGenericParam *param, MonoImage *image, gboolean is #define FAST_CACHE_SIZE 16 +/* + * LOCKING: Takes the image lock depending on @take_lock. + */ static MonoClass * -get_anon_gparam_class (MonoGenericParam *param, gboolean is_mvar) +get_anon_gparam_class (MonoGenericParam *param, gboolean is_mvar, gboolean take_lock) { int n = mono_generic_param_num (param) | ((guint32)param->serial << 16); MonoImage *image = param->image; @@ -6133,26 +6190,33 @@ get_anon_gparam_class (MonoGenericParam *param, gboolean is_mvar) else return image->var_cache_fast ? image->var_cache_fast [n] : NULL; } else { + MonoClass *klass = NULL; ht = is_mvar ? image->mvar_cache_slow : image->var_cache_slow; - return ht ? g_hash_table_lookup (ht, GINT_TO_POINTER (n)) : NULL; + if (ht) { + if (take_lock) + mono_image_lock (image); + klass = g_hash_table_lookup (ht, GINT_TO_POINTER (n)); + if (take_lock) + mono_image_unlock (image); + } + return klass; } } /* - * LOCKING: Acquires the loader lock. + * LOCKING: Image lock (param->image) must be held */ static void set_anon_gparam_class (MonoGenericParam *param, gboolean is_mvar, MonoClass *klass) { int n = mono_generic_param_num (param) | ((guint32)param->serial << 16); MonoImage *image = param->image; - GHashTable *ht; g_assert (image); if (n < FAST_CACHE_SIZE) { if (is_mvar) { - /* No locking needed */ + /* Requires locking to avoid droping an already published class */ if (!image->mvar_cache_fast) image->mvar_cache_fast = mono_image_alloc0 (image, sizeof (MonoClass*) * FAST_CACHE_SIZE); image->mvar_cache_fast [n] = klass; @@ -6161,54 +6225,42 @@ set_anon_gparam_class (MonoGenericParam *param, gboolean is_mvar, MonoClass *kla image->var_cache_fast = mono_image_alloc0 (image, sizeof (MonoClass*) * FAST_CACHE_SIZE); image->var_cache_fast [n] = klass; } - return; - } - ht = is_mvar ? image->mvar_cache_slow : image->var_cache_slow; - if (!ht) { - mono_image_lock (image); - ht = is_mvar ? image->mvar_cache_slow : image->var_cache_slow; + } else { + GHashTable *ht = is_mvar ? image->mvar_cache_slow : image->var_cache_slow; if (!ht) { - ht = g_hash_table_new (NULL, NULL); - mono_memory_barrier (); - if (is_mvar) - image->mvar_cache_slow = ht; - else - image->var_cache_slow = ht; + ht = is_mvar ? image->mvar_cache_slow : image->var_cache_slow; + if (!ht) { + ht = g_hash_table_new (NULL, NULL); + mono_memory_barrier (); + if (is_mvar) + image->mvar_cache_slow = ht; + else + image->var_cache_slow = ht; + } } - mono_image_unlock (image); + g_hash_table_insert (ht, GINT_TO_POINTER (n), klass); } - - g_hash_table_insert (ht, GINT_TO_POINTER (n), klass); } /* - * LOCKING: Acquires the loader lock. + * LOCKING: Acquires the image lock (@image). */ MonoClass * mono_class_from_generic_parameter (MonoGenericParam *param, MonoImage *image, gboolean is_mvar) { MonoGenericContainer *container = mono_generic_param_owner (param); - MonoGenericParamInfo *pinfo; - MonoClass *klass; - - mono_loader_lock (); + MonoGenericParamInfo *pinfo = NULL; + MonoClass *klass, *klass2; if (container) { pinfo = mono_generic_param_info (param); - if (pinfo->pklass) { - mono_loader_unlock (); - return pinfo->pklass; - } + klass = pinfo->pklass; } else { - pinfo = NULL; image = NULL; - - klass = get_anon_gparam_class (param, is_mvar); - if (klass) { - mono_loader_unlock (); - return klass; - } + klass = get_anon_gparam_class (param, is_mvar, TRUE); } + if (klass) + return klass; if (!image && container) { if (is_mvar) { @@ -6226,15 +6278,30 @@ mono_class_from_generic_parameter (MonoGenericParam *param, MonoImage *image, gb mono_memory_barrier (); - if (container) - pinfo->pklass = klass; - else - set_anon_gparam_class (param, is_mvar, klass); + if (!image) //FIXME is this only needed by monodis? Can't we fix monodis instead of having this hack? + image = mono_defaults.corlib; - mono_loader_unlock (); + mono_image_lock (image); + if (container) + klass2 = pinfo->pklass; + else + klass2 = get_anon_gparam_class (param, is_mvar, FALSE); + + if (klass2) { + klass = klass2; + } else { + if (container) + pinfo->pklass = klass; + else + set_anon_gparam_class (param, is_mvar, klass); + } + mono_image_unlock (image); /* FIXME: Should this go inside 'make_generic_param_klass'? */ - mono_profiler_class_loaded (klass, MONO_PROFILE_OK); + if (klass2) + mono_profiler_class_loaded (klass2, MONO_PROFILE_FAILED); + else + mono_profiler_class_loaded (klass, MONO_PROFILE_OK); return klass; } @@ -6250,15 +6317,15 @@ mono_ptr_class_get (MonoType *type) el_class = mono_class_from_mono_type (type); image = el_class->image; - mono_loader_lock (); - - if (!image->ptr_cache) - image->ptr_cache = g_hash_table_new (mono_aligned_addr_hash, NULL); - - if ((result = g_hash_table_lookup (image->ptr_cache, el_class))) { - mono_loader_unlock (); - return result; + mono_image_lock (image); + if (image->ptr_cache) { + if ((result = g_hash_table_lookup (image->ptr_cache, el_class))) { + mono_image_unlock (image); + return result; + } } + mono_image_unlock (image); + result = mono_image_alloc0 (image, sizeof (MonoClass)); classes_size += sizeof (MonoClass); @@ -6285,9 +6352,19 @@ mono_ptr_class_get (MonoType *type) mono_class_setup_supertypes (result); + mono_image_lock (image); + if (image->ptr_cache) { + MonoClass *result2; + if ((result2 = g_hash_table_lookup (image->ptr_cache, el_class))) { + mono_image_unlock (image); + mono_profiler_class_loaded (result, MONO_PROFILE_FAILED); + return result2; + } + } else { + image->ptr_cache = g_hash_table_new (mono_aligned_addr_hash, NULL); + } g_hash_table_insert (image->ptr_cache, el_class, result); - - mono_loader_unlock (); + mono_image_unlock (image); mono_profiler_class_loaded (result, MONO_PROFILE_OK); @@ -7191,10 +7268,7 @@ mono_class_get_full (MonoImage *image, guint32 type_token, MonoGenericContext *c if (class && context && mono_metadata_token_table (type_token) == MONO_TABLE_TYPESPEC) class = mono_class_inflate_generic_class_checked (class, context, &error); - if (!class) { - mono_loader_set_error_from_mono_error (&error); - mono_error_cleanup (&error); /*FIXME don't swallow this error */ - } + g_assert (mono_error_ok (&error)); /* FIXME deprecate this function and forbit the runtime from using it. */ return class; } @@ -7609,6 +7683,7 @@ search_modules (MonoImage *image, const char *name_space, const char *name) MonoClass * mono_class_from_name (MonoImage *image, const char* name_space, const char *name) { + MonoError error; GHashTable *nspace_table; MonoImage *loaded_image; guint32 token = 0; @@ -7710,7 +7785,11 @@ mono_class_from_name (MonoImage *image, const char* name_space, const char *name token = MONO_TOKEN_TYPE_DEF | token; - class = mono_class_get (image, token); + class = mono_class_get_checked (image, token, &error); + if (!mono_error_ok (&error)) { + mono_loader_set_error_from_mono_error (&error); + mono_error_cleanup (&error); /* FIXME Don't swallow the error */ + } if (nested) return return_nested_in (class, nested); return class; @@ -8260,8 +8339,13 @@ mono_class_get_cctor (MonoClass *klass) if (!klass->has_cctor) return NULL; - if (mono_class_get_cached_class_info (klass, &cached_info)) - return mono_get_method (klass->image, cached_info.cctor_token, klass); + if (mono_class_get_cached_class_info (klass, &cached_info)) { + MonoError error; + MonoMethod *result = mono_get_method_checked (klass->image, cached_info.cctor_token, klass, NULL, &error); + if (!mono_error_ok (&error)) + g_error ("Could not lookup class cctor from cached metadata due to %s", mono_error_get_message (&error)); + return result; + } if (klass->generic_class && !klass->methods) return mono_class_get_inflated_method (klass, mono_class_get_cctor (klass->generic_class->container_class)); @@ -8285,9 +8369,13 @@ mono_class_get_finalizer (MonoClass *klass) if (!mono_class_has_finalizer (klass)) return NULL; - if (mono_class_get_cached_class_info (klass, &cached_info)) - return mono_get_method (cached_info.finalize_image, cached_info.finalize_token, NULL); - else { + if (mono_class_get_cached_class_info (klass, &cached_info)) { + MonoError error; + MonoMethod *result = mono_get_method_checked (cached_info.finalize_image, cached_info.finalize_token, NULL, NULL, &error); + if (!mono_error_ok (&error)) + g_error ("Could not lookup finalizer from cached metadata due to %s", mono_error_get_message (&error)); + return result; + }else { mono_class_setup_vtable (klass); return klass->vtable [finalize_slot]; } @@ -8391,6 +8479,18 @@ gpointer mono_ldtoken (MonoImage *image, guint32 token, MonoClass **handle_class, MonoGenericContext *context) { + MonoError error; + gpointer res = mono_ldtoken_checked (image, token, handle_class, context, &error); + g_assert (mono_error_ok (&error)); + return res; +} + +gpointer +mono_ldtoken_checked (MonoImage *image, guint32 token, MonoClass **handle_class, + MonoGenericContext *context, MonoError *error) +{ + mono_error_init (error); + if (image_is_dynamic (image)) { MonoClass *tmp_handle_class; gpointer obj = mono_lookup_dynamic_token_class (image, token, TRUE, &tmp_handle_class, context); @@ -8409,43 +8509,42 @@ mono_ldtoken (MonoImage *image, guint32 token, MonoClass **handle_class, case MONO_TOKEN_TYPE_DEF: case MONO_TOKEN_TYPE_REF: case MONO_TOKEN_TYPE_SPEC: { - MonoError error; MonoType *type; if (handle_class) *handle_class = mono_defaults.typehandle_class; - type = mono_type_get_checked (image, token, context, &error); - if (!type) { - mono_loader_set_error_from_mono_error (&error); - mono_error_cleanup (&error); /* FIXME Don't swallow the error */ + type = mono_type_get_checked (image, token, context, error); + if (!type) return NULL; - } + mono_class_init (mono_class_from_mono_type (type)); /* We return a MonoType* as handle */ return type; } case MONO_TOKEN_FIELD_DEF: { MonoClass *class; - MonoError error; guint32 type = mono_metadata_typedef_from_field (image, mono_metadata_token_index (token)); - if (!type) - return NULL; - if (handle_class) - *handle_class = mono_defaults.fieldhandle_class; - class = mono_class_get_and_inflate_typespec_checked (image, MONO_TOKEN_TYPE_DEF | type, context, &error); - if (!class) { - mono_loader_set_error_from_mono_error (&error); - mono_error_cleanup (&error); /* FIXME Don't swallow the error */ + if (!type) { + mono_error_set_bad_image (error, image, "Bad ldtoken %x", token); return NULL; } + if (handle_class) + *handle_class = mono_defaults.fieldhandle_class; + class = mono_class_get_and_inflate_typespec_checked (image, MONO_TOKEN_TYPE_DEF | type, context, error); + if (!class) + return NULL; + mono_class_init (class); return mono_class_get_field (class, token); } case MONO_TOKEN_METHOD_DEF: case MONO_TOKEN_METHOD_SPEC: { MonoMethod *meth; - meth = mono_get_method_full (image, token, NULL, context); + meth = mono_get_method_checked (image, token, NULL, context, error); if (handle_class) *handle_class = mono_defaults.methodhandle_class; + if (!meth) + return NULL; + return meth; } case MONO_TOKEN_MEMBER_REF: { @@ -8457,21 +8556,20 @@ mono_ldtoken (MonoImage *image, guint32 token, MonoClass **handle_class, if (*sig == 0x6) { /* it's a field */ MonoClass *klass; MonoClassField *field; - field = mono_field_from_token (image, token, &klass, context); + field = mono_field_from_token_checked (image, token, &klass, context, error); if (handle_class) *handle_class = mono_defaults.fieldhandle_class; return field; } else { MonoMethod *meth; - meth = mono_get_method_full (image, token, NULL, context); + meth = mono_get_method_checked (image, token, NULL, context, error); if (handle_class) *handle_class = mono_defaults.methodhandle_class; return meth; } } default: - g_warning ("Unknown token 0x%08x in ldtoken", token); - break; + mono_error_set_bad_image (error, image, "Bad ldtoken %x", token); } return NULL; } @@ -8895,7 +8993,10 @@ mono_class_get_virtual_methods (MonoClass* klass, gpointer *iter) } if (i < klass->method.count) { - res = mono_get_method (klass->image, MONO_TOKEN_METHOD_DEF | (klass->method.first + i + 1), klass); + MonoError error; + res = mono_get_method_checked (klass->image, MONO_TOKEN_METHOD_DEF | (klass->method.first + i + 1), klass, NULL, &error); + mono_error_cleanup (&error); /* FIXME don't swallow the error */ + /* Add 1 here so the if (*iter) check fails */ *iter = GUINT_TO_POINTER (i + 1); return res; @@ -9447,6 +9548,7 @@ find_method_in_metadata (MonoClass *klass, const char *name, int param_count, in /* Search directly in the metadata to avoid calling setup_methods () */ for (i = 0; i < klass->method.count; ++i) { + MonoError error; guint32 cols [MONO_METHOD_SIZE]; MonoMethod *method; MonoMethodSignature *sig; @@ -9455,13 +9557,21 @@ find_method_in_metadata (MonoClass *klass, const char *name, int param_count, in mono_metadata_decode_table_row (klass->image, MONO_TABLE_METHOD, klass->method.first + i, cols, MONO_METHOD_SIZE); if (!strcmp (mono_metadata_string_heap (klass->image, cols [MONO_METHOD_NAME]), name)) { - method = mono_get_method (klass->image, MONO_TOKEN_METHOD_DEF | (klass->method.first + i + 1), klass); + method = mono_get_method_checked (klass->image, MONO_TOKEN_METHOD_DEF | (klass->method.first + i + 1), klass, NULL, &error); + if (!method) { + mono_error_cleanup (&error); /* FIXME don't swallow the error */ + continue; + } if (param_count == -1) { res = method; break; } - sig = mono_method_signature (method); - if (sig && sig->param_count == param_count) { + sig = mono_method_signature_checked (method, &error); + if (!sig) { + mono_error_cleanup (&error); /* FIXME don't swallow the error */ + continue; + } + if (sig->param_count == param_count) { res = method; break; } @@ -9491,8 +9601,11 @@ mono_class_get_method_from_name_flags (MonoClass *klass, const char *name, int p if (klass->generic_class && !klass->methods) { res = mono_class_get_method_from_name_flags (klass->generic_class->container_class, name, param_count, flags); - if (res) - res = mono_class_inflate_generic_method_full (res, klass, mono_class_get_context (klass)); + if (res) { + MonoError error; + res = mono_class_inflate_generic_method_full_checked (res, klass, mono_class_get_context (klass), &error); + g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/ + } return res; } diff --git a/mta-mono/vendor/mono/metadata/cominterop.c b/mta-mono/vendor/mono/metadata/cominterop.c index 6b98212..cf96357 100644 --- a/mta-mono/vendor/mono/metadata/cominterop.c +++ b/mta-mono/vendor/mono/metadata/cominterop.c @@ -524,8 +524,6 @@ cominterop_type_from_handle (MonoType *handle) MonoDomain *domain = mono_domain_get (); MonoClass *klass = mono_class_from_mono_type (handle); - MONO_ARCH_SAVE_REGS; - mono_class_init (klass); return mono_type_get_object (domain, handle); } @@ -1534,8 +1532,10 @@ ves_icall_System_Runtime_InteropServices_Marshal_GetCCW (MonoObject* object, Mon g_assert (type->type); klass = mono_type_get_class (type->type); g_assert (klass); - if (!mono_class_init (klass)) - mono_raise_exception (mono_class_get_exception_for_failure (klass)); + if (!mono_class_init (klass)) { + mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); + return NULL; + } itf = cominterop_get_ccw (object, klass); g_assert (itf); @@ -1588,8 +1588,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_ReleaseComObjectInternal (MonoO guint32 ves_icall_System_Runtime_InteropServices_Marshal_GetComSlotForMethodInfoInternal (MonoReflectionMethod *m) { - MONO_ARCH_SAVE_REGS; - #ifndef DISABLE_COM return cominterop_get_com_slot_for_method (m->method); #else @@ -1605,8 +1603,6 @@ ves_icall_System_ComObject_CreateRCW (MonoReflectionType *type) MonoDomain *domain; MonoObject *obj; - MONO_ARCH_SAVE_REGS; - domain = mono_object_domain (type); klass = mono_class_from_mono_type (type->type); @@ -1693,8 +1689,10 @@ ves_icall_System_ComObject_GetInterfaceInternal (MonoComObject* obj, MonoReflect { #ifndef DISABLE_COM MonoClass *class = mono_type_get_class (type->type); - if (!mono_class_init (class)) - mono_raise_exception (mono_class_get_exception_for_failure (class)); + if (!mono_class_init (class)) { + mono_set_pending_exception (mono_class_get_exception_for_failure (class)); + return NULL; + } return cominterop_get_interface (obj, class, (gboolean)throw_exception); #else @@ -2097,13 +2095,14 @@ mono_marshal_free_ccw (MonoObject* object) g_free (ccw_iter); } else - ccw_list_item = g_list_next(ccw_list_item); + ccw_list_item = g_list_next (ccw_list_item); } /* if list is empty remove original address from hash */ if (g_list_length (ccw_list) == 0) g_hash_table_remove (ccw_hash, GINT_TO_POINTER (mono_object_hash (object))); - + else if (ccw_list != ccw_list_orig) + g_hash_table_insert (ccw_hash, GINT_TO_POINTER (mono_object_hash (object)), ccw_list); return TRUE; } @@ -3308,23 +3307,17 @@ ves_icall_System_Runtime_InteropServices_Marshal_QueryInterfaceInternal (gpointe MonoString * ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringBSTR (gpointer ptr) { - MONO_ARCH_SAVE_REGS; - return mono_string_from_bstr(ptr); } gpointer ves_icall_System_Runtime_InteropServices_Marshal_StringToBSTR (MonoString* ptr) { - MONO_ARCH_SAVE_REGS; - return mono_string_to_bstr(ptr); } void ves_icall_System_Runtime_InteropServices_Marshal_FreeBSTR (gpointer ptr) { - MONO_ARCH_SAVE_REGS; - mono_free_bstr (ptr); } diff --git a/mta-mono/vendor/mono/metadata/console-null.c b/mta-mono/vendor/mono/metadata/console-null.c index a2e1486..46554d2 100644 --- a/mta-mono/vendor/mono/metadata/console-null.c +++ b/mta-mono/vendor/mono/metadata/console-null.c @@ -29,8 +29,6 @@ mono_console_handle_async_ops (void) MonoBoolean ves_icall_System_ConsoleDriver_Isatty (HANDLE handle) { - MONO_ARCH_SAVE_REGS; - return (GetFileType (handle) == FILE_TYPE_CHAR); } diff --git a/mta-mono/vendor/mono/metadata/console-unix.c b/mta-mono/vendor/mono/metadata/console-unix.c index 1de9a00..6803eaf 100644 --- a/mta-mono/vendor/mono/metadata/console-unix.c +++ b/mta-mono/vendor/mono/metadata/console-unix.c @@ -94,8 +94,6 @@ static struct termios initial_attr; MonoBoolean ves_icall_System_ConsoleDriver_Isatty (HANDLE handle) { - MONO_ARCH_SAVE_REGS; - return isatty (GPOINTER_TO_INT (handle)); } @@ -106,8 +104,6 @@ set_property (gint property, gboolean value) gboolean callset = FALSE; gboolean check; - MONO_ARCH_SAVE_REGS; - if (tcgetattr (STDIN_FILENO, &attr) == -1) return FALSE; @@ -152,8 +148,6 @@ ves_icall_System_ConsoleDriver_InternalKeyAvailable (gint32 timeout) div_t divvy; int ret, nbytes; - MONO_ARCH_SAVE_REGS; - do { FD_ZERO (&rfds); FD_SET (STDIN_FILENO, &rfds); @@ -208,8 +202,6 @@ tty_teardown (void) { int unused; - MONO_ARCH_SAVE_REGS; - if (!setup_finished) return; @@ -281,7 +273,6 @@ static gboolean in_sigint; MONO_SIG_HANDLER_FUNC (static, sigint_handler) { int save_errno; - MONO_ARCH_SAVE_REGS; if (in_sigint) return; @@ -449,8 +440,6 @@ ves_icall_System_ConsoleDriver_TtySetup (MonoString *keypad, MonoString *teardow { int dims; - MONO_ARCH_SAVE_REGS; - dims = terminal_get_dimensions (); if (dims == -1){ int cols = 0, rows = 0; diff --git a/mta-mono/vendor/mono/metadata/console-win32.c b/mta-mono/vendor/mono/metadata/console-win32.c index 15efa5a..2e751e1 100644 --- a/mta-mono/vendor/mono/metadata/console-win32.c +++ b/mta-mono/vendor/mono/metadata/console-win32.c @@ -46,8 +46,6 @@ ves_icall_System_ConsoleDriver_Isatty (HANDLE handle) { DWORD mode; - MONO_ARCH_SAVE_REGS; - return GetConsoleMode (handle, &mode) != 0; } diff --git a/mta-mono/vendor/mono/metadata/culture-info-tables.h b/mta-mono/vendor/mono/metadata/culture-info-tables.h index bdbeb1d..9bcbade 100644 --- a/mta-mono/vendor/mono/metadata/culture-info-tables.h +++ b/mta-mono/vendor/mono/metadata/culture-info-tables.h @@ -9,1394 +9,1389 @@ static const DateTimeFormatEntry datetime_format_entries [] = { - {1, 14, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{1,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {289, 308, 323, 331, 336, 352, 359, 370, {381, 394, 415, 430, 441, 460, 471}, {484, 489, 494, 499, 504, 509, 514}, {519, 522, 525, 528, 531, 522, 528}, {534, 547, 564, 573, 584, 591, 598, 605, 618, 637, 654, 669, 0}, {534, 547, 564, 573, 584, 591, 598, 605, 618, 637, 654, 669, 0}, {686, 692, 564, 702, 584, 591, 598, 710, 718, 728, 736, 746, 0}, {686, 692, 564, 702, 584, 591, 598, 710, 718, 728, 736, 746, 0}, 2, 1, 754, 241, {308,756,772,788,0,0,0,0,0,0,0,0,0,0},{289,805,823,848,0,0,0,0},{872,884,0,0,0,0,0,0,0,0,0,0},{895,910,0,0,0,0,0,0,0}}, - {924, 243, 323, 331, 947, 352, 962, 968, {974, 983, 991, 999, 1008, 1015, 1025}, {1034, 1038, 1042, 1046, 1050, 1054, 1058}, {1062, 1065, 1068, 1071, 1074, 1077, 1080}, {1083, 1089, 1096, 1102, 1108, 1113, 1118, 1125, 1131, 1140, 1148, 1157, 0}, {1083, 1089, 1096, 1102, 1108, 1113, 1118, 1125, 1131, 1140, 1148, 1157, 0}, {1166, 1171, 1096, 1176, 1108, 1113, 1181, 1186, 1190, 1195, 1200, 1205, 0}, {1166, 1171, 1096, 1176, 1108, 1113, 1181, 1186, 1190, 1195, 1200, 1205, 0}, 2, 1, 239, 241, {243,14,1210,1221,1229,1236,1245,0,0,0,0,0,0,0},{1254,1280,1296,0,0,0,0,0},{274,331,1312,0,0,0,0,0,0,0,0,0},{280,323,1324,0,0,0,0,0,0}}, - {1344, 1366, 323, 331, 1375, 1391, 1404, 1411, {1418, 1428, 1438, 1448, 1458, 1468, 1478}, {1488, 1495, 1502, 1509, 1516, 1523, 1530}, {1537, 1541, 1545, 1549, 1553, 1557, 1561}, {1565, 1572, 1579, 1586, 1593, 1600, 1607, 1614, 1621, 1628, 1635, 1645, 0}, {1565, 1572, 1579, 1586, 1593, 1600, 1607, 1614, 1621, 1628, 1635, 1645, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, 0, 0, 239, 241, {1366,1718,1727,1210,1736,1747,1758,1765,1772,1779,0,0,0,0},{1344,1788,1815,0,0,0,0,0},{331,274,1842,1850,0,0,0,0,0,0,0,0},{323,280,1859,1870,0,0,0,0,0}}, - {1344, 1366, 323, 331, 1375, 1391, 1404, 1411, {1418, 1428, 1438, 1448, 1458, 1468, 1478}, {1488, 1495, 1502, 1509, 1516, 1523, 1530}, {1537, 1541, 1545, 1549, 1553, 1557, 1561}, {1565, 1572, 1579, 1586, 1593, 1600, 1607, 1614, 1621, 1628, 1635, 1645, 0}, {1565, 1572, 1579, 1586, 1593, 1600, 1607, 1614, 1621, 1628, 1635, 1645, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, 0, 0, 239, 241, {1366,1718,1727,1210,1736,1747,1758,1765,1772,1779,0,0,0,0},{1344,1788,1815,0,0,0,0,0},{331,274,1842,1850,0,0,0,0,0,0,0,0},{323,280,1859,1870,0,0,0,0,0}}, - {1882, 1895, 323, 331, 1906, 1916, 1924, 1927, {1930, 1938, 1948, 1956, 1964, 1973, 1980}, {1987, 1990, 1993, 1997, 2000, 2004, 2008}, {2011, 2013, 2015, 2018, 2020, 2013, 2018}, {2023, 2029, 2035, 2043, 2049, 2057, 2065, 2075, 2081, 2089, 2097, 2106, 0}, {2115, 2121, 2128, 2136, 2142, 2150, 2158, 2168, 2081, 2174, 2182, 2192, 0}, {2201, 2205, 2210, 2215, 2219, 2224, 2229, 2234, 2238, 2244, 2250, 2254, 0}, {2201, 2205, 2210, 2215, 2219, 2224, 2229, 2234, 2238, 2244, 2250, 2254, 0}, 2, 1, 2258, 241, {2261,2270,1210,1718,1758,0,0,0,0,0,0,0,0,0},{1882,0,0,0,0,0,0,0},{331,274,2277,2285,0,0,0,0,0,0,0,0},{323,280,2290,2301,0,0,0,0,0}}, - {1882, 2309, 280, 274, 1906, 1916, 1924, 1927, {2320, 2328, 2335, 2343, 2350, 2358, 2365}, {2373, 2378, 2382, 2386, 2390, 2394, 2398}, {2018, 2403, 2405, 2407, 2405, 2409, 2411}, {2413, 2420, 2428, 2434, 2440, 2444, 2449, 2454, 2461, 2471, 2479, 2488, 0}, {2413, 2420, 2428, 2434, 2440, 2444, 2449, 2454, 2461, 2471, 2479, 2488, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, 2, 1, 2541, 241, {2309,1236,1210,2543,0,0,0,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {2568, 2587, 280, 274, 1906, 1916, 2598, 2604, {2611, 2619, 2626, 2635, 2644, 2655, 2663}, {2671, 2674, 2677, 2680, 2683, 2686, 2689}, {2018, 2403, 2692, 2403, 2692, 2409, 2018}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, 2, 1, 754, 241, {2587,2823,1245,2835,2843,2261,1210,0,0,0,0,0,0,0},{2568,1882,2850,0,0,0,0,0},{274,331,2285,2862,0,0,0,0,0,0,0,0},{280,2873,2887,2902,0,0,0,0,0}}, - {2909, 2927, 2936, 2947, 1906, 352, 2955, 2962, {2969, 2984, 2999, 3010, 3025, 3038, 3057}, {3072, 3079, 3086, 3093, 3100, 3107, 3114}, {3121, 3124, 3127, 3127, 3130, 3130, 3133}, {3136, 3157, 3180, 3195, 3212, 3223, 3238, 3253, 3272, 3295, 3314, 3333, 0}, {3354, 3375, 3398, 3413, 3430, 3441, 3456, 3471, 3490, 3513, 3532, 3551, 0}, {3572, 3579, 3586, 3593, 3600, 3607, 3616, 3625, 3632, 3639, 3646, 3653, 0}, {3572, 3579, 3586, 3593, 3600, 3607, 3616, 3625, 3632, 3639, 3646, 3653, 0}, 2, 1, 239, 241, {2927,243,1229,14,3660,1210,0,0,0,0,0,0,0,0},{2909,3672,0,0,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {3684, 3703, 2936, 2947, 1906, 3712, 1924, 1927, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {3957, 243, 323, 331, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 1, 239, 241, {243,14,1221,1229,1236,1245,1210,2823,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{331,274,1312,0,0,0,0,0,0,0,0,0},{323,280,1324,0,0,0,0,0,0}}, - {1882, 2261, 323, 331, 1906, 4391, 4401, 4405, {4409, 4421, 4433, 4443, 4457, 4467, 4479}, {4490, 4493, 4496, 4499, 4502, 4505, 4508}, {2018, 2403, 2405, 4511, 2405, 2013, 2411}, {4513, 4522, 4531, 4541, 4550, 4559, 4568, 4578, 4585, 4593, 4601, 4611, 0}, {4620, 4631, 4642, 4654, 4665, 4676, 4687, 4699, 4708, 4718, 4728, 4740, 0}, {4751, 4757, 4763, 4770, 4776, 4782, 4788, 4795, 4799, 4804, 4809, 4816, 0}, {4751, 4757, 4763, 4770, 4776, 4782, 4788, 4795, 4799, 4804, 4809, 4816, 0}, 2, 1, 754, 241, {2261,2587,2843,1210,0,0,0,0,0,0,0,0,0,0},{4822,4839,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {4857, 243, 280, 274, 1906, 352, 1924, 1927, {4874, 4883, 4889, 4895, 4904, 4910, 4919}, {4926, 4931, 4936, 4941, 4946, 4951, 4956}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, 0, 1, 239, 241, {243,14,1245,1236,1210,0,0,0,0,0,0,0,0,0},{4857,5076,3672,0,0,0,0,0},{274,331,5085,5091,5101,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {5109, 243, 280, 274, 1906, 55, 5127, 5140, {5151, 5169, 5183, 5201, 5219, 5237, 5253}, {5267, 5279, 5291, 5303, 5315, 5327, 5339}, {5346, 5351, 5356, 5361, 5366, 5371, 5376}, {5381, 5392, 5405, 5412, 5423, 5430, 5439, 5448, 5461, 5474, 5489, 5502, 0}, {5381, 5392, 5405, 5412, 5423, 5430, 5439, 5448, 5461, 5474, 5489, 5502, 0}, {5513, 5522, 5405, 5531, 5423, 5540, 5549, 5558, 5567, 5576, 5585, 5594, 0}, {5513, 5522, 5405, 5531, 5423, 5540, 5549, 5558, 5567, 5576, 5585, 5594, 0}, 0, 0, 239, 241, {243,5603,14,1,1236,2309,5616,1210,5629,5646,0,0,0,0},{5109,5603,5656,5678,5629,0,0,0},{274,35,0,0,0,0,0,0,0,0,0,0},{280,23,0,0,0,0,0,0,0}}, - {5699, 5713, 323, 331, 5725, 5736, 5744, 5748, {5752, 5762, 5770, 5775, 5782, 5795, 5803}, {4091, 5811, 4511, 5813, 5817, 2013, 5820}, {4091, 5811, 4511, 5824, 5817, 2013, 5824}, {5827, 5835, 5844, 5853, 5862, 5869, 5877, 5885, 5895, 5906, 2479, 2488, 0}, {5827, 5835, 5844, 5853, 5862, 5869, 5877, 5885, 5895, 5906, 2479, 2488, 0}, {5915, 5920, 5926, 5933, 5939, 5945, 5951, 5957, 5962, 5969, 1200, 5974, 0}, {5915, 5920, 5926, 5933, 5939, 5945, 5951, 5957, 5962, 5969, 1200, 5974, 0}, 2, 1, 754, 241, {5713,5979,1210,5993,0,0,0,0,0,0,0,0,0,0},{5699,0,0,0,0,0,0,0},{331,274,2947,0,0,0,0,0,0,0,0,0},{323,280,2936,0,0,0,0,0,0}}, - {1882, 2261, 280, 274, 1906, 1916, 6002, 6007, {6012, 6023, 6034, 6048, 6062, 6074, 6086}, {6098, 6103, 6109, 6115, 6121, 6126, 6132}, {2018, 2403, 6137, 2403, 2409, 2409, 2411}, {6140, 6148, 4978, 6157, 6164, 6169, 6176, 6183, 2461, 5906, 6191, 6201, 0}, {6140, 6148, 4978, 6157, 6164, 6169, 6176, 6183, 2461, 5906, 6191, 6201, 0}, {5915, 1171, 4936, 6210, 6164, 5945, 5951, 6215, 6222, 5969, 6227, 1205, 0}, {5915, 1171, 4936, 6210, 6164, 5945, 5951, 6215, 6222, 5969, 6227, 1205, 0}, 2, 1, 754, 241, {2261,1245,6233,6245,1210,6259,0,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {4857, 243, 280, 274, 1906, 352, 1924, 1927, {6268, 6277, 6285, 6294, 6305, 6314, 6323}, {6330, 6334, 2505, 6338, 6342, 6346, 6350}, {2692, 2411, 2403, 2403, 6354, 4091, 2018}, {6356, 6364, 4107, 6373, 6380, 6387, 6394, 4136, 6401, 6411, 6419, 6428, 0}, {6437, 6445, 4196, 6454, 6461, 6468, 6475, 4219, 6482, 6492, 1148, 6500, 0}, {6509, 2501, 2505, 2509, 6513, 6517, 6521, 6525, 6529, 6533, 2533, 6537, 0}, {6509, 2501, 2505, 2509, 6513, 6517, 6521, 6525, 6529, 6533, 2533, 6537, 0}, 2, 1, 239, 241, {243,3660,14,6541,1229,1210,0,0,0,0,0,0,0,0},{4857,6549,3672,0,0,0,0,0},{274,331,2285,5085,0,0,0,0,0,0,0,0},{280,2301,6558,0,0,0,0,0,0}}, - {1344, 1736, 323, 331, 1375, 1391, 6567, 6574, {6581, 6591, 6601, 6611, 6621, 6631, 6641}, {1537, 6651, 6655, 6659, 6663, 6667, 6671}, {1537, 6651, 6655, 6659, 6663, 6667, 6671}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 0, 239, 241, {1736,1779,1765,1366,6702,6721,6738,1210,0,0,0,0,0,0},{1344,6759,6783,6810,0,0,0,0},{331,274,1842,1850,0,0,0,0,0,0,0,0},{323,280,1859,1870,0,0,0,0,0}}, - {6839, 1210, 1859, 1842, 6868, 6885, 6899, 6906, {6913, 6923, 6933, 6943, 6953, 6963, 6973}, {6983, 6987, 6991, 6995, 6999, 7003, 7007}, {6983, 6987, 6991, 6995, 6999, 7003, 7007}, {7011, 7016, 7021, 7026, 7031, 7036, 7041, 7046, 7051, 7056, 7062, 7068, 0}, {7011, 7016, 7021, 7026, 7031, 7036, 7041, 7046, 7051, 7056, 7062, 7068, 0}, {7011, 7016, 7021, 7026, 7031, 7036, 7041, 7046, 7051, 7056, 7062, 7068, 0}, {7011, 7016, 7021, 7026, 7031, 7036, 7041, 7046, 7051, 7056, 7062, 7068, 0}, 0, 0, 2541, 241, {1210,5993,1758,1718,0,0,0,0,0,0,0,0,0,0},{6839,7074,7098,7125,7147,7178,0,0},{1842,1850,331,274,0,0,0,0,0,0,0,0},{1859,1870,323,280,0,0,0,0,0}}, - {4857, 7204, 280, 274, 1906, 352, 7213, 7218, {7223, 7230, 7238, 7246, 7255, 7265, 7273}, {7282, 4493, 7285, 7288, 7291, 7294, 7297}, {7300, 2403, 2692, 3804, 2692, 4091, 7300}, {7302, 7310, 7319, 2434, 7325, 2444, 2449, 7329, 2461, 2471, 2479, 2488, 0}, {7302, 7310, 7319, 2434, 7325, 2444, 2449, 7329, 2461, 2471, 2479, 2488, 0}, {2497, 2501, 7338, 2509, 7325, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 7338, 2509, 7325, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, 2, 1, 2541, 241, {7204,2270,1236,14,1245,2823,1210,0,0,0,0,0,0,0},{4857,6549,3672,5076,0,0,0,0},{331,274,2285,7342,7354,0,0,0,0,0,0,0},{323,280,7366,7381,0,0,0,0,0}}, - {1882, 2587, 280, 274, 1906, 1916, 7213, 7218, {2320, 2328, 2335, 2343, 2350, 2358, 2365}, {7396, 7401, 7405, 7409, 7413, 7417, 7421}, {2018, 2403, 2405, 2407, 2405, 2409, 2411}, {2413, 2420, 4978, 2434, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2413, 2420, 4978, 2434, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, 0, 0, 754, 241, {2587,1245,2843,1210,2823,0,0,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{274,331,7430,5085,0,0,0,0,0,0,0,0},{280,323,7441,6558,0,0,0,0,0}}, - {3672, 1210, 280, 274, 1906, 352, 1924, 1927, {7455, 7465, 7479, 7486, 7493, 7502, 1980}, {7510, 7517, 7522, 7526, 7531, 7536, 7540}, {2011, 2013, 3804, 7545, 7548, 2013, 2018}, {7550, 7559, 7564, 7571, 2440, 7581, 7590, 7597, 7607, 7617, 2097, 7630, 0}, {7640, 7649, 7656, 7662, 7671, 7676, 7684, 7690, 7699, 7709, 7723, 7733, 0}, {7741, 7745, 2505, 7749, 2440, 7753, 7757, 7761, 7765, 7769, 2250, 7774, 0}, {7741, 7745, 2505, 7749, 2440, 7753, 7757, 7761, 7765, 7769, 2250, 7774, 0}, 2, 1, 2541, 241, {1210,5993,0,0,0,0,0,0,0,0,0,0,0,0},{3672,5603,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {3957, 243, 280, 274, 947, 3985, 1924, 1927, {3997, 7778, 7792, 7805, 7818, 7831, 4044}, {6330, 7843, 7847, 7851, 7855, 7859, 7863}, {2692, 2018, 2405, 7868, 7868, 2018, 2018}, {7870, 7878, 7888, 1102, 7895, 7900, 7906, 4219, 7912, 7921, 7929, 7938, 0}, {7870, 7878, 7888, 1102, 7895, 7900, 7906, 4219, 7912, 7921, 7929, 7938, 0}, {2497, 7947, 2505, 7951, 4989, 2513, 2517, 6525, 6529, 7955, 2533, 7959, 0}, {2497, 7947, 2505, 7951, 4989, 2513, 2517, 6525, 6529, 7955, 2533, 7959, 0}, 0, 0, 239, 241, {243,14,2927,1229,1236,2309,2270,7204,1245,2587,2823,2843,2261,1210},{3957,4369,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {7963, 2309, 280, 274, 1906, 352, 7992, 7995, {7998, 8007, 4889, 8017, 8025, 8033, 8042}, {8048, 8051, 4493, 8055, 8058, 8062, 2008}, {2692, 6354, 2403, 2403, 6354, 4091, 2018}, {8065, 8073, 4978, 8080, 8087, 8092, 8102, 8110, 8116, 8126, 2479, 2488, 0}, {8065, 8073, 4978, 8080, 8087, 8092, 8102, 8110, 8116, 8126, 2479, 2488, 0}, {8134, 8141, 4978, 5053, 8087, 8147, 8154, 8110, 8159, 1195, 1200, 5974, 0}, {8134, 8141, 4978, 5053, 8087, 8147, 8154, 8110, 8159, 1195, 1200, 5974, 0}, 2, 1, 2541, 241, {243,14,1221,8165,1229,243,1210,0,0,0,0,0,0,0},{2909,3672,5076,0,0,0,0,0},{274,331,8173,8185,8196,8204,8214,8223,2862,8229,8237,8242},{280,323,8245,8260,2887,2873,8274,8287,2902}}, - {3672, 2587, 323, 331, 1906, 352, 7213, 7218, {8299, 8309, 8314, 8321, 8330, 8334, 8341}, {8352, 8356, 3860, 8360, 8364, 8368, 8372}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {8377, 8386, 8396, 8403, 4989, 8411, 8417, 2454, 8423, 8434, 8444, 8454, 0}, {8377, 8386, 8396, 8403, 4989, 8411, 8417, 2454, 8423, 8434, 8444, 8454, 0}, {8464, 1171, 4936, 6210, 4989, 8469, 8474, 5957, 5064, 1195, 1200, 5974, 0}, {8464, 1171, 4936, 6210, 4989, 8469, 8474, 5957, 5064, 1195, 1200, 5974, 0}, 0, 1, 754, 241, {2587,2261,1210,0,0,0,0,0,0,0,0,0,0,0},{3672,0,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {805, 2587, 323, 331, 1906, 352, 8479, 8499, {8525, 8548, 415, 8571, 8582, 8597, 8612}, {8627, 8632, 8637, 8642, 8647, 8652, 8657}, {8662, 8665, 8662, 8668, 8671, 8665, 8668}, {8674, 8687, 8702, 8711, 8724, 8731, 8740, 8749, 8762, 8779, 8794, 8807, 0}, {8822, 8835, 8850, 8861, 8874, 8881, 8890, 8899, 8914, 8931, 8946, 8959, 0}, {8974, 8982, 8702, 8992, 8724, 8731, 8740, 9000, 9008, 9018, 9026, 9036, 0}, {8974, 8982, 8702, 8992, 8724, 8731, 8740, 9000, 9008, 9018, 9026, 9036, 0}, 0, 1, 754, 241, {2587,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{805,289,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {9044, 9058, 323, 331, 44, 1916, 1924, 1927, {9068, 9077, 9089, 9096, 9104, 9114, 9120}, {9127, 9131, 9135, 9139, 9143, 9148, 9152}, {9156, 9158, 9160, 9162, 9164, 9158, 9162}, {9167, 9177, 9186, 9194, 9202, 9210, 9217, 9224, 9232, 2097, 9238, 9246, 0}, {9255, 9265, 9274, 9282, 9290, 9298, 9305, 9312, 9321, 7723, 9327, 9337, 0}, {9346, 9350, 9355, 9360, 9364, 7757, 2234, 9368, 9372, 2250, 9376, 2254, 0}, {9346, 9350, 9355, 9360, 9364, 7757, 2234, 9368, 9372, 2250, 9376, 2254, 0}, 0, 1, 754, 241, {9058,9380,6233,9388,9400,9410,9420,1210,0,0,0,0,0,0},{9044,9432,9447,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1882, 2261, 323, 331, 1906, 1916, 1924, 1927, {9467, 9475, 9484, 9491, 9498, 9507, 1980}, {1987, 1990, 9514, 1997, 9517, 9521, 2008}, {2011, 2013, 9524, 2018, 9526, 2013, 2018}, {5827, 5835, 9529, 6157, 9535, 9540, 9545, 2454, 2461, 5906, 2479, 2488, 0}, {9550, 9559, 7656, 9569, 9577, 9583, 9589, 9595, 9603, 9613, 9622, 9631, 0}, {2497, 2501, 2505, 2509, 9535, 9540, 9545, 2521, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 9535, 9540, 9545, 2521, 2525, 2529, 2533, 2537, 0}, 2, 1, 754, 241, {1895,2261,9640,2843,2587,1245,1210,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{331,274,2285,0,0,0,0,0,0,0,0,0},{323,280,2301,0,0,0,0,0,0}}, - {2909, 2261, 280, 274, 1906, 352, 9649, 9658, {9666, 9673, 9682, 9691, 9703, 9711, 9720}, {9730, 9734, 3860, 9739, 9744, 9748, 9752}, {2692, 5811, 2403, 2403, 9756, 2013, 2018}, {9758, 9764, 4978, 9771, 2440, 9777, 9785, 9792, 9798, 9806, 9812, 9820, 0}, {9758, 9764, 4978, 9771, 2440, 9777, 9785, 9792, 9798, 9806, 9812, 9820, 0}, {2778, 9828, 3860, 9832, 9836, 9840, 9844, 9848, 9752, 9852, 9856, 9861, 0}, {2778, 9828, 3860, 9832, 9836, 9840, 9844, 9848, 9752, 9852, 9856, 9861, 0}, 0, 1, 754, 241, {1210,5993,0,0,0,0,0,0,0,0,0,0,0,0},{1210,0,0,0,0,0,0,0},{9865,274,0,0,0,0,0,0,0,0,0,0},{9873,280,0,0,0,0,0,0,0}}, - {9884, 1210, 280, 274, 1906, 9902, 9915, 9918, {9921, 9929, 9937, 2343, 2350, 2358, 9944}, {9952, 9957, 9962, 9966, 9970, 9974, 9978}, {2018, 2403, 2405, 2407, 2405, 2409, 2411}, {9983, 9991, 10000, 2715, 9836, 2725, 2730, 10005, 2742, 2752, 2760, 3851, 0}, {7302, 7310, 4978, 2434, 2440, 2444, 2449, 10013, 2461, 2471, 2479, 2488, 0}, {2778, 2782, 3860, 2791, 9836, 2795, 2799, 2803, 2807, 2811, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 9836, 2795, 2799, 2803, 2807, 2811, 2815, 3868, 0}, 2, 1, 2541, 241, {1210,5993,0,0,0,0,0,0,0,0,0,0,0,0},{9884,10021,0,0,0,0,0,0},{274,331,10044,0,0,0,0,0,0,0,0,0},{280,323,10054,0,0,0,0,0,0}}, - {3672, 2927, 323, 331, 1906, 352, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 0, 239, 241, {2927,1229,14,243,10067,10078,1210,0,0,0,0,0,0,0},{3672,10090,10106,0,0,0,0,0},{331,274,2947,35,0,0,0,0,0,0,0,0},{323,280,2936,23,0,0,0,0,0}}, - {10148, 2261, 280, 274, 1906, 352, 10165, 10170, {10174, 10180, 10190, 10196, 10207, 10217, 10222}, {10232, 10236, 10240, 10244, 10249, 10253, 10257}, {2013, 2013, 2018, 10261, 2013, 7548, 7548}, {10264, 10269, 10276, 10281, 10287, 10294, 10302, 10309, 10318, 10325, 10330, 10337, 0}, {10264, 10269, 10276, 10281, 10287, 10294, 10302, 10309, 10318, 10325, 10330, 10337, 0}, {10345, 10349, 3860, 10354, 3829, 10358, 10362, 10366, 10371, 10375, 10379, 10383, 0}, {10345, 10349, 3860, 10354, 3829, 10358, 10362, 10366, 10371, 10375, 10379, 10383, 0}, 0, 1, 754, 241, {2587,1245,1210,0,0,0,0,0,0,0,0,0,0,0},{10387,5603,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {3943, 243, 2936, 2947, 44, 55, 10405, 10423, {10441, 10452, 10465, 10474, 10481, 10494, 10503}, {10441, 10452, 10465, 10474, 10481, 10494, 10503}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {10512, 10523, 10534, 10543, 10554, 10561, 10568, 10581, 10590, 10601, 10614, 10625, 0}, {10512, 10523, 10534, 10543, 10554, 10561, 10568, 10581, 10590, 10601, 10614, 10625, 0}, {10512, 10523, 10534, 10543, 10554, 10561, 10568, 10581, 10590, 10601, 10614, 10625, 0}, {10512, 10523, 10534, 10543, 10554, 10561, 10568, 10581, 10590, 10601, 10614, 10625, 0}, 0, 0, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {5603, 243, 323, 331, 1906, 55, 1924, 1927, {10636, 10643, 10649, 10656, 10661, 10667, 10673}, {10679, 10683, 10687, 10691, 10695, 10699, 10703}, {2403, 2018, 2018, 10707, 4511, 4089, 2018}, {9983, 9991, 10709, 2715, 10715, 2725, 2730, 10719, 2742, 2752, 2760, 10727, 0}, {9983, 9991, 10709, 2715, 10715, 2725, 2730, 10719, 2742, 2752, 2760, 10727, 0}, {2778, 2782, 3860, 2791, 10715, 2795, 2799, 10736, 2807, 2811, 2815, 10740, 0}, {2778, 2782, 3860, 2791, 10715, 2795, 2799, 10736, 2807, 2811, 2815, 10740, 0}, 0, 0, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {10744, 2587, 323, 331, 10762, 352, 10778, 10783, {10788, 10801, 10820, 10837, 10850, 10863, 10880}, {10893, 8632, 8637, 8642, 8647, 8652, 8657}, {10898, 8665, 8662, 8668, 8671, 8665, 8668}, {10901, 10914, 10925, 10942, 10957, 10972, 10987, 11000, 11015, 11032, 11047, 11064, 0}, {11079, 11090, 11103, 11118, 11131, 11144, 11157, 11168, 11181, 11196, 11209, 11228, 0}, {11241, 11248, 11255, 11262, 11269, 11276, 11283, 11290, 11297, 11304, 11311, 11318, 0}, {11241, 11248, 11255, 11262, 11269, 11276, 11283, 11290, 11297, 11304, 11311, 11318, 0}, 0, 1, 754, 241, {2587,1245,1210,0,0,0,0,0,0,0,0,0,0,0},{10744,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3672, 1245, 280, 274, 1906, 352, 11325, 11338, {11351, 11366, 11387, 11402, 11415, 11428, 10880}, {484, 489, 11443, 499, 11448, 509, 514}, {519, 522, 11453, 528, 531, 522, 528}, {11456, 11473, 11482, 11497, 584, 11514, 11529, 11542, 11557, 11574, 11595, 11612, 0}, {11627, 11644, 11657, 11674, 8874, 11693, 11708, 11721, 11734, 11749, 11772, 11791, 0}, {11804, 11811, 11818, 11825, 584, 11832, 11839, 11846, 11853, 11860, 11867, 11874, 0}, {11804, 11811, 11818, 11825, 584, 11832, 11839, 11846, 11853, 11860, 11867, 11874, 0}, 0, 0, 754, 241, {2587,1245,1210,0,0,0,0,0,0,0,0,0,0,0},{3672,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1882, 2261, 323, 331, 1906, 1916, 11881, 11886, {11891, 11899, 11910, 11916, 11922, 11931, 1980}, {9127, 9131, 2390, 11937, 9143, 9148, 11941}, {9156, 9158, 11945, 9162, 9164, 9158, 9162}, {2413, 2420, 9529, 2434, 2440, 11947, 11953, 11959, 2461, 2471, 2479, 2488, 0}, {2413, 2420, 9529, 2434, 2440, 11947, 11953, 11959, 2461, 2471, 2479, 2488, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1882, 11981, 323, 331, 1906, 11991, 12000, 12005, {12010, 12021, 12032, 12043, 12054, 12065, 12071}, {2013, 9756, 2405, 4511, 2011, 10707, 2411}, {2013, 9756, 2405, 4511, 2011, 10707, 2411}, {12080, 12088, 12097, 12104, 4989, 12111, 12117, 2454, 2461, 12123, 2479, 12132, 0}, {12080, 12088, 12097, 12104, 4989, 12111, 12117, 2454, 2461, 12123, 2479, 12132, 0}, {12142, 12147, 12097, 2509, 4989, 12111, 12117, 2521, 12153, 2529, 2533, 12158, 0}, {12142, 12147, 12097, 2509, 4989, 12111, 12117, 2521, 12153, 2529, 2533, 12158, 0}, 2, 1, 754, 241, {11981,2587,1245,1210,0,0,0,0,0,0,0,0,0,0},{12163,12182,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {12202, 9388, 323, 331, 12229, 1916, 12247, 12264, {12278, 12289, 12299, 12308, 12319, 12331, 12342}, {12352, 12355, 12358, 12361, 12364, 12367, 12370}, {2018, 2013, 2407, 2405, 7548, 2013, 2018}, {12373, 12383, 12394, 12400, 12409, 12415, 12423, 12431, 12439, 12450, 12459, 12469, 0}, {12479, 12489, 2428, 12500, 12509, 12515, 12523, 12531, 12539, 12550, 12559, 12569, 0}, {12579, 12585, 12394, 12591, 12409, 12596, 12602, 12608, 4292, 12613, 4303, 12618, 0}, {12579, 12585, 12394, 12591, 12409, 12596, 12602, 12608, 4292, 12613, 4303, 12618, 0}, 0, 1, 754, 241, {5713,12623,1210,0,0,0,0,0,0,0,0,0,0,0},{12202,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {12633, 1210, 280, 274, 12655, 12670, 12682, 11886, {12688, 12700, 12712, 12724, 12738, 12753, 12766}, {12780, 12783, 12786, 12789, 12792, 12795, 9517}, {2018, 2013, 12798, 2405, 4511, 2013, 9526}, {12800, 12807, 12815, 12821, 12830, 12839, 12849, 12855, 12866, 12876, 12883, 12893, 0}, {12800, 12807, 12815, 12821, 12830, 12839, 12849, 12855, 12866, 12876, 12883, 12893, 0}, {12901, 12907, 12912, 12917, 12922, 12927, 12934, 12940, 12946, 12952, 12958, 12965, 0}, {12901, 12907, 12912, 12917, 12922, 12927, 12934, 12940, 12946, 12952, 12958, 12965, 0}, 2, 1, 2541, 241, {1747,1210,0,0,0,0,0,0,0,0,0,0,0,0},{12633,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {12972, 2587, 280, 274, 1906, 55, 12990, 13002, {13014, 13029, 13044, 13059, 13076, 13095, 13106}, {13117, 13124, 13131, 13138, 13145, 13152, 13159}, {0, 0, 0, 0, 0, 0, 0}, {13166, 13177, 8702, 13190, 8724, 13201, 13208, 8749, 13215, 13230, 13243, 13254, 0}, {13166, 13177, 8702, 13190, 8724, 13201, 13208, 8749, 13215, 13230, 13243, 13254, 0}, {13267, 13274, 13281, 13288, 8724, 13201, 13208, 13295, 13302, 13309, 13316, 13323, 0}, {13267, 13274, 13281, 13288, 8724, 13201, 13208, 13295, 13302, 13309, 13316, 13323, 0}, 0, 0, 754, 241, {1245,1210,0,0,0,0,0,0,0,0,0,0,0,0},{3672,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}}, - {13330, 243, 23, 35, 44, 352, 13349, 13369, {13386, 13399, 13412, 13428, 13445, 13460, 13469}, {13386, 13399, 13412, 13428, 13445, 13460, 13469}, {13478, 13481, 13484, 13487, 13490, 13493, 13496}, {13499, 13512, 13523, 13532, 13543, 13548, 13557, 13568, 13575, 13590, 13601, 13614, 0}, {13627, 13642, 13523, 13532, 13655, 13548, 13662, 13568, 13575, 13590, 13601, 13614, 0}, {13499, 13512, 13523, 13532, 13543, 13548, 13557, 13568, 13575, 13590, 13601, 13614, 0}, {13499, 13512, 13523, 13532, 13543, 13548, 13557, 13568, 13575, 13590, 13601, 13614, 0}, 0, 6, 239, 241, {3888,3879,0,0,0,0,0,0,0,0,0,0,0,0},{3909,3929,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {5603, 243, 2936, 2947, 1906, 55, 13675, 13678, {13681, 13694, 13704, 13713, 13723, 13734, 13745}, {13757, 13760, 13765, 13770, 13775, 13780, 13785}, {13757, 13790, 13793, 13796, 13799, 13802, 13805}, {13808, 13817, 13826, 13835, 13844, 13853, 13862, 13871, 13880, 13889, 13899, 13909, 0}, {13919, 13928, 13937, 13946, 13955, 13964, 13973, 13982, 13991, 14000, 14010, 14020, 0}, {14030, 14036, 14042, 14048, 14054, 14060, 14066, 14072, 14078, 14084, 14091, 14098, 0}, {14030, 14036, 14042, 14048, 14054, 14060, 14066, 14072, 14078, 14084, 14091, 14098, 0}, 0, 1, 239, 241, {243,14,1236,2309,1210,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {14105, 2587, 280, 274, 44, 352, 14118, 14142, {14166, 14179, 14200, 14219, 14240, 14259, 14272}, {14283, 14290, 14297, 14304, 14311, 14318, 14325}, {14332, 14335, 14335, 14338, 14341, 14344, 14349}, {14352, 14367, 14382, 14391, 14402, 14413, 14426, 14439, 14454, 14473, 14492, 14509, 0}, {14528, 14545, 14562, 14573, 14586, 14599, 14614, 14629, 14646, 14667, 14688, 14707, 0}, {14728, 14735, 14742, 14749, 14756, 14763, 14770, 14777, 14784, 14791, 14798, 14805, 0}, {14728, 14735, 14742, 14749, 14756, 14763, 14770, 14777, 14784, 14791, 14798, 14805, 0}, 0, 1, 754, 241, {2587,1245,14812,243,14822,3660,1210,0,0,0,0,0,0,0},{14105,2909,13330,5603,14833,14844,14856,14873},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {14891, 2587, 280, 274, 1906, 352, 1924, 1927, {14913, 14919, 14933, 14956, 14970, 14986, 14993}, {15002, 15005, 15010, 15016, 15020, 7548, 15025}, {6687, 6675, 6677, 6679, 6681, 6683, 6685}, {15029, 15036, 10276, 15043, 3829, 15049, 15055, 15061, 15068, 15077, 15085, 15092, 0}, {15099, 15106, 15113, 15118, 15124, 15128, 15133, 15138, 15145, 15154, 15162, 15169, 0}, {15176, 7947, 2505, 2509, 15124, 15180, 15184, 15188, 15192, 2529, 15196, 15200, 0}, {15176, 7947, 2505, 2509, 15124, 15180, 15184, 15188, 15192, 2529, 15196, 15200, 0}, 0, 0, 754, 241, {2587,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{3672,5603,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {15204, 1736, 323, 331, 15237, 15254, 1924, 1927, {15269, 15277, 15288, 15298, 15309, 15318, 15327}, {15337, 15341, 15345, 15349, 15353, 15357, 15361}, {15365, 12798, 12798, 12798, 2407, 2407, 2411}, {15367, 15377, 15385, 15393, 15401, 15409, 15416, 15424, 15432, 15439, 15445, 15452, 0}, {15460, 15471, 15480, 15489, 15498, 15507, 15515, 15524, 15533, 15541, 15548, 15556, 0}, {15565, 15570, 4936, 15575, 15580, 15585, 15590, 15595, 15600, 15605, 15610, 15615, 0}, {15565, 15570, 4936, 15575, 15580, 15585, 15590, 15595, 15600, 15605, 15610, 15615, 0}, 2, 1, 239, 241, {1736,1210,0,0,0,0,0,0,0,0,0,0,0,0},{15620,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{323,280,1324,0,0,0,0,0,0}}, - {13330, 2587, 280, 274, 1906, 352, 15647, 15668, {15685, 394, 415, 8571, 15698, 15715, 15726}, {15739, 15747, 15755, 15761, 15769, 15777, 15785}, {519, 522, 525, 528, 531, 522, 528}, {15793, 547, 564, 573, 15808, 15815, 15824, 605, 618, 637, 654, 669, 0}, {15793, 547, 564, 573, 15808, 15815, 15824, 605, 618, 637, 654, 669, 0}, {15833, 15841, 15849, 702, 15808, 15857, 15865, 710, 718, 728, 736, 746, 0}, {15833, 15841, 15849, 702, 15808, 15857, 15865, 710, 718, 728, 736, 746, 0}, 0, 1, 754, 241, {2587,1245,1210,0,0,0,0,0,0,0,0,0,0,0},{13330,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {5603, 14, 23, 35, 1906, 352, 0, 0, {15873, 15880, 15891, 15900, 15909, 15916, 15927}, {15937, 15941, 15945, 15949, 15953, 15956, 15960}, {0, 0, 0, 0, 0, 0, 0}, {15964, 15974, 15983, 15991, 16000, 16013, 16025, 16032, 16039, 16046, 16056, 16068, 0}, {15964, 15974, 15983, 15991, 16000, 16013, 16025, 16032, 16039, 16046, 16056, 16068, 0}, {16081, 16085, 16089, 16093, 16097, 16101, 16105, 16109, 16113, 16117, 16121, 16125, 0}, {16081, 16085, 16089, 16093, 16097, 16101, 16105, 16109, 16113, 16117, 16121, 16125, 0}, 0, 0, 239, 241, {1736,1779,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{35,2947,274,0,0,0,0,0,0,0,0,0},{23,2936,280,0,0,0,0,0,0}}, - {5603, 1736, 23, 35, 1906, 352, 0, 0, {16129, 16134, 16140, 16150, 16162, 16170, 16181}, {16190, 16194, 16198, 16202, 16206, 16210, 16214}, {0, 0, 0, 0, 0, 0, 0}, {16218, 16228, 16238, 16245, 16252, 2725, 16257, 16264, 16271, 16280, 16288, 16296, 0}, {16218, 16228, 16238, 16245, 16252, 2725, 16257, 16264, 16271, 16280, 16288, 16296, 0}, {2778, 2782, 15960, 16304, 16308, 2795, 2799, 16312, 2807, 2811, 2815, 16316, 0}, {2778, 2782, 15960, 16304, 16308, 2795, 2799, 16312, 2807, 2811, 2815, 16316, 0}, 0, 0, 239, 241, {1736,1779,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{35,2947,274,0,0,0,0,0,0,0,0,0},{23,2936,280,0,0,0,0,0,0}}, - {5603, 2309, 23, 35, 1906, 352, 1924, 1927, {16320, 16326, 16337, 16150, 16162, 16170, 16181}, {16347, 16351, 16355, 16202, 16206, 16210, 16214}, {2018, 2403, 16359, 2405, 2018, 5811, 2403}, {16361, 16371, 16382, 16389, 16398, 16404, 16410, 16418, 16426, 16437, 16447, 16456, 0}, {16465, 16228, 16474, 16480, 16252, 2725, 16257, 16264, 16487, 16280, 16288, 16296, 0}, {2778, 2782, 16497, 2791, 16308, 2795, 2799, 16312, 2807, 2811, 2815, 16316, 0}, {2778, 2782, 16497, 2791, 16308, 2795, 2799, 16312, 2807, 2811, 2815, 16316, 0}, 0, 0, 2541, 241, {1736,1779,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{35,2947,274,0,0,0,0,0,0,0,0,0},{23,2936,280,0,0,0,0,0,0}}, - {5603, 1736, 23, 35, 1906, 352, 16501, 16505, {16509, 16516, 16524, 16532, 16541, 16551, 16558}, {2671, 16567, 2677, 16570, 2683, 16573, 2689}, {2018, 2403, 2692, 3804, 2692, 4091, 2018}, {16576, 16585, 16595, 2715, 10715, 16601, 16607, 16613, 2742, 2752, 2760, 10727, 0}, {16576, 16585, 16595, 2715, 10715, 16601, 16607, 16613, 2742, 2752, 2760, 10727, 0}, {2778, 2782, 3860, 2791, 10715, 2795, 2799, 2803, 2807, 2811, 2815, 10740, 0}, {2778, 2782, 3860, 2791, 10715, 2795, 2799, 2803, 2807, 2811, 2815, 10740, 0}, 0, 0, 239, 241, {1736,1779,1210,16622,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{35,2947,274,0,0,0,0,0,0,0,0,0},{23,2936,280,0,0,0,0,0,0}}, - {16634, 2587, 323, 331, 1906, 352, 1924, 1927, {16668, 16684, 16709, 16737, 16765, 16793, 16821}, {16840, 16850, 16860, 16870, 16880, 16890, 16900}, {16910, 16914, 16918, 16914, 16922, 16926, 16930}, {16934, 16956, 16984, 17000, 17019, 17035, 17054, 17073, 17095, 17126, 17154, 17179, 0}, {16934, 16956, 16984, 17000, 17019, 17035, 17054, 17073, 17095, 17126, 17154, 17179, 0}, {17207, 17217, 17227, 17237, 17247, 17257, 17267, 17277, 17287, 17297, 17307, 17317, 0}, {17207, 17217, 17227, 17237, 17247, 17257, 17267, 17277, 17287, 17297, 17307, 17317, 0}, 0, 1, 754, 241, {2587,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{17327,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1882, 2309, 280, 274, 1906, 352, 17359, 17364, {6012, 17369, 17380, 17390, 17400, 17410, 17424}, {17436, 17440, 17445, 17450, 17454, 17459, 17464}, {2018, 2403, 2405, 2403, 5811, 2409, 2411}, {2413, 2420, 4978, 6157, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2413, 2420, 4978, 6157, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, 2, 1, 2541, 241, {2309,1236,1210,0,0,0,0,0,0,0,0,0,0,0},{1882,0,0,0,0,0,0,0},{274,5085,0,0,0,0,0,0,0,0,0,0},{280,6558,0,0,0,0,0,0,0}}, - {5603, 2309, 280, 274, 44, 55, 17468, 17484, {17494, 17513, 17532, 17554, 17573, 17595, 17620}, {17639, 17649, 17659, 17672, 17682, 17695, 17711}, {17721, 17725, 17732, 17739, 17746, 17753, 17760}, {17764, 17780, 17799, 17815, 17834, 17841, 17851, 17867, 17883, 17902, 17924, 17940, 0}, {17764, 17780, 17799, 17815, 17834, 17841, 17851, 17867, 17883, 17902, 17924, 17940, 0}, {17959, 17966, 17799, 17976, 17834, 17841, 17992, 18005, 18012, 18025, 18041, 18051, 0}, {17959, 17966, 17799, 17976, 17834, 17841, 17992, 18005, 18012, 18025, 18041, 18051, 0}, 0, 0, 2541, 241, {2309,1236,2270,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {18064, 243, 280, 274, 1906, 18089, 18103, 18106, {18109, 18118, 18127, 18137, 18147, 18157, 18169}, {18177, 18182, 18186, 18190, 18194, 18199, 18204}, {18208, 2405, 2405, 9756, 18208, 18211, 2018}, {18214, 18221, 18226, 2715, 18232, 18238, 18245, 18251, 18259, 18269, 18277, 18286, 0}, {18214, 18221, 18226, 2715, 18232, 18238, 18245, 18251, 18259, 18269, 18277, 18286, 0}, {2778, 18296, 3860, 2791, 18300, 18304, 18309, 18313, 18317, 18321, 2815, 18325, 0}, {2778, 18296, 3860, 2791, 18300, 18304, 18309, 18313, 18317, 18321, 2815, 18325, 0}, 0, 0, 239, 241, {243,1210,18330,7204,2927,0,0,0,0,0,0,0,0,0},{18064,18339,10078,0,0,0,0,0},{274,2947,331,35,0,0,0,0,0,0,0,0},{280,2936,323,23,0,0,0,0,0}}, - {18358, 2587, 280, 274, 1906, 18382, 18395, 18400, {18405, 18417, 18428, 18442, 18454, 18464, 18474}, {18485, 18490, 18495, 18500, 18505, 18510, 18515}, {2018, 4091, 2403, 6354, 2692, 16359, 2411}, {18520, 18537, 18550, 18564, 18577, 18590, 18603, 18617, 18629, 18643, 18657, 18671, 0}, {18520, 18537, 18550, 18564, 18577, 18590, 18603, 18617, 18629, 18643, 18657, 18671, 0}, {18684, 18691, 18696, 18701, 18705, 18710, 18715, 18720, 18725, 18732, 18737, 18743, 0}, {18684, 18691, 18696, 18701, 18705, 18710, 18715, 18720, 18725, 18732, 18737, 18743, 0}, 2, 1, 754, 241, {2587,1245,2843,1210,0,0,0,0,0,0,0,0,0,0},{18748,0,0,0,0,0,0,0},{274,331,5085,0,0,0,0,0,0,0,0,0},{280,323,6558,0,0,0,0,0,0}}, - {3672, 243, 280, 274, 1906, 352, 7213, 7218, {18766, 18780, 18790, 18801, 18815, 18826, 18837}, {18850, 18855, 18860, 18867, 18873, 18879, 18885}, {2692, 2411, 2403, 7548, 2692, 12798, 2018}, {18890, 18898, 18906, 18913, 18922, 18932, 18942, 18948, 18956, 18971, 18989, 18997, 0}, {18890, 18898, 18906, 18913, 18922, 18932, 18942, 18948, 18956, 18971, 18989, 18997, 0}, {19005, 19009, 18906, 19015, 19019, 19024, 18942, 19030, 19035, 19042, 19049, 19054, 0}, {19005, 19009, 18906, 19015, 19019, 19024, 18942, 19030, 19035, 19042, 19049, 19054, 0}, 2, 0, 239, 241, {243,14,1229,2843,1210,0,0,0,0,0,0,0,0,0},{3672,5603,10078,10067,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {5603, 243, 323, 331, 1906, 55, 19059, 19062, {19066, 19071, 10649, 10656, 19077, 19084, 10673}, {19091, 19095, 10687, 10691, 19099, 10699, 10703}, {12798, 15365, 2018, 10707, 4511, 4089, 2018}, {9983, 9991, 19103, 2715, 10715, 2795, 19107, 19113, 2742, 2752, 2760, 19118, 0}, {9983, 9991, 19103, 2715, 10715, 2795, 19107, 19113, 2742, 2752, 2760, 19118, 0}, {2778, 2782, 19103, 2791, 10715, 2795, 2799, 19127, 2807, 2811, 2815, 16316, 0}, {2778, 2782, 19103, 2791, 10715, 2795, 2799, 19127, 2807, 2811, 2815, 16316, 0}, 0, 0, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {19131, 6549, 280, 274, 1906, 352, 19149, 19171, {19195, 19210, 19227, 19244, 19261, 19278, 19287}, {19298, 19304, 19310, 19316, 19322, 19328, 19334}, {19340, 19343, 8668, 8668, 19346, 19340, 8668}, {19349, 19362, 19373, 19386, 19397, 19408, 19421, 19432, 19443, 19460, 19471, 19484, 0}, {19349, 19362, 19373, 19386, 19397, 19408, 19421, 19432, 19443, 19460, 19471, 19484, 0}, {19503, 19511, 19519, 19527, 19535, 19543, 19551, 19559, 19567, 19575, 19583, 19591, 0}, {19503, 19511, 19519, 19527, 19535, 19543, 19551, 19559, 19567, 19575, 19583, 19591, 0}, 0, 0, 2541, 241, {2587,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{19131,19601,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {19620, 19641, 280, 274, 19650, 19666, 19675, 19701, {19729, 19736, 19743, 19750, 19757, 19764, 19771}, {19729, 19736, 19743, 19750, 19757, 19764, 19771}, {19340, 19343, 19778, 19778, 19346, 19340, 19781}, {19784, 19797, 564, 19812, 584, 19825, 19834, 605, 19843, 19860, 19875, 19888, 0}, {19784, 19797, 564, 19812, 584, 19825, 19834, 605, 19843, 19860, 19875, 19888, 0}, {19903, 15841, 15849, 702, 584, 19911, 19919, 710, 19927, 728, 19935, 746, 0}, {19903, 15841, 15849, 702, 584, 19911, 19919, 710, 19927, 728, 19935, 746, 0}, 0, 0, 2541, 241, {1245,1210,0,0,0,0,0,0,0,0,0,0,0,0},{19943,0,0,0,0,0,0,0},{331,0,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}}, - {3909, 3703, 2936, 2947, 44, 19963, 1924, 1927, {19971, 19980, 19989, 19997, 20006, 20015, 20022}, {20031, 20034, 20037, 20040, 20043, 20047, 20050}, {6677, 6679, 6681, 6683, 12798, 15365, 6675}, {9983, 9991, 20053, 20059, 10715, 2725, 19107, 20066, 16271, 20073, 16288, 20080, 0}, {9983, 9991, 20053, 20059, 10715, 2725, 19107, 20066, 16271, 20073, 16288, 20080, 0}, {2778, 2782, 19103, 2791, 10715, 2795, 2799, 20088, 2807, 2811, 2815, 10740, 0}, {2778, 2782, 19103, 2791, 10715, 2795, 2799, 20088, 2807, 2811, 2815, 10740, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {20092, 2587, 280, 274, 1906, 20110, 1924, 1927, {20117, 20127, 20136, 20145, 20156, 20166, 20171}, {20178, 20184, 20189, 20194, 20199, 10699, 20203}, {20208, 2692, 2018, 7548, 2013, 4089, 2018}, {15029, 15036, 10276, 15043, 3829, 20210, 20215, 20220, 15068, 15077, 15085, 15092, 0}, {15029, 15036, 10276, 15043, 3829, 20210, 20215, 20220, 15068, 15077, 15085, 15092, 0}, {20227, 20232, 3860, 2791, 3829, 20210, 20215, 20236, 10683, 2811, 20240, 20245, 0}, {20227, 20232, 3860, 2791, 3829, 20210, 20215, 20236, 10683, 2811, 20240, 20245, 0}, 0, 0, 754, 241, {20249,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{20092,3672,5603,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {5603, 1236, 6558, 5085, 44, 352, 20260, 20288, {20310, 20329, 20348, 20373, 20392, 20426, 20451}, {20470, 20480, 20490, 20506, 20516, 20541, 20557}, {20567, 20571, 20578, 20582, 20589, 20596, 20603}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, 0, 1, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{5085,2285,20853,20862,0,0,0,0,0,0,0,0},{6558,2301,20870,20882,0,0,0,0,0}}, - {10387, 1236, 1870, 1850, 44, 55, 1924, 1927, {20893, 20909, 20928, 20950, 20969, 20988, 21016}, {21038, 21046, 21057, 21071, 21082, 21093, 21113}, {21127, 21131, 21138, 21145, 21155, 21162, 21175}, {21182, 21198, 21217, 21230, 21249, 21256, 21266, 21282, 21295, 21311, 21330, 21346, 0}, {21182, 21198, 21217, 21230, 21249, 21256, 21266, 21282, 21295, 21311, 21330, 21346, 0}, {21182, 21198, 21217, 21230, 21249, 21256, 21266, 21282, 21295, 21311, 21330, 21346, 0}, {21182, 21198, 21217, 21230, 21249, 21256, 21266, 21282, 21295, 21311, 21330, 21346, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{10387,3672,0,0,0,0,0,0},{1850,1842,331,274,0,0,0,0,0,0,0,0},{1870,1859,323,280,0,0,0,0,0}}, - {5603, 1236, 280, 274, 44, 55, 1924, 1927, {21362, 21381, 21400, 21422, 21441, 21463, 21488}, {21507, 21517, 21527, 21540, 21550, 21563, 21579}, {21589, 21593, 21600, 21607, 21614, 21621, 21628}, {21632, 21660, 21688, 21704, 21723, 21730, 21740, 21756, 21772, 21800, 21822, 21844, 0}, {21632, 21660, 21688, 21704, 21723, 21730, 21740, 21756, 21772, 21800, 21822, 21844, 0}, {21869, 21888, 21688, 21704, 21723, 21730, 21740, 21907, 21914, 21930, 21946, 21956, 0}, {21869, 21888, 21688, 21704, 21723, 21730, 21740, 21907, 21914, 21930, 21946, 21956, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {5603, 1236, 280, 274, 44, 55, 7992, 21969, {21972, 21991, 22010, 22035, 22054, 22076, 22101}, {22120, 22130, 22140, 22156, 22166, 22179, 22195}, {22205, 22209, 22216, 22220, 22227, 22234, 22241}, {22245, 22267, 22298, 22320, 22339, 22346, 22356, 22372, 22388, 22419, 22441, 22463, 0}, {22245, 22267, 22298, 22320, 22339, 22346, 22356, 22372, 22388, 22419, 22441, 22463, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {5603, 2309, 280, 274, 1906, 352, 22488, 22513, {22538, 22557, 22579, 22604, 22620, 22642, 22661}, {22671, 22678, 22685, 22692, 22699, 22706, 22713}, {22671, 22678, 22685, 22692, 22699, 22706, 22713}, {22717, 22733, 22758, 22777, 22796, 22803, 22816, 22829, 22848, 22879, 22904, 22926, 0}, {22717, 22733, 22758, 22777, 22796, 22803, 22816, 22951, 22848, 22879, 22904, 22926, 0}, {22970, 22978, 22992, 23006, 22796, 22803, 22816, 23017, 23025, 23039, 23050, 23058, 0}, {22970, 22978, 22992, 23006, 22796, 22803, 22816, 23017, 23025, 23039, 23050, 23058, 0}, 0, 0, 2541, 241, {2309,1236,2270,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {5603, 1236, 280, 274, 44, 3712, 1924, 1927, {23069, 23091, 23113, 23138, 23160, 23185, 23213}, {23235, 23245, 23255, 23268, 23278, 23291, 23307}, {23317, 23321, 23328, 23332, 23339, 23346, 23353}, {23357, 23373, 23398, 23417, 23439, 23446, 23459, 23472, 23491, 23522, 23547, 23566, 0}, {23357, 23373, 23398, 23417, 23439, 23446, 23591, 23472, 23491, 23522, 23547, 23566, 0}, {23604, 23611, 23398, 23627, 23439, 23446, 23591, 23472, 23643, 23665, 23681, 23691, 0}, {23604, 23611, 23398, 23627, 23439, 23446, 23591, 23472, 23643, 23665, 23681, 23691, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {5603, 1236, 280, 274, 44, 3712, 1924, 1927, {23707, 23726, 23745, 23767, 23786, 23808, 23833}, {23852, 23862, 23872, 23885, 23895, 23908, 23924}, {23934, 23938, 23945, 23952, 23959, 23966, 23973}, {23977, 23993, 24018, 24037, 24059, 24066, 24079, 24092, 24111, 24139, 24164, 24186, 0}, {23977, 23993, 24018, 24037, 24059, 24066, 24079, 24092, 24111, 24139, 24164, 24186, 0}, {24211, 24219, 24239, 24246, 24059, 24263, 24270, 24278, 24286, 24309, 24326, 24340, 0}, {24211, 24219, 24239, 24246, 24059, 24263, 24270, 24278, 24286, 24309, 24326, 24340, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {5603, 1236, 6558, 5085, 44, 19963, 1924, 1927, {24357, 24385, 24419, 24447, 24475, 24506, 24543}, {24571, 24584, 24603, 24619, 24632, 24651, 24670}, {24680, 24687, 24694, 24701, 24708, 24721, 24728}, {24732, 24751, 24779, 24801, 24820, 24833, 24843, 24856, 24881, 24912, 24937, 24953, 0}, {24732, 24751, 24779, 24801, 24820, 24833, 24843, 24856, 24881, 24912, 24937, 24953, 0}, {24972, 24982, 25001, 25011, 24820, 24833, 24843, 25027, 25034, 25059, 25075, 25085, 0}, {24972, 24982, 25001, 25011, 24820, 24833, 24843, 25027, 25034, 25059, 25075, 25085, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{5085,2285,20853,20862,0,0,0,0,0,0,0,0},{6558,2301,20870,20882,0,0,0,0,0}}, - {25098, 2309, 1859, 1842, 25117, 352, 25125, 25153, {25175, 25194, 25213, 25238, 25257, 25291, 25316}, {25335, 20480, 20490, 20506, 25345, 25370, 20557}, {0, 0, 0, 0, 0, 0, 0}, {25386, 25411, 25442, 25458, 20704, 20711, 20721, 25477, 25493, 25524, 25546, 25568, 0}, {25386, 25411, 25442, 25458, 20704, 20711, 20721, 25477, 25493, 25524, 25546, 25568, 0}, {25593, 25606, 25442, 25458, 20704, 20711, 20721, 25625, 25632, 25648, 25664, 25674, 0}, {25593, 25606, 25442, 25458, 20704, 20711, 20721, 25625, 25632, 25648, 25664, 25674, 0}, 0, 0, 2541, 241, {2309,0,0,0,0,0,0,0,0,0,0,0,0,0},{25098,0,0,0,0,0,0,0},{1842,1850,0,0,0,0,0,0,0,0,0,0},{1859,1870,0,0,0,0,0,0,0}}, - {5603, 2309, 280, 274, 44, 55, 1924, 1927, {17494, 17513, 25687, 17554, 17573, 17595, 17620}, {17639, 17649, 25709, 17672, 17682, 17695, 17711}, {17721, 17725, 17732, 17739, 17746, 17753, 17760}, {25722, 25747, 17799, 25778, 25797, 17841, 25804, 25817, 25833, 25858, 25880, 25908, 0}, {25722, 25747, 17799, 25778, 25797, 17841, 25804, 25817, 25833, 25858, 25880, 25908, 0}, {25930, 25943, 17799, 25962, 25797, 17841, 25804, 25978, 25985, 26004, 26020, 26042, 0}, {25930, 25943, 17799, 25962, 25797, 17841, 25804, 25978, 25985, 26004, 26020, 26042, 0}, 0, 0, 2541, 241, {2309,1236,2270,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {26058, 1210, 280, 274, 26112, 5736, 26131, 26136, {26141, 26148, 26159, 26172, 26185, 26196, 26209}, {26220, 26225, 26230, 26235, 26240, 26245, 26250}, {6675, 6677, 6679, 6681, 6683, 6685, 6687}, {26255, 26281, 26309, 26339, 26369, 26395, 26425, 26451, 26479, 26503, 26531, 26568, 0}, {26255, 26281, 26309, 26339, 26369, 26395, 26425, 26451, 26479, 26503, 26531, 26568, 0}, {26607, 26619, 26631, 26643, 26655, 26667, 26679, 26691, 26703, 26715, 26728, 26741, 0}, {26607, 26619, 26631, 26643, 26655, 26667, 26679, 26691, 26703, 26715, 26728, 26741, 0}, 0, 0, 2541, 241, {26754,1210,0,0,0,0,0,0,0,0,0,0,0,0},{26763,0,0,0,0,0,0,0},{331,0,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}}, - {26784, 1366, 280, 274, 26827, 26860, 26884, 26906, {26931, 26959, 26987, 27024, 27055, 27089, 27114}, {27148, 27164, 27180, 27205, 27224, 27246, 27259}, {27281, 27288, 27295, 27302, 27309, 27316, 27320}, {27330, 27364, 27401, 27435, 27469, 27500, 27537, 27574, 27614, 27648, 27682, 27731, 0}, {27330, 27364, 27401, 27435, 27469, 27500, 27537, 27574, 27614, 27648, 27682, 27731, 0}, {27780, 27793, 27806, 27819, 27832, 27845, 27858, 27871, 27884, 27897, 27913, 27929, 0}, {27780, 27793, 27806, 27819, 27832, 27845, 27858, 27871, 27884, 27897, 27913, 27929, 0}, 0, 0, 239, 241, {1366,1718,1727,1747,1210,1736,1758,1765,1772,0,0,0,0,0},{26784,27945,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {3672, 14, 280, 274, 1906, 352, 1924, 1927, {27993, 28002, 28012, 28024, 28037, 28046, 28058}, {28070, 28074, 28079, 28083, 28087, 28091, 28095}, {2018, 28099, 2403, 2403, 15365, 6354, 2018}, {28102, 28109, 28118, 28125, 2721, 28132, 28140, 28151, 28156, 28161, 28168, 28177, 0}, {28102, 28109, 28118, 28125, 2721, 28132, 28140, 28151, 28156, 28161, 28168, 28177, 0}, {28185, 28189, 28079, 28193, 2721, 28197, 28201, 28151, 28156, 28205, 28209, 28214, 0}, {28185, 28189, 28079, 28193, 2721, 28197, 28201, 28151, 28156, 28205, 28209, 28214, 0}, 2, 1, 239, 241, {243,14,1229,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,35,2947,0,0,0,0,0,0,0,0},{280,323,23,2936,0,0,0,0,0}}, - {3672, 14, 280, 331, 28219, 352, 28254, 28270, {28286, 28308, 28321, 28340, 28350, 28381, 28397}, {28286, 28308, 28321, 28340, 28350, 28381, 28397}, {6675, 6677, 6679, 6681, 6683, 6685, 6687}, {28410, 28423, 28442, 28455, 28468, 28481, 28500, 28519, 28532, 28548, 28561, 28586, 0}, {28410, 28423, 28442, 28455, 28468, 28481, 28500, 28519, 28532, 28548, 28561, 28586, 0}, {28410, 28423, 28442, 28455, 28468, 28481, 28500, 28519, 28532, 28548, 28561, 28586, 0}, {28410, 28423, 28442, 28455, 28468, 28481, 28500, 28519, 28532, 28548, 28561, 28586, 0}, 0, 0, 239, 241, {1210,0,0,0,0,0,0,0,0,0,0,0,0,0},{3672,10090,0,0,0,0,0,0},{28599,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {5603, 243, 280, 274, 1906, 352, 28607, 28632, {28657, 28682, 28701, 28729, 28748, 28773, 28792}, {28657, 28682, 28701, 28729, 28748, 28773, 28792}, {28814, 28818, 28822, 28826, 28836, 28840, 28850}, {28854, 28873, 28889, 28902, 28915, 28937, 28956, 28978, 28994, 29010, 29023, 29039, 0}, {28854, 28873, 28889, 28902, 28915, 28937, 28956, 28978, 28994, 29010, 29023, 29039, 0}, {29055, 29064, 29073, 29082, 29091, 29100, 29112, 29121, 29130, 29139, 29148, 29157, 0}, {29055, 29064, 29073, 29082, 29091, 29100, 29112, 29121, 29130, 29139, 29148, 29157, 0}, 0, 0, 239, 241, {243,1210,0,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{28599,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {4313, 243, 323, 331, 947, 3985, 7213, 7218, {3997, 29166, 4011, 29171, 29181, 29187, 4044}, {29194, 8356, 3860, 29198, 29203, 29207, 29211}, {2692, 2411, 2403, 2403, 29216, 4091, 2018}, {29218, 29226, 4107, 4113, 29235, 29240, 29246, 4136, 29252, 29261, 29269, 29278, 0}, {29287, 29295, 4196, 1102, 7895, 29304, 29310, 4219, 7912, 7921, 7929, 29316, 0}, {29325, 2782, 3860, 29329, 2721, 29333, 29338, 20088, 18317, 29342, 2815, 3868, 0}, {29325, 2782, 3860, 29329, 2721, 29333, 29338, 20088, 18317, 29342, 2815, 3868, 0}, 2, 1, 239, 241, {243,14,1221,1229,1236,1245,1210,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{331,274,35,1312,0,0,0,0,0,0,0,0},{323,280,23,1324,0,0,0,0,0}}, - {5603, 2309, 280, 274, 44, 55, 29346, 29358, {29370, 17513, 29398, 17554, 17573, 17595, 17620}, {17639, 17649, 25709, 17672, 17682, 17695, 17711}, {0, 0, 0, 0, 0, 0, 0}, {25722, 25747, 17799, 25778, 25797, 17841, 25804, 29417, 29433, 29461, 25880, 25908, 0}, {25722, 25747, 17799, 25778, 25797, 17841, 25804, 29417, 29433, 29461, 25880, 25908, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 0, 2541, 241, {2309,1236,2270,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {29483, 1210, 1859, 1842, 29531, 19963, 29541, 29553, {29562, 29578, 29594, 29622, 29638, 29681, 29706}, {29562, 29578, 29734, 29622, 29744, 29766, 29779}, {29789, 29793, 29797, 29801, 29805, 29818, 29825}, {29832, 29851, 29876, 29895, 29920, 29933, 29946, 29959, 29981, 30015, 30040, 30068, 0}, {29832, 29851, 29876, 29895, 29920, 29933, 29946, 29959, 29981, 30015, 30040, 30068, 0}, {30096, 30103, 30113, 29895, 29920, 29933, 29946, 30126, 30136, 30149, 30159, 30172, 0}, {30096, 30103, 30113, 29895, 29920, 29933, 29946, 30126, 30136, 30149, 30159, 30172, 0}, 0, 1, 2541, 241, {1210,1736,1779,243,14,0,0,0,0,0,0,0,0,0},{29483,0,0,0,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {30185, 2927, 2936, 2947, 1906, 30217, 30233, 30243, {30256, 30266, 30273, 30286, 30296, 30306, 30316}, {30256, 30266, 30326, 30286, 30296, 30306, 30316}, {30336, 30340, 30344, 30348, 30352, 30356, 30360}, {30364, 30380, 30396, 30406, 30419, 30426, 30433, 30443, 30456, 30475, 30491, 30507, 0}, {30364, 30380, 30396, 30406, 30419, 30426, 30433, 30443, 30456, 30523, 30491, 30507, 0}, {30542, 30552, 30396, 30562, 30419, 30426, 30433, 30572, 30582, 30592, 30602, 30612, 0}, {30542, 30552, 30396, 30562, 30419, 30426, 30433, 30572, 30582, 30592, 30602, 30612, 0}, 0, 0, 239, 241, {2927,1210,0,0,0,0,0,0,0,0,0,0,0,0},{30185,0,0,0,0,0,0,0},{2947,0,0,0,0,0,0,0,0,0,0,0},{2936,0,0,0,0,0,0,0,0}}, - {3943, 2309, 323, 331, 44, 352, 30622, 30632, {30645, 30652, 30658, 30665, 30671, 30677, 30685}, {30695, 30699, 30703, 30707, 30711, 30715, 30719}, {12798, 12798, 12798, 12798, 12798, 12798, 12798}, {30725, 30734, 10000, 30743, 30749, 30755, 30761, 30768, 30774, 30783, 30792, 30800, 0}, {30725, 30734, 10000, 30743, 30749, 30755, 30761, 30768, 30774, 30783, 30792, 30800, 0}, {30809, 30813, 3860, 30817, 3829, 30821, 30825, 30829, 30834, 30838, 30844, 30848, 0}, {30809, 30813, 3860, 30817, 3829, 30821, 30825, 30829, 30834, 30838, 30844, 30848, 0}, 0, 0, 2541, 241, {2309,1236,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{331,274,30852,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3909, 3703, 2936, 2947, 30858, 55, 30868, 30909, {30950, 30969, 30988, 31013, 31032, 31054, 31079}, {31098, 17649, 31108, 17672, 31124, 17695, 17711}, {31137, 17725, 31141, 17739, 31145, 17753, 17760}, {17764, 31152, 17799, 31180, 25797, 31199, 17851, 31209, 31225, 31256, 31278, 31303, 0}, {17764, 31152, 17799, 31180, 25797, 31199, 17851, 31209, 31225, 31256, 31278, 31303, 0}, {17764, 31152, 17799, 31180, 25797, 31199, 17851, 31209, 31225, 31256, 31278, 31303, 0}, {17764, 31152, 17799, 31180, 25797, 31199, 17851, 31209, 31225, 31256, 31278, 31303, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {31328, 1366, 2936, 2947, 1906, 352, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {31349, 31356, 31365, 31380, 31391, 31400, 31407, 31414, 31421, 31432, 31445, 31458, 0}, {31349, 31356, 31365, 31380, 31391, 31400, 31407, 31414, 31421, 31432, 31445, 31458, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{243,1,254,31463,0,0,0,0},{2947,331,0,0,0,0,0,0,0,0,0,0},{2936,323,0,0,0,0,0,0,0}}, - {3909, 3703, 2936, 2947, 44, 31481, 1924, 1927, {31487, 31494, 31500, 31507, 31518, 31526, 31535}, {31542, 8356, 3860, 31546, 31550, 31554, 10703}, {2411, 2411, 2403, 2403, 5811, 16359, 2018}, {4093, 31558, 31566, 4113, 4119, 31572, 31578, 4136, 31584, 31594, 31602, 31612, 0}, {4093, 31558, 31566, 4113, 4119, 31572, 31578, 4136, 31584, 31594, 31602, 31612, 0}, {31622, 31626, 3860, 29329, 3829, 31630, 31634, 20088, 18317, 2811, 31638, 16316, 0}, {31622, 31626, 3860, 29329, 3829, 31630, 31634, 20088, 18317, 2811, 31638, 16316, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {3909, 2927, 2936, 2947, 44, 352, 0, 0, {31642, 31649, 31657, 31664, 31671, 31679, 31687}, {31694, 31697, 31700, 31703, 31706, 31709, 31712}, {2411, 2411, 2405, 2411, 12798, 4089, 12798}, {31715, 31723, 31733, 31739, 31747, 31752, 31757, 31762, 31769, 20073, 31777, 31785, 0}, {31715, 31723, 31733, 31739, 31747, 31752, 31757, 31762, 31769, 20073, 31777, 31785, 0}, {2778, 31793, 3860, 31797, 3829, 30821, 30825, 31801, 3800, 2811, 31805, 16316, 0}, {2778, 31793, 3860, 31797, 3829, 30821, 30825, 31801, 3800, 2811, 31805, 16316, 0}, 0, 0, 239, 241, {2927,1229,14,243,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {254, 2927, 2936, 2947, 30858, 55, 31809, 31820, {31830, 31848, 31863, 31885, 31898, 31912, 31929}, {31953, 31961, 31966, 31885, 31898, 31978, 31985}, {0, 0, 0, 0, 0, 0, 0}, {31999, 32021, 32037, 32057, 32071, 32088, 32103, 32120, 32134, 32147, 32166, 32180, 0}, {31999, 32021, 32037, 32057, 32071, 32088, 32103, 32120, 32134, 32147, 32166, 32180, 0}, {32199, 32214, 32223, 32236, 32243, 32253, 32261, 32271, 32278, 32284, 32296, 32303, 0}, {32199, 32214, 32223, 32236, 32243, 32253, 32261, 32271, 32278, 32284, 32296, 32303, 0}, 0, 0, 239, 241, {2927,1229,14,243,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {5603, 14, 23, 35, 1906, 3712, 0, 0, {32315, 32323, 15891, 15900, 15909, 32334, 32344}, {16347, 15941, 15945, 15949, 15953, 16210, 32353}, {0, 0, 0, 0, 0, 0, 0}, {32357, 32366, 32376, 32384, 10715, 3833, 32392, 32398, 32407, 32416, 32425, 32434, 0}, {32357, 32366, 32376, 32384, 10715, 3833, 32392, 32398, 32407, 32416, 32425, 32434, 0}, {2778, 2782, 15960, 32443, 10715, 2795, 2799, 20088, 18317, 2811, 32447, 16316, 0}, {2778, 2782, 15960, 32443, 10715, 2795, 2799, 20088, 18317, 2811, 32447, 16316, 0}, 0, 0, 239, 241, {1736,1779,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{35,2947,274,0,0,0,0,0,0,0,0,0},{23,2936,280,0,0,0,0,0,0}}, - {32451, 2309, 280, 274, 1906, 32470, 32483, 32488, {32493, 32500, 32515, 32529, 32545, 32560, 32576}, {6350, 32591, 2505, 32595, 32599, 32603, 32607}, {2018, 12798, 2403, 2013, 2018, 2405, 12798}, {7302, 7310, 32611, 32618, 32625, 2444, 2449, 32630, 32640, 32651, 32660, 32670, 0}, {7302, 7310, 32611, 32618, 32625, 2444, 2449, 32630, 32640, 32651, 32660, 32670, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, 0, 0, 2541, 241, {2309,1236,1210,2543,0,0,0,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {3909, 2927, 2290, 2277, 44, 352, 32680, 32685, {32690, 32706, 32714, 32722, 32731, 32743, 32753}, {32763, 32769, 32775, 32779, 32783, 32791, 3800}, {0, 0, 0, 0, 0, 0, 0}, {32798, 32811, 32825, 32834, 32840, 32844, 32849, 32857, 16271, 32870, 16288, 16296, 0}, {32798, 32811, 32825, 32834, 32840, 32844, 32849, 32857, 16271, 32870, 16288, 16296, 0}, {32879, 2782, 32883, 16304, 32840, 32887, 2799, 32891, 2807, 32899, 2815, 16316, 0}, {32879, 2782, 32883, 16304, 32840, 32887, 2799, 32891, 2807, 32899, 2815, 16316, 0}, 0, 0, 239, 241, {2927,1229,14,243,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {32905, 1366, 1859, 1842, 32929, 32946, 32973, 32980, {32987, 32997, 33007, 33017, 33027, 33037, 33047}, {33057, 33064, 33071, 33078, 33085, 33092, 33099}, {33106, 33110, 33114, 33118, 33122, 33126, 33130}, {33134, 33141, 33148, 33155, 33162, 33169, 33176, 33183, 33190, 33197, 33204, 33214, 0}, {33134, 33141, 33148, 33155, 33162, 33169, 33176, 33183, 33190, 33197, 33204, 33214, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 0, 239, 241, {1366,1718,1727,1747,1210,1736,0,0,0,0,0,0,0,0},{32905,33224,33254,0,0,0,0,0},{1842,331,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {4857, 243, 280, 274, 1906, 352, 0, 0, {28070, 8356, 33284, 33291, 33301, 33306, 33313}, {33320, 6334, 33324, 4941, 33329, 33334, 33339}, {4490, 33344, 33347, 33350, 33353, 33356, 33359}, {33362, 33369, 33284, 33380, 33386, 33390, 33399, 33406, 33411, 33420, 33425, 33428, 0}, {33362, 33369, 33284, 33380, 33386, 33390, 33399, 33406, 33411, 33420, 33425, 33428, 0}, {33434, 33438, 33445, 28193, 33386, 33450, 33455, 33406, 33460, 33420, 33425, 33465, 0}, {33434, 33438, 33445, 28193, 33386, 33450, 33455, 33406, 33460, 33420, 33425, 33465, 0}, 2, 1, 239, 241, {243,14,1245,1236,1210,0,0,0,0,0,0,0,0,0},{4857,5076,3672,0,0,0,0,0},{274,331,5085,5091,5101,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {4857, 243, 280, 274, 1906, 1916, 33469, 33474, {33479, 33487, 33497, 33507, 33516, 33526, 33534}, {33544, 33548, 33553, 33557, 33561, 33565, 33569}, {2018, 2403, 2692, 2403, 2692, 2409, 2018}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 33573, 33582, 33593, 33602, 33612, 0}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 33573, 33582, 33593, 33602, 33612, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, 0, 0, 239, 241, {243,14,1245,1236,1210,0,0,0,0,0,0,0,0,0},{4857,5076,3672,0,0,0,0,0},{274,331,5085,5091,5101,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {33622, 2587, 323, 331, 33657, 33673, 33691, 33696, {33701, 33726, 33755, 33780, 33793, 33808, 33825}, {33840, 33845, 33850, 33855, 33860, 33865, 8657}, {19346, 19346, 33870, 8668, 8671, 19346, 8668}, {33873, 33892, 33907, 33929, 33949, 33965, 33981, 33995, 34021, 34045, 34062, 34079, 0}, {33873, 33892, 33907, 33929, 33949, 33965, 33981, 33995, 34021, 34045, 34062, 34079, 0}, {34096, 34105, 34114, 34128, 34142, 34154, 34166, 34176, 34192, 34206, 34213, 34220, 0}, {34096, 34105, 34114, 34128, 34142, 34154, 34166, 34176, 34192, 34206, 34213, 34220, 0}, 0, 1, 754, 241, {34227,34238,2843,3879,34247,0,0,0,0,0,0,0,0,0},{34258,34276,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {34295, 14812, 323, 331, 1906, 19963, 0, 0, {34315, 34327, 34338, 34350, 34362, 34372, 34384}, {34399, 34404, 34409, 34414, 34419, 34424, 34429}, {0, 0, 0, 0, 0, 0, 0}, {34434, 34443, 34455, 34463, 34468, 34478, 34485, 34494, 34501, 34507, 34516, 34527, 0}, {34434, 34443, 34455, 34463, 34468, 34478, 34485, 34494, 34501, 34507, 34516, 34527, 0}, {34535, 34540, 34545, 34550, 34555, 34560, 34565, 34419, 34570, 34575, 34580, 34585, 0}, {34535, 34540, 34545, 34550, 34555, 34560, 34565, 34419, 34570, 34575, 34580, 34585, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {5603, 243, 280, 274, 1906, 352, 34590, 34592, {34594, 34607, 34615, 34624, 34634, 34644, 34653}, {34665, 34669, 34673, 34677, 34681, 34685, 34689}, {2692, 2411, 2403, 7548, 12798, 5811, 2018}, {34693, 34707, 34718, 34727, 34738, 34750, 34764, 34776, 34789, 34802, 34814, 34827, 0}, {34693, 34707, 34718, 34727, 34738, 34750, 34764, 34776, 34789, 34802, 34814, 34827, 0}, {34841, 34846, 34852, 34858, 34863, 34869, 34875, 34880, 34886, 34891, 19049, 34897, 0}, {34841, 34846, 34852, 34858, 34863, 34869, 34875, 34880, 34886, 34891, 19049, 34897, 0}, 2, 1, 239, 241, {243,14,1229,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,35,2947,0,0,0,0,0,0,0,0},{280,323,23,2936,0,0,0,0,0}}, - {1, 14, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 0, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{1,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {289, 308, 323, 331, 336, 352, 359, 370, {381, 394, 415, 430, 441, 460, 471}, {484, 489, 494, 499, 504, 509, 514}, {519, 522, 525, 528, 531, 522, 528}, {534, 547, 564, 573, 584, 591, 598, 605, 618, 637, 654, 669, 0}, {534, 547, 564, 573, 584, 591, 598, 605, 618, 637, 654, 669, 0}, {686, 692, 564, 702, 584, 591, 598, 710, 718, 728, 736, 746, 0}, {686, 692, 564, 702, 584, 591, 598, 710, 718, 728, 736, 746, 0}, 2, 1, 754, 241, {308,756,772,788,0,0,0,0,0,0,0,0,0,0},{289,805,823,848,0,0,0,0},{872,884,0,0,0,0,0,0,0,0,0,0},{895,910,0,0,0,0,0,0,0}}, - {924, 243, 323, 331, 947, 352, 962, 968, {974, 983, 991, 999, 1008, 1015, 1025}, {1034, 1038, 1042, 1046, 1050, 1054, 1058}, {1062, 1065, 1068, 1071, 1074, 1077, 1080}, {1083, 1089, 1096, 1102, 1108, 1113, 1118, 1125, 1131, 1140, 1148, 1157, 0}, {1083, 1089, 1096, 1102, 1108, 1113, 1118, 1125, 1131, 1140, 1148, 1157, 0}, {1166, 1171, 1096, 1176, 1108, 1113, 1181, 1186, 1190, 1195, 1200, 1205, 0}, {1166, 1171, 1096, 1176, 1108, 1113, 1181, 1186, 1190, 1195, 1200, 1205, 0}, 2, 1, 239, 241, {243,14,1210,1221,1229,1236,1245,0,0,0,0,0,0,0},{1254,1280,1296,0,0,0,0,0},{274,331,1312,0,0,0,0,0,0,0,0,0},{280,323,1324,0,0,0,0,0,0}}, - {1344, 1366, 1870, 1850, 1375, 1391, 1404, 1411, {1418, 1428, 1438, 1448, 1458, 1468, 1478}, {34903, 34910, 34917, 34924, 34931, 34938, 34945}, {1537, 1541, 1545, 1549, 1553, 1557, 1561}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, 0, 0, 239, 241, {1366,1736,1210,0,0,0,0,0,0,0,0,0,0,0},{1344,6759,0,0,0,0,0,0},{1850,1842,274,331,0,0,0,0,0,0,0,0},{1870,1859,280,323,0,0,0,0,0}}, - {1882, 1895, 323, 331, 1906, 1916, 1924, 1927, {1930, 1938, 1948, 1956, 1964, 1973, 1980}, {1987, 1990, 1993, 1997, 2000, 2004, 2008}, {2011, 2013, 2015, 2018, 2020, 2013, 2018}, {2023, 2029, 2035, 2043, 2049, 2057, 2065, 2075, 2081, 2089, 2097, 2106, 0}, {2115, 2121, 2128, 2136, 2142, 2150, 2158, 2168, 2081, 2174, 2182, 2192, 0}, {2201, 2205, 2210, 2215, 2219, 2224, 2229, 2234, 2238, 2244, 2250, 2254, 0}, {2201, 2205, 2210, 2215, 2219, 2224, 2229, 2234, 2238, 2244, 2250, 2254, 0}, 2, 1, 2258, 241, {2261,2270,1210,1718,1758,0,0,0,0,0,0,0,0,0},{1882,0,0,0,0,0,0,0},{331,274,2277,2285,0,0,0,0,0,0,0,0},{323,280,2290,2301,0,0,0,0,0}}, - {1882, 2309, 280, 274, 1906, 1916, 1924, 1927, {2320, 2328, 2335, 2343, 2350, 2358, 2365}, {2373, 2378, 2382, 2386, 2390, 2394, 2398}, {2018, 2403, 2405, 2407, 2405, 2409, 2411}, {2413, 2420, 2428, 2434, 2440, 2444, 2449, 2454, 2461, 2471, 2479, 2488, 0}, {2413, 2420, 2428, 2434, 2440, 2444, 2449, 2454, 2461, 2471, 2479, 2488, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, 2, 1, 2541, 241, {2309,1236,1210,2543,0,0,0,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {2568, 2587, 280, 274, 1906, 1916, 2598, 2604, {2611, 2619, 2626, 2635, 2644, 2655, 2663}, {2671, 2674, 2677, 2680, 2683, 2686, 2689}, {2018, 2403, 2692, 2403, 2692, 2409, 2018}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, 2, 1, 754, 241, {2587,2823,1245,2835,2843,2261,1210,0,0,0,0,0,0,0},{2568,1882,2850,0,0,0,0,0},{274,331,2285,2862,0,0,0,0,0,0,0,0},{280,2873,2887,2902,0,0,0,0,0}}, - {2909, 2927, 2936, 2947, 1906, 352, 2955, 2962, {2969, 2984, 2999, 3010, 3025, 3038, 3057}, {3072, 3079, 3086, 3093, 3100, 3107, 3114}, {3121, 3124, 3127, 3127, 3130, 3130, 3133}, {3136, 3157, 3180, 3195, 3212, 3223, 3238, 3253, 3272, 3295, 3314, 3333, 0}, {3354, 3375, 3398, 3413, 3430, 3441, 3456, 3471, 3490, 3513, 3532, 3551, 0}, {3572, 3579, 3586, 3593, 3600, 3607, 3616, 3625, 3632, 3639, 3646, 3653, 0}, {3572, 3579, 3586, 3593, 3600, 3607, 3616, 3625, 3632, 3639, 3646, 3653, 0}, 2, 1, 239, 241, {2927,243,1229,14,3660,1210,0,0,0,0,0,0,0,0},{2909,3672,0,0,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {3684, 3703, 2936, 2947, 1906, 3712, 1924, 1927, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {1882, 2261, 323, 331, 1906, 4391, 4401, 4405, {4409, 4421, 4433, 4443, 4457, 4467, 4479}, {4490, 4493, 4496, 4499, 4502, 4505, 4508}, {2018, 2403, 2405, 4511, 2405, 2013, 2411}, {4513, 4522, 4531, 4541, 4550, 4559, 4568, 4578, 4585, 4593, 4601, 4611, 0}, {4620, 4631, 4642, 4654, 4665, 4676, 4687, 4699, 4708, 4718, 4728, 4740, 0}, {4751, 4757, 4763, 4770, 4776, 4782, 4788, 4795, 4799, 4804, 4809, 4816, 0}, {4751, 4757, 4763, 4770, 4776, 4782, 4788, 4795, 4799, 4804, 4809, 4816, 0}, 2, 1, 754, 241, {2261,2587,2843,1210,0,0,0,0,0,0,0,0,0,0},{4822,4839,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {4857, 243, 280, 274, 1906, 352, 1924, 1927, {4874, 4883, 4889, 4895, 4904, 4910, 4919}, {4926, 4931, 4936, 4941, 4946, 4951, 4956}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, 2, 1, 239, 241, {243,14,1245,1236,1210,0,0,0,0,0,0,0,0,0},{4857,5076,3672,0,0,0,0,0},{274,331,5085,5091,5101,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {5109, 243, 280, 274, 1906, 55, 5127, 5140, {5151, 5169, 5183, 5201, 5219, 5237, 5253}, {5267, 5279, 5291, 5303, 5315, 5327, 5339}, {5346, 5351, 5356, 5361, 5366, 5371, 5376}, {5381, 5392, 5405, 5412, 5423, 5430, 5439, 5448, 5461, 5474, 5489, 5502, 0}, {5381, 5392, 5405, 5412, 5423, 5430, 5439, 5448, 5461, 5474, 5489, 5502, 0}, {5513, 5522, 5405, 5531, 5423, 5540, 5549, 5558, 5567, 5576, 5585, 5594, 0}, {5513, 5522, 5405, 5531, 5423, 5540, 5549, 5558, 5567, 5576, 5585, 5594, 0}, 0, 0, 239, 241, {243,5603,14,1,1236,2309,5616,1210,5629,5646,0,0,0,0},{5109,5603,5656,5678,5629,0,0,0},{274,35,0,0,0,0,0,0,0,0,0,0},{280,23,0,0,0,0,0,0,0}}, - {5699, 5713, 323, 331, 5725, 5736, 5744, 5748, {5752, 5762, 5770, 5775, 5782, 5795, 5803}, {4091, 5811, 4511, 5813, 5817, 2013, 5820}, {4091, 5811, 4511, 5824, 5817, 2013, 5824}, {5827, 5835, 5844, 5853, 5862, 5869, 5877, 5885, 5895, 5906, 2479, 2488, 0}, {5827, 5835, 5844, 5853, 5862, 5869, 5877, 5885, 5895, 5906, 2479, 2488, 0}, {5915, 5920, 5926, 5933, 5939, 5945, 5951, 5957, 5962, 5969, 1200, 5974, 0}, {5915, 5920, 5926, 5933, 5939, 5945, 5951, 5957, 5962, 5969, 1200, 5974, 0}, 2, 1, 754, 241, {5713,5979,1210,5993,0,0,0,0,0,0,0,0,0,0},{5699,0,0,0,0,0,0,0},{331,274,2947,0,0,0,0,0,0,0,0,0},{323,280,2936,0,0,0,0,0,0}}, - {1882, 2261, 280, 274, 1906, 1916, 6002, 6007, {6012, 6023, 6034, 6048, 6062, 6074, 6086}, {6098, 6103, 6109, 6115, 6121, 6126, 6132}, {2018, 2403, 6137, 2403, 2409, 2409, 2411}, {6140, 6148, 4978, 6157, 6164, 6169, 6176, 6183, 2461, 5906, 6191, 6201, 0}, {6140, 6148, 4978, 6157, 6164, 6169, 6176, 6183, 2461, 5906, 6191, 6201, 0}, {5915, 1171, 4936, 6210, 6164, 5945, 5951, 6215, 6222, 5969, 6227, 1205, 0}, {5915, 1171, 4936, 6210, 6164, 5945, 5951, 6215, 6222, 5969, 6227, 1205, 0}, 2, 1, 754, 241, {2261,1245,6233,6245,1210,6259,0,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {4857, 243, 280, 274, 1906, 352, 1924, 1927, {6268, 6277, 6285, 6294, 6305, 6314, 6323}, {6330, 6334, 2505, 6338, 6342, 6346, 6350}, {2692, 2411, 2403, 2403, 6354, 4091, 2018}, {6356, 6364, 4107, 6373, 6380, 6387, 6394, 4136, 6401, 6411, 6419, 6428, 0}, {6437, 6445, 4196, 6454, 6461, 6468, 6475, 4219, 6482, 6492, 1148, 6500, 0}, {6509, 2501, 2505, 2509, 6513, 6517, 6521, 6525, 6529, 6533, 2533, 6537, 0}, {6509, 2501, 2505, 2509, 6513, 6517, 6521, 6525, 6529, 6533, 2533, 6537, 0}, 2, 1, 239, 241, {243,3660,14,6541,1229,1210,0,0,0,0,0,0,0,0},{4857,6549,3672,0,0,0,0,0},{274,331,2285,5085,0,0,0,0,0,0,0,0},{280,2301,6558,0,0,0,0,0,0}}, - {1344, 1736, 323, 331, 1375, 1391, 6567, 6574, {6581, 6591, 6601, 6611, 6621, 6631, 6641}, {1537, 6651, 6655, 6659, 6663, 6667, 6671}, {1537, 6651, 6655, 6659, 6663, 6667, 6671}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 0, 239, 241, {1736,1779,1765,1366,6702,6721,6738,1210,0,0,0,0,0,0},{1344,6759,6783,6810,0,0,0,0},{331,274,1842,1850,0,0,0,0,0,0,0,0},{323,280,1859,1870,0,0,0,0,0}}, - {6839, 1210, 1859, 1842, 6868, 6885, 6899, 6906, {6913, 6923, 6933, 6943, 6953, 6963, 6973}, {6983, 6987, 6991, 6995, 6999, 7003, 7007}, {6983, 6987, 6991, 6995, 6999, 7003, 7007}, {7011, 7016, 7021, 7026, 7031, 7036, 7041, 7046, 7051, 7056, 7062, 7068, 0}, {7011, 7016, 7021, 7026, 7031, 7036, 7041, 7046, 7051, 7056, 7062, 7068, 0}, {7011, 7016, 7021, 7026, 7031, 7036, 7041, 7046, 7051, 7056, 7062, 7068, 0}, {7011, 7016, 7021, 7026, 7031, 7036, 7041, 7046, 7051, 7056, 7062, 7068, 0}, 0, 0, 2541, 241, {1210,5993,1758,1718,0,0,0,0,0,0,0,0,0,0},{6839,7074,7098,7125,7147,7178,0,0},{1842,1850,331,274,0,0,0,0,0,0,0,0},{1859,1870,323,280,0,0,0,0,0}}, - {4857, 7204, 280, 274, 1906, 352, 7213, 7218, {7223, 7230, 7238, 7246, 7255, 7265, 7273}, {7282, 4493, 7285, 7288, 7291, 7294, 7297}, {7300, 2403, 2692, 3804, 2692, 4091, 7300}, {7302, 7310, 7319, 2434, 7325, 2444, 2449, 7329, 2461, 2471, 2479, 2488, 0}, {7302, 7310, 7319, 2434, 7325, 2444, 2449, 7329, 2461, 2471, 2479, 2488, 0}, {2497, 2501, 7338, 2509, 7325, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 7338, 2509, 7325, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, 2, 1, 2541, 241, {7204,2270,1236,14,1245,2823,1210,0,0,0,0,0,0,0},{4857,6549,3672,5076,0,0,0,0},{331,274,2285,7342,7354,0,0,0,0,0,0,0},{323,280,7366,7381,0,0,0,0,0}}, - {1882, 2587, 280, 274, 1906, 1916, 7213, 7218, {2320, 2328, 2335, 2343, 2350, 2358, 2365}, {7396, 7401, 7405, 7409, 7413, 7417, 7421}, {2018, 2403, 2405, 2407, 2405, 2409, 2411}, {2413, 2420, 4978, 2434, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2413, 2420, 4978, 2434, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, 2, 1, 754, 241, {2587,1245,2843,1210,2823,0,0,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{274,331,7430,5085,0,0,0,0,0,0,0,0},{280,323,7441,6558,0,0,0,0,0}}, - {3672, 1210, 280, 274, 1906, 352, 1924, 1927, {7455, 7465, 7479, 7486, 7493, 7502, 1980}, {7510, 7517, 7522, 7526, 7531, 7536, 7540}, {2011, 2013, 3804, 7545, 7548, 2013, 2018}, {7550, 7559, 7564, 7571, 2440, 7581, 7590, 7597, 7607, 7617, 2097, 7630, 0}, {7640, 7649, 7656, 7662, 7671, 7676, 7684, 7690, 7699, 7709, 7723, 7733, 0}, {7741, 7745, 2505, 7749, 2440, 7753, 7757, 7761, 7765, 7769, 2250, 7774, 0}, {7741, 7745, 2505, 7749, 2440, 7753, 7757, 7761, 7765, 7769, 2250, 7774, 0}, 2, 1, 2541, 241, {1210,5993,0,0,0,0,0,0,0,0,0,0,0,0},{3672,5603,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {3957, 243, 280, 274, 947, 3985, 1924, 1927, {3997, 7778, 7792, 7805, 7818, 7831, 4044}, {6330, 7843, 7847, 7851, 7855, 7859, 7863}, {2692, 2018, 2405, 7868, 7868, 2018, 2018}, {7870, 7878, 7888, 1102, 7895, 7900, 7906, 4219, 7912, 7921, 7929, 7938, 0}, {7870, 7878, 7888, 1102, 7895, 7900, 7906, 4219, 7912, 7921, 7929, 7938, 0}, {2497, 7947, 2505, 7951, 4989, 2513, 2517, 6525, 6529, 7955, 2533, 7959, 0}, {2497, 7947, 2505, 7951, 4989, 2513, 2517, 6525, 6529, 7955, 2533, 7959, 0}, 0, 0, 239, 241, {243,14,2927,1229,1236,2309,2270,7204,1245,2587,2823,2843,2261,1210},{3957,4369,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {7963, 2309, 280, 274, 1906, 352, 7992, 7995, {7998, 8007, 4889, 8017, 8025, 8033, 8042}, {8048, 8051, 4493, 8055, 8058, 8062, 2008}, {2692, 6354, 2403, 2403, 6354, 4091, 2018}, {8065, 8073, 4978, 8080, 8087, 8092, 8102, 8110, 8116, 8126, 2479, 2488, 0}, {8065, 8073, 4978, 8080, 8087, 8092, 8102, 8110, 8116, 8126, 2479, 2488, 0}, {8134, 8141, 4978, 5053, 8087, 8147, 8154, 8110, 8159, 1195, 1200, 5974, 0}, {8134, 8141, 4978, 5053, 8087, 8147, 8154, 8110, 8159, 1195, 1200, 5974, 0}, 2, 1, 2541, 241, {243,14,1221,8165,1229,243,1210,0,0,0,0,0,0,0},{2909,3672,5076,0,0,0,0,0},{274,331,8173,8185,8196,8204,8214,8223,2862,8229,8237,8242},{280,323,8245,8260,2887,2873,8274,8287,2902}}, - {3672, 2587, 323, 331, 1906, 352, 7213, 7218, {8299, 8309, 8314, 8321, 8330, 8334, 8341}, {8352, 8356, 3860, 8360, 8364, 8368, 8372}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {8377, 8386, 8396, 8403, 4989, 8411, 8417, 2454, 8423, 8434, 8444, 8454, 0}, {8377, 8386, 8396, 8403, 4989, 8411, 8417, 2454, 8423, 8434, 8444, 8454, 0}, {8464, 1171, 4936, 6210, 4989, 8469, 8474, 5957, 5064, 1195, 1200, 5974, 0}, {8464, 1171, 4936, 6210, 4989, 8469, 8474, 5957, 5064, 1195, 1200, 5974, 0}, 0, 1, 754, 241, {2587,2261,1210,0,0,0,0,0,0,0,0,0,0,0},{3672,0,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {805, 2587, 323, 331, 1906, 352, 8479, 8499, {8525, 8548, 415, 8571, 8582, 8597, 8612}, {8627, 8632, 8637, 8642, 8647, 8652, 8657}, {8662, 8665, 8662, 8668, 8671, 8665, 8668}, {8674, 8687, 8702, 8711, 8724, 8731, 8740, 8749, 8762, 8779, 8794, 8807, 0}, {8822, 8835, 8850, 8861, 8874, 8881, 8890, 8899, 8914, 8931, 8946, 8959, 0}, {8974, 8982, 8702, 8992, 8724, 8731, 8740, 9000, 9008, 9018, 9026, 9036, 0}, {8974, 8982, 8702, 8992, 8724, 8731, 8740, 9000, 9008, 9018, 9026, 9036, 0}, 0, 1, 754, 241, {2587,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{805,289,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {9044, 9058, 323, 331, 44, 1916, 1924, 1927, {9068, 9077, 9089, 9096, 9104, 9114, 9120}, {9127, 9131, 9135, 9139, 9143, 9148, 9152}, {9156, 9158, 9160, 9162, 9164, 9158, 9162}, {9167, 9177, 9186, 9194, 9202, 9210, 9217, 9224, 9232, 2097, 9238, 9246, 0}, {9255, 9265, 9274, 9282, 9290, 9298, 9305, 9312, 9321, 7723, 9327, 9337, 0}, {9346, 9350, 9355, 9360, 9364, 7757, 2234, 9368, 9372, 2250, 9376, 2254, 0}, {9346, 9350, 9355, 9360, 9364, 7757, 2234, 9368, 9372, 2250, 9376, 2254, 0}, 0, 1, 754, 241, {9058,9380,6233,9388,9400,9410,9420,1210,0,0,0,0,0,0},{9044,9432,9447,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1882, 2261, 323, 331, 1906, 1916, 1924, 1927, {9467, 9475, 9484, 9491, 9498, 9507, 1980}, {1987, 1990, 9514, 1997, 9517, 9521, 2008}, {2011, 2013, 9524, 2018, 9526, 2013, 2018}, {5827, 5835, 9529, 6157, 9535, 9540, 9545, 2454, 2461, 5906, 2479, 2488, 0}, {9550, 9559, 7656, 9569, 9577, 9583, 9589, 9595, 9603, 9613, 9622, 9631, 0}, {2497, 2501, 2505, 2509, 9535, 9540, 9545, 2521, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 9535, 9540, 9545, 2521, 2525, 2529, 2533, 2537, 0}, 2, 1, 754, 241, {1895,2261,9640,2843,2587,1245,1210,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{331,274,2285,0,0,0,0,0,0,0,0,0},{323,280,2301,0,0,0,0,0,0}}, - {2909, 2261, 280, 274, 1906, 352, 9649, 9658, {9666, 9673, 9682, 9691, 9703, 9711, 9720}, {9730, 9734, 3860, 9739, 9744, 9748, 9752}, {2692, 5811, 2403, 2403, 9756, 2013, 2018}, {9758, 9764, 4978, 9771, 2440, 9777, 9785, 9792, 9798, 9806, 9812, 9820, 0}, {9758, 9764, 4978, 9771, 2440, 9777, 9785, 9792, 9798, 9806, 9812, 9820, 0}, {2778, 9828, 3860, 9832, 9836, 9840, 9844, 9848, 9752, 9852, 9856, 9861, 0}, {2778, 9828, 3860, 9832, 9836, 9840, 9844, 9848, 9752, 9852, 9856, 9861, 0}, 0, 1, 754, 241, {1210,5993,0,0,0,0,0,0,0,0,0,0,0,0},{1210,0,0,0,0,0,0,0},{9865,274,0,0,0,0,0,0,0,0,0,0},{9873,280,0,0,0,0,0,0,0}}, - {9884, 1210, 280, 274, 1906, 9902, 9915, 9918, {9921, 9929, 9937, 2343, 2350, 2358, 9944}, {9952, 9957, 9962, 9966, 9970, 9974, 9978}, {2018, 2403, 2405, 2407, 2405, 2409, 2411}, {9983, 9991, 10000, 2715, 9836, 2725, 2730, 10005, 2742, 2752, 2760, 3851, 0}, {7302, 7310, 4978, 2434, 2440, 2444, 2449, 10013, 2461, 2471, 2479, 2488, 0}, {2778, 2782, 3860, 2791, 9836, 2795, 2799, 2803, 2807, 2811, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 9836, 2795, 2799, 2803, 2807, 2811, 2815, 3868, 0}, 2, 1, 2541, 241, {1210,5993,0,0,0,0,0,0,0,0,0,0,0,0},{9884,10021,0,0,0,0,0,0},{274,331,10044,0,0,0,0,0,0,0,0,0},{280,323,10054,0,0,0,0,0,0}}, - {3672, 2927, 323, 331, 1906, 352, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 0, 239, 241, {2927,1229,14,243,10067,10078,1210,0,0,0,0,0,0,0},{3672,10090,10106,0,0,0,0,0},{331,274,2947,35,0,0,0,0,0,0,0,0},{323,280,2936,23,0,0,0,0,0}}, - {10148, 2261, 280, 274, 1906, 352, 10165, 10170, {10174, 10180, 10190, 10196, 10207, 10217, 10222}, {10232, 10236, 10240, 10244, 10249, 10253, 10257}, {2013, 2013, 2018, 10261, 2013, 7548, 7548}, {10264, 10269, 10276, 10281, 10287, 10294, 10302, 10309, 10318, 10325, 10330, 10337, 0}, {10264, 10269, 10276, 10281, 10287, 10294, 10302, 10309, 10318, 10325, 10330, 10337, 0}, {10345, 10349, 3860, 10354, 3829, 10358, 10362, 10366, 10371, 10375, 10379, 10383, 0}, {10345, 10349, 3860, 10354, 3829, 10358, 10362, 10366, 10371, 10375, 10379, 10383, 0}, 0, 1, 754, 241, {2587,1245,1210,0,0,0,0,0,0,0,0,0,0,0},{10387,5603,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {3943, 243, 2936, 2947, 44, 55, 10405, 10423, {10441, 10452, 10465, 10474, 10481, 10494, 10503}, {10441, 10452, 10465, 10474, 10481, 10494, 10503}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {10512, 10523, 10534, 10543, 10554, 10561, 10568, 10581, 10590, 10601, 10614, 10625, 0}, {10512, 10523, 10534, 10543, 10554, 10561, 10568, 10581, 10590, 10601, 10614, 10625, 0}, {10512, 10523, 10534, 10543, 10554, 10561, 10568, 10581, 10590, 10601, 10614, 10625, 0}, {10512, 10523, 10534, 10543, 10554, 10561, 10568, 10581, 10590, 10601, 10614, 10625, 0}, 0, 0, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {5603, 243, 323, 331, 1906, 55, 1924, 1927, {10636, 10643, 10649, 10656, 10661, 10667, 10673}, {10679, 10683, 10687, 10691, 10695, 10699, 10703}, {2403, 2018, 2018, 10707, 4511, 4089, 2018}, {9983, 9991, 10709, 2715, 10715, 2725, 2730, 10719, 2742, 2752, 2760, 10727, 0}, {9983, 9991, 10709, 2715, 10715, 2725, 2730, 10719, 2742, 2752, 2760, 10727, 0}, {2778, 2782, 3860, 2791, 10715, 2795, 2799, 10736, 2807, 2811, 2815, 10740, 0}, {2778, 2782, 3860, 2791, 10715, 2795, 2799, 10736, 2807, 2811, 2815, 10740, 0}, 0, 0, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {10744, 2587, 323, 331, 10762, 352, 10778, 10783, {10788, 10801, 10820, 10837, 10850, 10863, 10880}, {10893, 8632, 8637, 8642, 8647, 8652, 8657}, {10898, 8665, 8662, 8668, 8671, 8665, 8668}, {10901, 10914, 10925, 10942, 10957, 10972, 10987, 11000, 11015, 11032, 11047, 11064, 0}, {11079, 11090, 11103, 11118, 11131, 11144, 11157, 11168, 11181, 11196, 11209, 11228, 0}, {11241, 11248, 11255, 11262, 11269, 11276, 11283, 11290, 11297, 11304, 11311, 11318, 0}, {11241, 11248, 11255, 11262, 11269, 11276, 11283, 11290, 11297, 11304, 11311, 11318, 0}, 0, 1, 754, 241, {2587,1245,1210,0,0,0,0,0,0,0,0,0,0,0},{10744,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3672, 1245, 280, 274, 1906, 352, 11325, 11338, {11351, 11366, 11387, 11402, 11415, 11428, 10880}, {484, 489, 11443, 499, 11448, 509, 514}, {519, 522, 11453, 528, 531, 522, 528}, {11456, 11473, 11482, 11497, 584, 11514, 11529, 11542, 11557, 11574, 11595, 11612, 0}, {11627, 11644, 11657, 11674, 8874, 11693, 11708, 11721, 11734, 11749, 11772, 11791, 0}, {11804, 11811, 11818, 11825, 584, 11832, 11839, 11846, 11853, 11860, 11867, 11874, 0}, {11804, 11811, 11818, 11825, 584, 11832, 11839, 11846, 11853, 11860, 11867, 11874, 0}, 0, 0, 754, 241, {2587,1245,1210,0,0,0,0,0,0,0,0,0,0,0},{3672,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1882, 2261, 323, 331, 1906, 1916, 11881, 11886, {11891, 11899, 11910, 11916, 11922, 11931, 1980}, {9127, 9131, 2390, 11937, 9143, 9148, 11941}, {9156, 9158, 11945, 9162, 9164, 9158, 9162}, {2413, 2420, 9529, 2434, 2440, 11947, 11953, 11959, 2461, 2471, 2479, 2488, 0}, {2413, 2420, 9529, 2434, 2440, 11947, 11953, 11959, 2461, 2471, 2479, 2488, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1882, 11981, 323, 331, 1906, 11991, 12000, 12005, {12010, 12021, 12032, 12043, 12054, 12065, 12071}, {2013, 9756, 2405, 4511, 2011, 10707, 2411}, {2013, 9756, 2405, 4511, 2011, 10707, 2411}, {12080, 12088, 12097, 12104, 4989, 12111, 12117, 2454, 2461, 12123, 2479, 12132, 0}, {12080, 12088, 12097, 12104, 4989, 12111, 12117, 2454, 2461, 12123, 2479, 12132, 0}, {12142, 12147, 12097, 2509, 4989, 12111, 12117, 2521, 12153, 2529, 2533, 12158, 0}, {12142, 12147, 12097, 2509, 4989, 12111, 12117, 2521, 12153, 2529, 2533, 12158, 0}, 2, 1, 754, 241, {11981,2587,1245,1210,0,0,0,0,0,0,0,0,0,0},{12163,12182,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {12202, 9388, 323, 331, 12229, 1916, 12247, 12264, {12278, 12289, 12299, 12308, 12319, 12331, 12342}, {12352, 12355, 12358, 12361, 12364, 12367, 12370}, {2018, 2013, 2407, 2405, 7548, 2013, 2018}, {12373, 12383, 12394, 12400, 12409, 12415, 12423, 12431, 12439, 12450, 12459, 12469, 0}, {12479, 12489, 2428, 12500, 12509, 12515, 12523, 12531, 12539, 12550, 12559, 12569, 0}, {12579, 12585, 12394, 12591, 12409, 12596, 12602, 12608, 4292, 12613, 4303, 12618, 0}, {12579, 12585, 12394, 12591, 12409, 12596, 12602, 12608, 4292, 12613, 4303, 12618, 0}, 0, 1, 754, 241, {5713,12623,1210,0,0,0,0,0,0,0,0,0,0,0},{12202,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {12633, 1210, 280, 274, 12655, 12670, 12682, 11886, {12688, 12700, 12712, 12724, 12738, 12753, 12766}, {12780, 12783, 12786, 12789, 12792, 12795, 9517}, {2018, 2013, 12798, 2405, 4511, 2013, 9526}, {12800, 12807, 12815, 12821, 12830, 12839, 12849, 12855, 12866, 12876, 12883, 12893, 0}, {12800, 12807, 12815, 12821, 12830, 12839, 12849, 12855, 12866, 12876, 12883, 12893, 0}, {12901, 12907, 12912, 12917, 12922, 12927, 12934, 12940, 12946, 12952, 12958, 12965, 0}, {12901, 12907, 12912, 12917, 12922, 12927, 12934, 12940, 12946, 12952, 12958, 12965, 0}, 2, 1, 2541, 241, {1747,1210,0,0,0,0,0,0,0,0,0,0,0,0},{12633,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {12972, 2587, 280, 274, 1906, 55, 12990, 13002, {13014, 13029, 13044, 13059, 13076, 13095, 13106}, {13117, 13124, 13131, 13138, 13145, 13152, 13159}, {0, 0, 0, 0, 0, 0, 0}, {13166, 13177, 8702, 13190, 8724, 13201, 13208, 8749, 13215, 13230, 13243, 13254, 0}, {13166, 13177, 8702, 13190, 8724, 13201, 13208, 8749, 13215, 13230, 13243, 13254, 0}, {13267, 13274, 13281, 13288, 8724, 13201, 13208, 13295, 13302, 13309, 13316, 13323, 0}, {13267, 13274, 13281, 13288, 8724, 13201, 13208, 13295, 13302, 13309, 13316, 13323, 0}, 0, 1, 754, 241, {1245,1210,0,0,0,0,0,0,0,0,0,0,0,0},{3672,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}}, - {13330, 243, 23, 35, 44, 352, 13349, 13369, {13386, 13399, 13412, 13428, 13445, 13460, 13469}, {13386, 13399, 13412, 13428, 13445, 13460, 13469}, {13478, 13481, 13484, 13487, 13490, 13493, 13496}, {13499, 13512, 13523, 13532, 13543, 13548, 13557, 13568, 13575, 13590, 13601, 13614, 0}, {13627, 13642, 13523, 13532, 13655, 13548, 13662, 13568, 13575, 13590, 13601, 13614, 0}, {13499, 13512, 13523, 13532, 13543, 13548, 13557, 13568, 13575, 13590, 13601, 13614, 0}, {13499, 13512, 13523, 13532, 13543, 13548, 13557, 13568, 13575, 13590, 13601, 13614, 0}, 0, 6, 239, 241, {3888,3879,0,0,0,0,0,0,0,0,0,0,0,0},{3909,3929,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {5603, 243, 2936, 2947, 1906, 55, 13675, 13678, {13681, 13694, 13704, 13713, 13723, 13734, 13745}, {13757, 13760, 13765, 13770, 13775, 13780, 13785}, {13757, 13790, 13793, 13796, 13799, 13802, 13805}, {13808, 13817, 13826, 13835, 13844, 13853, 13862, 13871, 13880, 13889, 13899, 13909, 0}, {13919, 13928, 13937, 13946, 13955, 13964, 13973, 13982, 13991, 14000, 14010, 14020, 0}, {14030, 14036, 14042, 14048, 14054, 14060, 14066, 14072, 14078, 14084, 14091, 14098, 0}, {14030, 14036, 14042, 14048, 14054, 14060, 14066, 14072, 14078, 14084, 14091, 14098, 0}, 0, 1, 239, 241, {243,14,1236,2309,1210,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {14105, 2587, 280, 274, 44, 352, 14118, 14142, {14166, 14179, 14200, 14219, 14240, 14259, 14272}, {14283, 14290, 14297, 14304, 14311, 14318, 14325}, {14332, 14335, 14335, 14338, 14341, 14344, 14349}, {14352, 14367, 14382, 14391, 14402, 14413, 14426, 14439, 14454, 14473, 14492, 14509, 0}, {14528, 14545, 14562, 14573, 14586, 14599, 14614, 14629, 14646, 14667, 14688, 14707, 0}, {14728, 14735, 14742, 14749, 14756, 14763, 14770, 14777, 14784, 14791, 14798, 14805, 0}, {14728, 14735, 14742, 14749, 14756, 14763, 14770, 14777, 14784, 14791, 14798, 14805, 0}, 0, 1, 754, 241, {2587,1245,14812,243,14822,3660,1210,0,0,0,0,0,0,0},{14105,2909,13330,5603,14833,14844,14856,14873},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {14891, 2587, 280, 274, 1906, 352, 1924, 1927, {14913, 14919, 14933, 14956, 14970, 14986, 14993}, {15002, 15005, 15010, 15016, 15020, 7548, 15025}, {6687, 6675, 6677, 6679, 6681, 6683, 6685}, {15029, 15036, 10276, 15043, 3829, 15049, 15055, 15061, 15068, 15077, 15085, 15092, 0}, {15099, 15106, 15113, 15118, 15124, 15128, 15133, 15138, 15145, 15154, 15162, 15169, 0}, {15176, 7947, 2505, 2509, 15124, 15180, 15184, 15188, 15192, 2529, 15196, 15200, 0}, {15176, 7947, 2505, 2509, 15124, 15180, 15184, 15188, 15192, 2529, 15196, 15200, 0}, 0, 1, 754, 241, {2587,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{3672,5603,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {15204, 1736, 323, 331, 15237, 15254, 1924, 1927, {15269, 15277, 15288, 15298, 15309, 15318, 15327}, {15337, 15341, 15345, 15349, 15353, 15357, 15361}, {15365, 12798, 12798, 12798, 2407, 2407, 2411}, {15367, 15377, 15385, 15393, 15401, 15409, 15416, 15424, 15432, 15439, 15445, 15452, 0}, {15460, 15471, 15480, 15489, 15498, 15507, 15515, 15524, 15533, 15541, 15548, 15556, 0}, {15565, 15570, 4936, 15575, 15580, 15585, 15590, 15595, 15600, 15605, 15610, 15615, 0}, {15565, 15570, 4936, 15575, 15580, 15585, 15590, 15595, 15600, 15605, 15610, 15615, 0}, 2, 1, 239, 241, {1736,1210,0,0,0,0,0,0,0,0,0,0,0,0},{15620,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{323,280,1324,0,0,0,0,0,0}}, - {13330, 2587, 280, 274, 1906, 352, 15647, 15668, {15685, 394, 415, 8571, 15698, 15715, 15726}, {15739, 15747, 15755, 15761, 15769, 15777, 15785}, {519, 522, 525, 528, 531, 522, 528}, {15793, 547, 564, 573, 15808, 15815, 15824, 605, 618, 637, 654, 669, 0}, {15793, 547, 564, 573, 15808, 15815, 15824, 605, 618, 637, 654, 669, 0}, {15833, 15841, 15849, 702, 15808, 15857, 15865, 710, 718, 728, 736, 746, 0}, {15833, 15841, 15849, 702, 15808, 15857, 15865, 710, 718, 728, 736, 746, 0}, 0, 1, 754, 241, {2587,1245,1210,0,0,0,0,0,0,0,0,0,0,0},{13330,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {5603, 14, 23, 35, 1906, 352, 0, 0, {15873, 15880, 15891, 15900, 15909, 15916, 15927}, {15937, 15941, 15945, 15949, 15953, 15956, 15960}, {0, 0, 0, 0, 0, 0, 0}, {15964, 15974, 15983, 15991, 16000, 16013, 16025, 16032, 16039, 16046, 16056, 16068, 0}, {15964, 15974, 15983, 15991, 16000, 16013, 16025, 16032, 16039, 16046, 16056, 16068, 0}, {16081, 16085, 16089, 16093, 16097, 16101, 16105, 16109, 16113, 16117, 16121, 16125, 0}, {16081, 16085, 16089, 16093, 16097, 16101, 16105, 16109, 16113, 16117, 16121, 16125, 0}, 0, 0, 239, 241, {1736,1779,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{35,2947,274,0,0,0,0,0,0,0,0,0},{23,2936,280,0,0,0,0,0,0}}, - {5603, 1736, 23, 35, 1906, 352, 0, 0, {16129, 16134, 16140, 16150, 16162, 16170, 16181}, {16190, 16194, 16198, 16202, 16206, 16210, 16214}, {0, 0, 0, 0, 0, 0, 0}, {16218, 16228, 16238, 16245, 16252, 2725, 16257, 16264, 16271, 16280, 16288, 16296, 0}, {16218, 16228, 16238, 16245, 16252, 2725, 16257, 16264, 16271, 16280, 16288, 16296, 0}, {2778, 2782, 15960, 16304, 16308, 2795, 2799, 16312, 2807, 2811, 2815, 16316, 0}, {2778, 2782, 15960, 16304, 16308, 2795, 2799, 16312, 2807, 2811, 2815, 16316, 0}, 0, 0, 239, 241, {1736,1779,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{35,2947,274,0,0,0,0,0,0,0,0,0},{23,2936,280,0,0,0,0,0,0}}, - {5603, 2309, 23, 35, 1906, 352, 1924, 1927, {16320, 16326, 16337, 16150, 16162, 16170, 16181}, {16347, 16351, 16355, 16202, 16206, 16210, 16214}, {2018, 2403, 16359, 2405, 2018, 5811, 2403}, {16361, 16371, 16382, 16389, 16398, 16404, 16410, 16418, 16426, 16437, 16447, 16456, 0}, {16465, 16228, 16474, 16480, 16252, 2725, 16257, 16264, 16487, 16280, 16288, 16296, 0}, {2778, 2782, 16497, 2791, 16308, 2795, 2799, 16312, 2807, 2811, 2815, 16316, 0}, {2778, 2782, 16497, 2791, 16308, 2795, 2799, 16312, 2807, 2811, 2815, 16316, 0}, 0, 0, 2541, 241, {1736,1779,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{35,2947,274,0,0,0,0,0,0,0,0,0},{23,2936,280,0,0,0,0,0,0}}, - {5603, 1736, 23, 35, 1906, 352, 16501, 16505, {16509, 16516, 16524, 16532, 16541, 16551, 16558}, {2671, 16567, 2677, 16570, 2683, 16573, 2689}, {2018, 2403, 2692, 3804, 2692, 4091, 2018}, {16576, 16585, 16595, 2715, 10715, 16601, 16607, 16613, 2742, 2752, 2760, 10727, 0}, {16576, 16585, 16595, 2715, 10715, 16601, 16607, 16613, 2742, 2752, 2760, 10727, 0}, {2778, 2782, 3860, 2791, 10715, 2795, 2799, 2803, 2807, 2811, 2815, 10740, 0}, {2778, 2782, 3860, 2791, 10715, 2795, 2799, 2803, 2807, 2811, 2815, 10740, 0}, 0, 0, 239, 241, {1736,1779,1210,16622,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{35,2947,274,0,0,0,0,0,0,0,0,0},{23,2936,280,0,0,0,0,0,0}}, - {16634, 2587, 323, 331, 1906, 352, 1924, 1927, {16668, 16684, 16709, 16737, 16765, 16793, 16821}, {16840, 16850, 16860, 16870, 16880, 16890, 16900}, {16910, 16914, 16918, 16914, 16922, 16926, 16930}, {16934, 16956, 16984, 17000, 17019, 17035, 17054, 17073, 17095, 17126, 17154, 17179, 0}, {16934, 16956, 16984, 17000, 17019, 17035, 17054, 17073, 17095, 17126, 17154, 17179, 0}, {17207, 17217, 17227, 17237, 17247, 17257, 17267, 17277, 17287, 17297, 17307, 17317, 0}, {17207, 17217, 17227, 17237, 17247, 17257, 17267, 17277, 17287, 17297, 17307, 17317, 0}, 0, 1, 754, 241, {2587,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{17327,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1882, 2309, 280, 274, 1906, 352, 17359, 17364, {6012, 17369, 17380, 17390, 17400, 17410, 17424}, {17436, 17440, 17445, 17450, 17454, 17459, 17464}, {2018, 2403, 2405, 2403, 5811, 2409, 2411}, {2413, 2420, 4978, 6157, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2413, 2420, 4978, 6157, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, 2, 1, 2541, 241, {2309,1236,1210,0,0,0,0,0,0,0,0,0,0,0},{1882,0,0,0,0,0,0,0},{274,5085,0,0,0,0,0,0,0,0,0,0},{280,6558,0,0,0,0,0,0,0}}, - {5603, 2309, 280, 274, 44, 55, 17468, 17484, {17494, 17513, 17532, 17554, 17573, 17595, 17620}, {17639, 17649, 17659, 17672, 17682, 17695, 17711}, {17721, 17725, 17732, 17739, 17746, 17753, 17760}, {17764, 17780, 17799, 17815, 17834, 17841, 17851, 17867, 17883, 17902, 17924, 17940, 0}, {17764, 17780, 17799, 17815, 17834, 17841, 17851, 17867, 17883, 17902, 17924, 17940, 0}, {17959, 17966, 17799, 17976, 17834, 17841, 17992, 18005, 18012, 18025, 18041, 18051, 0}, {17959, 17966, 17799, 17976, 17834, 17841, 17992, 18005, 18012, 18025, 18041, 18051, 0}, 0, 0, 2541, 241, {2309,1236,2270,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {18064, 243, 280, 274, 1906, 18089, 18103, 18106, {18109, 18118, 18127, 18137, 18147, 18157, 18169}, {18177, 18182, 18186, 18190, 18194, 18199, 18204}, {18208, 2405, 2405, 9756, 18208, 18211, 2018}, {18214, 18221, 18226, 2715, 18232, 18238, 18245, 18251, 18259, 18269, 18277, 18286, 0}, {18214, 18221, 18226, 2715, 18232, 18238, 18245, 18251, 18259, 18269, 18277, 18286, 0}, {2778, 18296, 3860, 2791, 18300, 18304, 18309, 18313, 18317, 18321, 2815, 18325, 0}, {2778, 18296, 3860, 2791, 18300, 18304, 18309, 18313, 18317, 18321, 2815, 18325, 0}, 0, 0, 239, 241, {243,1210,18330,7204,2927,0,0,0,0,0,0,0,0,0},{18064,18339,10078,0,0,0,0,0},{274,2947,331,35,0,0,0,0,0,0,0,0},{280,2936,323,23,0,0,0,0,0}}, - {18358, 2587, 280, 274, 1906, 18382, 18395, 18400, {18405, 18417, 18428, 18442, 18454, 18464, 18474}, {18485, 18490, 18495, 18500, 18505, 18510, 18515}, {2018, 4091, 2403, 6354, 2692, 16359, 2411}, {18520, 18537, 18550, 18564, 18577, 18590, 18603, 18617, 18629, 18643, 18657, 18671, 0}, {18520, 18537, 18550, 18564, 18577, 18590, 18603, 18617, 18629, 18643, 18657, 18671, 0}, {18684, 18691, 18696, 18701, 18705, 18710, 18715, 18720, 18725, 18732, 18737, 18743, 0}, {18684, 18691, 18696, 18701, 18705, 18710, 18715, 18720, 18725, 18732, 18737, 18743, 0}, 2, 1, 754, 241, {2587,1245,2843,1210,0,0,0,0,0,0,0,0,0,0},{18748,0,0,0,0,0,0,0},{274,331,5085,0,0,0,0,0,0,0,0,0},{280,323,6558,0,0,0,0,0,0}}, - {3909, 3703, 2936, 2947, 44, 19963, 1924, 1927, {19971, 19980, 19989, 19997, 20006, 20015, 20022}, {20031, 20034, 20037, 20040, 20043, 20047, 20050}, {6677, 6679, 6681, 6683, 12798, 15365, 6675}, {9983, 9991, 20053, 20059, 10715, 2725, 19107, 20066, 16271, 20073, 16288, 20080, 0}, {9983, 9991, 20053, 20059, 10715, 2725, 19107, 20066, 16271, 20073, 16288, 20080, 0}, {2778, 2782, 19103, 2791, 10715, 2795, 2799, 20088, 2807, 2811, 2815, 10740, 0}, {2778, 2782, 19103, 2791, 10715, 2795, 2799, 20088, 2807, 2811, 2815, 10740, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {20092, 2587, 280, 274, 1906, 20110, 1924, 1927, {20117, 20127, 20136, 20145, 20156, 20166, 20171}, {20178, 20184, 20189, 20194, 20199, 10699, 20203}, {20208, 2692, 2018, 7548, 2013, 4089, 2018}, {15029, 15036, 10276, 15043, 3829, 20210, 20215, 20220, 15068, 15077, 15085, 15092, 0}, {15029, 15036, 10276, 15043, 3829, 20210, 20215, 20220, 15068, 15077, 15085, 15092, 0}, {20227, 20232, 3860, 2791, 3829, 20210, 20215, 20236, 10683, 2811, 20240, 20245, 0}, {20227, 20232, 3860, 2791, 3829, 20210, 20215, 20236, 10683, 2811, 20240, 20245, 0}, 0, 1, 754, 241, {20249,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{20092,3672,5603,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {5603, 1236, 6558, 5085, 44, 352, 20260, 20288, {20310, 20329, 20348, 20373, 20392, 20426, 20451}, {20470, 20480, 20490, 20506, 20516, 20541, 20557}, {20567, 20571, 20578, 20582, 20589, 20596, 20603}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{5085,2285,20853,20862,0,0,0,0,0,0,0,0},{6558,2301,20870,20882,0,0,0,0,0}}, - {5603, 1236, 280, 274, 44, 55, 1924, 1927, {21362, 21381, 21400, 21422, 21441, 21463, 21488}, {21507, 21517, 21527, 21540, 21550, 21563, 21579}, {21589, 21593, 21600, 21607, 21614, 21621, 21628}, {21632, 21660, 21688, 21704, 21723, 21730, 21740, 21756, 21772, 21800, 21822, 21844, 0}, {21632, 21660, 21688, 21704, 21723, 21730, 21740, 21756, 21772, 21800, 21822, 21844, 0}, {21869, 21888, 21688, 21704, 21723, 21730, 21740, 21907, 21914, 21930, 21946, 21956, 0}, {21869, 21888, 21688, 21704, 21723, 21730, 21740, 21907, 21914, 21930, 21946, 21956, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {5603, 1236, 280, 274, 44, 55, 7992, 21969, {21972, 21991, 22010, 22035, 22054, 22076, 22101}, {22120, 22130, 22140, 22156, 22166, 22179, 22195}, {22205, 22209, 22216, 22220, 22227, 22234, 22241}, {22245, 22267, 22298, 22320, 22339, 22346, 22356, 22372, 22388, 22419, 22441, 22463, 0}, {22245, 22267, 22298, 22320, 22339, 22346, 22356, 22372, 22388, 22419, 22441, 22463, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {5603, 2309, 280, 274, 1906, 352, 22488, 22513, {22538, 22557, 22579, 22604, 22620, 22642, 22661}, {22671, 22678, 22685, 22692, 22699, 22706, 22713}, {22671, 22678, 22685, 22692, 22699, 22706, 22713}, {22717, 22733, 22758, 22777, 22796, 22803, 22816, 22829, 22848, 22879, 22904, 22926, 0}, {22717, 22733, 22758, 22777, 22796, 22803, 22816, 22951, 22848, 22879, 22904, 22926, 0}, {22970, 22978, 22992, 23006, 22796, 22803, 22816, 23017, 23025, 23039, 23050, 23058, 0}, {22970, 22978, 22992, 23006, 22796, 22803, 22816, 23017, 23025, 23039, 23050, 23058, 0}, 0, 0, 2541, 241, {2309,1236,2270,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {5603, 1236, 280, 274, 44, 3712, 1924, 1927, {23069, 23091, 23113, 23138, 23160, 23185, 23213}, {23235, 23245, 23255, 23268, 23278, 23291, 23307}, {23317, 23321, 23328, 23332, 23339, 23346, 23353}, {23357, 23373, 23398, 23417, 23439, 23446, 23459, 23472, 23491, 23522, 23547, 23566, 0}, {23357, 23373, 23398, 23417, 23439, 23446, 23591, 23472, 23491, 23522, 23547, 23566, 0}, {23604, 23611, 23398, 23627, 23439, 23446, 23591, 23472, 23643, 23665, 23681, 23691, 0}, {23604, 23611, 23398, 23627, 23439, 23446, 23591, 23472, 23643, 23665, 23681, 23691, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {5603, 1236, 280, 274, 44, 3712, 1924, 1927, {23707, 23726, 23745, 23767, 23786, 23808, 23833}, {23852, 23862, 23872, 23885, 23895, 23908, 23924}, {23934, 23938, 23945, 23952, 23959, 23966, 23973}, {23977, 23993, 24018, 24037, 24059, 24066, 24079, 24092, 24111, 24139, 24164, 24186, 0}, {23977, 23993, 24018, 24037, 24059, 24066, 24079, 24092, 24111, 24139, 24164, 24186, 0}, {24211, 24219, 24239, 24246, 24059, 24263, 24270, 24278, 24286, 24309, 24326, 24340, 0}, {24211, 24219, 24239, 24246, 24059, 24263, 24270, 24278, 24286, 24309, 24326, 24340, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {5603, 1236, 6558, 5085, 44, 19963, 1924, 1927, {24357, 24385, 24419, 24447, 24475, 24506, 24543}, {24571, 24584, 24603, 24619, 24632, 24651, 24670}, {24680, 24687, 24694, 24701, 24708, 24721, 24728}, {24732, 24751, 24779, 24801, 24820, 24833, 24843, 24856, 24881, 24912, 24937, 24953, 0}, {24732, 24751, 24779, 24801, 24820, 24833, 24843, 24856, 24881, 24912, 24937, 24953, 0}, {24972, 24982, 25001, 25011, 24820, 24833, 24843, 25027, 25034, 25059, 25075, 25085, 0}, {24972, 24982, 25001, 25011, 24820, 24833, 24843, 25027, 25034, 25059, 25075, 25085, 0}, 0, 0, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{5085,2285,20853,20862,0,0,0,0,0,0,0,0},{6558,2301,20870,20882,0,0,0,0,0}}, - {25098, 2309, 1859, 1842, 25117, 352, 25125, 25153, {25175, 25194, 25213, 25238, 25257, 25291, 25316}, {25335, 20480, 20490, 20506, 25345, 25370, 20557}, {0, 0, 0, 0, 0, 0, 0}, {25386, 25411, 25442, 25458, 20704, 20711, 20721, 25477, 25493, 25524, 25546, 25568, 0}, {25386, 25411, 25442, 25458, 20704, 20711, 20721, 25477, 25493, 25524, 25546, 25568, 0}, {25593, 25606, 25442, 25458, 20704, 20711, 20721, 25625, 25632, 25648, 25664, 25674, 0}, {25593, 25606, 25442, 25458, 20704, 20711, 20721, 25625, 25632, 25648, 25664, 25674, 0}, 0, 0, 2541, 241, {2309,0,0,0,0,0,0,0,0,0,0,0,0,0},{25098,0,0,0,0,0,0,0},{1842,1850,0,0,0,0,0,0,0,0,0,0},{1859,1870,0,0,0,0,0,0,0}}, - {5603, 2309, 280, 274, 44, 55, 1924, 1927, {17494, 17513, 25687, 17554, 17573, 17595, 17620}, {17639, 17649, 25709, 17672, 17682, 17695, 17711}, {17721, 17725, 17732, 17739, 17746, 17753, 17760}, {25722, 25747, 17799, 25778, 25797, 17841, 25804, 25817, 25833, 25858, 25880, 25908, 0}, {25722, 25747, 17799, 25778, 25797, 17841, 25804, 25817, 25833, 25858, 25880, 25908, 0}, {25930, 25943, 17799, 25962, 25797, 17841, 25804, 25978, 25985, 26004, 26020, 26042, 0}, {25930, 25943, 17799, 25962, 25797, 17841, 25804, 25978, 25985, 26004, 26020, 26042, 0}, 0, 0, 2541, 241, {2309,1236,2270,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {26784, 1366, 280, 274, 26827, 26860, 26884, 26906, {26931, 26959, 26987, 27024, 27055, 27089, 27114}, {27148, 27164, 27180, 27205, 27224, 27246, 27259}, {27281, 27288, 27295, 27302, 27309, 27316, 27320}, {27330, 27364, 27401, 27435, 27469, 27500, 27537, 27574, 27614, 27648, 27682, 27731, 0}, {27330, 27364, 27401, 27435, 27469, 27500, 27537, 27574, 27614, 27648, 27682, 27731, 0}, {27780, 27793, 27806, 27819, 27832, 27845, 27858, 27871, 27884, 27897, 27913, 27929, 0}, {27780, 27793, 27806, 27819, 27832, 27845, 27858, 27871, 27884, 27897, 27913, 27929, 0}, 0, 0, 239, 241, {1366,1718,1727,1747,1210,1736,1758,1765,1772,0,0,0,0,0},{26784,27945,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {3672, 14, 280, 274, 1906, 352, 1924, 1927, {27993, 28002, 28012, 28024, 28037, 28046, 28058}, {28070, 28074, 28079, 28083, 28087, 28091, 28095}, {2018, 28099, 2403, 2403, 15365, 6354, 2018}, {28102, 28109, 28118, 28125, 2721, 28132, 28140, 28151, 28156, 28161, 28168, 28177, 0}, {28102, 28109, 28118, 28125, 2721, 28132, 28140, 28151, 28156, 28161, 28168, 28177, 0}, {28185, 28189, 28079, 28193, 2721, 28197, 28201, 28151, 28156, 28205, 28209, 28214, 0}, {28185, 28189, 28079, 28193, 2721, 28197, 28201, 28151, 28156, 28205, 28209, 28214, 0}, 2, 1, 239, 241, {243,14,1229,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,35,2947,0,0,0,0,0,0,0,0},{280,323,23,2936,0,0,0,0,0}}, - {3672, 14, 280, 331, 28219, 352, 28254, 28270, {28286, 28308, 28321, 28340, 28350, 28381, 28397}, {28286, 28308, 28321, 28340, 28350, 28381, 28397}, {6675, 6677, 6679, 6681, 6683, 6685, 6687}, {28410, 28423, 28442, 28455, 28468, 28481, 28500, 28519, 28532, 28548, 28561, 28586, 0}, {28410, 28423, 28442, 28455, 28468, 28481, 28500, 28519, 28532, 28548, 28561, 28586, 0}, {28410, 28423, 28442, 28455, 28468, 28481, 28500, 28519, 28532, 28548, 28561, 28586, 0}, {28410, 28423, 28442, 28455, 28468, 28481, 28500, 28519, 28532, 28548, 28561, 28586, 0}, 0, 0, 239, 241, {1210,0,0,0,0,0,0,0,0,0,0,0,0,0},{3672,10090,0,0,0,0,0,0},{28599,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {5603, 243, 280, 274, 1906, 352, 28607, 28632, {28657, 28682, 28701, 28729, 28748, 28773, 28792}, {28657, 28682, 28701, 28729, 28748, 28773, 28792}, {28814, 28818, 28822, 28826, 28836, 28840, 28850}, {28854, 28873, 28889, 28902, 28915, 28937, 28956, 28978, 28994, 29010, 29023, 29039, 0}, {28854, 28873, 28889, 28902, 28915, 28937, 28956, 28978, 28994, 29010, 29023, 29039, 0}, {29055, 29064, 29073, 29082, 29091, 29100, 29112, 29121, 29130, 29139, 29148, 29157, 0}, {29055, 29064, 29073, 29082, 29091, 29100, 29112, 29121, 29130, 29139, 29148, 29157, 0}, 0, 0, 239, 241, {243,1210,0,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{28599,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {4313, 243, 323, 331, 947, 3985, 7213, 7218, {3997, 29166, 4011, 29171, 29181, 29187, 4044}, {29194, 8356, 3860, 29198, 29203, 29207, 29211}, {2692, 2411, 2403, 2403, 29216, 4091, 2018}, {29218, 29226, 4107, 4113, 29235, 29240, 29246, 4136, 29252, 29261, 29269, 29278, 0}, {29287, 29295, 4196, 1102, 7895, 29304, 29310, 4219, 7912, 7921, 7929, 29316, 0}, {29325, 2782, 3860, 29329, 2721, 29333, 29338, 20088, 18317, 29342, 2815, 3868, 0}, {29325, 2782, 3860, 29329, 2721, 29333, 29338, 20088, 18317, 29342, 2815, 3868, 0}, 2, 1, 239, 241, {243,14,1221,1229,1236,1245,1210,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{331,274,35,1312,0,0,0,0,0,0,0,0},{323,280,23,1324,0,0,0,0,0}}, - {5603, 2309, 280, 274, 44, 55, 29346, 29358, {29370, 17513, 29398, 17554, 17573, 17595, 17620}, {17639, 17649, 25709, 17672, 17682, 17695, 17711}, {0, 0, 0, 0, 0, 0, 0}, {25722, 25747, 17799, 25778, 25797, 17841, 25804, 29417, 29433, 29461, 25880, 25908, 0}, {25722, 25747, 17799, 25778, 25797, 17841, 25804, 29417, 29433, 29461, 25880, 25908, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 0, 2541, 241, {2309,1236,2270,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,1842,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {29483, 1210, 1859, 1842, 29531, 19963, 29541, 29553, {29562, 29578, 29594, 29622, 29638, 29681, 29706}, {29562, 29578, 29734, 29622, 29744, 29766, 29779}, {29789, 29793, 29797, 29801, 29805, 29818, 29825}, {29832, 29851, 29876, 29895, 29920, 29933, 29946, 29959, 29981, 30015, 30040, 30068, 0}, {29832, 29851, 29876, 29895, 29920, 29933, 29946, 29959, 29981, 30015, 30040, 30068, 0}, {30096, 30103, 30113, 29895, 29920, 29933, 29946, 30126, 30136, 30149, 30159, 30172, 0}, {30096, 30103, 30113, 29895, 29920, 29933, 29946, 30126, 30136, 30149, 30159, 30172, 0}, 0, 1, 2541, 241, {1210,1736,1779,243,14,0,0,0,0,0,0,0,0,0},{29483,0,0,0,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {30185, 2927, 2936, 2947, 1906, 30217, 30233, 30243, {30256, 30266, 30273, 30286, 30296, 30306, 30316}, {30256, 30266, 30326, 30286, 30296, 30306, 30316}, {30336, 30340, 30344, 30348, 30352, 30356, 30360}, {30364, 30380, 30396, 30406, 30419, 30426, 30433, 30443, 30456, 30475, 30491, 30507, 0}, {30364, 30380, 30396, 30406, 30419, 30426, 30433, 30443, 30456, 30523, 30491, 30507, 0}, {30542, 30552, 30396, 30562, 30419, 30426, 30433, 30572, 30582, 30592, 30602, 30612, 0}, {30542, 30552, 30396, 30562, 30419, 30426, 30433, 30572, 30582, 30592, 30602, 30612, 0}, 0, 0, 239, 241, {2927,1210,0,0,0,0,0,0,0,0,0,0,0,0},{30185,0,0,0,0,0,0,0},{2947,0,0,0,0,0,0,0,0,0,0,0},{2936,0,0,0,0,0,0,0,0}}, - {3909, 3703, 2936, 2947, 30858, 55, 30868, 30909, {30950, 30969, 30988, 31013, 31032, 31054, 31079}, {31098, 17649, 31108, 17672, 31124, 17695, 17711}, {31137, 17725, 31141, 17739, 31145, 17753, 17760}, {17764, 31152, 17799, 31180, 25797, 31199, 17851, 31209, 31225, 31256, 31278, 31303, 0}, {17764, 31152, 17799, 31180, 25797, 31199, 17851, 31209, 31225, 31256, 31278, 31303, 0}, {17764, 31152, 17799, 31180, 25797, 31199, 17851, 31209, 31225, 31256, 31278, 31303, 0}, {17764, 31152, 17799, 31180, 25797, 31199, 17851, 31209, 31225, 31256, 31278, 31303, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {31328, 1366, 2936, 2947, 1906, 352, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {31349, 31356, 31365, 31380, 31391, 31400, 31407, 31414, 31421, 31432, 31445, 31458, 0}, {31349, 31356, 31365, 31380, 31391, 31400, 31407, 31414, 31421, 31432, 31445, 31458, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{243,1,254,31463,0,0,0,0},{2947,331,0,0,0,0,0,0,0,0,0,0},{2936,323,0,0,0,0,0,0,0}}, - {3909, 3703, 2936, 2947, 44, 31481, 1924, 1927, {31487, 31494, 31500, 31507, 31518, 31526, 31535}, {31542, 8356, 3860, 31546, 31550, 31554, 10703}, {2411, 2411, 2403, 2403, 5811, 16359, 2018}, {4093, 31558, 31566, 4113, 4119, 31572, 31578, 4136, 31584, 31594, 31602, 31612, 0}, {4093, 31558, 31566, 4113, 4119, 31572, 31578, 4136, 31584, 31594, 31602, 31612, 0}, {31622, 31626, 3860, 29329, 3829, 31630, 31634, 20088, 18317, 2811, 31638, 16316, 0}, {31622, 31626, 3860, 29329, 3829, 31630, 31634, 20088, 18317, 2811, 31638, 16316, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {3909, 2927, 2936, 2947, 44, 352, 0, 0, {31642, 31649, 31657, 31664, 31671, 31679, 31687}, {31694, 31697, 31700, 31703, 31706, 31709, 31712}, {2411, 2411, 2405, 2411, 12798, 4089, 12798}, {31715, 31723, 31733, 31739, 31747, 31752, 31757, 31762, 31769, 20073, 31777, 31785, 0}, {31715, 31723, 31733, 31739, 31747, 31752, 31757, 31762, 31769, 20073, 31777, 31785, 0}, {2778, 31793, 3860, 31797, 3829, 30821, 30825, 31801, 3800, 2811, 31805, 16316, 0}, {2778, 31793, 3860, 31797, 3829, 30821, 30825, 31801, 3800, 2811, 31805, 16316, 0}, 0, 0, 239, 241, {2927,1229,14,243,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {254, 2927, 2936, 2947, 30858, 55, 31809, 31820, {31830, 31848, 31863, 31885, 31898, 31912, 31929}, {31953, 31961, 31966, 31885, 31898, 31978, 31985}, {0, 0, 0, 0, 0, 0, 0}, {31999, 32021, 32037, 32057, 32071, 32088, 32103, 32120, 32134, 32147, 32166, 32180, 0}, {31999, 32021, 32037, 32057, 32071, 32088, 32103, 32120, 32134, 32147, 32166, 32180, 0}, {32199, 32214, 32223, 32236, 32243, 32253, 32261, 32271, 32278, 32284, 32296, 32303, 0}, {32199, 32214, 32223, 32236, 32243, 32253, 32261, 32271, 32278, 32284, 32296, 32303, 0}, 0, 0, 239, 241, {2927,1229,14,243,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {5603, 14, 23, 35, 1906, 3712, 0, 0, {32315, 32323, 15891, 15900, 15909, 32334, 32344}, {16347, 15941, 15945, 15949, 15953, 16210, 32353}, {0, 0, 0, 0, 0, 0, 0}, {32357, 32366, 32376, 32384, 10715, 3833, 32392, 32398, 32407, 32416, 32425, 32434, 0}, {32357, 32366, 32376, 32384, 10715, 3833, 32392, 32398, 32407, 32416, 32425, 32434, 0}, {2778, 2782, 15960, 32443, 10715, 2795, 2799, 20088, 18317, 2811, 32447, 16316, 0}, {2778, 2782, 15960, 32443, 10715, 2795, 2799, 20088, 18317, 2811, 32447, 16316, 0}, 0, 0, 239, 241, {1736,1779,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{35,2947,274,0,0,0,0,0,0,0,0,0},{23,2936,280,0,0,0,0,0,0}}, - {32451, 2309, 280, 274, 1906, 32470, 32483, 32488, {32493, 32500, 32515, 32529, 32545, 32560, 32576}, {6350, 32591, 2505, 32595, 32599, 32603, 32607}, {2018, 12798, 2403, 2013, 2018, 2405, 12798}, {7302, 7310, 32611, 32618, 32625, 2444, 2449, 32630, 32640, 32651, 32660, 32670, 0}, {7302, 7310, 32611, 32618, 32625, 2444, 2449, 32630, 32640, 32651, 32660, 32670, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, 0, 0, 2541, 241, {2309,1236,1210,2543,0,0,0,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {3909, 2927, 2290, 2277, 44, 352, 32680, 32685, {32690, 32706, 32714, 32722, 32731, 32743, 32753}, {32763, 32769, 32775, 32779, 32783, 32791, 3800}, {0, 0, 0, 0, 0, 0, 0}, {32798, 32811, 32825, 32834, 32840, 32844, 32849, 32857, 16271, 32870, 16288, 16296, 0}, {32798, 32811, 32825, 32834, 32840, 32844, 32849, 32857, 16271, 32870, 16288, 16296, 0}, {32879, 2782, 32883, 16304, 32840, 32887, 2799, 32891, 2807, 32899, 2815, 16316, 0}, {32879, 2782, 32883, 16304, 32840, 32887, 2799, 32891, 2807, 32899, 2815, 16316, 0}, 0, 0, 239, 241, {2927,1229,14,243,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {32905, 1366, 1859, 1842, 32929, 32946, 32973, 32980, {32987, 32997, 33007, 33017, 33027, 33037, 33047}, {33057, 33064, 33071, 33078, 33085, 33092, 33099}, {33106, 33110, 33114, 33118, 33122, 33126, 33130}, {33134, 33141, 33148, 33155, 33162, 33169, 33176, 33183, 33190, 33197, 33204, 33214, 0}, {33134, 33141, 33148, 33155, 33162, 33169, 33176, 33183, 33190, 33197, 33204, 33214, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, {6675, 6677, 6679, 6681, 6683, 6685, 6687, 6689, 6691, 6693, 6696, 6699, 0}, 0, 0, 239, 241, {1366,1718,1727,1747,1210,1736,0,0,0,0,0,0,0,0},{32905,33224,33254,0,0,0,0,0},{1842,331,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {4857, 243, 280, 274, 1906, 352, 0, 0, {28070, 8356, 33284, 33291, 33301, 33306, 33313}, {33320, 6334, 33324, 4941, 33329, 33334, 33339}, {4490, 33344, 33347, 33350, 33353, 33356, 33359}, {33362, 33369, 33284, 33380, 33386, 33390, 33399, 33406, 33411, 33420, 33425, 33428, 0}, {33362, 33369, 33284, 33380, 33386, 33390, 33399, 33406, 33411, 33420, 33425, 33428, 0}, {33434, 33438, 33445, 28193, 33386, 33450, 33455, 33406, 33460, 33420, 33425, 33465, 0}, {33434, 33438, 33445, 28193, 33386, 33450, 33455, 33406, 33460, 33420, 33425, 33465, 0}, 2, 1, 239, 241, {243,14,1245,1236,1210,0,0,0,0,0,0,0,0,0},{4857,5076,3672,0,0,0,0,0},{274,331,5085,5091,5101,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {33622, 2587, 323, 331, 33657, 33673, 33691, 33696, {33701, 33726, 33755, 33780, 33793, 33808, 33825}, {33840, 33845, 33850, 33855, 33860, 33865, 8657}, {19346, 19346, 33870, 8668, 8671, 19346, 8668}, {33873, 33892, 33907, 33929, 33949, 33965, 33981, 33995, 34021, 34045, 34062, 34079, 0}, {33873, 33892, 33907, 33929, 33949, 33965, 33981, 33995, 34021, 34045, 34062, 34079, 0}, {34096, 34105, 34114, 34128, 34142, 34154, 34166, 34176, 34192, 34206, 34213, 34220, 0}, {34096, 34105, 34114, 34128, 34142, 34154, 34166, 34176, 34192, 34206, 34213, 34220, 0}, 0, 1, 754, 241, {34227,34238,2843,3879,34247,0,0,0,0,0,0,0,0,0},{34258,34276,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {34295, 14812, 323, 331, 1906, 19963, 0, 0, {34315, 34327, 34338, 34350, 34362, 34372, 34384}, {34399, 34404, 34409, 34414, 34419, 34424, 34429}, {0, 0, 0, 0, 0, 0, 0}, {34434, 34443, 34455, 34463, 34468, 34478, 34485, 34494, 34501, 34507, 34516, 34527, 0}, {34434, 34443, 34455, 34463, 34468, 34478, 34485, 34494, 34501, 34507, 34516, 34527, 0}, {34535, 34540, 34545, 34550, 34555, 34560, 34565, 34419, 34570, 34575, 34580, 34585, 0}, {34535, 34540, 34545, 34550, 34555, 34560, 34565, 34419, 34570, 34575, 34580, 34585, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {5603, 243, 280, 274, 1906, 352, 34590, 34592, {34594, 34607, 34615, 34624, 34634, 34644, 34653}, {34665, 34669, 34673, 34677, 34681, 34685, 34689}, {2692, 2411, 2403, 7548, 12798, 5811, 2018}, {34693, 34707, 34718, 34727, 34738, 34750, 34764, 34776, 34789, 34802, 34814, 34827, 0}, {34693, 34707, 34718, 34727, 34738, 34750, 34764, 34776, 34789, 34802, 34814, 34827, 0}, {34841, 34846, 34852, 34858, 34863, 34869, 34875, 34880, 34886, 34891, 19049, 34897, 0}, {34841, 34846, 34852, 34858, 34863, 34869, 34875, 34880, 34886, 34891, 19049, 34897, 0}, 2, 1, 239, 241, {243,14,1229,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,35,2947,0,0,0,0,0,0,0,0},{280,323,23,2936,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, 0, 6, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {1344, 1366, 323, 331, 1375, 1391, 1404, 1411, {1418, 1428, 1438, 1448, 1458, 1468, 1478}, {1488, 1495, 1502, 1509, 1516, 1523, 1530}, {1537, 1541, 1545, 1549, 1553, 1557, 1561}, {1565, 1572, 1579, 1586, 1593, 1600, 1607, 1614, 1621, 1628, 1635, 1645, 0}, {1565, 1572, 1579, 1586, 1593, 1600, 1607, 1614, 1621, 1628, 1635, 1645, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, 0, 0, 239, 241, {1366,1718,1727,1210,1736,1747,1758,1765,1772,1779,0,0,0,0},{1344,1788,1815,0,0,0,0,0},{331,274,1842,1850,0,0,0,0,0,0,0,0},{323,280,1859,1870,0,0,0,0,0}}, - {2568, 2587, 280, 274, 1906, 1916, 2598, 2604, {2611, 2619, 2626, 2635, 2644, 2655, 2663}, {2671, 2674, 2677, 2680, 2683, 2686, 2689}, {2018, 2403, 2692, 2403, 2692, 2409, 2018}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, 2, 1, 754, 241, {2587,1245,2835,35120,2843,1210,0,0,0,0,0,0,0,0},{2568,1882,35130,0,0,0,0,0},{274,331,8214,8204,2862,8237,8242,8223,8229,0,0,0},{280,323,8274,8287,2887,2873,2902,0,0}}, - {5603, 243, 280, 274, 1906, 352, 7992, 21969, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 2, 1, 239, 241, {243,14,1229,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,35,2947,0,0,0,0,0,0,0,0},{280,323,23,2936,0,0,0,0,0}}, - {3957, 243, 23, 35, 947, 3985, 7213, 7218, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {35140, 6334, 4936, 35145, 35151, 35156, 35160}, {2692, 2411, 2403, 29216, 4089, 4091, 2018}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {35166, 5920, 35170, 1176, 35175, 2513, 2517, 1186, 1190, 1195, 1200, 35179, 0}, {35166, 5920, 35170, 1176, 35175, 2513, 2517, 1186, 1190, 1195, 1200, 35179, 0}, 0, 0, 239, 241, {243,3660,14,1221,1229,1236,1210,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {4857, 1236, 280, 274, 1906, 352, 1924, 1927, {4874, 4883, 4889, 4895, 4904, 4910, 4919}, {4926, 4931, 4936, 4941, 4946, 4951, 4956}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, 2, 1, 2541, 241, {14812,1221,1245,1779,1236,243,1210,0,0,0,0,0,0,0},{4857,3672,3899,0,0,0,0,0},{274,331,5085,5091,5101,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {2568, 2587, 280, 274, 1906, 352, 1924, 1927, {6268, 6277, 6285, 6294, 6305, 6314, 6323}, {6330, 6334, 2505, 6338, 6342, 6346, 6350}, {2692, 2411, 2403, 2403, 6354, 4091, 2018}, {6356, 6364, 4107, 6373, 6380, 6387, 6394, 4136, 6401, 6411, 6419, 6428, 0}, {6437, 6445, 4196, 6454, 6461, 6468, 6475, 4219, 6482, 6492, 1148, 6500, 0}, {6509, 2501, 2505, 2509, 6513, 6517, 6521, 6525, 6529, 6533, 2533, 6537, 0}, {6509, 2501, 2505, 2509, 6513, 6517, 6521, 6525, 6529, 6533, 2533, 6537, 0}, 2, 1, 754, 241, {2587,1245,11970,1229,6541,1210,0,0,0,0,0,0,0,0},{2568,6549,3672,0,0,0,0,0},{274,331,8214,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {4857, 14812, 323, 331, 1906, 352, 7213, 7218, {7223, 7230, 7238, 7246, 7255, 7265, 7273}, {7282, 4493, 7285, 7288, 7291, 7294, 7297}, {7300, 2403, 2692, 3804, 2692, 4091, 7300}, {7302, 7310, 7319, 2434, 7325, 2444, 2449, 7329, 2461, 2471, 2479, 2488, 0}, {7302, 7310, 7319, 2434, 7325, 2444, 2449, 7329, 2461, 2471, 2479, 2488, 0}, {2497, 2501, 7338, 2509, 7325, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 7338, 2509, 7325, 2513, 2517, 2521, 2525, 2529, 2533, 2537, 0}, 2, 1, 239, 241, {14812,1221,1236,1245,2823,1210,0,0,0,0,0,0,0,0},{4857,3899,3672,5646,0,0,0,0},{331,274,35184,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1882, 2587, 280, 274, 1906, 1916, 35194, 35199, {2320, 9929, 35204, 2343, 2350, 2358, 35211}, {2373, 35219, 35224, 2386, 2390, 2394, 35228}, {2018, 2403, 2405, 2407, 2405, 2409, 2411}, {2413, 2420, 4978, 2434, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2413, 2420, 4978, 2434, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, 2, 1, 754, 241, {2587,1245,2843,1210,2823,0,0,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{274,331,7430,5085,0,0,0,0,0,0,0,0},{280,323,7441,6558,0,0,0,0,0}}, - {4369, 243, 280, 274, 947, 3985, 7213, 7218, {3997, 7778, 7792, 7805, 7818, 7831, 4044}, {6330, 7843, 7847, 7851, 7855, 7859, 7863}, {2692, 2018, 2405, 7868, 7868, 2018, 2018}, {35232, 35240, 35250, 4113, 29235, 35257, 35263, 4136, 29252, 29261, 29269, 35269, 0}, {35232, 35240, 35250, 4113, 29235, 35257, 35263, 4136, 29252, 29261, 29269, 35269, 0}, {2778, 20232, 3860, 29329, 2721, 2795, 2799, 20088, 18317, 29342, 2815, 2819, 0}, {2778, 20232, 3860, 29329, 2721, 2795, 2799, 20088, 18317, 29342, 2815, 2819, 0}, 2, 1, 239, 241, {2309,14844,26754,2843,14,1210,0,0,0,0,0,0,0,0},{3957,4369,35278,35287,0,0,0,0},{274,35296,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}}, - {9884, 2261, 280, 274, 1906, 9902, 9915, 9918, {9921, 9929, 9937, 2343, 2350, 2358, 9944}, {9952, 9957, 9962, 9966, 9970, 9974, 9978}, {2018, 2403, 2405, 2407, 2405, 2409, 2411}, {9983, 9991, 10000, 2715, 9836, 2725, 2730, 10005, 2742, 2752, 2760, 3851, 0}, {7302, 7310, 4978, 2434, 2440, 2444, 2449, 10013, 2461, 2471, 2479, 2488, 0}, {2778, 2782, 3860, 2791, 9836, 2795, 2799, 2803, 2807, 2811, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 9836, 2795, 2799, 2803, 2807, 2811, 2815, 3868, 0}, 2, 1, 754, 241, {2261,2587,2843,1210,0,0,0,0,0,0,0,0,0,0},{9884,10021,0,0,0,0,0,0},{274,331,10044,0,0,0,0,0,0,0,0,0},{280,323,10054,0,0,0,0,0,0}}, - {3672, 2587, 280, 331, 1906, 352, 1924, 1927, {35307, 35318, 35342, 35372, 35389, 35411, 35420}, {15002, 15005, 15010, 15016, 15020, 7548, 15025}, {6687, 6675, 6677, 6679, 6681, 6683, 6685}, {35431, 35444, 564, 35457, 584, 35468, 35477, 605, 35486, 35503, 35518, 35531, 0}, {35431, 35444, 564, 35457, 584, 35468, 35477, 605, 35486, 35503, 35518, 35531, 0}, {15176, 7947, 2505, 2509, 15124, 15180, 15184, 15188, 15192, 2529, 15196, 15200, 0}, {15176, 7947, 2505, 2509, 15124, 15180, 15184, 15188, 15192, 2529, 15196, 15200, 0}, 0, 1, 754, 241, {2587,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{3672,5603,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3672, 243, 280, 274, 1906, 352, 7213, 7218, {18766, 18780, 18790, 18801, 18815, 18826, 18837}, {18850, 18855, 18860, 18867, 18873, 18879, 18885}, {2692, 2411, 2403, 7548, 2692, 12798, 2018}, {18890, 18898, 18906, 18913, 18922, 18932, 18942, 18948, 18956, 18971, 18989, 18997, 0}, {18890, 18898, 18906, 18913, 18922, 18932, 18942, 18948, 18956, 18971, 18989, 18997, 0}, {19005, 19009, 18906, 19015, 19019, 19024, 18942, 19030, 19035, 19042, 19049, 19054, 0}, {19005, 19009, 18906, 19015, 19019, 19024, 18942, 19030, 19035, 19042, 19049, 19054, 0}, 2, 0, 239, 241, {243,14,1229,2843,1210,0,0,0,0,0,0,0,0,0},{3672,5603,10078,10067,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {35544, 2587, 280, 274, 1906, 352, 1924, 1927, {35565, 35580, 35595, 35610, 35627, 35644, 35653}, {35664, 35671, 35678, 35685, 35692, 19764, 35699}, {35706, 19343, 8668, 8671, 8665, 19340, 19778}, {13166, 13177, 8702, 13190, 8724, 13201, 13208, 8749, 13215, 13230, 13243, 13254, 0}, {13166, 13177, 8702, 13190, 8724, 13201, 13208, 8749, 13215, 13230, 13243, 13254, 0}, {13267, 13274, 13281, 13288, 8724, 13201, 13208, 13295, 13302, 13309, 13316, 13323, 0}, {13267, 13274, 13281, 13288, 8724, 13201, 13208, 13295, 13302, 13309, 13316, 13323, 0}, 0, 1, 754, 241, {2587,1245,20249,2843,14,1210,0,0,0,0,0,0,0,0},{35544,3672,5603,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {5603, 1236, 6558, 5085, 44, 55, 20260, 20288, {20310, 20329, 20348, 20373, 20392, 20426, 20451}, {20470, 20480, 20490, 20506, 20516, 20541, 20557}, {20567, 20571, 20578, 20582, 20589, 20596, 20603}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, {20607, 20635, 20669, 20685, 20704, 20711, 20721, 20737, 20753, 20784, 20806, 20828, 0}, 0, 5, 2541, 241, {1236,2270,2843,2309,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{5085,2285,20853,20862,0,0,0,0,0,0,0,0},{6558,2301,20870,20882,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {1344, 2927, 323, 331, 1375, 1391, 1404, 1411, {1418, 1428, 1438, 1448, 1458, 1468, 1478}, {34903, 34910, 34917, 34924, 34931, 34938, 34945}, {1537, 1541, 1545, 1549, 1553, 1557, 1561}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, 0, 0, 239, 241, {2927,1229,14,1765,1779,1366,1736,1210,0,0,0,0,0,0},{1344,6759,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {35709, 2587, 280, 274, 1906, 1916, 2598, 2604, {2611, 2619, 2626, 2635, 2644, 2655, 2663}, {2671, 2674, 2677, 2680, 2683, 2686, 2689}, {2018, 2403, 2692, 2403, 2692, 2409, 2018}, {35729, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {35729, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {35737, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, {35737, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, 2, 1, 754, 241, {2587,1245,35742,1210,0,0,0,0,0,0,0,0,0,0},{35709,35752,35764,10067,0,0,0,0},{274,331,35774,35786,8237,8242,8229,0,0,0,0,0},{280,323,2887,2873,2902,0,0,0,0}}, - {2909, 14812, 2936, 2947, 1906, 3712, 1924, 1927, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 239, 241, {14812,1221,1229,2927,14,243,3899,5616,1210,1779,1736,0,0,0},{2909,3672,0,0,0,0,0,0},{2947,331,274,0,0,0,0,0,0,0,0,0},{2936,323,280,0,0,0,0,0,0}}, - {3957, 243, 323, 331, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 2, 1, 239, 241, {243,14,1221,1229,1236,1245,1210,2823,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{331,274,1312,0,0,0,0,0,0,0,0,0},{323,280,1324,0,0,0,0,0,0}}, - {3672, 1210, 280, 274, 44, 352, 1924, 1927, {4874, 4883, 4889, 4895, 4904, 4910, 4919}, {4926, 4931, 4936, 4941, 4946, 4951, 4956}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, 0, 0, 2541, 241, {1210,5993,1236,6259,14,3660,0,0,0,0,0,0,0,0},{3672,10067,0,0,0,0,0,0},{274,331,5085,5091,5101,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {35797, 2261, 323, 331, 1906, 18382, 18395, 18400, {35823, 35831, 35839, 35847, 35859, 35868, 35880}, {18485, 18490, 18495, 18500, 18505, 18510, 18515}, {2018, 2403, 2692, 6354, 2692, 16359, 2411}, {18520, 18537, 18550, 18564, 18577, 18590, 18603, 18617, 18629, 18643, 18657, 18671, 0}, {18520, 18537, 18550, 18564, 18577, 18590, 18603, 18617, 18629, 18643, 18657, 18671, 0}, {35891, 35902, 35909, 35917, 35924, 35931, 35938, 35946, 35952, 35960, 35968, 35976, 0}, {35891, 35902, 35909, 35917, 35924, 35931, 35938, 35946, 35952, 35960, 35968, 35976, 0}, 2, 1, 754, 241, {2261,2587,2843,1210,0,0,0,0,0,0,0,0,0,0},{18748,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {1344, 2927, 1859, 1842, 1375, 1391, 1404, 1411, {1418, 1428, 1438, 1448, 1458, 1468, 1478}, {1488, 1495, 1502, 1509, 1516, 1523, 1530}, {1537, 1541, 1545, 1549, 1553, 1557, 1561}, {1565, 1572, 1579, 1586, 1593, 1600, 1607, 1614, 1621, 1628, 1635, 1645, 0}, {1565, 1572, 1579, 1586, 1593, 1600, 1607, 1614, 1621, 1628, 1635, 1645, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, 0, 0, 239, 241, {2927,1229,14,1765,1779,1366,1736,1210,0,0,0,0,0,0},{1344,6759,0,0,0,0,0,0},{1842,1850,331,274,0,0,0,0,0,0,0,0},{1859,1870,323,280,0,0,0,0,0}}, - {35983, 2587, 280, 274, 1906, 1916, 2598, 2604, {2611, 2619, 2626, 2635, 2644, 2655, 2663}, {2671, 2674, 2677, 2680, 2683, 2686, 2689}, {2018, 2403, 2692, 2403, 2692, 2409, 2018}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, 2, 1, 754, 241, {2587,1245,2835,2843,2261,1210,0,0,0,0,0,0,0,0},{2568,1882,2850,0,0,0,0,0},{274,331,2285,2862,0,0,0,0,0,0,0,0},{280,2873,2887,2902,0,0,0,0,0}}, - {36009, 1210, 2936, 2947, 44, 352, 1924, 1927, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 2541, 241, {243,14,1229,1210,5993,36022,3899,14844,0,0,0,0,0,0},{36030,36009,6549,3909,0,0,0,0},{2947,35,274,331,0,0,0,0,0,0,0,0},{2936,23,280,323,0,0,0,0,0}}, - {4313, 243, 2936, 2947, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {243,14,14812,1229,1236,1210,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {4857, 2587, 280, 274, 1906, 352, 1924, 1927, {4874, 4883, 4889, 4895, 4904, 4910, 4919}, {4926, 4931, 4936, 4941, 4946, 4951, 4956}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, 2, 1, 754, 241, {2587,1245,35120,2843,1210,0,0,0,0,0,0,0,0,0},{4857,3672,5076,0,0,0,0,0},{274,331,5085,5091,5101,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {9044, 9058, 323, 331, 44, 1916, 1924, 1927, {9068, 9077, 9089, 9096, 9104, 9114, 9120}, {9127, 9131, 9135, 9139, 9143, 9148, 9152}, {9156, 9158, 9160, 9162, 9164, 9158, 9162}, {9167, 9177, 9186, 9194, 9202, 9210, 9217, 9224, 9232, 2097, 9238, 9246, 0}, {9255, 9265, 9274, 9282, 9290, 9298, 9305, 9312, 9321, 7723, 9327, 9337, 0}, {9346, 9350, 9355, 9360, 9364, 7757, 2234, 9368, 9372, 2250, 9376, 2254, 0}, {9346, 9350, 9355, 9360, 9364, 7757, 2234, 9368, 9372, 2250, 9376, 2254, 0}, 0, 1, 754, 241, {9058,9380,6233,9388,9400,9410,9420,1210,0,0,0,0,0,0},{9044,9432,9447,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3943, 2309, 323, 331, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {36041, 36052, 13523, 36063, 36074, 36081, 36090, 36103, 36110, 36123, 36136, 36149, 0}, {36041, 36052, 13523, 36063, 36074, 36081, 36090, 36103, 36110, 36123, 36136, 36149, 0}, {36041, 36052, 13523, 36063, 36074, 36081, 36090, 36103, 36110, 36123, 36136, 36149, 0}, {36041, 36052, 13523, 36063, 36074, 36081, 36090, 36103, 36110, 36123, 36136, 36149, 0}, 0, 6, 2541, 241, {2309,1236,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{331,274,35,0,0,0,0,0,0,0,0,0},{323,280,23,0,0,0,0,0,0}}, - {1344, 2927, 323, 331, 1375, 1391, 1404, 1411, {1418, 1428, 1438, 1448, 1458, 1468, 1478}, {34903, 34910, 34917, 34924, 34931, 34938, 34945}, {1537, 1541, 1545, 1549, 1553, 1557, 1561}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, 0, 0, 239, 241, {2927,1229,14,1765,1779,1366,1736,1210,0,0,0,0,0,0},{1344,36162,36189,2543,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {2568, 2587, 280, 274, 1906, 1916, 2598, 2604, {2611, 2619, 2626, 2635, 2644, 2655, 2663}, {2671, 2674, 2677, 2680, 2683, 2686, 2689}, {2018, 2403, 2692, 2403, 2692, 2409, 2018}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {2694, 2701, 2709, 2715, 2721, 2725, 2730, 2735, 2742, 2752, 2760, 2769, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, {2778, 2782, 2786, 2791, 2721, 2795, 2799, 2803, 2807, 2811, 2815, 2819, 0}, 2, 1, 754, 241, {2587,1245,2835,35120,2843,1210,0,0,0,0,0,0,0,0},{2568,1882,35130,0,0,0,0,0},{274,331,8214,8204,2862,8237,8242,8223,8229,0,0,0},{280,323,8274,8287,2887,2873,2902,0,0}}, - {2909, 14812, 2936, 2947, 1906, 352, 7213, 7218, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 239, 241, {14812,1221,14,2835,1210,0,0,0,0,0,0,0,0,0},{2909,3672,0,0,0,0,0,0},{2947,35,274,331,0,0,0,0,0,0,0,0},{2936,23,280,323,0,0,0,0,0}}, - {4342, 243, 23, 35, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 1, 239, 241, {243,14,1229,1236,1210,0,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {36205, 243, 280, 274, 1906, 352, 1924, 1927, {4874, 4883, 4889, 4895, 4904, 4910, 4919}, {4926, 4931, 4936, 4941, 4946, 4951, 4956}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, 2, 1, 239, 241, {243,14,1245,1236,1210,0,0,0,0,0,0,0,0,0},{4857,5076,3672,0,0,0,0,0},{274,331,5085,5091,5101,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {1882, 2261, 323, 331, 1906, 11991, 36228, 36238, {9068, 9077, 9089, 9096, 9104, 9114, 9120}, {9127, 9131, 9135, 9139, 9143, 9148, 9152}, {0, 0, 0, 0, 0, 0, 0}, {2413, 2420, 15113, 2434, 2440, 2444, 2449, 11959, 36246, 36256, 36264, 36273, 0}, {2413, 2420, 15113, 2434, 2440, 2444, 2449, 11959, 36246, 36256, 36264, 36273, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3943, 2309, 323, 331, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {36282, 36293, 13523, 36306, 36074, 36317, 36328, 36341, 36348, 36123, 36359, 36370, 0}, {36282, 36293, 13523, 36306, 36074, 36317, 36328, 36341, 36348, 36123, 36359, 36370, 0}, {36282, 36293, 13523, 36306, 36074, 36317, 36328, 36341, 36348, 36123, 36359, 36370, 0}, {36282, 36293, 13523, 36306, 36074, 36317, 36328, 36341, 36348, 36123, 36359, 36370, 0}, 0, 6, 2541, 241, {2309,1236,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{331,274,35,0,0,0,0,0,0,0,0,0},{323,280,23,0,0,0,0,0,0}}, - {5603, 243, 280, 274, 1906, 352, 7213, 7218, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 2, 0, 239, 241, {243,14,1229,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {4313, 1229, 2936, 2947, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {3888,3879,1229,14,1236,1210,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {4857, 243, 280, 274, 1906, 352, 1924, 1927, {4874, 4883, 4889, 4895, 4904, 4910, 4919}, {4926, 4931, 4936, 4941, 4946, 4951, 4956}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {4961, 4969, 4978, 4983, 4989, 4993, 4998, 5006, 5012, 5022, 1148, 5030, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, {5040, 5046, 4978, 5053, 4989, 4993, 5058, 5006, 5064, 1195, 1200, 5070, 0}, 2, 1, 239, 241, {243,14,1245,1236,1210,0,0,0,0,0,0,0,0,0},{4857,5076,3672,0,0,0,0,0},{274,331,5085,5091,5101,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {9044, 9058, 323, 331, 36381, 1916, 36228, 36238, {11891, 36392, 9089, 11916, 9104, 9114, 9120}, {9127, 9131, 9135, 11937, 9143, 9148, 9152}, {9156, 9158, 9160, 9162, 9164, 9158, 9162}, {2413, 2420, 15113, 2434, 2440, 2513, 2517, 11959, 36246, 36256, 36264, 36273, 0}, {2413, 2420, 15113, 2434, 2440, 2513, 2517, 11959, 36246, 36256, 36264, 36273, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3943, 2309, 323, 331, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {36041, 36052, 13523, 36063, 36074, 36081, 36090, 36103, 36110, 36123, 36136, 36149, 0}, {36041, 36052, 13523, 36063, 36074, 36081, 36090, 36103, 36110, 36123, 36136, 36149, 0}, {36041, 36052, 13523, 36063, 36074, 36081, 36090, 36103, 36110, 36123, 36136, 36149, 0}, {36041, 36052, 13523, 36063, 36074, 36081, 36090, 36103, 36110, 36123, 36136, 36149, 0}, 0, 0, 2541, 241, {2309,1236,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{331,274,35,0,0,0,0,0,0,0,0,0},{323,280,23,0,0,0,0,0,0}}, - {5603, 1210, 23, 35, 1906, 3712, 1924, 1927, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 2541, 241, {1736,1779,1210,0,0,0,0,0,0,0,0,0,0,0},{5603,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {4313, 1229, 2936, 2947, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {243,14,3888,1229,1236,1210,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {1882, 9058, 323, 331, 44, 1916, 36403, 36421, {36436, 36449, 36468, 36481, 36496, 36513, 10880}, {36524, 36531, 36538, 36545, 36552, 36559, 36566}, {519, 522, 36573, 528, 531, 522, 528}, {36576, 36589, 564, 573, 15808, 15815, 15824, 605, 36604, 36623, 36638, 36655, 0}, {36576, 36589, 564, 573, 15808, 15815, 15824, 605, 36604, 36623, 36638, 36655, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}}, - {3943, 243, 280, 274, 44, 352, 1924, 1927, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 239, 241, {243,1210,0,0,0,0,0,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {4313, 2309, 23, 35, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 2541, 241, {243,14,1229,1236,1210,0,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {1882, 2261, 323, 331, 44, 19963, 36403, 36421, {36436, 36449, 36468, 36481, 36496, 36513, 10880}, {36524, 36531, 36538, 36545, 36552, 36559, 36566}, {519, 522, 36573, 528, 531, 522, 528}, {36576, 36589, 564, 573, 15808, 15815, 15824, 605, 36604, 36623, 36638, 36655, 0}, {36576, 36589, 564, 573, 15808, 15815, 15824, 605, 36604, 36623, 36638, 36655, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 0, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}}, - {4313, 243, 2936, 2947, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {243,14,14812,1229,1236,1210,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {9044, 9058, 323, 331, 36381, 1916, 36228, 36238, {11891, 36392, 9089, 11916, 9104, 9114, 9120}, {9127, 9131, 9135, 11937, 9143, 9148, 9152}, {9156, 9158, 9160, 9162, 9164, 9158, 9162}, {2413, 2420, 15113, 2434, 2440, 2513, 2517, 11959, 36246, 36256, 36264, 36273, 0}, {2413, 2420, 15113, 2434, 2440, 2513, 2517, 11959, 36246, 36256, 36264, 36273, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, 0, 6, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}}, - {13330, 243, 23, 35, 1906, 352, 1924, 1927, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 239, 241, {243,1210,0,0,0,0,0,0,0,0,0,0,0,0},{13330,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {4313, 243, 23, 35, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {243,14,1229,1236,1210,0,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {9044, 9058, 323, 331, 36381, 1916, 36403, 36421, {36436, 36449, 36468, 8571, 36496, 36513, 10880}, {36524, 36531, 36538, 36749, 36552, 36559, 36566}, {519, 522, 36573, 528, 531, 522, 528}, {36576, 36589, 564, 573, 15808, 36700, 36707, 605, 36604, 36623, 36638, 36655, 0}, {36576, 36589, 564, 573, 15808, 36700, 36707, 605, 36604, 36623, 36638, 36655, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, 0, 6, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}}, - {13330, 243, 23, 35, 1906, 352, 1924, 1927, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 239, 241, {243,1210,0,0,0,0,0,0,0,0,0,0,0,0},{13330,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {4313, 243, 23, 35, 947, 36756, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {243,14,1229,1236,1210,0,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,274,331,0,0,0,0,0,0,0,0},{23,2936,280,323,0,0,0,0,0}}, - {9044, 9058, 323, 331, 36381, 1916, 36228, 36238, {11891, 36392, 9089, 11916, 9104, 9114, 9120}, {9127, 9131, 9135, 11937, 9143, 9148, 9152}, {9156, 9158, 9160, 9162, 9164, 9158, 9162}, {2413, 2420, 15113, 2434, 2440, 2513, 2517, 11959, 36246, 36256, 36264, 36273, 0}, {2413, 2420, 15113, 2434, 2440, 2513, 2517, 11959, 36246, 36256, 36264, 36273, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, {34952, 34976, 34985, 34994, 35005, 35014, 35027, 35036, 35041, 35052, 35074, 35098, 0}, 0, 1, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}}, - {2909, 243, 2936, 2947, 36769, 352, 1924, 1927, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1210,1779,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {4313, 243, 323, 331, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 1, 239, 241, {243,14,1229,1236,1210,0,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {9044, 9058, 323, 331, 36381, 1916, 36403, 36421, {36436, 36449, 36468, 8571, 36496, 36513, 10880}, {36524, 36531, 36538, 36749, 36552, 36559, 36566}, {519, 522, 36573, 528, 531, 522, 528}, {36576, 36589, 564, 573, 15808, 36700, 36707, 605, 36604, 36623, 36638, 36655, 0}, {36576, 36589, 564, 573, 15808, 36700, 36707, 605, 36604, 36623, 36638, 36655, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}}, - {3909, 3703, 2936, 2947, 44, 3712, 1924, 1927, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1210,1779,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {4313, 2309, 323, 331, 947, 36779, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 1, 2541, 241, {2309,1236,14,1229,1210,0,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}}, - {4313, 243, 323, 331, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 1, 239, 241, {243,14,1229,1236,1210,0,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}}, - {4313, 243, 23, 35, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {243,14,1229,1236,1210,0,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {3943, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}}, - {5603, 2309, 280, 274, 44, 352, 7992, 21969, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 2541, 241, {2309,1236,2270,2843,1210,0,0,0,0,0,0,0,0,0},{5603,3672,0,0,0,0,0,0},{274,331,1850,0,0,0,0,0,0,0,0,0},{280,323,1870,1859,0,0,0,0,0}}, - {4313, 243, 23, 35, 947, 36779, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {243,14,1229,1236,1210,0,0,0,0,0,0,0,0,0},{4313,4342,4369,0,0,0,0,0},{35,2947,331,274,0,0,0,0,0,0,0,0},{23,2936,323,280,0,0,0,0,0}}, - {4313, 243, 23, 35, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {243,14,34247,1210,0,0,0,0,0,0,0,0,0,0},{4313,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {2909, 2927, 2936, 2947, 1906, 352, 7992, 21969, {3719, 3726, 3733, 3741, 3751, 3760, 3767}, {3776, 3780, 3784, 3788, 3792, 3796, 3800}, {2018, 2403, 2405, 3804, 2405, 2409, 2018}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {3806, 3814, 3823, 2715, 3829, 3833, 3838, 2735, 2742, 3843, 2760, 3851, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, {2778, 2782, 3860, 2791, 3829, 2795, 2799, 2803, 2807, 3864, 2815, 3868, 0}, 0, 0, 239, 241, {2927,1229,243,14,1210,0,0,0,0,0,0,0,0,0},{36790,14105,0,0,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {3957, 243, 23, 35, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {243,14,34247,1210,0,0,0,0,0,0,0,0,0,0},{4313,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {3957, 243, 23, 35, 36809, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {243,14,34247,1210,0,0,0,0,0,0,0,0,0,0},{4313,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {4313, 243, 23, 35, 947, 3985, 962, 968, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {243,14,34247,1210,0,0,0,0,0,0,0,0,0,0},{4313,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}}, - {3909, 3703, 2936, 2947, 947, 3712, 1924, 1927, {3997, 4005, 4011, 4018, 4029, 4036, 4044}, {4052, 4057, 4062, 4067, 4073, 4078, 4083}, {2692, 2411, 2403, 2403, 4089, 4091, 2018}, {4093, 4099, 4107, 4113, 4119, 4124, 4130, 4136, 4143, 4154, 4162, 4172, 0}, {4182, 4188, 4196, 1102, 4202, 4207, 4213, 4219, 4226, 1140, 4237, 4247, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, {4257, 4262, 4062, 4267, 4272, 4277, 4282, 4287, 4292, 4298, 4303, 4308, 0}, 0, 0, 239, 241, {3703,3872,3879,3888,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}}, - {1882, 2261, 323, 331, 44, 19963, 36403, 36421, {36436, 36449, 36468, 36481, 36496, 36513, 10880}, {36524, 36531, 36538, 36545, 36552, 36559, 36566}, {519, 522, 36573, 528, 531, 522, 528}, {36576, 36589, 564, 573, 15808, 15815, 15824, 605, 36604, 36623, 36638, 36655, 0}, {36576, 36589, 564, 573, 15808, 15815, 15824, 605, 36604, 36623, 36638, 36655, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1882, 2261, 323, 331, 1906, 11991, 36228, 36238, {9068, 9077, 9089, 9096, 9104, 9114, 9120}, {9127, 9131, 9135, 9139, 9143, 9148, 9152}, {0, 0, 0, 0, 0, 0, 0}, {2413, 2420, 15113, 2434, 2440, 2444, 2449, 11959, 36246, 36256, 36264, 36273, 0}, {2413, 2420, 15113, 2434, 2440, 2444, 2449, 11959, 36246, 36256, 36264, 36273, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {9044, 9058, 323, 331, 36381, 1916, 36403, 36421, {36436, 36449, 36468, 8571, 36496, 36513, 10880}, {36524, 36531, 36538, 36749, 36552, 36559, 36566}, {519, 522, 36573, 528, 531, 522, 528}, {36576, 36589, 564, 573, 15808, 36700, 36707, 605, 36604, 36623, 36638, 36655, 0}, {36576, 36589, 564, 573, 15808, 36700, 36707, 605, 36604, 36623, 36638, 36655, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {9044, 9058, 323, 331, 36381, 1916, 36228, 36238, {11891, 36392, 9089, 11916, 9104, 9114, 9120}, {9127, 9131, 9135, 11937, 9143, 9148, 9152}, {9156, 9158, 9160, 9162, 9164, 9158, 9162}, {2413, 2420, 15113, 2434, 2440, 2513, 2517, 11959, 36246, 36256, 36264, 36273, 0}, {2413, 2420, 15113, 2434, 2440, 2513, 2517, 11959, 36246, 36256, 36264, 36273, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3672, 2587, 280, 331, 1906, 352, 1924, 1927, {35307, 35318, 35342, 35372, 35389, 35411, 35420}, {15002, 15005, 15010, 15016, 15020, 7548, 15025}, {6687, 6675, 6677, 6679, 6681, 6683, 6685}, {35431, 35444, 564, 35457, 584, 35468, 35477, 605, 35486, 35503, 35518, 35531, 0}, {35431, 35444, 564, 35457, 584, 35468, 35477, 605, 35486, 35503, 35518, 35531, 0}, {15176, 7947, 2505, 2509, 15124, 15180, 15184, 15188, 15192, 2529, 15196, 15200, 0}, {15176, 7947, 2505, 2509, 15124, 15180, 15184, 15188, 15192, 2529, 15196, 15200, 0}, 0, 1, 754, 241, {2587,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{3672,5603,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1344, 1366, 323, 331, 1375, 1391, 1404, 1411, {1418, 1428, 1438, 1448, 1458, 1468, 1478}, {1488, 1495, 1502, 1509, 1516, 1523, 1530}, {1537, 1541, 1545, 1549, 1553, 1557, 1561}, {1565, 1572, 1579, 1586, 1593, 1600, 1607, 1614, 1621, 1628, 1635, 1645, 0}, {1565, 1572, 1579, 1586, 1593, 1600, 1607, 1614, 1621, 1628, 1635, 1645, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, 0, 0, 239, 241, {1366,1718,1727,1210,1736,1747,1758,1765,1772,1779,0,0,0,0},{1344,1788,1815,0,0,0,0,0},{331,274,1842,1850,0,0,0,0,0,0,0,0},{323,280,1859,1870,0,0,0,0,0}}, - {1882, 2587, 280, 274, 1906, 1916, 35194, 35199, {2320, 9929, 35204, 2343, 2350, 2358, 35211}, {2373, 35219, 35224, 2386, 2390, 2394, 35228}, {2018, 2403, 2405, 2407, 2405, 2409, 2411}, {2413, 2420, 4978, 2434, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2413, 2420, 4978, 2434, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, 2, 1, 754, 241, {2587,1245,2843,1210,2823,0,0,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{274,331,7430,5085,0,0,0,0,0,0,0,0},{280,323,7441,6558,0,0,0,0,0}}, - {1882, 2261, 323, 331, 1906, 11991, 36228, 36238, {9068, 9077, 9089, 9096, 9104, 9114, 9120}, {9127, 9131, 9135, 9139, 9143, 9148, 9152}, {0, 0, 0, 0, 0, 0, 0}, {2413, 2420, 15113, 2434, 2440, 2444, 2449, 11959, 36246, 36256, 36264, 36273, 0}, {2413, 2420, 15113, 2434, 2440, 2444, 2449, 11959, 36246, 36256, 36264, 36273, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, {2497, 2501, 2505, 2509, 2440, 2513, 2517, 11966, 2525, 2529, 2533, 2537, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {14891, 2587, 280, 274, 1906, 352, 1924, 1927, {14913, 14919, 14933, 14956, 14970, 14986, 14993}, {15002, 15005, 15010, 15016, 15020, 7548, 15025}, {6687, 6675, 6677, 6679, 6681, 6683, 6685}, {15029, 15036, 10276, 15043, 3829, 15049, 15055, 15061, 15068, 15077, 15085, 15092, 0}, {15099, 15106, 15113, 15118, 15124, 15128, 15133, 15138, 15145, 15154, 15162, 15169, 0}, {15176, 7947, 2505, 2509, 15124, 15180, 15184, 15188, 15192, 2529, 15196, 15200, 0}, {15176, 7947, 2505, 2509, 15124, 15180, 15184, 15188, 15192, 2529, 15196, 15200, 0}, 0, 1, 754, 241, {2587,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{3672,5603,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {35544, 2587, 280, 274, 1906, 352, 1924, 1927, {35565, 35580, 35595, 35610, 35627, 35644, 35653}, {35664, 35671, 35678, 35685, 35692, 19764, 35699}, {35706, 19343, 8668, 8671, 8665, 19340, 19778}, {13166, 13177, 8702, 13190, 8724, 13201, 13208, 8749, 13215, 13230, 13243, 13254, 0}, {13166, 13177, 8702, 13190, 8724, 13201, 13208, 8749, 13215, 13230, 13243, 13254, 0}, {13267, 13274, 13281, 13288, 8724, 13201, 13208, 13295, 13302, 13309, 13316, 13323, 0}, {13267, 13274, 13281, 13288, 8724, 13201, 13208, 13295, 13302, 13309, 13316, 13323, 0}, 0, 1, 754, 241, {2587,1245,20249,2843,14,1210,0,0,0,0,0,0,0,0},{35544,3672,5603,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {26058, 1210, 280, 274, 26112, 5736, 26131, 26136, {26141, 26148, 26159, 26172, 26185, 26196, 26209}, {26220, 26225, 26230, 26235, 26240, 26245, 26250}, {6675, 6677, 6679, 6681, 6683, 6685, 6687}, {26255, 26281, 26309, 26339, 26369, 26395, 26425, 26451, 26479, 26503, 26531, 26568, 0}, {26255, 26281, 26309, 26339, 26369, 26395, 26425, 26451, 26479, 26503, 26531, 26568, 0}, {26607, 26619, 26631, 26643, 26655, 26667, 26679, 26691, 26703, 26715, 26728, 26741, 0}, {26607, 26619, 26631, 26643, 26655, 26667, 26679, 26691, 26703, 26715, 26728, 26741, 0}, 0, 0, 2541, 241, {26754,1210,0,0,0,0,0,0,0,0,0,0,0,0},{26763,0,0,0,0,0,0,0},{331,0,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}}, - {1344, 2927, 323, 331, 1375, 1391, 1404, 1411, {1418, 1428, 1438, 1448, 1458, 1468, 1478}, {34903, 34910, 34917, 34924, 34931, 34938, 34945}, {1537, 1541, 1545, 1549, 1553, 1557, 1561}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, 0, 0, 239, 241, {2927,1229,14,1765,1779,1366,1736,1210,0,0,0,0,0,0},{1344,6759,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1344, 2927, 323, 331, 1375, 1391, 1404, 1411, {1418, 1428, 1438, 1448, 1458, 1468, 1478}, {34903, 34910, 34917, 34924, 34931, 34938, 34945}, {1537, 1541, 1545, 1549, 1553, 1557, 1561}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, {1655, 1660, 1665, 1670, 1675, 1680, 1685, 1690, 1695, 1700, 1706, 1712, 0}, 0, 0, 239, 241, {2927,1229,14,1765,1779,1366,1736,1210,0,0,0,0,0,0},{1344,6759,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {1882, 2587, 280, 274, 1906, 1916, 7213, 7218, {2320, 2328, 2335, 2343, 2350, 2358, 2365}, {7396, 7401, 7405, 7409, 7413, 7417, 7421}, {2018, 2403, 2405, 2407, 2405, 2409, 2411}, {2413, 2420, 4978, 2434, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2413, 2420, 4978, 2434, 4989, 2444, 2449, 2454, 2461, 2471, 2479, 6201, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, {2497, 2501, 2505, 2509, 4989, 2513, 2517, 2521, 2525, 2529, 2533, 7426, 0}, 2, 1, 754, 241, {2587,1245,2843,1210,2823,0,0,0,0,0,0,0,0,0},{1882,2554,0,0,0,0,0,0},{274,331,7430,5085,0,0,0,0,0,0,0,0},{280,323,7441,6558,0,0,0,0,0}}, - {9044, 9058, 323, 331, 36381, 1916, 36403, 36421, {36436, 36449, 36468, 8571, 36496, 36513, 10880}, {36524, 36531, 36538, 36749, 36552, 36559, 36566}, {519, 522, 36573, 528, 531, 522, 528}, {36576, 36589, 564, 573, 15808, 36700, 36707, 605, 36604, 36623, 36638, 36655, 0}, {36576, 36589, 564, 573, 15808, 36700, 36707, 605, 36604, 36623, 36638, 36655, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, {36672, 36679, 36686, 36693, 15808, 36700, 36707, 36714, 36721, 36728, 36735, 36742, 0}, 0, 1, 754, 241, {2261,2843,1895,2587,9640,1245,11970,1210,0,0,0,0,0,0},{1882,2554,2568,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {12972, 2587, 280, 274, 1906, 55, 12990, 13002, {13014, 13029, 13044, 13059, 13076, 13095, 13106}, {13117, 13124, 13131, 13138, 13145, 13152, 13159}, {0, 0, 0, 0, 0, 0, 0}, {13166, 13177, 8702, 13190, 8724, 13201, 13208, 8749, 13215, 13230, 13243, 13254, 0}, {13166, 13177, 8702, 13190, 8724, 13201, 13208, 8749, 13215, 13230, 13243, 13254, 0}, {13267, 13274, 13281, 13288, 8724, 13201, 13208, 13295, 13302, 13309, 13316, 13323, 0}, {13267, 13274, 13281, 13288, 8724, 13201, 13208, 13295, 13302, 13309, 13316, 13323, 0}, 0, 1, 754, 241, {1245,1210,0,0,0,0,0,0,0,0,0,0,0,0},{3672,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}}, - {20092, 2587, 280, 274, 1906, 20110, 1924, 1927, {20117, 20127, 20136, 20145, 20156, 20166, 20171}, {20178, 20184, 20189, 20194, 20199, 10699, 20203}, {20208, 2692, 2018, 7548, 2013, 4089, 2018}, {15029, 15036, 10276, 15043, 3829, 20210, 20215, 20220, 15068, 15077, 15085, 15092, 0}, {15029, 15036, 10276, 15043, 3829, 20210, 20215, 20220, 15068, 15077, 15085, 15092, 0}, {20227, 20232, 3860, 2791, 3829, 20210, 20215, 20236, 10683, 2811, 20240, 20245, 0}, {20227, 20232, 3860, 2791, 3829, 20210, 20215, 20236, 10683, 2811, 20240, 20245, 0}, 0, 1, 754, 241, {20249,1245,2843,14,1210,0,0,0,0,0,0,0,0,0},{20092,3672,5603,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}}, - {3943, 2309, 323, 331, 44, 352, 30622, 30632, {30645, 30652, 30658, 30665, 30671, 30677, 30685}, {30695, 30699, 30703, 30707, 30711, 30715, 30719}, {12798, 12798, 12798, 12798, 12798, 12798, 12798}, {30725, 30734, 10000, 30743, 30749, 30755, 30761, 30768, 30774, 30783, 30792, 30800, 0}, {30725, 30734, 10000, 30743, 30749, 30755, 30761, 30768, 30774, 30783, 30792, 30800, 0}, {30809, 30813, 3860, 30817, 3829, 30821, 30825, 30829, 30834, 30838, 30844, 30848, 0}, {30809, 30813, 3860, 30817, 3829, 30821, 30825, 30829, 30834, 30838, 30844, 30848, 0}, 0, 0, 2541, 241, {2309,1236,1210,0,0,0,0,0,0,0,0,0,0,0},{3943,254,0,0,0,0,0,0},{331,274,30852,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}}, - {3909, 2927, 2936, 2947, 44, 352, 0, 0, {31642, 31649, 31657, 31664, 31671, 31679, 31687}, {31694, 31697, 31700, 31703, 31706, 31709, 31712}, {2411, 2411, 2405, 2411, 12798, 4089, 12798}, {31715, 31723, 31733, 31739, 31747, 31752, 31757, 31762, 31769, 20073, 31777, 31785, 0}, {31715, 31723, 31733, 31739, 31747, 31752, 31757, 31762, 31769, 20073, 31777, 31785, 0}, {2778, 31793, 3860, 31797, 3829, 30821, 30825, 31801, 3800, 2811, 31805, 16316, 0}, {2778, 31793, 3860, 31797, 3829, 30821, 30825, 31801, 3800, 2811, 31805, 16316, 0}, 0, 0, 239, 241, {2927,1229,14,243,1779,1210,3899,0,0,0,0,0,0,0},{3909,3929,254,3943,0,0,0,0},{2947,35,331,274,0,0,0,0,0,0,0,0},{2936,23,323,280,0,0,0,0,0}} + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, 0, 6, 185, 187, {189,198,0,0,0,0,0,0,0,0,0,0,0,0},{209,222,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 296, 307, {318, 331, 352, 367, 378, 397, 408}, {421, 426, 431, 436, 441, 446, 451}, {456, 459, 462, 465, 468, 459, 465}, {471, 484, 501, 510, 521, 528, 535, 542, 555, 574, 591, 606, 0}, {471, 484, 501, 510, 521, 528, 535, 542, 555, 574, 591, 606, 0}, {623, 629, 501, 639, 521, 528, 535, 647, 655, 665, 673, 683, 0}, {623, 629, 501, 639, 521, 528, 535, 647, 655, 665, 673, 683, 0}, 2, 1, 691, 187, {693,708,724,740,0,0,0,0,0,0,0,0,0,0},{757,776,794,819,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{856,0,0,0,0,0,0,0}}, + {289, 872, 878, {884, 893, 901, 909, 918, 925, 935}, {944, 948, 952, 956, 960, 964, 968}, {972, 975, 978, 981, 984, 987, 990}, {993, 999, 1006, 1012, 1018, 1023, 1028, 1035, 1041, 1050, 1058, 1067, 0}, {993, 999, 1006, 1012, 1018, 1023, 1028, 1035, 1041, 1050, 1058, 1067, 0}, {1076, 1081, 1006, 1086, 1018, 1023, 1091, 1096, 1100, 1105, 1110, 1115, 0}, {1076, 1081, 1006, 1086, 1018, 1023, 1091, 1096, 1100, 1105, 1110, 1115, 0}, 2, 1, 185, 187, {198,189,1120,1128,1139,1148,1156,1167,1176,0,0,0,0,0},{1184,1207,1225,1242,1254,1270,0,0,0,0},{843,0,0,0,0,0,0,0,0,0,0,0},{848,0,0,0,0,0,0,0,0},{1286,1301,1311,1320,0,0,0,0}}, + {1327, 1340, 1347, {1354, 1364, 1374, 1384, 1394, 1404, 1414}, {1424, 1431, 1438, 1445, 1452, 1459, 1466}, {1473, 1477, 1481, 1485, 1489, 1493, 1497}, {1501, 1508, 1515, 1522, 1529, 1536, 1543, 1550, 1557, 1564, 1571, 1581, 0}, {1501, 1508, 1515, 1522, 1529, 1536, 1543, 1550, 1557, 1564, 1571, 1581, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, 0, 0, 185, 187, {1654,1663,1672,1681,1692,1703,1714,1721,1728,1735,0,0,0,0},{1744,1766,1794,1822,1837,0,0,0,0,0},{843,251,1858,1866,0,0,0,0,0,0,0,0},{848,269,1875,1886,0,0,0,0,0},{1898,1914,0,0,0,0,0,0}}, + {1327, 1340, 1347, {1354, 1364, 1374, 1384, 1394, 1404, 1414}, {1424, 1431, 1438, 1445, 1452, 1459, 1466}, {1473, 1477, 1481, 1485, 1489, 1493, 1497}, {1501, 1508, 1515, 1522, 1529, 1536, 1543, 1550, 1557, 1564, 1571, 1581, 0}, {1501, 1508, 1515, 1522, 1529, 1536, 1543, 1550, 1557, 1564, 1571, 1581, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, 0, 0, 185, 187, {1654,1663,1672,1681,1692,1703,1714,1721,1728,1735,0,0,0,0},{1744,1766,1794,1822,1837,0,0,0,0,0},{843,251,1858,1866,0,0,0,0,0,0,0,0},{848,269,1875,1886,0,0,0,0,0},{1898,1914,0,0,0,0,0,0}}, + {1921, 1929, 1932, {1935, 1943, 1953, 1961, 1969, 1978, 1985}, {1992, 1995, 1998, 2002, 2005, 2009, 2013}, {2016, 2018, 2020, 2023, 2025, 2018, 2023}, {2028, 2034, 2040, 2048, 2054, 2062, 2070, 2080, 2086, 2094, 2102, 2111, 0}, {2120, 2126, 2133, 2141, 2147, 2155, 2163, 2173, 2086, 2179, 2187, 2197, 0}, {2206, 2210, 2215, 2220, 2224, 2229, 2234, 2239, 2243, 2249, 2255, 2259, 0}, {2206, 2210, 2215, 2220, 2224, 2229, 2234, 2239, 2243, 2249, 2255, 2259, 0}, 2, 1, 2263, 187, {2266,2277,198,2286,189,2293,1692,1663,1721,0,0,0,0,0},{2300,0,0,0,0,0,0,0,0,0},{843,251,2313,2321,0,0,0,0,0,0,0,0},{848,269,2326,2337,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 1929, 1932, {2345, 2353, 2360, 2368, 2375, 2383, 2390}, {2398, 2403, 2407, 2411, 2415, 2419, 2423}, {2023, 2428, 2430, 2432, 2430, 2434, 2436}, {2438, 2445, 2453, 2459, 2465, 2469, 2474, 2479, 2486, 2496, 2504, 2513, 0}, {2438, 2445, 2453, 2459, 2465, 2469, 2474, 2479, 2486, 2496, 2504, 2513, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, 2, 1, 2566, 187, {1128,1139,1692,2568,0,0,0,0,0,0,0,0,0,0},{2300,0,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 2579, 2585, {2592, 2600, 2607, 2616, 2625, 2636, 2644}, {2652, 2655, 2658, 2661, 2664, 2667, 2670}, {2023, 2428, 2673, 2428, 2673, 2434, 2023}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, 2, 1, 691, 187, {1156,1167,1692,2804,0,0,0,0,0,0,0,0,0,0},{2818,2300,2837,0,0,0,0,0,0,0},{251,2850,0,0,0,0,0,0,0,0,0,0},{269,2862,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 2877, 2884, {2891, 2906, 2921, 2932, 2947, 2960, 2979}, {2994, 3001, 3008, 3015, 3022, 3029, 3036}, {3043, 3046, 3049, 3049, 3052, 3052, 3055}, {3058, 3079, 3102, 3117, 3134, 3145, 3160, 3175, 3194, 3217, 3236, 3255, 0}, {3276, 3297, 3320, 3335, 3352, 3363, 3378, 3393, 3412, 3435, 3454, 3473, 0}, {3494, 3501, 3508, 3515, 3522, 3529, 3538, 3547, 3554, 3561, 3568, 3575, 0}, {3494, 3501, 3508, 3515, 3522, 3529, 3538, 3547, 3554, 3561, 3568, 3575, 0}, 2, 1, 185, 187, {2277,198,2286,189,3582,1692,0,0,0,0,0,0,0,0},{1207,1242,0,0,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3613, 1929, 1932, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 185, 187, {3773,3782,3789,3798,1735,1692,3809,0,0,0,0,0,0,0},{3819,3838,3851,3870,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 1, 185, 187, {198,189,1120,2286,2293,1139,1167,1692,0,0,0,0,0,0},{4211,4239,4266,0,0,0,0,0,0,0},{843,251,2321,4288,4294,0,0,0,0,0,0,0},{848,269,2337,4302,4311,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {4322, 4332, 4336, {4340, 4352, 4364, 4374, 4388, 4398, 4410}, {4421, 4424, 4427, 4430, 4433, 4436, 4439}, {2023, 2428, 2430, 4442, 2430, 2018, 2436}, {4444, 4453, 4462, 4472, 4481, 4490, 4499, 4509, 4516, 4524, 4532, 4542, 0}, {4551, 4562, 4573, 4585, 4596, 4607, 4618, 4630, 4639, 4649, 4659, 4671, 0}, {4682, 4688, 4694, 4701, 4707, 4713, 4719, 4726, 4730, 4735, 4740, 4747, 0}, {4682, 4688, 4694, 4701, 4707, 4713, 4719, 4726, 4730, 4735, 4740, 4747, 0}, 2, 1, 691, 187, {4753,1156,4762,1692,0,0,0,0,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,2321,0,0,0,0,0,0,0,0,0,0},{848,2337,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {4783, 4792, 4798, 4804, 4813, 4819, 4828}, {4835, 4840, 4845, 4850, 4855, 4860, 4865}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, 0, 1, 185, 187, {198,189,1167,1139,1692,0,0,0,0,0,0,0,0,0},{4985,1242,5002,0,0,0,0,0,0,0},{251,843,4288,5011,5021,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 5029, 5042, {5053, 5071, 5085, 5103, 5121, 5139, 5155}, {5169, 5181, 5193, 5205, 5217, 5229, 5241}, {5248, 5253, 5258, 5263, 5268, 5273, 5278}, {5283, 5294, 5307, 5314, 5325, 5332, 5341, 5350, 5363, 5376, 5391, 5404, 0}, {5283, 5294, 5307, 5314, 5325, 5332, 5341, 5350, 5363, 5376, 5391, 5404, 0}, {5415, 5424, 5307, 5433, 5325, 5442, 5451, 5460, 5469, 5478, 5487, 5496, 0}, {5415, 5424, 5307, 5433, 5325, 5442, 5451, 5460, 5469, 5478, 5487, 5496, 0}, 0, 0, 185, 187, {198,5505,189,209,1139,1128,5518,1692,5531,5548,0,0,0,0},{5558,5505,5576,5598,5531,0,0,0,0,0},{251,242,0,0,0,0,0,0,0,0,0,0},{269,257,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {5619, 5627, 5631, {5635, 5645, 5653, 5658, 5665, 5678, 5686}, {3989, 5694, 4442, 5696, 5700, 2018, 5703}, {3989, 5694, 4442, 5707, 5700, 2018, 5707}, {5710, 5718, 5727, 5736, 5745, 5752, 5760, 5768, 5778, 5789, 2504, 2513, 0}, {5710, 5718, 5727, 5736, 5745, 5752, 5760, 5768, 5778, 5789, 2504, 2513, 0}, {5798, 5803, 5809, 5816, 5822, 5828, 5834, 5840, 5845, 5852, 1110, 5857, 0}, {5798, 5803, 5809, 5816, 5822, 5828, 5834, 5840, 5845, 5852, 1110, 5857, 0}, 2, 1, 691, 187, {5862,5874,1692,5888,0,0,0,0,0,0,0,0,0,0},{5897,0,0,0,0,0,0,0,0,0},{843,251,3594,0,0,0,0,0,0,0,0,0},{848,269,3602,0,0,0,0,0,0},{5911,0,0,0,0,0,0,0}}, + {1921, 5922, 5927, {5932, 5943, 5954, 5968, 5982, 5994, 6006}, {6018, 6023, 6029, 6035, 6041, 6046, 6052}, {2023, 2428, 6057, 2428, 2434, 2434, 2436}, {6060, 6068, 4887, 6077, 6084, 6089, 6096, 6103, 2486, 5789, 6111, 6121, 0}, {6060, 6068, 4887, 6077, 6084, 6089, 6096, 6103, 2486, 5789, 6111, 6121, 0}, {5798, 1081, 4845, 6130, 6084, 5828, 5834, 6135, 6142, 5852, 6147, 1115, 0}, {5798, 1081, 4845, 6130, 6084, 5828, 5834, 6135, 6142, 5852, 6147, 1115, 0}, 2, 1, 691, 187, {4753,1167,6153,6165,1692,6179,189,0,0,0,0,0,0,0},{2300,4769,6188,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {6207, 6216, 6224, 6233, 6244, 6253, 6262}, {6269, 6273, 2530, 6277, 6281, 6285, 6289}, {2673, 2436, 2428, 2428, 6293, 3989, 2023}, {6295, 6303, 4005, 6312, 6319, 6326, 6333, 4034, 6340, 6350, 6358, 6367, 0}, {6376, 6384, 4094, 6393, 6400, 6407, 6414, 4117, 6421, 6431, 1058, 6439, 0}, {6448, 2526, 2530, 2534, 6452, 6456, 6460, 6464, 6468, 6472, 2558, 6476, 0}, {6448, 2526, 2530, 2534, 6452, 6456, 6460, 6464, 6468, 6472, 2558, 6476, 0}, 2, 1, 185, 187, {198,3582,189,6480,2286,0,0,0,0,0,0,0,0,0},{4985,6488,1242,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1327, 6497, 6504, {6511, 6521, 6531, 6541, 6551, 6561, 6571}, {1473, 6581, 6585, 6589, 6593, 6597, 6601}, {1473, 6581, 6585, 6589, 6593, 6597, 6601}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 0, 185, 187, {1681,1735,1714,1654,1692,0,0,0,0,0,0,0,0,0},{1744,6632,6656,6683,6712,6736,6765,6785,0,0},{843,251,1858,1866,0,0,0,0,0,0,0,0},{848,269,1875,1886,0,0,0,0,0},{1898,0,0,0,0,0,0,0}}, + {6810, 6824, 6831, {6838, 6848, 6858, 6868, 6878, 6888, 6898}, {6908, 6912, 6916, 6920, 6924, 6928, 6932}, {6908, 6912, 6916, 6920, 6924, 6928, 6932}, {6936, 6941, 6946, 6951, 6956, 6961, 6966, 6971, 6976, 6981, 6987, 6993, 0}, {6936, 6941, 6946, 6951, 6956, 6961, 6966, 6971, 6976, 6981, 6987, 6993, 0}, {6936, 6941, 6946, 6951, 6956, 6961, 6966, 6971, 6976, 6981, 6987, 6993, 0}, {6936, 6941, 6946, 6951, 6956, 6961, 6966, 6971, 6976, 6981, 6987, 6993, 0}, 0, 0, 2566, 187, {1692,5888,1721,1663,0,0,0,0,0,0,0,0,0,0},{6999,7028,7052,7079,7101,7132,7158,7189,7215,7242},{1858,1866,843,251,0,0,0,0,0,0,0,0},{1875,1886,848,269,0,0,0,0,0},{7264,0,0,0,0,0,0,0}}, + {289, 7281, 7286, {7291, 7298, 7306, 7314, 7323, 7333, 7341}, {7350, 4424, 7353, 7356, 7359, 7362, 7365}, {7368, 2428, 2673, 3705, 2673, 3989, 7368}, {7370, 7378, 7387, 2459, 7393, 2469, 2474, 7397, 2486, 2496, 2504, 2513, 0}, {7370, 7378, 7387, 2459, 7393, 2469, 2474, 7397, 2486, 2496, 2504, 2513, 0}, {2522, 2526, 7406, 2534, 7393, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 7406, 2534, 7393, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, 2, 1, 2566, 187, {7410,2293,1139,189,1167,7419,1692,0,0,0,0,0,0,0},{4985,6488,1242,5002,0,0,0,0,0,0},{251,843,2321,7431,7443,0,0,0,0,0,0,0},{269,848,7455,7470,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 7281, 7286, {2345, 2353, 2360, 2368, 2375, 2383, 2390}, {7485, 7490, 7494, 7498, 7502, 7506, 7510}, {2023, 2428, 2430, 2432, 2430, 2434, 2436}, {2438, 2445, 4887, 2459, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2438, 2445, 4887, 2459, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, 0, 0, 691, 187, {1156,7519,1167,4762,2804,1692,0,0,0,0,0,0,0,0},{2300,4769,0,0,0,0,0,0,0,0},{251,843,7529,7539,4288,2321,7550,7561,0,0,0,0},{269,848,7571,7585,4302,2337,7598,7612,0},{1301,7625,7635,0,0,0,0,0}}, + {289, 1929, 1932, {7643, 7653, 7667, 7674, 7681, 7690, 1985}, {7698, 7705, 7710, 7714, 7719, 7724, 7728}, {2016, 2018, 3705, 7733, 7736, 2018, 2023}, {7738, 7747, 7752, 7759, 2465, 7769, 7778, 7785, 7795, 7805, 2102, 7818, 0}, {7828, 7837, 7844, 7850, 7859, 7864, 7872, 7878, 7887, 7897, 7911, 7921, 0}, {7929, 7933, 2530, 7937, 2465, 7941, 7945, 7949, 7953, 7957, 2255, 7962, 0}, {7929, 7933, 2530, 7937, 2465, 7941, 7945, 7949, 7953, 7957, 2255, 7962, 0}, 2, 1, 2566, 187, {1692,5888,0,0,0,0,0,0,0,0,0,0,0,0},{1242,5505,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 1929, 1932, {3895, 7966, 7980, 7993, 8006, 8019, 3942}, {6269, 8031, 8035, 8039, 8043, 8047, 8051}, {2673, 2023, 2430, 8056, 8056, 2023, 2023}, {8058, 8066, 8076, 1012, 8083, 8088, 8094, 4117, 8100, 8109, 8117, 8126, 0}, {8058, 8066, 8076, 1012, 8083, 8088, 8094, 4117, 8100, 8109, 8117, 8126, 0}, {2522, 8135, 2530, 8139, 4898, 2538, 2542, 6464, 6468, 8143, 2558, 8147, 0}, {2522, 8135, 2530, 8139, 4898, 2538, 2542, 6464, 6468, 8143, 2558, 8147, 0}, 0, 0, 185, 187, {198,189,2277,2286,1139,1128,2293,7410,1167,1156,7419,4762,4753,1692},{4211,4266,0,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {289, 8151, 8154, {8157, 8166, 4798, 8176, 8184, 8192, 8201}, {8207, 8210, 4424, 8214, 8217, 8221, 2013}, {2673, 6293, 2428, 2428, 6293, 3989, 2023}, {8224, 8232, 4887, 8239, 8246, 8251, 8261, 8269, 8275, 8285, 2504, 2513, 0}, {8224, 8232, 4887, 8239, 8246, 8251, 8261, 8269, 8275, 8285, 2504, 2513, 0}, {8293, 8300, 4887, 4962, 8246, 8306, 8313, 8269, 8318, 1105, 1110, 5857, 0}, {8293, 8300, 4887, 4962, 8246, 8306, 8313, 8269, 8318, 1105, 1110, 5857, 0}, 2, 1, 2566, 187, {1128,1139,0,0,0,0,0,0,0,0,0,0,0,0},{8324,0,0,0,0,0,0,0,0,0},{251,843,8353,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 7281, 7286, {8356, 8366, 8371, 8378, 8387, 8391, 8398}, {8409, 8413, 3761, 8417, 8421, 8425, 8429}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {8434, 8443, 8453, 8460, 4898, 8468, 8474, 2479, 8480, 8491, 8501, 8511, 0}, {8434, 8443, 8453, 8460, 4898, 8468, 8474, 2479, 8480, 8491, 8501, 8511, 0}, {8521, 1081, 4845, 6130, 4898, 8526, 8531, 5840, 4973, 1105, 1110, 5857, 0}, {8521, 1081, 4845, 6130, 4898, 8526, 8531, 5840, 4973, 1105, 1110, 5857, 0}, 0, 1, 691, 187, {1156,4753,1176,1128,1139,8536,8551,1692,8564,0,0,0,0,0},{1242,1207,4985,8579,0,0,0,0,0,0},{843,251,3594,242,0,0,0,0,0,0,0,0},{848,269,3602,257,0,0,0,0,0},{1301,1311,8590,1320,7635,8598,8604,8614}}, + {289, 8622, 8642, {8668, 8691, 352, 8714, 8725, 8740, 8755}, {8770, 8775, 8780, 8785, 8790, 8795, 8800}, {8805, 8808, 8805, 8811, 8814, 8808, 8811}, {8817, 8830, 8845, 8854, 8867, 8874, 8883, 8892, 8905, 8922, 8937, 8950, 0}, {8965, 8978, 8993, 9004, 9017, 9024, 9033, 9042, 9057, 9074, 9089, 9102, 0}, {9117, 9125, 8845, 9135, 8867, 8874, 8883, 9143, 9151, 9161, 9169, 9179, 0}, {9117, 9125, 8845, 9135, 8867, 8874, 8883, 9143, 9151, 9161, 9169, 9179, 0}, 0, 1, 691, 187, {1156,1167,4762,1128,189,0,0,0,0,0,0,0,0,0},{776,757,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 1929, 1932, {9187, 9196, 9208, 9215, 9223, 9233, 9239}, {9246, 9250, 9254, 9258, 9262, 9267, 9271}, {9275, 9277, 9279, 9281, 9283, 9277, 9281}, {9286, 9296, 9305, 9313, 9321, 9329, 9336, 9343, 9351, 2102, 9357, 9365, 0}, {9374, 9384, 9393, 9401, 9409, 9417, 9424, 9431, 9440, 7911, 9446, 9456, 0}, {9465, 9469, 9474, 9479, 9483, 7945, 2239, 9487, 9491, 2255, 9495, 2259, 0}, {9465, 9469, 9474, 9479, 9483, 7945, 2239, 9487, 9491, 2255, 9495, 2259, 0}, 0, 1, 691, 187, {9499,9509,6153,9517,9529,9539,9549,1692,0,0,0,0,0,0},{9561,9575,9590,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1921, 1929, 1932, {9610, 9618, 9627, 9634, 9641, 9650, 1985}, {1992, 1995, 9657, 2002, 9660, 9664, 2013}, {2016, 2018, 9667, 2023, 9669, 2018, 2023}, {5710, 5718, 9672, 6077, 9678, 9683, 9688, 2479, 2486, 5789, 2504, 2513, 0}, {9693, 9702, 7844, 9712, 9720, 9726, 9732, 9738, 9746, 9756, 9765, 9774, 0}, {2522, 2526, 2530, 2534, 9678, 9683, 9688, 2546, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 9678, 9683, 9688, 2546, 2550, 2554, 2558, 2562, 0}, 2, 1, 691, 187, {4753,1156,1167,1692,5888,9783,9796,9806,0,0,0,0,0,0},{2300,0,0,0,0,0,0,0,0,0},{843,251,2321,0,0,0,0,0,0,0,0,0},{848,269,2337,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 9817, 9826, {9834, 9841, 9850, 9859, 9871, 9879, 9888}, {9898, 9902, 3761, 9907, 9912, 9916, 9920}, {2673, 5694, 2428, 2428, 9924, 2018, 2023}, {9926, 9932, 4887, 9939, 2465, 9945, 9953, 9960, 9966, 9974, 9980, 9988, 0}, {9926, 9932, 4887, 9939, 2465, 9945, 9953, 9960, 9966, 9974, 9980, 9988, 0}, {2759, 9996, 3761, 10000, 10004, 10008, 10012, 10016, 9920, 10020, 10024, 10029, 0}, {2759, 9996, 3761, 10000, 10004, 10008, 10012, 10016, 9920, 10020, 10024, 10029, 0}, 0, 1, 691, 187, {4753,4762,0,0,0,0,0,0,0,0,0,0,0,0},{1207,0,0,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {10033, 10046, 10049, {10052, 10060, 10068, 2368, 2375, 2383, 10075}, {10083, 10088, 10093, 10097, 10101, 10105, 10109}, {2023, 2428, 2430, 2432, 2430, 2434, 2436}, {10114, 10122, 10131, 2696, 10004, 2706, 2711, 10136, 2723, 2733, 2741, 3752, 0}, {7370, 7378, 4887, 2459, 2465, 2469, 2474, 10144, 2486, 2496, 2504, 2513, 0}, {2759, 2763, 3761, 2772, 10004, 2776, 2780, 2784, 2788, 2792, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 10004, 2776, 2780, 2784, 2788, 2792, 2796, 3769, 0}, 2, 1, 2566, 187, {1692,5888,0,0,0,0,0,0,0,0,0,0,0,0},{10152,10170,0,0,0,0,0,0,0,0},{251,843,7529,0,0,0,0,0,0,0,0,0},{269,848,7585,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 0, 185, 187, {2277,2286,189,198,8579,10193,1692,0,0,0,0,0,0,0},{1242,10205,10221,0,0,0,0,0,0,0},{843,251,3594,242,0,0,0,0,0,0,0,0},{848,269,3602,257,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 10263, 10268, {10272, 10278, 10288, 10294, 10305, 10315, 10320}, {10330, 10334, 10338, 10342, 10347, 10351, 10355}, {2018, 2018, 2023, 10359, 2018, 7736, 7736}, {10362, 10367, 10374, 10379, 10385, 10392, 10400, 10407, 10416, 10423, 10428, 10435, 0}, {10362, 10367, 10374, 10379, 10385, 10392, 10400, 10407, 10416, 10423, 10428, 10435, 0}, {10443, 10447, 3761, 10452, 3730, 10456, 10460, 10464, 10469, 10473, 10477, 10481, 0}, {10443, 10447, 3761, 10452, 3730, 10456, 10460, 10464, 10469, 10473, 10477, 10481, 0}, 0, 1, 691, 187, {4753,4762,1156,1167,0,0,0,0,0,0,0,0,0,0},{10485,1242,10502,5505,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 10520, 10538, {10556, 10567, 10580, 10589, 10596, 10609, 10618}, {10556, 10567, 10580, 10589, 10596, 10609, 10618}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {10627, 10638, 10649, 10658, 10669, 10676, 10683, 10696, 10705, 10716, 10729, 10740, 0}, {10627, 10638, 10649, 10658, 10669, 10676, 10683, 10696, 10705, 10716, 10729, 10740, 0}, {10627, 10638, 10649, 10658, 10669, 10676, 10683, 10696, 10705, 10716, 10729, 10740, 0}, {10627, 10638, 10649, 10658, 10669, 10676, 10683, 10696, 10705, 10716, 10729, 10740, 0}, 0, 0, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 1929, 1932, {10765, 10772, 10778, 10785, 10790, 10796, 10802}, {10808, 10812, 10816, 10820, 10824, 10828, 10832}, {2428, 2023, 2023, 10836, 4442, 3987, 2023}, {10114, 10122, 10838, 2696, 10844, 2706, 2711, 10848, 2723, 2733, 2741, 10856, 0}, {10114, 10122, 10838, 2696, 10844, 2706, 2711, 10848, 2723, 2733, 2741, 10856, 0}, {2759, 2763, 3761, 2772, 10844, 2776, 2780, 10865, 2788, 2792, 2796, 10869, 0}, {2759, 2763, 3761, 2772, 10844, 2776, 2780, 10865, 2788, 2792, 2796, 10869, 0}, 0, 0, 185, 187, {198,189,1128,0,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 10873, 10878, {10883, 10896, 10915, 10932, 10945, 10958, 10975}, {10988, 8775, 8780, 8785, 8790, 8795, 8800}, {10993, 8808, 8805, 8811, 8814, 8808, 8811}, {10996, 11009, 11020, 11037, 11052, 11067, 11082, 11095, 11110, 11127, 11142, 11159, 0}, {11174, 11185, 11198, 11213, 11226, 11239, 11252, 11263, 11276, 11291, 11304, 11323, 0}, {11336, 11343, 11350, 11357, 11364, 11371, 11378, 11385, 11392, 11399, 11406, 11413, 0}, {11336, 11343, 11350, 11357, 11364, 11371, 11378, 11385, 11392, 11399, 11406, 11413, 0}, 0, 1, 691, 187, {1156,1167,1692,0,0,0,0,0,0,0,0,0,0,0},{11420,0,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{11438,0,0,0,0,0,0,0}}, + {289, 11454, 11467, {11480, 11495, 11516, 11531, 11544, 11557, 10975}, {421, 426, 11572, 436, 11577, 446, 451}, {456, 459, 11582, 465, 468, 459, 465}, {11585, 11602, 11611, 11626, 521, 11643, 11658, 11671, 11686, 11703, 11724, 11741, 0}, {11756, 11773, 11786, 11803, 9017, 11822, 11837, 11850, 11863, 11878, 11901, 11920, 0}, {11933, 11940, 11947, 11954, 521, 11961, 11968, 11975, 11982, 11989, 11996, 12003, 0}, {11933, 11940, 11947, 11954, 521, 11961, 11968, 11975, 11982, 11989, 11996, 12003, 0}, 0, 0, 691, 187, {1167,0,0,0,0,0,0,0,0,0,0,0,0,0},{1242,0,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 12010, 12015, {12020, 12028, 12039, 12045, 12051, 12060, 1985}, {9246, 9250, 2415, 12066, 9262, 9267, 12070}, {9275, 9277, 12074, 9281, 9283, 9277, 9281}, {2438, 2445, 9672, 2459, 2465, 12076, 12082, 12088, 2486, 2496, 2504, 2513, 0}, {2438, 2445, 9672, 2459, 2465, 12076, 12082, 12088, 2486, 2496, 2504, 2513, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, 0, 1, 691, 187, {4753,4762,2266,1156,12099,1167,9806,0,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {12109, 12118, 12123, {12128, 12139, 12150, 12161, 12172, 12183, 12189}, {2018, 9924, 2430, 4442, 2016, 10836, 2436}, {2018, 9924, 2430, 4442, 2016, 10836, 2436}, {12198, 12206, 12215, 12222, 4898, 12229, 12235, 2479, 2486, 12241, 2504, 12250, 0}, {12198, 12206, 12215, 12222, 4898, 12229, 12235, 2479, 2486, 12241, 2504, 12250, 0}, {12260, 12265, 12215, 2534, 4898, 12229, 12235, 2546, 12271, 2554, 2558, 12276, 0}, {12260, 12265, 12215, 2534, 4898, 12229, 12235, 2546, 12271, 2554, 2558, 12276, 0}, 2, 1, 691, 187, {7519,1156,1167,1692,0,0,0,0,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 12281, 12298, {12312, 12323, 12333, 12342, 12353, 12365, 12376}, {12386, 12389, 12392, 12395, 12398, 12401, 12404}, {2023, 2018, 2432, 2430, 7736, 2018, 2023}, {12407, 12417, 12428, 12434, 12443, 12449, 12457, 12465, 12473, 12484, 12493, 12503, 0}, {12513, 12523, 2453, 12534, 12543, 12549, 12557, 12565, 12573, 12584, 12593, 12603, 0}, {12613, 12619, 12428, 12625, 12443, 12630, 12636, 12642, 4190, 12647, 4201, 12652, 0}, {12613, 12619, 12428, 12625, 12443, 12630, 12636, 12642, 4190, 12647, 4201, 12652, 0}, 0, 1, 691, 187, {9517,9539,12657,0,0,0,0,0,0,0,0,0,0,0},{12669,0,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{12696,0,0,0,0,0,0,0}}, + {12714, 12726, 12015, {12732, 12744, 12756, 12768, 12782, 12797, 12810}, {12824, 12827, 12830, 12833, 12836, 12839, 9660}, {2023, 2018, 12842, 2430, 4442, 2018, 9669}, {12844, 12851, 12859, 12865, 12874, 12883, 12893, 12899, 12910, 12920, 12927, 12937, 0}, {12844, 12851, 12859, 12865, 12874, 12883, 12893, 12899, 12910, 12920, 12927, 12937, 0}, {12945, 12951, 12956, 12961, 12966, 12971, 12978, 12984, 12990, 12996, 13002, 13009, 0}, {12945, 12951, 12956, 12961, 12966, 12971, 12978, 12984, 12990, 12996, 13002, 13009, 0}, 2, 1, 2566, 187, {1692,2568,0,0,0,0,0,0,0,0,0,0,0,0},{13016,0,0,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{13038,0,0,0,0,0,0,0}}, + {1, 13053, 13065, {13077, 13092, 13107, 13122, 13139, 13158, 13169}, {13180, 13187, 13194, 13201, 13208, 13215, 13222}, {0, 0, 0, 0, 0, 0, 0}, {13229, 13240, 8845, 13253, 8867, 13264, 13271, 8892, 13278, 13293, 13306, 13317, 0}, {13229, 13240, 8845, 13253, 8867, 13264, 13271, 8892, 13278, 13293, 13306, 13317, 0}, {13330, 13337, 13344, 13351, 8867, 13264, 13271, 13358, 13365, 13372, 13379, 13386, 0}, {13330, 13337, 13344, 13351, 8867, 13264, 13271, 13358, 13365, 13372, 13379, 13386, 0}, 0, 0, 691, 187, {1156,1167,4762,1128,189,0,0,0,0,0,0,0,0,0},{13393,13411,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 13430, 13450, {13467, 13480, 13493, 13509, 13526, 13541, 13550}, {13467, 13480, 13493, 13509, 13526, 13541, 13550}, {13559, 13562, 13565, 13568, 13571, 13574, 13577}, {13580, 13593, 13604, 13613, 13624, 13629, 13638, 13649, 13656, 13671, 13682, 13695, 0}, {13708, 13723, 13604, 13613, 13736, 13629, 13743, 13649, 13656, 13671, 13682, 13695, 0}, {13580, 13593, 13604, 13613, 13624, 13629, 13638, 13649, 13656, 13671, 13682, 13695, 0}, {13580, 13593, 13604, 13613, 13624, 13629, 13638, 13649, 13656, 13671, 13682, 13695, 0}, 0, 6, 185, 187, {198,189,0,0,0,0,0,0,0,0,0,0,0,0},{13756,5505,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 13775, 13778, {13781, 13794, 13804, 13813, 13823, 13834, 13845}, {13857, 13860, 13865, 13870, 13875, 13880, 13885}, {13857, 13890, 13893, 13896, 13899, 13902, 13905}, {13908, 13917, 13926, 13935, 13944, 13953, 13962, 13971, 13980, 13989, 13999, 14009, 0}, {14019, 14028, 14037, 14046, 14055, 14064, 14073, 14082, 14091, 14100, 14110, 14120, 0}, {14130, 14136, 14142, 14148, 14154, 14160, 14166, 14172, 14178, 14184, 14191, 14198, 0}, {14130, 14136, 14142, 14148, 14154, 14160, 14166, 14172, 14178, 14184, 14191, 14198, 0}, 0, 1, 185, 187, {198,189,1139,1128,1692,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 14205, 14229, {14253, 14266, 14287, 14306, 14327, 14346, 14359}, {14370, 14377, 14384, 14391, 14398, 14405, 14412}, {14419, 14422, 14422, 14425, 14428, 14431, 14436}, {14439, 14454, 14469, 14478, 14489, 14500, 14513, 14526, 14541, 14560, 14579, 14596, 0}, {14615, 14632, 14649, 14660, 14673, 14686, 14701, 14716, 14733, 14754, 14775, 14794, 0}, {14815, 14822, 14829, 14836, 14843, 14850, 14857, 14864, 14871, 14878, 14885, 14892, 0}, {14815, 14822, 14829, 14836, 14843, 14850, 14857, 14864, 14871, 14878, 14885, 14892, 0}, 0, 1, 691, 187, {1156,1167,9796,198,14899,3582,1692,0,0,0,0,0,0,0},{3870,1207,13756,5505,14910,14921,14933,14950,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {14968, 14974, 14988, 15011, 15025, 15041, 15048}, {15057, 15060, 15065, 15071, 15075, 7736, 15080}, {6617, 6605, 6607, 6609, 6611, 6613, 6615}, {15084, 15091, 10374, 15098, 3730, 15104, 15110, 15116, 15123, 15132, 15140, 15147, 0}, {15154, 15161, 15168, 15173, 15179, 15183, 15188, 15193, 15200, 15209, 15217, 15224, 0}, {15231, 8135, 2530, 2534, 15179, 15235, 15239, 15243, 15247, 2554, 15251, 15255, 0}, {15231, 8135, 2530, 2534, 15179, 15235, 15239, 15243, 15247, 2554, 15251, 15255, 0}, 0, 0, 691, 187, {1156,1167,4762,189,1692,0,0,0,0,0,0,0,0,0},{15259,0,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {15281, 1929, 1932, {15296, 15304, 15315, 15325, 15336, 15345, 15354}, {15364, 15368, 15372, 15376, 15380, 15384, 15388}, {15392, 12842, 12842, 12842, 2432, 2432, 2436}, {15394, 15404, 15412, 15420, 15428, 15436, 15443, 15451, 15459, 15466, 15472, 15479, 0}, {15487, 15498, 15507, 15516, 15525, 15534, 15542, 15551, 15560, 15568, 15575, 15583, 0}, {15592, 15597, 4845, 15602, 15607, 15612, 15617, 15622, 15627, 15632, 15637, 15642, 0}, {15592, 15597, 4845, 15602, 15607, 15612, 15617, 15622, 15627, 15632, 15637, 15642, 0}, 2, 1, 185, 187, {1681,1692,0,0,0,0,0,0,0,0,0,0,0,0},{15647,0,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{15680,0,0,0,0,0,0,0}}, + {289, 15697, 15718, {15735, 331, 352, 8714, 15748, 15765, 15776}, {15789, 15797, 15805, 15811, 15819, 15827, 15835}, {456, 459, 462, 465, 468, 459, 465}, {15843, 484, 501, 510, 15858, 15865, 15874, 542, 555, 574, 591, 606, 0}, {15843, 484, 501, 510, 15858, 15865, 15874, 542, 555, 574, 591, 606, 0}, {15883, 15891, 15899, 639, 15858, 15907, 15915, 647, 655, 665, 673, 683, 0}, {15883, 15891, 15899, 639, 15858, 15907, 15915, 647, 655, 665, 673, 683, 0}, 0, 1, 691, 187, {1156,1167,15923,0,0,0,0,0,0,0,0,0,0,0},{13756,0,0,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 0, 0, {15940, 15947, 15958, 15967, 15976, 15983, 15994}, {16004, 16008, 16012, 16016, 16020, 16023, 16027}, {0, 0, 0, 0, 0, 0, 0}, {16031, 16041, 16050, 16058, 16067, 16080, 16092, 16099, 16106, 16113, 16123, 16135, 0}, {16031, 16041, 16050, 16058, 16067, 16080, 16092, 16099, 16106, 16113, 16123, 16135, 0}, {16148, 16152, 16156, 16160, 16164, 16168, 16172, 16176, 16180, 16184, 16188, 16192, 0}, {16148, 16152, 16156, 16160, 16164, 16168, 16172, 16176, 16180, 16184, 16188, 16192, 0}, 0, 0, 185, 187, {189,1681,1735,1692,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{242,3594,251,0,0,0,0,0,0,0,0,0},{257,3602,269,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 0, 0, {16196, 16201, 16207, 16217, 16229, 16237, 16248}, {16257, 16261, 16265, 16269, 16273, 16277, 16281}, {0, 0, 0, 0, 0, 0, 0}, {16285, 16295, 16305, 16312, 16319, 2706, 16324, 16331, 16338, 16347, 16355, 16363, 0}, {16285, 16295, 16305, 16312, 16319, 2706, 16324, 16331, 16338, 16347, 16355, 16363, 0}, {2759, 2763, 16027, 16371, 16375, 2776, 2780, 16379, 2788, 2792, 2796, 16383, 0}, {2759, 2763, 16027, 16371, 16375, 2776, 2780, 16379, 2788, 2792, 2796, 16383, 0}, 0, 0, 185, 187, {1681,1735,1692,0,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{242,3594,251,0,0,0,0,0,0,0,0,0},{257,3602,269,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {16387, 16393, 16404, 16217, 16229, 16237, 16248}, {16414, 16418, 16422, 16269, 16273, 16277, 16281}, {2023, 2428, 16426, 2430, 2023, 5694, 2428}, {16428, 16438, 16449, 16456, 16465, 16471, 16477, 16485, 16493, 16504, 16514, 16523, 0}, {16532, 16295, 16541, 16547, 16319, 2706, 16324, 16331, 16554, 16347, 16355, 16363, 0}, {2759, 2763, 16564, 2772, 16375, 2776, 2780, 16379, 2788, 2792, 2796, 16383, 0}, {2759, 2763, 16564, 2772, 16375, 2776, 2780, 16379, 2788, 2792, 2796, 16383, 0}, 0, 0, 2566, 187, {1128,1139,189,1681,1735,1692,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{242,3594,251,0,0,0,0,0,0,0,0,0},{257,3602,269,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 16568, 16572, {16576, 16583, 16591, 16599, 16608, 16618, 16625}, {2652, 16634, 2658, 16637, 2664, 16640, 2670}, {2023, 2428, 2673, 3705, 2673, 3989, 2023}, {16643, 16652, 16662, 2696, 10844, 16668, 16674, 16680, 2723, 2733, 2741, 10856, 0}, {16643, 16652, 16662, 2696, 10844, 16668, 16674, 16680, 2723, 2733, 2741, 10856, 0}, {2759, 2763, 3761, 2772, 10844, 2776, 2780, 2784, 2788, 2792, 2796, 10869, 0}, {2759, 2763, 3761, 2772, 10844, 2776, 2780, 2784, 2788, 2792, 2796, 10869, 0}, 0, 0, 185, 187, {1681,1735,1692,16689,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{242,3594,251,0,0,0,0,0,0,0,0,0},{257,3602,269,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {16701, 16717, 16742, 16770, 16798, 16826, 16854}, {16873, 16883, 16893, 16903, 16913, 16923, 16933}, {16943, 16947, 16951, 16947, 16955, 16959, 16963}, {16967, 16989, 17017, 17033, 17052, 17068, 17087, 17106, 17128, 17159, 17187, 17212, 0}, {16967, 16989, 17017, 17033, 17052, 17068, 17087, 17106, 17128, 17159, 17187, 17212, 0}, {17240, 17250, 17260, 17270, 17280, 17290, 17300, 17310, 17320, 17330, 17340, 17350, 0}, {17240, 17250, 17260, 17270, 17280, 17290, 17300, 17310, 17320, 17330, 17340, 17350, 0}, 0, 1, 691, 187, {1156,1167,7419,1176,4762,4753,1692,0,0,0,0,0,0,0},{17360,17394,17427,3870,17461,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 17473, 17478, {5932, 17483, 17494, 17504, 17514, 17524, 17538}, {17550, 17554, 17559, 17564, 17568, 17573, 17578}, {2023, 2428, 2430, 2428, 5694, 2434, 2436}, {2438, 2445, 4887, 6077, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2438, 2445, 4887, 6077, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, 2, 1, 2566, 187, {1128,1139,1692,0,0,0,0,0,0,0,0,0,0,0},{2300,0,0,0,0,0,0,0,0,0},{251,4288,0,0,0,0,0,0,0,0,0,0},{269,4302,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 17582, 17598, {17608, 17627, 17646, 17668, 17687, 17709, 17734}, {17753, 17763, 17773, 17786, 17796, 17809, 17825}, {17835, 17839, 17846, 17853, 17860, 17867, 17874}, {17878, 17894, 17913, 17929, 17948, 17955, 17965, 17981, 17997, 18016, 18038, 18054, 0}, {17878, 17894, 17913, 17929, 17948, 17955, 17965, 17981, 17997, 18016, 18038, 18054, 0}, {18073, 18080, 17913, 18090, 17948, 17955, 18106, 18119, 18126, 18139, 18155, 18165, 0}, {18073, 18080, 17913, 18090, 17948, 17955, 18106, 18119, 18126, 18139, 18155, 18165, 0}, 0, 0, 2566, 187, {1128,1139,2293,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {18178, 18192, 18195, {18198, 18207, 18216, 18226, 18236, 18246, 18258}, {18266, 18271, 18275, 18279, 18283, 18288, 18293}, {18297, 2430, 2430, 9924, 18297, 18300, 2023}, {18303, 18310, 18315, 2696, 18321, 18327, 18334, 18340, 18348, 18358, 18366, 18375, 0}, {18303, 18310, 18315, 2696, 18321, 18327, 18334, 18340, 18348, 18358, 18366, 18375, 0}, {2759, 18385, 3761, 2772, 18389, 18393, 18398, 18402, 18406, 18410, 2796, 18414, 0}, {2759, 18385, 3761, 2772, 18389, 18393, 18398, 18402, 18406, 18410, 2796, 18414, 0}, 0, 0, 185, 187, {198,1692,18419,7410,2277,0,0,0,0,0,0,0,0,0},{18428,18453,10193,0,0,0,0,0,0,0},{251,3594,843,0,0,0,0,0,0,0,0,0},{269,3602,848,3594,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {18472, 18485, 18490, {18495, 18507, 18518, 18532, 18544, 18554, 18564}, {18575, 18580, 18585, 18590, 18595, 18600, 18605}, {2023, 3989, 2428, 6293, 2673, 16426, 2436}, {18610, 18627, 18640, 18654, 18667, 18680, 18693, 18707, 18719, 18733, 18747, 18761, 0}, {18610, 18627, 18640, 18654, 18667, 18680, 18693, 18707, 18719, 18733, 18747, 18761, 0}, {18774, 18781, 18786, 18791, 18795, 18800, 18805, 18810, 18815, 18822, 18827, 18833, 0}, {18774, 18781, 18786, 18791, 18795, 18800, 18805, 18810, 18815, 18822, 18827, 18833, 0}, 2, 1, 691, 187, {1156,1167,4762,1692,0,0,0,0,0,0,0,0,0,0},{18838,18862,0,0,0,0,0,0,0,0},{251,843,4288,0,0,0,0,0,0,0,0,0},{269,848,4302,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 7281, 7286, {18880, 18894, 18904, 18915, 18929, 18940, 18951}, {18964, 18969, 18974, 18981, 18987, 18993, 18999}, {2673, 2436, 2428, 7736, 2673, 12842, 2023}, {19004, 19012, 19020, 19027, 19036, 19046, 19056, 19062, 19070, 19085, 19103, 19111, 0}, {19004, 19012, 19020, 19027, 19036, 19046, 19056, 19062, 19070, 19085, 19103, 19111, 0}, {19119, 19123, 19020, 19129, 19133, 19138, 19056, 19144, 19149, 19156, 19163, 19168, 0}, {19119, 19123, 19020, 19129, 19133, 19138, 19056, 19144, 19149, 19156, 19163, 19168, 0}, 2, 0, 185, 187, {198,189,2286,4762,1692,0,0,0,0,0,0,0,0,0},{1242,5505,10193,8579,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 19173, 19176, {19180, 19185, 10778, 10785, 19191, 19198, 10802}, {19205, 19209, 10816, 10820, 19213, 10828, 10832}, {12842, 15392, 2023, 10836, 4442, 3987, 2023}, {10114, 10122, 19217, 2696, 10844, 2776, 19221, 19227, 2723, 2733, 2741, 19232, 0}, {10114, 10122, 19217, 2696, 10844, 2776, 19221, 19227, 2723, 2733, 2741, 19232, 0}, {2759, 2763, 19217, 2772, 10844, 2776, 2780, 19241, 2788, 2792, 2796, 16383, 0}, {2759, 2763, 19217, 2772, 10844, 2776, 2780, 19241, 2788, 2792, 2796, 16383, 0}, 0, 0, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 19245, 19267, {19291, 19306, 19323, 19340, 19357, 19374, 19383}, {19394, 19400, 19406, 19412, 19418, 19424, 19430}, {19436, 19439, 8811, 8811, 19442, 19436, 8811}, {19445, 19458, 19469, 19482, 19493, 19504, 19517, 19528, 19539, 19556, 19567, 19580, 0}, {19445, 19458, 19469, 19482, 19493, 19504, 19517, 19528, 19539, 19556, 19567, 19580, 0}, {19599, 19607, 19615, 19623, 19631, 19639, 19647, 19655, 19663, 19671, 19679, 19687, 0}, {19599, 19607, 19615, 19623, 19631, 19639, 19647, 19655, 19663, 19671, 19679, 19687, 0}, 0, 0, 2566, 187, {6488,0,0,0,0,0,0,0,0,0,0,0,0,0},{19697,19715,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {19734, 19743, 19769, {19797, 19804, 19811, 19818, 19825, 19832, 19839}, {19797, 19804, 19811, 19818, 19825, 19832, 19839}, {19436, 19439, 19846, 19846, 19442, 19436, 19849}, {19852, 19865, 501, 19880, 521, 19893, 19902, 542, 19911, 19928, 19943, 19956, 0}, {19852, 19865, 501, 19880, 521, 19893, 19902, 542, 19911, 19928, 19943, 19956, 0}, {19971, 15891, 15899, 639, 521, 19979, 19987, 647, 19995, 665, 20003, 683, 0}, {19971, 15891, 15899, 639, 521, 19979, 19987, 647, 19995, 665, 20003, 683, 0}, 0, 0, 2566, 187, {20011,0,0,0,0,0,0,0,0,0,0,0,0,0},{20020,0,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{20041,0,0,0,0,0,0,0}}, + {20057, 1929, 1932, {20065, 20074, 20083, 20091, 20100, 20109, 20116}, {20125, 20128, 20131, 20134, 20137, 20141, 20144}, {6607, 6609, 6611, 6613, 12842, 15392, 6605}, {10114, 10122, 20147, 20153, 10844, 2706, 19221, 20160, 16338, 20167, 16355, 20174, 0}, {10114, 10122, 20147, 20153, 10844, 2706, 19221, 20160, 16338, 20167, 16355, 20174, 0}, {2759, 2763, 19217, 2772, 10844, 2776, 2780, 20182, 2788, 2792, 2796, 10869, 0}, {2759, 2763, 19217, 2772, 10844, 2776, 2780, 20182, 2788, 2792, 2796, 10869, 0}, 0, 0, 185, 187, {3773,3782,3789,3798,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {20220, 1929, 1932, {20227, 20237, 20246, 20255, 20266, 20276, 20281}, {20288, 20294, 20299, 20304, 20309, 10828, 20313}, {20318, 2673, 2023, 7736, 2018, 3987, 2023}, {15084, 15091, 10374, 15098, 3730, 20320, 20325, 20330, 15123, 15132, 15140, 15147, 0}, {15084, 15091, 10374, 15098, 3730, 20320, 20325, 20330, 15123, 15132, 15140, 15147, 0}, {20337, 20342, 3761, 2772, 3730, 20320, 20325, 20346, 10812, 2792, 20350, 20355, 0}, {20337, 20342, 3761, 2772, 3730, 20320, 20325, 20346, 10812, 2792, 20350, 20355, 0}, 0, 0, 691, 187, {1156,0,0,0,0,0,0,0,0,0,0,0,0,0},{20359,1242,5505,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 20377, 20405, {20427, 20446, 20465, 20490, 20509, 20543, 20568}, {20587, 20597, 20607, 20623, 20633, 20658, 20674}, {20684, 20688, 20695, 20699, 20706, 20713, 20720}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, 0, 1, 2566, 187, {1139,2293,1128,20970,20983,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{4288,2321,20998,21007,0,0,0,0,0,0,0,0},{4302,2337,21015,21027,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 1929, 1932, {21038, 21054, 21073, 21095, 21114, 21133, 21161}, {21183, 21191, 21202, 21216, 21227, 21238, 21258}, {21272, 21276, 21283, 21290, 21300, 21307, 21320}, {21327, 21343, 21362, 21375, 21394, 21401, 21411, 21427, 21440, 21456, 21475, 21491, 0}, {21327, 21343, 21362, 21375, 21394, 21401, 21411, 21427, 21440, 21456, 21475, 21491, 0}, {21327, 21343, 21362, 21375, 21394, 21401, 21411, 21427, 21440, 21456, 21475, 21491, 0}, {21327, 21343, 21362, 21375, 21394, 21401, 21411, 21427, 21440, 21456, 21475, 21491, 0}, 0, 0, 2566, 187, {1139,2293,4762,1128,1692,0,0,0,0,0,0,0,0,0},{10502,1242,0,0,0,0,0,0,0,0},{1866,1858,843,251,0,0,0,0,0,0,0,0},{1886,1875,848,269,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 1929, 1932, {21507, 21526, 21545, 21567, 21586, 21608, 21633}, {21652, 21662, 21672, 21685, 21695, 21708, 21724}, {21734, 21738, 21745, 21752, 21759, 21766, 21773}, {21777, 21805, 21833, 21849, 21868, 21875, 21885, 21901, 21917, 21945, 21967, 21989, 0}, {21777, 21805, 21833, 21849, 21868, 21875, 21885, 21901, 21917, 21945, 21967, 21989, 0}, {22014, 22033, 21833, 21849, 21868, 21875, 21885, 22052, 22059, 22075, 22091, 22101, 0}, {22014, 22033, 21833, 21849, 21868, 21875, 21885, 22052, 22059, 22075, 22091, 22101, 0}, 0, 0, 2566, 187, {1139,2293,4762,1128,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 8151, 22114, {22117, 22136, 22155, 22180, 22199, 22221, 22246}, {22265, 22275, 22285, 22301, 22311, 22324, 22340}, {22350, 22354, 22361, 22365, 22372, 22379, 22386}, {22390, 22412, 22443, 22465, 22484, 22491, 22501, 22517, 22533, 22564, 22586, 22608, 0}, {22390, 22412, 22443, 22465, 22484, 22491, 22501, 22517, 22533, 22564, 22586, 22608, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 0, 2566, 187, {1139,2293,4762,1128,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 22633, 22658, {22683, 22702, 22724, 22749, 22765, 22787, 22806}, {22816, 22823, 22830, 22837, 22844, 22851, 22858}, {22816, 22823, 22830, 22837, 22844, 22851, 22858}, {22862, 22878, 22903, 22922, 22941, 22948, 22961, 22974, 22993, 23024, 23049, 23071, 0}, {22862, 22878, 22903, 22922, 22941, 22948, 22961, 23096, 22993, 23024, 23049, 23071, 0}, {23115, 23123, 23137, 23151, 22941, 22948, 22961, 23162, 23170, 23184, 23195, 23203, 0}, {23115, 23123, 23137, 23151, 22941, 22948, 22961, 23162, 23170, 23184, 23195, 23203, 0}, 0, 0, 2566, 187, {1128,1139,2293,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3613, 1929, 1932, {23214, 23236, 23258, 23283, 23305, 23330, 23358}, {23380, 23390, 23400, 23413, 23423, 23436, 23452}, {23462, 23466, 23473, 23477, 23484, 23491, 23498}, {23502, 23518, 23543, 23562, 23584, 23591, 23604, 23617, 23636, 23667, 23692, 23711, 0}, {23502, 23518, 23543, 23562, 23584, 23591, 23736, 23617, 23636, 23667, 23692, 23711, 0}, {23749, 23756, 23543, 23772, 23584, 23591, 23736, 23617, 23788, 23810, 23826, 23836, 0}, {23749, 23756, 23543, 23772, 23584, 23591, 23736, 23617, 23788, 23810, 23826, 23836, 0}, 0, 0, 2566, 187, {1139,2293,4762,1128,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {3613, 1929, 1932, {23852, 23871, 23890, 23912, 23931, 23953, 23978}, {23997, 24007, 24017, 24030, 24040, 24053, 24069}, {24079, 24083, 24090, 24097, 24104, 24111, 24118}, {24122, 24138, 24163, 24182, 24204, 24211, 24224, 24237, 24256, 24284, 24309, 24331, 0}, {24122, 24138, 24163, 24182, 24204, 24211, 24224, 24237, 24256, 24284, 24309, 24331, 0}, {24356, 24364, 24384, 24391, 24204, 24408, 24415, 24423, 24431, 24454, 24471, 24485, 0}, {24356, 24364, 24384, 24391, 24204, 24408, 24415, 24423, 24431, 24454, 24471, 24485, 0}, 0, 0, 2566, 187, {1139,2293,4762,1128,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {20057, 1929, 1932, {24502, 24530, 24564, 24592, 24620, 24651, 24688}, {24716, 24729, 24748, 24764, 24777, 24796, 24815}, {24825, 24832, 24839, 24846, 24853, 24866, 24873}, {24877, 24896, 24924, 24946, 24965, 24978, 24988, 25001, 25026, 25057, 25082, 25098, 0}, {24877, 24896, 24924, 24946, 24965, 24978, 24988, 25001, 25026, 25057, 25082, 25098, 0}, {25117, 25127, 25146, 25156, 24965, 24978, 24988, 25172, 25179, 25204, 25220, 25230, 0}, {25117, 25127, 25146, 25156, 24965, 24978, 24988, 25172, 25179, 25204, 25220, 25230, 0}, 0, 0, 2566, 187, {1139,2293,1167,4762,0,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{4288,2321,20998,21007,0,0,0,0,0,0,0,0},{4302,2337,21015,21027,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 25243, 25271, {25293, 25312, 25331, 25356, 25375, 25409, 25434}, {25453, 20597, 20607, 20623, 25463, 25488, 20674}, {0, 0, 0, 0, 0, 0, 0}, {25504, 25529, 25560, 25576, 20821, 20828, 20838, 25595, 25611, 25642, 25664, 25686, 0}, {25504, 25529, 25560, 25576, 20821, 20828, 20838, 25595, 25611, 25642, 25664, 25686, 0}, {25711, 25724, 25560, 25576, 20821, 20828, 20838, 25743, 25750, 25766, 25782, 25792, 0}, {25711, 25724, 25560, 25576, 20821, 20828, 20838, 25743, 25750, 25766, 25782, 25792, 0}, 0, 0, 2566, 187, {1128,0,0,0,0,0,0,0,0,0,0,0,0,0},{25805,0,0,0,0,0,0,0,0,0},{1858,1866,0,0,0,0,0,0,0,0,0,0},{1875,1886,0,0,0,0,0,0,0},{25824,25832,0,0,0,0,0,0}}, + {1, 1929, 1932, {17608, 17627, 25842, 17668, 17687, 17709, 17734}, {17753, 17763, 25864, 17786, 17796, 17809, 17825}, {17835, 17839, 17846, 17853, 17860, 17867, 17874}, {25877, 25902, 17913, 25933, 25952, 17955, 25959, 25972, 25988, 26013, 26035, 26063, 0}, {25877, 25902, 17913, 25933, 25952, 17955, 25959, 25972, 25988, 26013, 26035, 26063, 0}, {26085, 26098, 17913, 26117, 25952, 17955, 25959, 26133, 26140, 26159, 26175, 26197, 0}, {26085, 26098, 17913, 26117, 25952, 17955, 25959, 26133, 26140, 26159, 26175, 26197, 0}, 0, 0, 2566, 187, {1128,1139,2293,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {5619, 26213, 26218, {26223, 26230, 26241, 26254, 26267, 26278, 26291}, {26302, 26307, 26312, 26317, 26322, 26327, 26332}, {6605, 6607, 6609, 6611, 6613, 6615, 6617}, {26337, 26363, 26391, 26421, 26451, 26477, 26507, 26533, 26561, 26585, 26613, 26650, 0}, {26337, 26363, 26391, 26421, 26451, 26477, 26507, 26533, 26561, 26585, 26613, 26650, 0}, {26689, 26701, 26713, 26725, 26737, 26749, 26761, 26773, 26785, 26797, 26810, 26823, 0}, {26689, 26701, 26713, 26725, 26737, 26749, 26761, 26773, 26785, 26797, 26810, 26823, 0}, 0, 0, 2566, 187, {1692,0,0,0,0,0,0,0,0,0,0,0,0,0},{26836,26890,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{26926,0,0,0,0,0,0,0}}, + {26945, 26969, 26991, {27016, 27044, 27072, 27109, 27140, 27174, 27199}, {27233, 27249, 27265, 27290, 27309, 27331, 27344}, {27366, 27373, 27380, 27387, 27394, 27401, 27405}, {27415, 27449, 27486, 27520, 27554, 27585, 27622, 27659, 27699, 27733, 27767, 27816, 0}, {27415, 27449, 27486, 27520, 27554, 27585, 27622, 27659, 27699, 27733, 27767, 27816, 0}, {27865, 27878, 27891, 27904, 27917, 27930, 27943, 27956, 27969, 27982, 27998, 28014, 0}, {27865, 27878, 27891, 27904, 27917, 27930, 27943, 27956, 27969, 27982, 27998, 28014, 0}, 0, 0, 185, 187, {1654,1663,1672,1703,1692,1681,1721,1714,1728,0,0,0,0,0},{28030,28073,28121,28153,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{28190,1914,0,0,0,0,0,0}}, + {289, 1929, 1932, {28223, 28232, 28242, 28254, 28267, 28276, 28288}, {28300, 28304, 28309, 28313, 28317, 28321, 28325}, {2023, 28329, 2428, 2428, 15392, 6293, 2023}, {28332, 28339, 28348, 28355, 2702, 28362, 28370, 28381, 28386, 28391, 28398, 28407, 0}, {28332, 28339, 28348, 28355, 2702, 28362, 28370, 28381, 28386, 28391, 28398, 28407, 0}, {28415, 28419, 28309, 28423, 2702, 28427, 28431, 28381, 28386, 28435, 28439, 28444, 0}, {28415, 28419, 28309, 28423, 2702, 28427, 28431, 28381, 28386, 28435, 28439, 28444, 0}, 2, 1, 185, 187, {189,198,5002,8579,0,0,0,0,0,0,0,0,0,0},{1242,1207,0,0,0,0,0,0,0,0},{251,843,242,3594,0,0,0,0,0,0,0,0},{269,848,257,3602,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 28449, 28465, {28481, 28503, 28516, 28535, 28545, 28576, 28592}, {28481, 28503, 28516, 28535, 28545, 28576, 28592}, {6605, 6607, 6609, 6611, 6613, 6615, 6617}, {28605, 28618, 28637, 28650, 28663, 28676, 28695, 28714, 28727, 28743, 28756, 28781, 0}, {28605, 28618, 28637, 28650, 28663, 28676, 28695, 28714, 28727, 28743, 28756, 28781, 0}, {28605, 28618, 28637, 28650, 28663, 28676, 28695, 28714, 28727, 28743, 28756, 28781, 0}, {28605, 28618, 28637, 28650, 28663, 28676, 28695, 28714, 28727, 28743, 28756, 28781, 0}, 0, 0, 185, 187, {189,1692,0,0,0,0,0,0,0,0,0,0,0,0},{1242,10205,0,0,0,0,0,0,0,0},{843,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{28794,0,0,0,0,0,0,0}}, + {289, 28829, 28854, {28879, 28904, 28923, 28951, 28970, 28995, 29014}, {28879, 28904, 28923, 28951, 28970, 28995, 29014}, {29036, 29040, 29044, 29048, 29058, 29062, 29072}, {29076, 29095, 29111, 29124, 29137, 29159, 29178, 29200, 29216, 29232, 29245, 29261, 0}, {29076, 29095, 29111, 29124, 29137, 29159, 29178, 29200, 29216, 29232, 29245, 29261, 0}, {29277, 29286, 29295, 29304, 29313, 29322, 29334, 29343, 29352, 29361, 29370, 29379, 0}, {29277, 29286, 29295, 29304, 29313, 29322, 29334, 29343, 29352, 29361, 29370, 29379, 0}, 0, 0, 185, 187, {198,29388,6480,0,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 7281, 7286, {3895, 29398, 3909, 29403, 29413, 29419, 3942}, {29426, 8413, 3761, 29430, 29435, 29439, 29443}, {2673, 2436, 2428, 2428, 29448, 3989, 2023}, {29450, 29458, 4005, 4011, 29467, 29472, 29478, 4034, 29484, 29493, 29501, 29510, 0}, {29519, 29527, 4094, 1012, 8083, 29536, 29542, 4117, 8100, 8109, 8117, 29548, 0}, {29557, 2763, 3761, 29561, 2702, 29565, 29570, 20182, 18406, 29574, 2796, 3769, 0}, {29557, 2763, 3761, 29561, 2702, 29565, 29570, 20182, 18406, 29574, 2796, 3769, 0}, 2, 1, 185, 187, {198,189,1120,2286,1139,1167,1692,0,0,0,0,0,0,0},{29578,4239,4266,1242,0,0,0,0,0,0},{843,251,242,29607,0,0,0,0,0,0,0,0},{848,269,257,29619,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {1, 29639, 29651, {29663, 17627, 29691, 17668, 17687, 17709, 17734}, {17753, 17763, 25864, 17786, 17796, 17809, 17825}, {0, 0, 0, 0, 0, 0, 0}, {25877, 25902, 17913, 25933, 25952, 17955, 25959, 29710, 29726, 29754, 26035, 26063, 0}, {25877, 25902, 17913, 25933, 25952, 17955, 25959, 29710, 29726, 29754, 26035, 26063, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 0, 2566, 187, {1128,1139,2293,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {20057, 29776, 29788, {29797, 29813, 29829, 29857, 29873, 29916, 29941}, {29797, 29813, 29969, 29857, 29979, 30001, 30014}, {30024, 30028, 30032, 30036, 30040, 30053, 30060}, {30067, 30086, 30111, 30130, 30155, 30168, 30181, 30194, 30216, 30250, 30275, 30303, 0}, {30067, 30086, 30111, 30130, 30155, 30168, 30181, 30194, 30216, 30250, 30275, 30303, 0}, {30331, 30338, 30348, 30130, 30155, 30168, 30181, 30361, 30371, 30384, 30394, 30407, 0}, {30331, 30338, 30348, 30130, 30155, 30168, 30181, 30361, 30371, 30384, 30394, 30407, 0}, 0, 1, 2566, 187, {1692,1681,1735,198,189,0,0,0,0,0,0,0,0,0},{30420,0,0,0,0,0,0,0,0,0},{1858,1866,843,251,0,0,0,0,0,0,0,0},{1875,1886,848,269,0,0,0,0,0},{30468,0,0,0,0,0,0,0}}, + {30478, 30494, 30504, {30517, 30527, 30534, 30547, 30557, 30567, 30577}, {30517, 30527, 30587, 30547, 30557, 30567, 30577}, {30597, 30601, 30605, 30609, 30613, 30617, 30621}, {30625, 30641, 30657, 30667, 30680, 30687, 30694, 30704, 30717, 30736, 30752, 30768, 0}, {30625, 30641, 30657, 30667, 30680, 30687, 30694, 30704, 30717, 30784, 30752, 30768, 0}, {30803, 30813, 30657, 30823, 30680, 30687, 30694, 30833, 30843, 30853, 30863, 30873, 0}, {30803, 30813, 30657, 30823, 30680, 30687, 30694, 30833, 30843, 30853, 30863, 30873, 0}, 0, 0, 185, 187, {2277,1692,0,0,0,0,0,0,0,0,0,0,0,0},{30883,0,0,0,0,0,0,0,0,0},{3594,0,0,0,0,0,0,0,0,0,0,0},{3602,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 30915, 30925, {30938, 30945, 30951, 30958, 30964, 30970, 30978}, {30988, 30992, 30996, 31000, 31004, 31008, 31012}, {12842, 12842, 12842, 12842, 12842, 12842, 12842}, {31018, 31027, 10131, 31036, 31042, 31048, 31054, 31061, 31067, 31076, 31085, 31093, 0}, {31018, 31027, 10131, 31036, 31042, 31048, 31054, 31061, 31067, 31076, 31085, 31093, 0}, {31102, 31106, 3761, 31110, 3730, 31114, 31118, 31122, 31127, 31131, 31137, 31141, 0}, {31102, 31106, 3761, 31110, 3730, 31114, 31118, 31122, 31127, 31131, 31137, 31141, 0}, 0, 0, 2566, 187, {1128,1139,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 31145, 31186, {31227, 31246, 31265, 31290, 31309, 31331, 31356}, {31375, 17763, 31385, 17786, 31401, 17809, 17825}, {31414, 17839, 31418, 17853, 31422, 17867, 17874}, {17878, 31429, 17913, 31457, 25952, 31476, 17965, 31486, 31502, 31533, 31555, 31580, 0}, {17878, 31429, 17913, 31457, 25952, 31476, 17965, 31486, 31502, 31533, 31555, 31580, 0}, {17878, 31429, 17913, 31457, 25952, 31476, 17965, 31486, 31502, 31533, 31555, 31580, 0}, {17878, 31429, 17913, 31457, 25952, 31476, 17965, 31486, 31502, 31533, 31555, 31580, 0}, 0, 0, 185, 187, {3773,3782,3789,3798,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{25832,0,0,0,0,0,0,0}}, + {289, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {31605, 31612, 31621, 31636, 31647, 31656, 31663, 31670, 31677, 31688, 31701, 31714, 0}, {31605, 31612, 31621, 31636, 31647, 31656, 31663, 31670, 31677, 31688, 31701, 31714, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 6, 185, 187, {1654,1692,0,0,0,0,0,0,0,0,0,0,0,0},{31719,31740,0,0,0,0,0,0,0,0},{3594,843,0,0,0,0,0,0,0,0,0,0},{3602,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {31755, 1929, 1932, {31761, 31768, 31774, 31781, 31792, 31800, 31809}, {31816, 8413, 3761, 31820, 31824, 31828, 10832}, {2436, 2436, 2428, 2428, 5694, 16426, 2023}, {3991, 31832, 31840, 4011, 4017, 31846, 31852, 4034, 31858, 31868, 31876, 31886, 0}, {3991, 31832, 31840, 4011, 4017, 31846, 31852, 4034, 31858, 31868, 31876, 31886, 0}, {31896, 31900, 3761, 29561, 3730, 31904, 31908, 20182, 18406, 2792, 31912, 16383, 0}, {31896, 31900, 3761, 29561, 3730, 31904, 31908, 20182, 18406, 2792, 31912, 16383, 0}, 0, 0, 185, 187, {3773,3782,3789,3798,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 0, 0, {31916, 31923, 31931, 31938, 31945, 31953, 31961}, {31968, 31971, 31974, 31977, 31980, 31983, 31986}, {2436, 2436, 2430, 2436, 12842, 3987, 12842}, {31989, 31997, 32007, 32013, 32021, 32026, 32031, 32036, 32043, 20167, 32051, 32059, 0}, {31989, 31997, 32007, 32013, 32021, 32026, 32031, 32036, 32043, 20167, 32051, 32059, 0}, {2759, 32067, 3761, 32071, 3730, 31114, 31118, 32075, 3701, 2792, 32079, 16383, 0}, {2759, 32067, 3761, 32071, 3730, 31114, 31118, 32075, 3701, 2792, 32079, 16383, 0}, 0, 0, 185, 187, {2277,2286,189,198,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 32083, 32094, {32104, 32122, 32137, 32159, 32172, 32186, 32203}, {32227, 32235, 32240, 32159, 32172, 32252, 32259}, {0, 0, 0, 0, 0, 0, 0}, {32273, 32295, 32311, 32331, 32345, 32362, 32377, 32394, 32408, 32421, 32440, 32454, 0}, {32273, 32295, 32311, 32331, 32345, 32362, 32377, 32394, 32408, 32421, 32440, 32454, 0}, {32473, 32488, 32497, 32510, 32517, 32527, 32535, 32545, 32552, 32558, 32570, 32577, 0}, {32473, 32488, 32497, 32510, 32517, 32527, 32535, 32545, 32552, 32558, 32570, 32577, 0}, 0, 0, 185, 187, {2277,2286,189,198,1735,1692,3809,0,0,0,0,0,0,0},{222,20186,20206,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{25832,0,0,0,0,0,0,0}}, + {3613, 0, 0, {32589, 32597, 15958, 15967, 15976, 32608, 32618}, {16414, 16008, 16012, 16016, 16020, 16277, 32627}, {0, 0, 0, 0, 0, 0, 0}, {32631, 32640, 32650, 32658, 10844, 3734, 32666, 32672, 32681, 32690, 32699, 32708, 0}, {32631, 32640, 32650, 32658, 10844, 3734, 32666, 32672, 32681, 32690, 32699, 32708, 0}, {2759, 2763, 16027, 32717, 10844, 2776, 2780, 20182, 18406, 2792, 32721, 16383, 0}, {2759, 2763, 16027, 32717, 10844, 2776, 2780, 20182, 18406, 2792, 32721, 16383, 0}, 0, 0, 185, 187, {189,1681,1735,1692,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{242,3594,251,0,0,0,0,0,0,0,0,0},{257,3602,269,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {32725, 32738, 32743, {32748, 32755, 32770, 32784, 32800, 32815, 32831}, {6289, 32846, 2530, 32850, 32854, 32858, 32862}, {2023, 12842, 2428, 2018, 2023, 2430, 12842}, {7370, 7378, 32866, 32873, 32880, 2469, 2474, 32885, 32895, 32906, 32915, 32925, 0}, {7370, 7378, 32866, 32873, 32880, 2469, 2474, 32885, 32895, 32906, 32915, 32925, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, 0, 0, 2566, 187, {1128,1139,1692,2568,0,0,0,0,0,0,0,0,0,0},{32935,2300,4769,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 32954, 32959, {32964, 32980, 32988, 32996, 33005, 33017, 33027}, {33037, 33043, 33049, 33053, 33057, 33065, 3701}, {0, 0, 0, 0, 0, 0, 0}, {33072, 33085, 33099, 33108, 33114, 33118, 33123, 33131, 16338, 33144, 16355, 16363, 0}, {33072, 33085, 33099, 33108, 33114, 33118, 33123, 33131, 16338, 33144, 16355, 16363, 0}, {33153, 2763, 33157, 16371, 33114, 33161, 2780, 33165, 2788, 33173, 2796, 16383, 0}, {33153, 2763, 33157, 16371, 33114, 33161, 2780, 33165, 2788, 33173, 2796, 16383, 0}, 0, 0, 185, 187, {2277,2286,189,198,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{2313,0,0,0,0,0,0,0,0,0,0,0},{2326,0,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {33179, 33206, 33213, {33220, 33230, 33240, 33250, 33260, 33270, 33280}, {33290, 33297, 33304, 33311, 33318, 33325, 33332}, {33339, 33343, 33347, 33351, 33355, 33359, 33363}, {33367, 33374, 33381, 33388, 33395, 33402, 33409, 33416, 33423, 33430, 33437, 33447, 0}, {33367, 33374, 33381, 33388, 33395, 33402, 33409, 33416, 33423, 33430, 33437, 33447, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 0, 185, 187, {1654,1663,1672,1703,1692,1681,0,0,0,0,0,0,0,0},{33457,33481,33511,33541,33558,0,0,0,0,0},{1858,843,251,0,0,0,0,0,0,0,0,0},{1875,848,269,0,0,0,0,0,0},{33581,1914,0,0,0,0,0,0}}, + {289, 0, 0, {28300, 8413, 33598, 33605, 33615, 33620, 33627}, {33634, 6273, 33638, 4850, 33643, 33648, 33653}, {4421, 33658, 33661, 33664, 33667, 33670, 33673}, {33676, 33683, 33598, 33694, 33700, 33704, 33713, 33720, 33725, 33734, 33739, 33742, 0}, {33676, 33683, 33598, 33694, 33700, 33704, 33713, 33720, 33725, 33734, 33739, 33742, 0}, {33748, 33752, 33759, 28423, 33700, 33764, 33769, 33720, 33774, 33734, 33739, 33779, 0}, {33748, 33752, 33759, 28423, 33700, 33764, 33769, 33720, 33774, 33734, 33739, 33779, 0}, 2, 1, 185, 187, {198,189,1167,1139,1692,0,0,0,0,0,0,0,0,0},{4985,5002,1242,0,0,0,0,0,0,0},{251,843,4288,5011,5021,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 33783, 33788, {33793, 33801, 33811, 33821, 33830, 33840, 33848}, {33858, 33862, 33867, 33871, 33875, 33879, 33883}, {2023, 2428, 2673, 2428, 2673, 2434, 2023}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 33887, 33896, 33907, 33916, 33926, 0}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 33887, 33896, 33907, 33916, 33926, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, 0, 0, 185, 187, {198,189,1167,1139,1692,0,0,0,0,0,0,0,0,0},{4985,5002,1242,0,0,0,0,0,0,0},{251,843,4288,5011,5021,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {33936, 33954, 33959, {33964, 33989, 34018, 34043, 34056, 34071, 34088}, {34103, 34108, 34113, 34118, 34123, 34128, 8800}, {19442, 19442, 34133, 8811, 8814, 19442, 8811}, {34136, 34155, 34170, 34192, 34212, 34228, 34244, 34258, 34284, 34308, 34325, 34342, 0}, {34136, 34155, 34170, 34192, 34212, 34228, 34244, 34258, 34284, 34308, 34325, 34342, 0}, {34359, 34368, 34377, 34391, 34405, 34417, 34429, 34439, 34455, 34469, 34476, 34483, 0}, {34359, 34368, 34377, 34391, 34405, 34417, 34429, 34439, 34455, 34469, 34476, 34483, 0}, 0, 1, 691, 187, {1156,4753,1692,34490,34500,0,0,0,0,0,0,0,0,0},{34513,34548,34577,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{34612,0,0,0,0,0,0,0}}, + {20057, 0, 0, {34628, 34640, 34651, 34663, 34675, 34685, 34697}, {34712, 34717, 34722, 34727, 34732, 34737, 34742}, {0, 0, 0, 0, 0, 0, 0}, {34747, 34756, 34768, 34776, 34781, 34791, 34798, 34807, 34814, 34820, 34829, 34840, 0}, {34747, 34756, 34768, 34776, 34781, 34791, 34798, 34807, 34814, 34820, 34829, 34840, 0}, {34848, 34853, 34858, 34863, 34868, 34873, 34878, 34732, 34883, 34888, 34893, 34898, 0}, {34848, 34853, 34858, 34863, 34868, 34873, 34878, 34732, 34883, 34888, 34893, 34898, 0}, 0, 0, 185, 187, {9796,2286,0,0,0,0,0,0,0,0,0,0,0,0},{34903,1207,0,0,0,0,0,0,0,0},{843,0,0,0,0,0,0,0,0,0,0,0},{848,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 34923, 34925, {34927, 34940, 34948, 34957, 34967, 34977, 34986}, {34998, 35002, 35006, 35010, 35014, 35018, 35022}, {2673, 2436, 2428, 7736, 12842, 5694, 2023}, {35026, 35040, 35051, 35060, 35071, 35083, 35097, 35109, 35122, 35135, 35147, 35160, 0}, {35026, 35040, 35051, 35060, 35071, 35083, 35097, 35109, 35122, 35135, 35147, 35160, 0}, {35174, 35179, 35185, 35191, 35196, 35202, 35208, 35213, 35219, 35224, 19163, 35230, 0}, {35174, 35179, 35185, 35191, 35196, 35202, 35208, 35213, 35219, 35224, 19163, 35230, 0}, 2, 1, 185, 187, {198,189,2286,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,242,3594,0,0,0,0,0,0,0,0},{269,848,257,3602,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, 0, 0, 185, 187, {189,198,0,0,0,0,0,0,0,0,0,0,0,0},{209,222,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 296, 307, {318, 331, 352, 367, 378, 397, 408}, {421, 426, 431, 436, 441, 446, 451}, {456, 459, 462, 465, 468, 459, 465}, {471, 484, 501, 510, 521, 528, 535, 542, 555, 574, 591, 606, 0}, {471, 484, 501, 510, 521, 528, 535, 542, 555, 574, 591, 606, 0}, {623, 629, 501, 639, 521, 528, 535, 647, 655, 665, 673, 683, 0}, {623, 629, 501, 639, 521, 528, 535, 647, 655, 665, 673, 683, 0}, 2, 1, 691, 187, {693,708,724,740,0,0,0,0,0,0,0,0,0,0},{757,776,794,819,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{856,0,0,0,0,0,0,0}}, + {289, 872, 878, {884, 893, 901, 909, 918, 925, 935}, {944, 948, 952, 956, 960, 964, 968}, {972, 975, 978, 981, 984, 987, 990}, {993, 999, 1006, 1012, 1018, 1023, 1028, 1035, 1041, 1050, 1058, 1067, 0}, {993, 999, 1006, 1012, 1018, 1023, 1028, 1035, 1041, 1050, 1058, 1067, 0}, {1076, 1081, 1006, 1086, 1018, 1023, 1091, 1096, 1100, 1105, 1110, 1115, 0}, {1076, 1081, 1006, 1086, 1018, 1023, 1091, 1096, 1100, 1105, 1110, 1115, 0}, 2, 1, 185, 187, {198,189,1120,1128,1139,1148,1156,1167,1176,0,0,0,0,0},{1184,1207,1225,1242,1254,1270,0,0,0,0},{843,0,0,0,0,0,0,0,0,0,0,0},{848,0,0,0,0,0,0,0,0},{1286,1301,1311,1320,0,0,0,0}}, + {1327, 1340, 1347, {1354, 1364, 1374, 1384, 1394, 1404, 1414}, {35236, 35243, 35250, 35257, 35264, 35271, 35278}, {1473, 1477, 1481, 1485, 1489, 1493, 1497}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, 0, 0, 185, 187, {1654,1681,1692,0,0,0,0,0,0,0,0,0,0,0},{1744,6632,1822,35285,0,0,0,0,0,0},{1866,1858,251,843,0,0,0,0,0,0,0,0},{1886,1875,269,848,0,0,0,0,0},{1898,0,0,0,0,0,0,0}}, + {1921, 1929, 1932, {1935, 1943, 1953, 1961, 1969, 1978, 1985}, {1992, 1995, 1998, 2002, 2005, 2009, 2013}, {2016, 2018, 2020, 2023, 2025, 2018, 2023}, {2028, 2034, 2040, 2048, 2054, 2062, 2070, 2080, 2086, 2094, 2102, 2111, 0}, {2120, 2126, 2133, 2141, 2147, 2155, 2163, 2173, 2086, 2179, 2187, 2197, 0}, {2206, 2210, 2215, 2220, 2224, 2229, 2234, 2239, 2243, 2249, 2255, 2259, 0}, {2206, 2210, 2215, 2220, 2224, 2229, 2234, 2239, 2243, 2249, 2255, 2259, 0}, 2, 1, 2263, 187, {2266,2277,198,2286,189,2293,1692,1663,1721,0,0,0,0,0},{2300,0,0,0,0,0,0,0,0,0},{843,251,2313,2321,0,0,0,0,0,0,0,0},{848,269,2326,2337,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 1929, 1932, {2345, 2353, 2360, 2368, 2375, 2383, 2390}, {2398, 2403, 2407, 2411, 2415, 2419, 2423}, {2023, 2428, 2430, 2432, 2430, 2434, 2436}, {2438, 2445, 2453, 2459, 2465, 2469, 2474, 2479, 2486, 2496, 2504, 2513, 0}, {2438, 2445, 2453, 2459, 2465, 2469, 2474, 2479, 2486, 2496, 2504, 2513, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, 2, 1, 2566, 187, {1128,1139,1692,2568,0,0,0,0,0,0,0,0,0,0},{2300,0,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 2579, 2585, {2592, 2600, 2607, 2616, 2625, 2636, 2644}, {2652, 2655, 2658, 2661, 2664, 2667, 2670}, {2023, 2428, 2673, 2428, 2673, 2434, 2023}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, 2, 1, 691, 187, {1156,1167,1692,2804,0,0,0,0,0,0,0,0,0,0},{2818,2300,2837,0,0,0,0,0,0,0},{251,2850,0,0,0,0,0,0,0,0,0,0},{269,2862,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 2877, 2884, {2891, 2906, 2921, 2932, 2947, 2960, 2979}, {2994, 3001, 3008, 3015, 3022, 3029, 3036}, {3043, 3046, 3049, 3049, 3052, 3052, 3055}, {3058, 3079, 3102, 3117, 3134, 3145, 3160, 3175, 3194, 3217, 3236, 3255, 0}, {3276, 3297, 3320, 3335, 3352, 3363, 3378, 3393, 3412, 3435, 3454, 3473, 0}, {3494, 3501, 3508, 3515, 3522, 3529, 3538, 3547, 3554, 3561, 3568, 3575, 0}, {3494, 3501, 3508, 3515, 3522, 3529, 3538, 3547, 3554, 3561, 3568, 3575, 0}, 2, 1, 185, 187, {2277,198,2286,189,3582,1692,0,0,0,0,0,0,0,0},{1207,1242,0,0,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3613, 1929, 1932, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 185, 187, {3773,3782,3789,3798,1735,1692,3809,0,0,0,0,0,0,0},{3819,3838,3851,3870,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {4322, 4332, 4336, {4340, 4352, 4364, 4374, 4388, 4398, 4410}, {4421, 4424, 4427, 4430, 4433, 4436, 4439}, {2023, 2428, 2430, 4442, 2430, 2018, 2436}, {4444, 4453, 4462, 4472, 4481, 4490, 4499, 4509, 4516, 4524, 4532, 4542, 0}, {4551, 4562, 4573, 4585, 4596, 4607, 4618, 4630, 4639, 4649, 4659, 4671, 0}, {4682, 4688, 4694, 4701, 4707, 4713, 4719, 4726, 4730, 4735, 4740, 4747, 0}, {4682, 4688, 4694, 4701, 4707, 4713, 4719, 4726, 4730, 4735, 4740, 4747, 0}, 2, 1, 691, 187, {4753,1156,4762,1692,0,0,0,0,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,2321,0,0,0,0,0,0,0,0,0,0},{848,2337,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {4783, 4792, 4798, 4804, 4813, 4819, 4828}, {4835, 4840, 4845, 4850, 4855, 4860, 4865}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, 2, 1, 185, 187, {198,189,1167,1139,1692,0,0,0,0,0,0,0,0,0},{4985,1242,5002,0,0,0,0,0,0,0},{251,843,4288,5011,5021,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 5029, 5042, {5053, 5071, 5085, 5103, 5121, 5139, 5155}, {5169, 5181, 5193, 5205, 5217, 5229, 5241}, {5248, 5253, 5258, 5263, 5268, 5273, 5278}, {5283, 5294, 5307, 5314, 5325, 5332, 5341, 5350, 5363, 5376, 5391, 5404, 0}, {5283, 5294, 5307, 5314, 5325, 5332, 5341, 5350, 5363, 5376, 5391, 5404, 0}, {5415, 5424, 5307, 5433, 5325, 5442, 5451, 5460, 5469, 5478, 5487, 5496, 0}, {5415, 5424, 5307, 5433, 5325, 5442, 5451, 5460, 5469, 5478, 5487, 5496, 0}, 0, 0, 185, 187, {198,5505,189,209,1139,1128,5518,1692,5531,5548,0,0,0,0},{5558,5505,5576,5598,5531,0,0,0,0,0},{251,242,0,0,0,0,0,0,0,0,0,0},{269,257,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {5619, 5627, 5631, {5635, 5645, 5653, 5658, 5665, 5678, 5686}, {3989, 5694, 4442, 5696, 5700, 2018, 5703}, {3989, 5694, 4442, 5707, 5700, 2018, 5707}, {5710, 5718, 5727, 5736, 5745, 5752, 5760, 5768, 5778, 5789, 2504, 2513, 0}, {5710, 5718, 5727, 5736, 5745, 5752, 5760, 5768, 5778, 5789, 2504, 2513, 0}, {5798, 5803, 5809, 5816, 5822, 5828, 5834, 5840, 5845, 5852, 1110, 5857, 0}, {5798, 5803, 5809, 5816, 5822, 5828, 5834, 5840, 5845, 5852, 1110, 5857, 0}, 2, 1, 691, 187, {5862,5874,1692,5888,0,0,0,0,0,0,0,0,0,0},{5897,0,0,0,0,0,0,0,0,0},{843,251,3594,0,0,0,0,0,0,0,0,0},{848,269,3602,0,0,0,0,0,0},{5911,0,0,0,0,0,0,0}}, + {1921, 5922, 5927, {5932, 5943, 5954, 5968, 5982, 5994, 6006}, {6018, 6023, 6029, 6035, 6041, 6046, 6052}, {2023, 2428, 6057, 2428, 2434, 2434, 2436}, {6060, 6068, 4887, 6077, 6084, 6089, 6096, 6103, 2486, 5789, 6111, 6121, 0}, {6060, 6068, 4887, 6077, 6084, 6089, 6096, 6103, 2486, 5789, 6111, 6121, 0}, {5798, 1081, 4845, 6130, 6084, 5828, 5834, 6135, 6142, 5852, 6147, 1115, 0}, {5798, 1081, 4845, 6130, 6084, 5828, 5834, 6135, 6142, 5852, 6147, 1115, 0}, 2, 1, 691, 187, {4753,1167,6153,6165,1692,6179,189,0,0,0,0,0,0,0},{2300,4769,6188,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {6207, 6216, 6224, 6233, 6244, 6253, 6262}, {6269, 6273, 2530, 6277, 6281, 6285, 6289}, {2673, 2436, 2428, 2428, 6293, 3989, 2023}, {6295, 6303, 4005, 6312, 6319, 6326, 6333, 4034, 6340, 6350, 6358, 6367, 0}, {6376, 6384, 4094, 6393, 6400, 6407, 6414, 4117, 6421, 6431, 1058, 6439, 0}, {6448, 2526, 2530, 2534, 6452, 6456, 6460, 6464, 6468, 6472, 2558, 6476, 0}, {6448, 2526, 2530, 2534, 6452, 6456, 6460, 6464, 6468, 6472, 2558, 6476, 0}, 2, 1, 185, 187, {198,3582,189,6480,2286,0,0,0,0,0,0,0,0,0},{4985,6488,1242,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1327, 6497, 6504, {6511, 6521, 6531, 6541, 6551, 6561, 6571}, {1473, 6581, 6585, 6589, 6593, 6597, 6601}, {1473, 6581, 6585, 6589, 6593, 6597, 6601}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 0, 185, 187, {1681,1735,1714,1654,1692,0,0,0,0,0,0,0,0,0},{1744,6632,6656,6683,6712,6736,6765,6785,0,0},{843,251,1858,1866,0,0,0,0,0,0,0,0},{848,269,1875,1886,0,0,0,0,0},{1898,0,0,0,0,0,0,0}}, + {6810, 6824, 6831, {6838, 6848, 6858, 6868, 6878, 6888, 6898}, {6908, 6912, 6916, 6920, 6924, 6928, 6932}, {6908, 6912, 6916, 6920, 6924, 6928, 6932}, {6936, 6941, 6946, 6951, 6956, 6961, 6966, 6971, 6976, 6981, 6987, 6993, 0}, {6936, 6941, 6946, 6951, 6956, 6961, 6966, 6971, 6976, 6981, 6987, 6993, 0}, {6936, 6941, 6946, 6951, 6956, 6961, 6966, 6971, 6976, 6981, 6987, 6993, 0}, {6936, 6941, 6946, 6951, 6956, 6961, 6966, 6971, 6976, 6981, 6987, 6993, 0}, 0, 0, 2566, 187, {1692,5888,1721,1663,0,0,0,0,0,0,0,0,0,0},{6999,7028,7052,7079,7101,7132,7158,7189,7215,7242},{1858,1866,843,251,0,0,0,0,0,0,0,0},{1875,1886,848,269,0,0,0,0,0},{7264,0,0,0,0,0,0,0}}, + {289, 7281, 7286, {7291, 7298, 7306, 7314, 7323, 7333, 7341}, {7350, 4424, 7353, 7356, 7359, 7362, 7365}, {7368, 2428, 2673, 3705, 2673, 3989, 7368}, {7370, 7378, 7387, 2459, 7393, 2469, 2474, 7397, 2486, 2496, 2504, 2513, 0}, {7370, 7378, 7387, 2459, 7393, 2469, 2474, 7397, 2486, 2496, 2504, 2513, 0}, {2522, 2526, 7406, 2534, 7393, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 7406, 2534, 7393, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, 2, 1, 2566, 187, {7410,2293,1139,189,1167,7419,1692,0,0,0,0,0,0,0},{4985,6488,1242,5002,0,0,0,0,0,0},{251,843,2321,7431,7443,0,0,0,0,0,0,0},{269,848,7455,7470,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 7281, 7286, {2345, 2353, 2360, 2368, 2375, 2383, 2390}, {7485, 7490, 7494, 7498, 7502, 7506, 7510}, {2023, 2428, 2430, 2432, 2430, 2434, 2436}, {2438, 2445, 4887, 2459, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2438, 2445, 4887, 2459, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, 2, 1, 691, 187, {1156,7519,1167,4762,2804,1692,0,0,0,0,0,0,0,0},{2300,4769,0,0,0,0,0,0,0,0},{251,843,7529,7539,4288,2321,7550,7561,0,0,0,0},{269,848,7571,7585,4302,2337,7598,7612,0},{1301,7625,7635,0,0,0,0,0}}, + {289, 1929, 1932, {7643, 7653, 7667, 7674, 7681, 7690, 1985}, {7698, 7705, 7710, 7714, 7719, 7724, 7728}, {2016, 2018, 3705, 7733, 7736, 2018, 2023}, {7738, 7747, 7752, 7759, 2465, 7769, 7778, 7785, 7795, 7805, 2102, 7818, 0}, {7828, 7837, 7844, 7850, 7859, 7864, 7872, 7878, 7887, 7897, 7911, 7921, 0}, {7929, 7933, 2530, 7937, 2465, 7941, 7945, 7949, 7953, 7957, 2255, 7962, 0}, {7929, 7933, 2530, 7937, 2465, 7941, 7945, 7949, 7953, 7957, 2255, 7962, 0}, 2, 1, 2566, 187, {1692,5888,0,0,0,0,0,0,0,0,0,0,0,0},{1242,5505,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 1929, 1932, {3895, 7966, 7980, 7993, 8006, 8019, 3942}, {6269, 8031, 8035, 8039, 8043, 8047, 8051}, {2673, 2023, 2430, 8056, 8056, 2023, 2023}, {8058, 8066, 8076, 1012, 8083, 8088, 8094, 4117, 8100, 8109, 8117, 8126, 0}, {8058, 8066, 8076, 1012, 8083, 8088, 8094, 4117, 8100, 8109, 8117, 8126, 0}, {2522, 8135, 2530, 8139, 4898, 2538, 2542, 6464, 6468, 8143, 2558, 8147, 0}, {2522, 8135, 2530, 8139, 4898, 2538, 2542, 6464, 6468, 8143, 2558, 8147, 0}, 0, 0, 185, 187, {198,189,2277,2286,1139,1128,2293,7410,1167,1156,7419,4762,4753,1692},{4211,4266,0,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {289, 8151, 8154, {8157, 8166, 4798, 8176, 8184, 8192, 8201}, {8207, 8210, 4424, 8214, 8217, 8221, 2013}, {2673, 6293, 2428, 2428, 6293, 3989, 2023}, {8224, 8232, 4887, 8239, 8246, 8251, 8261, 8269, 8275, 8285, 2504, 2513, 0}, {8224, 8232, 4887, 8239, 8246, 8251, 8261, 8269, 8275, 8285, 2504, 2513, 0}, {8293, 8300, 4887, 4962, 8246, 8306, 8313, 8269, 8318, 1105, 1110, 5857, 0}, {8293, 8300, 4887, 4962, 8246, 8306, 8313, 8269, 8318, 1105, 1110, 5857, 0}, 2, 1, 2566, 187, {1128,1139,0,0,0,0,0,0,0,0,0,0,0,0},{8324,0,0,0,0,0,0,0,0,0},{251,843,8353,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 7281, 7286, {8356, 8366, 8371, 8378, 8387, 8391, 8398}, {8409, 8413, 3761, 8417, 8421, 8425, 8429}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {8434, 8443, 8453, 8460, 4898, 8468, 8474, 2479, 8480, 8491, 8501, 8511, 0}, {8434, 8443, 8453, 8460, 4898, 8468, 8474, 2479, 8480, 8491, 8501, 8511, 0}, {8521, 1081, 4845, 6130, 4898, 8526, 8531, 5840, 4973, 1105, 1110, 5857, 0}, {8521, 1081, 4845, 6130, 4898, 8526, 8531, 5840, 4973, 1105, 1110, 5857, 0}, 0, 1, 691, 187, {1156,4753,1176,1128,1139,8536,8551,1692,8564,0,0,0,0,0},{1242,1207,4985,8579,0,0,0,0,0,0},{843,251,3594,242,0,0,0,0,0,0,0,0},{848,269,3602,257,0,0,0,0,0},{1301,1311,8590,1320,7635,8598,8604,8614}}, + {289, 8622, 8642, {8668, 8691, 352, 8714, 8725, 8740, 8755}, {8770, 8775, 8780, 8785, 8790, 8795, 8800}, {8805, 8808, 8805, 8811, 8814, 8808, 8811}, {8817, 8830, 8845, 8854, 8867, 8874, 8883, 8892, 8905, 8922, 8937, 8950, 0}, {8965, 8978, 8993, 9004, 9017, 9024, 9033, 9042, 9057, 9074, 9089, 9102, 0}, {9117, 9125, 8845, 9135, 8867, 8874, 8883, 9143, 9151, 9161, 9169, 9179, 0}, {9117, 9125, 8845, 9135, 8867, 8874, 8883, 9143, 9151, 9161, 9169, 9179, 0}, 0, 1, 691, 187, {1156,1167,4762,1128,189,0,0,0,0,0,0,0,0,0},{776,757,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 1929, 1932, {9187, 9196, 9208, 9215, 9223, 9233, 9239}, {9246, 9250, 9254, 9258, 9262, 9267, 9271}, {9275, 9277, 9279, 9281, 9283, 9277, 9281}, {9286, 9296, 9305, 9313, 9321, 9329, 9336, 9343, 9351, 2102, 9357, 9365, 0}, {9374, 9384, 9393, 9401, 9409, 9417, 9424, 9431, 9440, 7911, 9446, 9456, 0}, {9465, 9469, 9474, 9479, 9483, 7945, 2239, 9487, 9491, 2255, 9495, 2259, 0}, {9465, 9469, 9474, 9479, 9483, 7945, 2239, 9487, 9491, 2255, 9495, 2259, 0}, 0, 1, 691, 187, {9499,9509,6153,9517,9529,9539,9549,1692,0,0,0,0,0,0},{9561,9575,9590,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1921, 1929, 1932, {9610, 9618, 9627, 9634, 9641, 9650, 1985}, {1992, 1995, 9657, 2002, 9660, 9664, 2013}, {2016, 2018, 9667, 2023, 9669, 2018, 2023}, {5710, 5718, 9672, 6077, 9678, 9683, 9688, 2479, 2486, 5789, 2504, 2513, 0}, {9693, 9702, 7844, 9712, 9720, 9726, 9732, 9738, 9746, 9756, 9765, 9774, 0}, {2522, 2526, 2530, 2534, 9678, 9683, 9688, 2546, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 9678, 9683, 9688, 2546, 2550, 2554, 2558, 2562, 0}, 2, 1, 691, 187, {4753,1156,1167,1692,5888,9783,9796,9806,0,0,0,0,0,0},{2300,0,0,0,0,0,0,0,0,0},{843,251,2321,0,0,0,0,0,0,0,0,0},{848,269,2337,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 9817, 9826, {9834, 9841, 9850, 9859, 9871, 9879, 9888}, {9898, 9902, 3761, 9907, 9912, 9916, 9920}, {2673, 5694, 2428, 2428, 9924, 2018, 2023}, {9926, 9932, 4887, 9939, 2465, 9945, 9953, 9960, 9966, 9974, 9980, 9988, 0}, {9926, 9932, 4887, 9939, 2465, 9945, 9953, 9960, 9966, 9974, 9980, 9988, 0}, {2759, 9996, 3761, 10000, 10004, 10008, 10012, 10016, 9920, 10020, 10024, 10029, 0}, {2759, 9996, 3761, 10000, 10004, 10008, 10012, 10016, 9920, 10020, 10024, 10029, 0}, 0, 1, 691, 187, {4753,4762,0,0,0,0,0,0,0,0,0,0,0,0},{1207,0,0,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {10033, 10046, 10049, {10052, 10060, 10068, 2368, 2375, 2383, 10075}, {10083, 10088, 10093, 10097, 10101, 10105, 10109}, {2023, 2428, 2430, 2432, 2430, 2434, 2436}, {10114, 10122, 10131, 2696, 10004, 2706, 2711, 10136, 2723, 2733, 2741, 3752, 0}, {7370, 7378, 4887, 2459, 2465, 2469, 2474, 10144, 2486, 2496, 2504, 2513, 0}, {2759, 2763, 3761, 2772, 10004, 2776, 2780, 2784, 2788, 2792, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 10004, 2776, 2780, 2784, 2788, 2792, 2796, 3769, 0}, 2, 1, 2566, 187, {1692,5888,0,0,0,0,0,0,0,0,0,0,0,0},{10152,10170,0,0,0,0,0,0,0,0},{251,843,7529,0,0,0,0,0,0,0,0,0},{269,848,7585,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 0, 185, 187, {2277,2286,189,198,8579,10193,1692,0,0,0,0,0,0,0},{1242,10205,10221,0,0,0,0,0,0,0},{843,251,3594,242,0,0,0,0,0,0,0,0},{848,269,3602,257,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 10263, 10268, {10272, 10278, 10288, 10294, 10305, 10315, 10320}, {10330, 10334, 10338, 10342, 10347, 10351, 10355}, {2018, 2018, 2023, 10359, 2018, 7736, 7736}, {10362, 10367, 10374, 10379, 10385, 10392, 10400, 10407, 10416, 10423, 10428, 10435, 0}, {10362, 10367, 10374, 10379, 10385, 10392, 10400, 10407, 10416, 10423, 10428, 10435, 0}, {10443, 10447, 3761, 10452, 3730, 10456, 10460, 10464, 10469, 10473, 10477, 10481, 0}, {10443, 10447, 3761, 10452, 3730, 10456, 10460, 10464, 10469, 10473, 10477, 10481, 0}, 0, 1, 691, 187, {4753,4762,1156,1167,0,0,0,0,0,0,0,0,0,0},{10485,1242,10502,5505,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 10520, 10538, {10556, 10567, 10580, 10589, 10596, 10609, 10618}, {10556, 10567, 10580, 10589, 10596, 10609, 10618}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {10627, 10638, 10649, 10658, 10669, 10676, 10683, 10696, 10705, 10716, 10729, 10740, 0}, {10627, 10638, 10649, 10658, 10669, 10676, 10683, 10696, 10705, 10716, 10729, 10740, 0}, {10627, 10638, 10649, 10658, 10669, 10676, 10683, 10696, 10705, 10716, 10729, 10740, 0}, {10627, 10638, 10649, 10658, 10669, 10676, 10683, 10696, 10705, 10716, 10729, 10740, 0}, 0, 0, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 1929, 1932, {10765, 10772, 10778, 10785, 10790, 10796, 10802}, {10808, 10812, 10816, 10820, 10824, 10828, 10832}, {2428, 2023, 2023, 10836, 4442, 3987, 2023}, {10114, 10122, 10838, 2696, 10844, 2706, 2711, 10848, 2723, 2733, 2741, 10856, 0}, {10114, 10122, 10838, 2696, 10844, 2706, 2711, 10848, 2723, 2733, 2741, 10856, 0}, {2759, 2763, 3761, 2772, 10844, 2776, 2780, 10865, 2788, 2792, 2796, 10869, 0}, {2759, 2763, 3761, 2772, 10844, 2776, 2780, 10865, 2788, 2792, 2796, 10869, 0}, 0, 0, 185, 187, {198,189,1128,0,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 10873, 10878, {10883, 10896, 10915, 10932, 10945, 10958, 10975}, {10988, 8775, 8780, 8785, 8790, 8795, 8800}, {10993, 8808, 8805, 8811, 8814, 8808, 8811}, {10996, 11009, 11020, 11037, 11052, 11067, 11082, 11095, 11110, 11127, 11142, 11159, 0}, {11174, 11185, 11198, 11213, 11226, 11239, 11252, 11263, 11276, 11291, 11304, 11323, 0}, {11336, 11343, 11350, 11357, 11364, 11371, 11378, 11385, 11392, 11399, 11406, 11413, 0}, {11336, 11343, 11350, 11357, 11364, 11371, 11378, 11385, 11392, 11399, 11406, 11413, 0}, 0, 1, 691, 187, {1156,1167,1692,0,0,0,0,0,0,0,0,0,0,0},{11420,0,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{11438,0,0,0,0,0,0,0}}, + {289, 11454, 11467, {11480, 11495, 11516, 11531, 11544, 11557, 10975}, {421, 426, 11572, 436, 11577, 446, 451}, {456, 459, 11582, 465, 468, 459, 465}, {11585, 11602, 11611, 11626, 521, 11643, 11658, 11671, 11686, 11703, 11724, 11741, 0}, {11756, 11773, 11786, 11803, 9017, 11822, 11837, 11850, 11863, 11878, 11901, 11920, 0}, {11933, 11940, 11947, 11954, 521, 11961, 11968, 11975, 11982, 11989, 11996, 12003, 0}, {11933, 11940, 11947, 11954, 521, 11961, 11968, 11975, 11982, 11989, 11996, 12003, 0}, 0, 0, 691, 187, {1167,0,0,0,0,0,0,0,0,0,0,0,0,0},{1242,0,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 12010, 12015, {12020, 12028, 12039, 12045, 12051, 12060, 1985}, {9246, 9250, 2415, 12066, 9262, 9267, 12070}, {9275, 9277, 12074, 9281, 9283, 9277, 9281}, {2438, 2445, 9672, 2459, 2465, 12076, 12082, 12088, 2486, 2496, 2504, 2513, 0}, {2438, 2445, 9672, 2459, 2465, 12076, 12082, 12088, 2486, 2496, 2504, 2513, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, 0, 1, 691, 187, {4753,4762,2266,1156,12099,1167,9806,0,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {12109, 12118, 12123, {12128, 12139, 12150, 12161, 12172, 12183, 12189}, {2018, 9924, 2430, 4442, 2016, 10836, 2436}, {2018, 9924, 2430, 4442, 2016, 10836, 2436}, {12198, 12206, 12215, 12222, 4898, 12229, 12235, 2479, 2486, 12241, 2504, 12250, 0}, {12198, 12206, 12215, 12222, 4898, 12229, 12235, 2479, 2486, 12241, 2504, 12250, 0}, {12260, 12265, 12215, 2534, 4898, 12229, 12235, 2546, 12271, 2554, 2558, 12276, 0}, {12260, 12265, 12215, 2534, 4898, 12229, 12235, 2546, 12271, 2554, 2558, 12276, 0}, 2, 1, 691, 187, {7519,1156,1167,1692,0,0,0,0,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 12281, 12298, {12312, 12323, 12333, 12342, 12353, 12365, 12376}, {12386, 12389, 12392, 12395, 12398, 12401, 12404}, {2023, 2018, 2432, 2430, 7736, 2018, 2023}, {12407, 12417, 12428, 12434, 12443, 12449, 12457, 12465, 12473, 12484, 12493, 12503, 0}, {12513, 12523, 2453, 12534, 12543, 12549, 12557, 12565, 12573, 12584, 12593, 12603, 0}, {12613, 12619, 12428, 12625, 12443, 12630, 12636, 12642, 4190, 12647, 4201, 12652, 0}, {12613, 12619, 12428, 12625, 12443, 12630, 12636, 12642, 4190, 12647, 4201, 12652, 0}, 0, 1, 691, 187, {9517,9539,12657,0,0,0,0,0,0,0,0,0,0,0},{12669,0,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{12696,0,0,0,0,0,0,0}}, + {12714, 12726, 12015, {12732, 12744, 12756, 12768, 12782, 12797, 12810}, {12824, 12827, 12830, 12833, 12836, 12839, 9660}, {2023, 2018, 12842, 2430, 4442, 2018, 9669}, {12844, 12851, 12859, 12865, 12874, 12883, 12893, 12899, 12910, 12920, 12927, 12937, 0}, {12844, 12851, 12859, 12865, 12874, 12883, 12893, 12899, 12910, 12920, 12927, 12937, 0}, {12945, 12951, 12956, 12961, 12966, 12971, 12978, 12984, 12990, 12996, 13002, 13009, 0}, {12945, 12951, 12956, 12961, 12966, 12971, 12978, 12984, 12990, 12996, 13002, 13009, 0}, 2, 1, 2566, 187, {1692,2568,0,0,0,0,0,0,0,0,0,0,0,0},{13016,0,0,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{13038,0,0,0,0,0,0,0}}, + {1, 13053, 13065, {13077, 13092, 13107, 13122, 13139, 13158, 13169}, {13180, 13187, 13194, 13201, 13208, 13215, 13222}, {0, 0, 0, 0, 0, 0, 0}, {13229, 13240, 8845, 13253, 8867, 13264, 13271, 8892, 13278, 13293, 13306, 13317, 0}, {13229, 13240, 8845, 13253, 8867, 13264, 13271, 8892, 13278, 13293, 13306, 13317, 0}, {13330, 13337, 13344, 13351, 8867, 13264, 13271, 13358, 13365, 13372, 13379, 13386, 0}, {13330, 13337, 13344, 13351, 8867, 13264, 13271, 13358, 13365, 13372, 13379, 13386, 0}, 0, 1, 691, 187, {1156,1167,4762,1128,189,0,0,0,0,0,0,0,0,0},{13393,13411,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 13430, 13450, {13467, 13480, 13493, 13509, 13526, 13541, 13550}, {13467, 13480, 13493, 13509, 13526, 13541, 13550}, {13559, 13562, 13565, 13568, 13571, 13574, 13577}, {13580, 13593, 13604, 13613, 13624, 13629, 13638, 13649, 13656, 13671, 13682, 13695, 0}, {13708, 13723, 13604, 13613, 13736, 13629, 13743, 13649, 13656, 13671, 13682, 13695, 0}, {13580, 13593, 13604, 13613, 13624, 13629, 13638, 13649, 13656, 13671, 13682, 13695, 0}, {13580, 13593, 13604, 13613, 13624, 13629, 13638, 13649, 13656, 13671, 13682, 13695, 0}, 0, 6, 185, 187, {198,189,0,0,0,0,0,0,0,0,0,0,0,0},{13756,5505,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 13775, 13778, {13781, 13794, 13804, 13813, 13823, 13834, 13845}, {13857, 13860, 13865, 13870, 13875, 13880, 13885}, {13857, 13890, 13893, 13896, 13899, 13902, 13905}, {13908, 13917, 13926, 13935, 13944, 13953, 13962, 13971, 13980, 13989, 13999, 14009, 0}, {14019, 14028, 14037, 14046, 14055, 14064, 14073, 14082, 14091, 14100, 14110, 14120, 0}, {14130, 14136, 14142, 14148, 14154, 14160, 14166, 14172, 14178, 14184, 14191, 14198, 0}, {14130, 14136, 14142, 14148, 14154, 14160, 14166, 14172, 14178, 14184, 14191, 14198, 0}, 0, 1, 185, 187, {198,189,1139,1128,1692,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 14205, 14229, {14253, 14266, 14287, 14306, 14327, 14346, 14359}, {14370, 14377, 14384, 14391, 14398, 14405, 14412}, {14419, 14422, 14422, 14425, 14428, 14431, 14436}, {14439, 14454, 14469, 14478, 14489, 14500, 14513, 14526, 14541, 14560, 14579, 14596, 0}, {14615, 14632, 14649, 14660, 14673, 14686, 14701, 14716, 14733, 14754, 14775, 14794, 0}, {14815, 14822, 14829, 14836, 14843, 14850, 14857, 14864, 14871, 14878, 14885, 14892, 0}, {14815, 14822, 14829, 14836, 14843, 14850, 14857, 14864, 14871, 14878, 14885, 14892, 0}, 0, 1, 691, 187, {1156,1167,9796,198,14899,3582,1692,0,0,0,0,0,0,0},{3870,1207,13756,5505,14910,14921,14933,14950,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {14968, 14974, 14988, 15011, 15025, 15041, 15048}, {15057, 15060, 15065, 15071, 15075, 7736, 15080}, {6617, 6605, 6607, 6609, 6611, 6613, 6615}, {15084, 15091, 10374, 15098, 3730, 15104, 15110, 15116, 15123, 15132, 15140, 15147, 0}, {15154, 15161, 15168, 15173, 15179, 15183, 15188, 15193, 15200, 15209, 15217, 15224, 0}, {15231, 8135, 2530, 2534, 15179, 15235, 15239, 15243, 15247, 2554, 15251, 15255, 0}, {15231, 8135, 2530, 2534, 15179, 15235, 15239, 15243, 15247, 2554, 15251, 15255, 0}, 0, 1, 691, 187, {1156,1167,4762,189,1692,0,0,0,0,0,0,0,0,0},{15259,0,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {15281, 1929, 1932, {15296, 15304, 15315, 15325, 15336, 15345, 15354}, {15364, 15368, 15372, 15376, 15380, 15384, 15388}, {15392, 12842, 12842, 12842, 2432, 2432, 2436}, {15394, 15404, 15412, 15420, 15428, 15436, 15443, 15451, 15459, 15466, 15472, 15479, 0}, {15487, 15498, 15507, 15516, 15525, 15534, 15542, 15551, 15560, 15568, 15575, 15583, 0}, {15592, 15597, 4845, 15602, 15607, 15612, 15617, 15622, 15627, 15632, 15637, 15642, 0}, {15592, 15597, 4845, 15602, 15607, 15612, 15617, 15622, 15627, 15632, 15637, 15642, 0}, 2, 1, 185, 187, {1681,1692,0,0,0,0,0,0,0,0,0,0,0,0},{15647,0,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{15680,0,0,0,0,0,0,0}}, + {289, 15697, 15718, {15735, 331, 352, 8714, 15748, 15765, 15776}, {15789, 15797, 15805, 15811, 15819, 15827, 15835}, {456, 459, 462, 465, 468, 459, 465}, {15843, 484, 501, 510, 15858, 15865, 15874, 542, 555, 574, 591, 606, 0}, {15843, 484, 501, 510, 15858, 15865, 15874, 542, 555, 574, 591, 606, 0}, {15883, 15891, 15899, 639, 15858, 15907, 15915, 647, 655, 665, 673, 683, 0}, {15883, 15891, 15899, 639, 15858, 15907, 15915, 647, 655, 665, 673, 683, 0}, 0, 1, 691, 187, {1156,1167,15923,0,0,0,0,0,0,0,0,0,0,0},{13756,0,0,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 0, 0, {15940, 15947, 15958, 15967, 15976, 15983, 15994}, {16004, 16008, 16012, 16016, 16020, 16023, 16027}, {0, 0, 0, 0, 0, 0, 0}, {16031, 16041, 16050, 16058, 16067, 16080, 16092, 16099, 16106, 16113, 16123, 16135, 0}, {16031, 16041, 16050, 16058, 16067, 16080, 16092, 16099, 16106, 16113, 16123, 16135, 0}, {16148, 16152, 16156, 16160, 16164, 16168, 16172, 16176, 16180, 16184, 16188, 16192, 0}, {16148, 16152, 16156, 16160, 16164, 16168, 16172, 16176, 16180, 16184, 16188, 16192, 0}, 0, 0, 185, 187, {189,1681,1735,1692,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{242,3594,251,0,0,0,0,0,0,0,0,0},{257,3602,269,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 0, 0, {16196, 16201, 16207, 16217, 16229, 16237, 16248}, {16257, 16261, 16265, 16269, 16273, 16277, 16281}, {0, 0, 0, 0, 0, 0, 0}, {16285, 16295, 16305, 16312, 16319, 2706, 16324, 16331, 16338, 16347, 16355, 16363, 0}, {16285, 16295, 16305, 16312, 16319, 2706, 16324, 16331, 16338, 16347, 16355, 16363, 0}, {2759, 2763, 16027, 16371, 16375, 2776, 2780, 16379, 2788, 2792, 2796, 16383, 0}, {2759, 2763, 16027, 16371, 16375, 2776, 2780, 16379, 2788, 2792, 2796, 16383, 0}, 0, 0, 185, 187, {1681,1735,1692,0,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{242,3594,251,0,0,0,0,0,0,0,0,0},{257,3602,269,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {16387, 16393, 16404, 16217, 16229, 16237, 16248}, {16414, 16418, 16422, 16269, 16273, 16277, 16281}, {2023, 2428, 16426, 2430, 2023, 5694, 2428}, {16428, 16438, 16449, 16456, 16465, 16471, 16477, 16485, 16493, 16504, 16514, 16523, 0}, {16532, 16295, 16541, 16547, 16319, 2706, 16324, 16331, 16554, 16347, 16355, 16363, 0}, {2759, 2763, 16564, 2772, 16375, 2776, 2780, 16379, 2788, 2792, 2796, 16383, 0}, {2759, 2763, 16564, 2772, 16375, 2776, 2780, 16379, 2788, 2792, 2796, 16383, 0}, 0, 0, 2566, 187, {1128,1139,189,1681,1735,1692,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{242,3594,251,0,0,0,0,0,0,0,0,0},{257,3602,269,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 16568, 16572, {16576, 16583, 16591, 16599, 16608, 16618, 16625}, {2652, 16634, 2658, 16637, 2664, 16640, 2670}, {2023, 2428, 2673, 3705, 2673, 3989, 2023}, {16643, 16652, 16662, 2696, 10844, 16668, 16674, 16680, 2723, 2733, 2741, 10856, 0}, {16643, 16652, 16662, 2696, 10844, 16668, 16674, 16680, 2723, 2733, 2741, 10856, 0}, {2759, 2763, 3761, 2772, 10844, 2776, 2780, 2784, 2788, 2792, 2796, 10869, 0}, {2759, 2763, 3761, 2772, 10844, 2776, 2780, 2784, 2788, 2792, 2796, 10869, 0}, 0, 0, 185, 187, {1681,1735,1692,16689,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{242,3594,251,0,0,0,0,0,0,0,0,0},{257,3602,269,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {16701, 16717, 16742, 16770, 16798, 16826, 16854}, {16873, 16883, 16893, 16903, 16913, 16923, 16933}, {16943, 16947, 16951, 16947, 16955, 16959, 16963}, {16967, 16989, 17017, 17033, 17052, 17068, 17087, 17106, 17128, 17159, 17187, 17212, 0}, {16967, 16989, 17017, 17033, 17052, 17068, 17087, 17106, 17128, 17159, 17187, 17212, 0}, {17240, 17250, 17260, 17270, 17280, 17290, 17300, 17310, 17320, 17330, 17340, 17350, 0}, {17240, 17250, 17260, 17270, 17280, 17290, 17300, 17310, 17320, 17330, 17340, 17350, 0}, 0, 1, 691, 187, {1156,1167,7419,1176,4762,4753,1692,0,0,0,0,0,0,0},{17360,17394,17427,3870,17461,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 17473, 17478, {5932, 17483, 17494, 17504, 17514, 17524, 17538}, {17550, 17554, 17559, 17564, 17568, 17573, 17578}, {2023, 2428, 2430, 2428, 5694, 2434, 2436}, {2438, 2445, 4887, 6077, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2438, 2445, 4887, 6077, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, 2, 1, 2566, 187, {1128,1139,1692,0,0,0,0,0,0,0,0,0,0,0},{2300,0,0,0,0,0,0,0,0,0},{251,4288,0,0,0,0,0,0,0,0,0,0},{269,4302,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 17582, 17598, {17608, 17627, 17646, 17668, 17687, 17709, 17734}, {17753, 17763, 17773, 17786, 17796, 17809, 17825}, {17835, 17839, 17846, 17853, 17860, 17867, 17874}, {17878, 17894, 17913, 17929, 17948, 17955, 17965, 17981, 17997, 18016, 18038, 18054, 0}, {17878, 17894, 17913, 17929, 17948, 17955, 17965, 17981, 17997, 18016, 18038, 18054, 0}, {18073, 18080, 17913, 18090, 17948, 17955, 18106, 18119, 18126, 18139, 18155, 18165, 0}, {18073, 18080, 17913, 18090, 17948, 17955, 18106, 18119, 18126, 18139, 18155, 18165, 0}, 0, 0, 2566, 187, {1128,1139,2293,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {18178, 18192, 18195, {18198, 18207, 18216, 18226, 18236, 18246, 18258}, {18266, 18271, 18275, 18279, 18283, 18288, 18293}, {18297, 2430, 2430, 9924, 18297, 18300, 2023}, {18303, 18310, 18315, 2696, 18321, 18327, 18334, 18340, 18348, 18358, 18366, 18375, 0}, {18303, 18310, 18315, 2696, 18321, 18327, 18334, 18340, 18348, 18358, 18366, 18375, 0}, {2759, 18385, 3761, 2772, 18389, 18393, 18398, 18402, 18406, 18410, 2796, 18414, 0}, {2759, 18385, 3761, 2772, 18389, 18393, 18398, 18402, 18406, 18410, 2796, 18414, 0}, 0, 0, 185, 187, {198,1692,18419,7410,2277,0,0,0,0,0,0,0,0,0},{18428,18453,10193,0,0,0,0,0,0,0},{251,3594,843,0,0,0,0,0,0,0,0,0},{269,3602,848,3594,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {18472, 18485, 18490, {18495, 18507, 18518, 18532, 18544, 18554, 18564}, {18575, 18580, 18585, 18590, 18595, 18600, 18605}, {2023, 3989, 2428, 6293, 2673, 16426, 2436}, {18610, 18627, 18640, 18654, 18667, 18680, 18693, 18707, 18719, 18733, 18747, 18761, 0}, {18610, 18627, 18640, 18654, 18667, 18680, 18693, 18707, 18719, 18733, 18747, 18761, 0}, {18774, 18781, 18786, 18791, 18795, 18800, 18805, 18810, 18815, 18822, 18827, 18833, 0}, {18774, 18781, 18786, 18791, 18795, 18800, 18805, 18810, 18815, 18822, 18827, 18833, 0}, 2, 1, 691, 187, {1156,1167,4762,1692,0,0,0,0,0,0,0,0,0,0},{18838,18862,0,0,0,0,0,0,0,0},{251,843,4288,0,0,0,0,0,0,0,0,0},{269,848,4302,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {20057, 1929, 1932, {20065, 20074, 20083, 20091, 20100, 20109, 20116}, {20125, 20128, 20131, 20134, 20137, 20141, 20144}, {6607, 6609, 6611, 6613, 12842, 15392, 6605}, {10114, 10122, 20147, 20153, 10844, 2706, 19221, 20160, 16338, 20167, 16355, 20174, 0}, {10114, 10122, 20147, 20153, 10844, 2706, 19221, 20160, 16338, 20167, 16355, 20174, 0}, {2759, 2763, 19217, 2772, 10844, 2776, 2780, 20182, 2788, 2792, 2796, 10869, 0}, {2759, 2763, 19217, 2772, 10844, 2776, 2780, 20182, 2788, 2792, 2796, 10869, 0}, 0, 0, 185, 187, {3773,3782,3789,3798,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {20220, 1929, 1932, {20227, 20237, 20246, 20255, 20266, 20276, 20281}, {20288, 20294, 20299, 20304, 20309, 10828, 20313}, {20318, 2673, 2023, 7736, 2018, 3987, 2023}, {15084, 15091, 10374, 15098, 3730, 20320, 20325, 20330, 15123, 15132, 15140, 15147, 0}, {15084, 15091, 10374, 15098, 3730, 20320, 20325, 20330, 15123, 15132, 15140, 15147, 0}, {20337, 20342, 3761, 2772, 3730, 20320, 20325, 20346, 10812, 2792, 20350, 20355, 0}, {20337, 20342, 3761, 2772, 3730, 20320, 20325, 20346, 10812, 2792, 20350, 20355, 0}, 0, 1, 691, 187, {1156,0,0,0,0,0,0,0,0,0,0,0,0,0},{20359,1242,5505,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 20377, 20405, {20427, 20446, 20465, 20490, 20509, 20543, 20568}, {20587, 20597, 20607, 20623, 20633, 20658, 20674}, {20684, 20688, 20695, 20699, 20706, 20713, 20720}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, 0, 0, 2566, 187, {1139,2293,1128,20970,20983,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{4288,2321,20998,21007,0,0,0,0,0,0,0,0},{4302,2337,21015,21027,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 1929, 1932, {21507, 21526, 21545, 21567, 21586, 21608, 21633}, {21652, 21662, 21672, 21685, 21695, 21708, 21724}, {21734, 21738, 21745, 21752, 21759, 21766, 21773}, {21777, 21805, 21833, 21849, 21868, 21875, 21885, 21901, 21917, 21945, 21967, 21989, 0}, {21777, 21805, 21833, 21849, 21868, 21875, 21885, 21901, 21917, 21945, 21967, 21989, 0}, {22014, 22033, 21833, 21849, 21868, 21875, 21885, 22052, 22059, 22075, 22091, 22101, 0}, {22014, 22033, 21833, 21849, 21868, 21875, 21885, 22052, 22059, 22075, 22091, 22101, 0}, 0, 0, 2566, 187, {1139,2293,4762,1128,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 8151, 22114, {22117, 22136, 22155, 22180, 22199, 22221, 22246}, {22265, 22275, 22285, 22301, 22311, 22324, 22340}, {22350, 22354, 22361, 22365, 22372, 22379, 22386}, {22390, 22412, 22443, 22465, 22484, 22491, 22501, 22517, 22533, 22564, 22586, 22608, 0}, {22390, 22412, 22443, 22465, 22484, 22491, 22501, 22517, 22533, 22564, 22586, 22608, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 0, 2566, 187, {1139,2293,4762,1128,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 22633, 22658, {22683, 22702, 22724, 22749, 22765, 22787, 22806}, {22816, 22823, 22830, 22837, 22844, 22851, 22858}, {22816, 22823, 22830, 22837, 22844, 22851, 22858}, {22862, 22878, 22903, 22922, 22941, 22948, 22961, 22974, 22993, 23024, 23049, 23071, 0}, {22862, 22878, 22903, 22922, 22941, 22948, 22961, 23096, 22993, 23024, 23049, 23071, 0}, {23115, 23123, 23137, 23151, 22941, 22948, 22961, 23162, 23170, 23184, 23195, 23203, 0}, {23115, 23123, 23137, 23151, 22941, 22948, 22961, 23162, 23170, 23184, 23195, 23203, 0}, 0, 0, 2566, 187, {1128,1139,2293,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3613, 1929, 1932, {23214, 23236, 23258, 23283, 23305, 23330, 23358}, {23380, 23390, 23400, 23413, 23423, 23436, 23452}, {23462, 23466, 23473, 23477, 23484, 23491, 23498}, {23502, 23518, 23543, 23562, 23584, 23591, 23604, 23617, 23636, 23667, 23692, 23711, 0}, {23502, 23518, 23543, 23562, 23584, 23591, 23736, 23617, 23636, 23667, 23692, 23711, 0}, {23749, 23756, 23543, 23772, 23584, 23591, 23736, 23617, 23788, 23810, 23826, 23836, 0}, {23749, 23756, 23543, 23772, 23584, 23591, 23736, 23617, 23788, 23810, 23826, 23836, 0}, 0, 0, 2566, 187, {1139,2293,4762,1128,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {3613, 1929, 1932, {23852, 23871, 23890, 23912, 23931, 23953, 23978}, {23997, 24007, 24017, 24030, 24040, 24053, 24069}, {24079, 24083, 24090, 24097, 24104, 24111, 24118}, {24122, 24138, 24163, 24182, 24204, 24211, 24224, 24237, 24256, 24284, 24309, 24331, 0}, {24122, 24138, 24163, 24182, 24204, 24211, 24224, 24237, 24256, 24284, 24309, 24331, 0}, {24356, 24364, 24384, 24391, 24204, 24408, 24415, 24423, 24431, 24454, 24471, 24485, 0}, {24356, 24364, 24384, 24391, 24204, 24408, 24415, 24423, 24431, 24454, 24471, 24485, 0}, 0, 0, 2566, 187, {1139,2293,4762,1128,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {20057, 1929, 1932, {24502, 24530, 24564, 24592, 24620, 24651, 24688}, {24716, 24729, 24748, 24764, 24777, 24796, 24815}, {24825, 24832, 24839, 24846, 24853, 24866, 24873}, {24877, 24896, 24924, 24946, 24965, 24978, 24988, 25001, 25026, 25057, 25082, 25098, 0}, {24877, 24896, 24924, 24946, 24965, 24978, 24988, 25001, 25026, 25057, 25082, 25098, 0}, {25117, 25127, 25146, 25156, 24965, 24978, 24988, 25172, 25179, 25204, 25220, 25230, 0}, {25117, 25127, 25146, 25156, 24965, 24978, 24988, 25172, 25179, 25204, 25220, 25230, 0}, 0, 0, 2566, 187, {1139,2293,1167,4762,0,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{4288,2321,20998,21007,0,0,0,0,0,0,0,0},{4302,2337,21015,21027,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 25243, 25271, {25293, 25312, 25331, 25356, 25375, 25409, 25434}, {25453, 20597, 20607, 20623, 25463, 25488, 20674}, {0, 0, 0, 0, 0, 0, 0}, {25504, 25529, 25560, 25576, 20821, 20828, 20838, 25595, 25611, 25642, 25664, 25686, 0}, {25504, 25529, 25560, 25576, 20821, 20828, 20838, 25595, 25611, 25642, 25664, 25686, 0}, {25711, 25724, 25560, 25576, 20821, 20828, 20838, 25743, 25750, 25766, 25782, 25792, 0}, {25711, 25724, 25560, 25576, 20821, 20828, 20838, 25743, 25750, 25766, 25782, 25792, 0}, 0, 0, 2566, 187, {1128,0,0,0,0,0,0,0,0,0,0,0,0,0},{25805,0,0,0,0,0,0,0,0,0},{1858,1866,0,0,0,0,0,0,0,0,0,0},{1875,1886,0,0,0,0,0,0,0},{25824,25832,0,0,0,0,0,0}}, + {1, 1929, 1932, {17608, 17627, 25842, 17668, 17687, 17709, 17734}, {17753, 17763, 25864, 17786, 17796, 17809, 17825}, {17835, 17839, 17846, 17853, 17860, 17867, 17874}, {25877, 25902, 17913, 25933, 25952, 17955, 25959, 25972, 25988, 26013, 26035, 26063, 0}, {25877, 25902, 17913, 25933, 25952, 17955, 25959, 25972, 25988, 26013, 26035, 26063, 0}, {26085, 26098, 17913, 26117, 25952, 17955, 25959, 26133, 26140, 26159, 26175, 26197, 0}, {26085, 26098, 17913, 26117, 25952, 17955, 25959, 26133, 26140, 26159, 26175, 26197, 0}, 0, 0, 2566, 187, {1128,1139,2293,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {26945, 26969, 26991, {27016, 27044, 27072, 27109, 27140, 27174, 27199}, {27233, 27249, 27265, 27290, 27309, 27331, 27344}, {27366, 27373, 27380, 27387, 27394, 27401, 27405}, {27415, 27449, 27486, 27520, 27554, 27585, 27622, 27659, 27699, 27733, 27767, 27816, 0}, {27415, 27449, 27486, 27520, 27554, 27585, 27622, 27659, 27699, 27733, 27767, 27816, 0}, {27865, 27878, 27891, 27904, 27917, 27930, 27943, 27956, 27969, 27982, 27998, 28014, 0}, {27865, 27878, 27891, 27904, 27917, 27930, 27943, 27956, 27969, 27982, 27998, 28014, 0}, 0, 0, 185, 187, {1654,1663,1672,1703,1692,1681,1721,1714,1728,0,0,0,0,0},{28030,28073,28121,28153,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{28190,1914,0,0,0,0,0,0}}, + {289, 1929, 1932, {28223, 28232, 28242, 28254, 28267, 28276, 28288}, {28300, 28304, 28309, 28313, 28317, 28321, 28325}, {2023, 28329, 2428, 2428, 15392, 6293, 2023}, {28332, 28339, 28348, 28355, 2702, 28362, 28370, 28381, 28386, 28391, 28398, 28407, 0}, {28332, 28339, 28348, 28355, 2702, 28362, 28370, 28381, 28386, 28391, 28398, 28407, 0}, {28415, 28419, 28309, 28423, 2702, 28427, 28431, 28381, 28386, 28435, 28439, 28444, 0}, {28415, 28419, 28309, 28423, 2702, 28427, 28431, 28381, 28386, 28435, 28439, 28444, 0}, 2, 1, 185, 187, {189,198,5002,8579,0,0,0,0,0,0,0,0,0,0},{1242,1207,0,0,0,0,0,0,0,0},{251,843,242,3594,0,0,0,0,0,0,0,0},{269,848,257,3602,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 28449, 28465, {28481, 28503, 28516, 28535, 28545, 28576, 28592}, {28481, 28503, 28516, 28535, 28545, 28576, 28592}, {6605, 6607, 6609, 6611, 6613, 6615, 6617}, {28605, 28618, 28637, 28650, 28663, 28676, 28695, 28714, 28727, 28743, 28756, 28781, 0}, {28605, 28618, 28637, 28650, 28663, 28676, 28695, 28714, 28727, 28743, 28756, 28781, 0}, {28605, 28618, 28637, 28650, 28663, 28676, 28695, 28714, 28727, 28743, 28756, 28781, 0}, {28605, 28618, 28637, 28650, 28663, 28676, 28695, 28714, 28727, 28743, 28756, 28781, 0}, 0, 0, 185, 187, {189,1692,0,0,0,0,0,0,0,0,0,0,0,0},{1242,10205,0,0,0,0,0,0,0,0},{843,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{28794,0,0,0,0,0,0,0}}, + {289, 28829, 28854, {28879, 28904, 28923, 28951, 28970, 28995, 29014}, {28879, 28904, 28923, 28951, 28970, 28995, 29014}, {29036, 29040, 29044, 29048, 29058, 29062, 29072}, {29076, 29095, 29111, 29124, 29137, 29159, 29178, 29200, 29216, 29232, 29245, 29261, 0}, {29076, 29095, 29111, 29124, 29137, 29159, 29178, 29200, 29216, 29232, 29245, 29261, 0}, {29277, 29286, 29295, 29304, 29313, 29322, 29334, 29343, 29352, 29361, 29370, 29379, 0}, {29277, 29286, 29295, 29304, 29313, 29322, 29334, 29343, 29352, 29361, 29370, 29379, 0}, 0, 0, 185, 187, {198,29388,6480,0,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 7281, 7286, {3895, 29398, 3909, 29403, 29413, 29419, 3942}, {29426, 8413, 3761, 29430, 29435, 29439, 29443}, {2673, 2436, 2428, 2428, 29448, 3989, 2023}, {29450, 29458, 4005, 4011, 29467, 29472, 29478, 4034, 29484, 29493, 29501, 29510, 0}, {29519, 29527, 4094, 1012, 8083, 29536, 29542, 4117, 8100, 8109, 8117, 29548, 0}, {29557, 2763, 3761, 29561, 2702, 29565, 29570, 20182, 18406, 29574, 2796, 3769, 0}, {29557, 2763, 3761, 29561, 2702, 29565, 29570, 20182, 18406, 29574, 2796, 3769, 0}, 2, 1, 185, 187, {198,189,1120,2286,1139,1167,1692,0,0,0,0,0,0,0},{29578,4239,4266,1242,0,0,0,0,0,0},{843,251,242,29607,0,0,0,0,0,0,0,0},{848,269,257,29619,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {1, 29639, 29651, {29663, 17627, 29691, 17668, 17687, 17709, 17734}, {17753, 17763, 25864, 17786, 17796, 17809, 17825}, {0, 0, 0, 0, 0, 0, 0}, {25877, 25902, 17913, 25933, 25952, 17955, 25959, 29710, 29726, 29754, 26035, 26063, 0}, {25877, 25902, 17913, 25933, 25952, 17955, 25959, 29710, 29726, 29754, 26035, 26063, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 0, 2566, 187, {1128,1139,2293,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,1866,1858,0,0,0,0,0,0,0,0},{269,848,1886,1875,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {20057, 29776, 29788, {29797, 29813, 29829, 29857, 29873, 29916, 29941}, {29797, 29813, 29969, 29857, 29979, 30001, 30014}, {30024, 30028, 30032, 30036, 30040, 30053, 30060}, {30067, 30086, 30111, 30130, 30155, 30168, 30181, 30194, 30216, 30250, 30275, 30303, 0}, {30067, 30086, 30111, 30130, 30155, 30168, 30181, 30194, 30216, 30250, 30275, 30303, 0}, {30331, 30338, 30348, 30130, 30155, 30168, 30181, 30361, 30371, 30384, 30394, 30407, 0}, {30331, 30338, 30348, 30130, 30155, 30168, 30181, 30361, 30371, 30384, 30394, 30407, 0}, 0, 1, 2566, 187, {1692,1681,1735,198,189,0,0,0,0,0,0,0,0,0},{30420,0,0,0,0,0,0,0,0,0},{1858,1866,843,251,0,0,0,0,0,0,0,0},{1875,1886,848,269,0,0,0,0,0},{30468,0,0,0,0,0,0,0}}, + {30478, 30494, 30504, {30517, 30527, 30534, 30547, 30557, 30567, 30577}, {30517, 30527, 30587, 30547, 30557, 30567, 30577}, {30597, 30601, 30605, 30609, 30613, 30617, 30621}, {30625, 30641, 30657, 30667, 30680, 30687, 30694, 30704, 30717, 30736, 30752, 30768, 0}, {30625, 30641, 30657, 30667, 30680, 30687, 30694, 30704, 30717, 30784, 30752, 30768, 0}, {30803, 30813, 30657, 30823, 30680, 30687, 30694, 30833, 30843, 30853, 30863, 30873, 0}, {30803, 30813, 30657, 30823, 30680, 30687, 30694, 30833, 30843, 30853, 30863, 30873, 0}, 0, 0, 185, 187, {2277,1692,0,0,0,0,0,0,0,0,0,0,0,0},{30883,0,0,0,0,0,0,0,0,0},{3594,0,0,0,0,0,0,0,0,0,0,0},{3602,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 31145, 31186, {31227, 31246, 31265, 31290, 31309, 31331, 31356}, {31375, 17763, 31385, 17786, 31401, 17809, 17825}, {31414, 17839, 31418, 17853, 31422, 17867, 17874}, {17878, 31429, 17913, 31457, 25952, 31476, 17965, 31486, 31502, 31533, 31555, 31580, 0}, {17878, 31429, 17913, 31457, 25952, 31476, 17965, 31486, 31502, 31533, 31555, 31580, 0}, {17878, 31429, 17913, 31457, 25952, 31476, 17965, 31486, 31502, 31533, 31555, 31580, 0}, {17878, 31429, 17913, 31457, 25952, 31476, 17965, 31486, 31502, 31533, 31555, 31580, 0}, 0, 0, 185, 187, {3773,3782,3789,3798,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{25832,0,0,0,0,0,0,0}}, + {289, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {31605, 31612, 31621, 31636, 31647, 31656, 31663, 31670, 31677, 31688, 31701, 31714, 0}, {31605, 31612, 31621, 31636, 31647, 31656, 31663, 31670, 31677, 31688, 31701, 31714, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 6, 185, 187, {1654,1692,0,0,0,0,0,0,0,0,0,0,0,0},{31719,31740,0,0,0,0,0,0,0,0},{3594,843,0,0,0,0,0,0,0,0,0,0},{3602,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {31755, 1929, 1932, {31761, 31768, 31774, 31781, 31792, 31800, 31809}, {31816, 8413, 3761, 31820, 31824, 31828, 10832}, {2436, 2436, 2428, 2428, 5694, 16426, 2023}, {3991, 31832, 31840, 4011, 4017, 31846, 31852, 4034, 31858, 31868, 31876, 31886, 0}, {3991, 31832, 31840, 4011, 4017, 31846, 31852, 4034, 31858, 31868, 31876, 31886, 0}, {31896, 31900, 3761, 29561, 3730, 31904, 31908, 20182, 18406, 2792, 31912, 16383, 0}, {31896, 31900, 3761, 29561, 3730, 31904, 31908, 20182, 18406, 2792, 31912, 16383, 0}, 0, 0, 185, 187, {3773,3782,3789,3798,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 0, 0, {31916, 31923, 31931, 31938, 31945, 31953, 31961}, {31968, 31971, 31974, 31977, 31980, 31983, 31986}, {2436, 2436, 2430, 2436, 12842, 3987, 12842}, {31989, 31997, 32007, 32013, 32021, 32026, 32031, 32036, 32043, 20167, 32051, 32059, 0}, {31989, 31997, 32007, 32013, 32021, 32026, 32031, 32036, 32043, 20167, 32051, 32059, 0}, {2759, 32067, 3761, 32071, 3730, 31114, 31118, 32075, 3701, 2792, 32079, 16383, 0}, {2759, 32067, 3761, 32071, 3730, 31114, 31118, 32075, 3701, 2792, 32079, 16383, 0}, 0, 0, 185, 187, {2277,2286,189,198,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 32083, 32094, {32104, 32122, 32137, 32159, 32172, 32186, 32203}, {32227, 32235, 32240, 32159, 32172, 32252, 32259}, {0, 0, 0, 0, 0, 0, 0}, {32273, 32295, 32311, 32331, 32345, 32362, 32377, 32394, 32408, 32421, 32440, 32454, 0}, {32273, 32295, 32311, 32331, 32345, 32362, 32377, 32394, 32408, 32421, 32440, 32454, 0}, {32473, 32488, 32497, 32510, 32517, 32527, 32535, 32545, 32552, 32558, 32570, 32577, 0}, {32473, 32488, 32497, 32510, 32517, 32527, 32535, 32545, 32552, 32558, 32570, 32577, 0}, 0, 0, 185, 187, {2277,2286,189,198,1735,1692,3809,0,0,0,0,0,0,0},{222,20186,20206,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{25832,0,0,0,0,0,0,0}}, + {3613, 0, 0, {32589, 32597, 15958, 15967, 15976, 32608, 32618}, {16414, 16008, 16012, 16016, 16020, 16277, 32627}, {0, 0, 0, 0, 0, 0, 0}, {32631, 32640, 32650, 32658, 10844, 3734, 32666, 32672, 32681, 32690, 32699, 32708, 0}, {32631, 32640, 32650, 32658, 10844, 3734, 32666, 32672, 32681, 32690, 32699, 32708, 0}, {2759, 2763, 16027, 32717, 10844, 2776, 2780, 20182, 18406, 2792, 32721, 16383, 0}, {2759, 2763, 16027, 32717, 10844, 2776, 2780, 20182, 18406, 2792, 32721, 16383, 0}, 0, 0, 185, 187, {189,1681,1735,1692,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{242,3594,251,0,0,0,0,0,0,0,0,0},{257,3602,269,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {32725, 32738, 32743, {32748, 32755, 32770, 32784, 32800, 32815, 32831}, {6289, 32846, 2530, 32850, 32854, 32858, 32862}, {2023, 12842, 2428, 2018, 2023, 2430, 12842}, {7370, 7378, 32866, 32873, 32880, 2469, 2474, 32885, 32895, 32906, 32915, 32925, 0}, {7370, 7378, 32866, 32873, 32880, 2469, 2474, 32885, 32895, 32906, 32915, 32925, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, 0, 0, 2566, 187, {1128,1139,1692,2568,0,0,0,0,0,0,0,0,0,0},{32935,2300,4769,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 32954, 32959, {32964, 32980, 32988, 32996, 33005, 33017, 33027}, {33037, 33043, 33049, 33053, 33057, 33065, 3701}, {0, 0, 0, 0, 0, 0, 0}, {33072, 33085, 33099, 33108, 33114, 33118, 33123, 33131, 16338, 33144, 16355, 16363, 0}, {33072, 33085, 33099, 33108, 33114, 33118, 33123, 33131, 16338, 33144, 16355, 16363, 0}, {33153, 2763, 33157, 16371, 33114, 33161, 2780, 33165, 2788, 33173, 2796, 16383, 0}, {33153, 2763, 33157, 16371, 33114, 33161, 2780, 33165, 2788, 33173, 2796, 16383, 0}, 0, 0, 185, 187, {2277,2286,189,198,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{2313,0,0,0,0,0,0,0,0,0,0,0},{2326,0,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {33179, 33206, 33213, {33220, 33230, 33240, 33250, 33260, 33270, 33280}, {33290, 33297, 33304, 33311, 33318, 33325, 33332}, {33339, 33343, 33347, 33351, 33355, 33359, 33363}, {33367, 33374, 33381, 33388, 33395, 33402, 33409, 33416, 33423, 33430, 33437, 33447, 0}, {33367, 33374, 33381, 33388, 33395, 33402, 33409, 33416, 33423, 33430, 33437, 33447, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, {6605, 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6626, 6629, 0}, 0, 0, 185, 187, {1654,1663,1672,1703,1692,1681,0,0,0,0,0,0,0,0},{33457,33481,33511,33541,33558,0,0,0,0,0},{1858,843,251,0,0,0,0,0,0,0,0,0},{1875,848,269,0,0,0,0,0,0},{33581,1914,0,0,0,0,0,0}}, + {289, 0, 0, {28300, 8413, 33598, 33605, 33615, 33620, 33627}, {33634, 6273, 33638, 4850, 33643, 33648, 33653}, {4421, 33658, 33661, 33664, 33667, 33670, 33673}, {33676, 33683, 33598, 33694, 33700, 33704, 33713, 33720, 33725, 33734, 33739, 33742, 0}, {33676, 33683, 33598, 33694, 33700, 33704, 33713, 33720, 33725, 33734, 33739, 33742, 0}, {33748, 33752, 33759, 28423, 33700, 33764, 33769, 33720, 33774, 33734, 33739, 33779, 0}, {33748, 33752, 33759, 28423, 33700, 33764, 33769, 33720, 33774, 33734, 33739, 33779, 0}, 2, 1, 185, 187, {198,189,1167,1139,1692,0,0,0,0,0,0,0,0,0},{4985,5002,1242,0,0,0,0,0,0,0},{251,843,4288,5011,5021,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {33936, 33954, 33959, {33964, 33989, 34018, 34043, 34056, 34071, 34088}, {34103, 34108, 34113, 34118, 34123, 34128, 8800}, {19442, 19442, 34133, 8811, 8814, 19442, 8811}, {34136, 34155, 34170, 34192, 34212, 34228, 34244, 34258, 34284, 34308, 34325, 34342, 0}, {34136, 34155, 34170, 34192, 34212, 34228, 34244, 34258, 34284, 34308, 34325, 34342, 0}, {34359, 34368, 34377, 34391, 34405, 34417, 34429, 34439, 34455, 34469, 34476, 34483, 0}, {34359, 34368, 34377, 34391, 34405, 34417, 34429, 34439, 34455, 34469, 34476, 34483, 0}, 0, 1, 691, 187, {1156,4753,1692,34490,34500,0,0,0,0,0,0,0,0,0},{34513,34548,34577,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{34612,0,0,0,0,0,0,0}}, + {20057, 0, 0, {34628, 34640, 34651, 34663, 34675, 34685, 34697}, {34712, 34717, 34722, 34727, 34732, 34737, 34742}, {0, 0, 0, 0, 0, 0, 0}, {34747, 34756, 34768, 34776, 34781, 34791, 34798, 34807, 34814, 34820, 34829, 34840, 0}, {34747, 34756, 34768, 34776, 34781, 34791, 34798, 34807, 34814, 34820, 34829, 34840, 0}, {34848, 34853, 34858, 34863, 34868, 34873, 34878, 34732, 34883, 34888, 34893, 34898, 0}, {34848, 34853, 34858, 34863, 34868, 34873, 34878, 34732, 34883, 34888, 34893, 34898, 0}, 0, 0, 185, 187, {9796,2286,0,0,0,0,0,0,0,0,0,0,0,0},{34903,1207,0,0,0,0,0,0,0,0},{843,0,0,0,0,0,0,0,0,0,0,0},{848,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 34923, 34925, {34927, 34940, 34948, 34957, 34967, 34977, 34986}, {34998, 35002, 35006, 35010, 35014, 35018, 35022}, {2673, 2436, 2428, 7736, 12842, 5694, 2023}, {35026, 35040, 35051, 35060, 35071, 35083, 35097, 35109, 35122, 35135, 35147, 35160, 0}, {35026, 35040, 35051, 35060, 35071, 35083, 35097, 35109, 35122, 35135, 35147, 35160, 0}, {35174, 35179, 35185, 35191, 35196, 35202, 35208, 35213, 35219, 35224, 19163, 35230, 0}, {35174, 35179, 35185, 35191, 35196, 35202, 35208, 35213, 35219, 35224, 19163, 35230, 0}, 2, 1, 185, 187, {198,189,2286,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,242,3594,0,0,0,0,0,0,0,0},{269,848,257,3602,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, 0, 6, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1327, 1340, 1347, {1354, 1364, 1374, 1384, 1394, 1404, 1414}, {1424, 1431, 1438, 1445, 1452, 1459, 1466}, {1473, 1477, 1481, 1485, 1489, 1493, 1497}, {1501, 1508, 1515, 1522, 1529, 1536, 1543, 1550, 1557, 1564, 1571, 1581, 0}, {1501, 1508, 1515, 1522, 1529, 1536, 1543, 1550, 1557, 1564, 1571, 1581, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, 0, 0, 185, 187, {1654,1663,1672,1681,1692,1703,1714,1721,1728,1735,0,0,0,0},{1744,1766,1794,1822,1837,0,0,0,0,0},{843,251,1858,1866,0,0,0,0,0,0,0,0},{848,269,1875,1886,0,0,0,0,0},{1898,1914,0,0,0,0,0,0}}, + {1921, 2579, 2585, {2592, 2600, 2607, 2616, 2625, 2636, 2644}, {2652, 2655, 2658, 2661, 2664, 2667, 2670}, {2023, 2428, 2673, 2428, 2673, 2434, 2023}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, 2, 1, 691, 187, {1156,1167,1176,35473,4762,1692,0,0,0,0,0,0,0,0},{2818,2300,35483,0,0,0,0,0,0,0},{251,843,35493,35502,35512,35523,8353,35528,35534,0,0,0},{269,848,35542,35555,2862,35567,35581,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 8151, 22114, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 2, 1, 185, 187, {198,189,2286,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,1207,13756,0,0,0,0,0,0},{251,843,242,3594,0,0,0,0,0,0,0,0},{269,848,257,3602,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 7281, 7286, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {35588, 6273, 4845, 35593, 35599, 35604, 35608}, {2673, 2436, 2428, 29448, 3987, 3989, 2023}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {35614, 5803, 35618, 1086, 35623, 2538, 2542, 1096, 1100, 1105, 1110, 35627, 0}, {35614, 5803, 35618, 1086, 35623, 2538, 2542, 1096, 1100, 1105, 1110, 35627, 0}, 0, 0, 185, 187, {198,3582,189,1120,2286,1139,1692,0,0,0,0,0,0,0},{4211,4266,0,0,0,0,0,0,0,0},{242,3594,843,251,0,0,0,0,0,0,0,0},{257,3602,848,269,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {4783, 4792, 4798, 4804, 4813, 4819, 4828}, {4835, 4840, 4845, 4850, 4855, 4860, 4865}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, 2, 1, 2566, 187, {1139,198,189,1128,0,0,0,0,0,0,0,0,0,0},{4985,1242,0,0,0,0,0,0,0,0},{251,843,4288,5011,5021,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {6207, 6216, 6224, 6233, 6244, 6253, 6262}, {6269, 6273, 2530, 6277, 6281, 6285, 6289}, {2673, 2436, 2428, 2428, 6293, 3989, 2023}, {6295, 6303, 4005, 6312, 6319, 6326, 6333, 4034, 6340, 6350, 6358, 6367, 0}, {6376, 6384, 4094, 6393, 6400, 6407, 6414, 4117, 6421, 6431, 1058, 6439, 0}, {6448, 2526, 2530, 2534, 6452, 6456, 6460, 6464, 6468, 6472, 2558, 6476, 0}, {6448, 2526, 2530, 2534, 6452, 6456, 6460, 6464, 6468, 6472, 2558, 6476, 0}, 2, 1, 691, 187, {1156,1167,9806,2286,6480,0,0,0,0,0,0,0,0,0},{2818,1242,1207,0,0,0,0,0,0,0},{251,843,35493,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 7281, 7286, {7291, 7298, 7306, 7314, 7323, 7333, 7341}, {7350, 4424, 7353, 7356, 7359, 7362, 7365}, {7368, 2428, 2673, 3705, 2673, 3989, 7368}, {7370, 7378, 7387, 2459, 7393, 2469, 2474, 7397, 2486, 2496, 2504, 2513, 0}, {7370, 7378, 7387, 2459, 7393, 2469, 2474, 7397, 2486, 2496, 2504, 2513, 0}, {2522, 2526, 7406, 2534, 7393, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 7406, 2534, 7393, 2538, 2542, 2546, 2550, 2554, 2558, 2562, 0}, 2, 1, 185, 187, {9796,1120,1139,1167,7419,1692,0,0,0,0,0,0,0,0},{4985,3809,1242,5548,0,0,0,0,0,0},{843,251,35632,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 35642, 35647, {2345, 10060, 35652, 2368, 2375, 2383, 35659}, {2398, 35667, 35672, 2411, 2415, 2419, 35676}, {2023, 2428, 2430, 2432, 2430, 2434, 2436}, {2438, 2445, 4887, 2459, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2438, 2445, 4887, 2459, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, 2, 1, 691, 187, {1156,7519,1167,4762,2804,1692,0,0,0,0,0,0,0,0},{2300,4769,0,0,0,0,0,0,0,0},{251,843,7529,7539,4288,2321,7550,7561,0,0,0,0},{269,848,7571,7585,4302,2337,7598,7612,0},{1301,7625,7635,0,0,0,0,0}}, + {3883, 7281, 7286, {3895, 7966, 7980, 7993, 8006, 8019, 3942}, {6269, 8031, 8035, 8039, 8043, 8047, 8051}, {2673, 2023, 2430, 8056, 8056, 2023, 2023}, {35680, 35688, 35698, 4011, 29467, 35705, 35711, 4034, 29484, 29493, 29501, 35717, 0}, {35680, 35688, 35698, 4011, 29467, 35705, 35711, 4034, 29484, 29493, 29501, 35717, 0}, {2759, 20342, 3761, 29561, 2702, 2776, 2780, 20182, 18406, 29574, 2796, 2800, 0}, {2759, 20342, 3761, 29561, 2702, 2776, 2780, 20182, 18406, 29574, 2796, 2800, 0}, 2, 1, 185, 187, {198,1156,1128,189,1167,1139,1681,1703,1692,1735,35726,5888,0,0},{4266,4211,0,0,0,0,0,0,0,0},{251,0,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {10033, 10046, 10049, {10052, 10060, 10068, 2368, 2375, 2383, 10075}, {10083, 10088, 10093, 10097, 10101, 10105, 10109}, {2023, 2428, 2430, 2432, 2430, 2434, 2436}, {10114, 10122, 10131, 2696, 10004, 2706, 2711, 10136, 2723, 2733, 2741, 3752, 0}, {7370, 7378, 4887, 2459, 2465, 2469, 2474, 10144, 2486, 2496, 2504, 2513, 0}, {2759, 2763, 3761, 2772, 10004, 2776, 2780, 2784, 2788, 2792, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 10004, 2776, 2780, 2784, 2788, 2792, 2796, 3769, 0}, 2, 1, 691, 187, {4753,1156,4762,1692,0,0,0,0,0,0,0,0,0,0},{10152,10170,0,0,0,0,0,0,0,0},{251,843,7529,0,0,0,0,0,0,0,0,0},{269,848,7585,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {35735, 35746, 35770, 35800, 35817, 35839, 35848}, {15057, 15060, 15065, 15071, 15075, 7736, 15080}, {6617, 6605, 6607, 6609, 6611, 6613, 6615}, {35859, 35872, 501, 35885, 521, 35896, 35905, 542, 35914, 35931, 35946, 35959, 0}, {35859, 35872, 501, 35885, 521, 35896, 35905, 542, 35914, 35931, 35946, 35959, 0}, {15231, 8135, 2530, 2534, 15179, 15235, 15239, 15243, 15247, 2554, 15251, 15255, 0}, {15231, 8135, 2530, 2534, 15179, 15235, 15239, 15243, 15247, 2554, 15251, 15255, 0}, 0, 1, 691, 187, {1156,1167,4762,189,1692,0,0,0,0,0,0,0,0,0},{1242,5505,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 7281, 7286, {18880, 18894, 18904, 18915, 18929, 18940, 18951}, {18964, 18969, 18974, 18981, 18987, 18993, 18999}, {2673, 2436, 2428, 7736, 2673, 12842, 2023}, {19004, 19012, 19020, 19027, 19036, 19046, 19056, 19062, 19070, 19085, 19103, 19111, 0}, {19004, 19012, 19020, 19027, 19036, 19046, 19056, 19062, 19070, 19085, 19103, 19111, 0}, {19119, 19123, 19020, 19129, 19133, 19138, 19056, 19144, 19149, 19156, 19163, 19168, 0}, {19119, 19123, 19020, 19129, 19133, 19138, 19056, 19144, 19149, 19156, 19163, 19168, 0}, 2, 0, 185, 187, {198,189,2286,4762,1692,0,0,0,0,0,0,0,0,0},{1242,5505,10193,8579,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {35972, 35987, 36002, 36017, 36034, 36051, 36060}, {36071, 36078, 36085, 36092, 36099, 19832, 36106}, {36113, 19439, 8811, 8814, 8808, 19436, 19846}, {13229, 13240, 8845, 13253, 8867, 13264, 13271, 8892, 13278, 13293, 13306, 13317, 0}, {13229, 13240, 8845, 13253, 8867, 13264, 13271, 8892, 13278, 13293, 13306, 13317, 0}, {13330, 13337, 13344, 13351, 8867, 13264, 13271, 13358, 13365, 13372, 13379, 13386, 0}, {13330, 13337, 13344, 13351, 8867, 13264, 13271, 13358, 13365, 13372, 13379, 13386, 0}, 0, 1, 691, 187, {1156,1167,36116,4762,189,1692,0,0,0,0,0,0,0,0},{36127,1242,5505,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 20377, 20405, {20427, 20446, 20465, 20490, 20509, 20543, 20568}, {20587, 20597, 20607, 20623, 20633, 20658, 20674}, {20684, 20688, 20695, 20699, 20706, 20713, 20720}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, {20724, 20752, 20786, 20802, 20821, 20828, 20838, 20854, 20870, 20901, 20923, 20945, 0}, 0, 5, 2566, 187, {1139,2293,4762,1128,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{4288,2321,20998,21007,0,0,0,0,0,0,0,0},{4302,2337,21015,21027,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, 0, 6, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1327, 1340, 1347, {1354, 1364, 1374, 1384, 1394, 1404, 1414}, {35236, 35243, 35250, 35257, 35264, 35271, 35278}, {1473, 1477, 1481, 1485, 1489, 1493, 1497}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, 0, 0, 185, 187, {2277,2286,189,1714,1735,1654,1681,1692,0,0,0,0,0,0},{1744,6632,1822,1837,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1898,1914,0,0,0,0,0,0}}, + {1921, 2579, 2585, {2592, 2600, 2607, 2616, 2625, 2636, 2644}, {2652, 2655, 2658, 2661, 2664, 2667, 2670}, {2023, 2428, 2673, 2428, 2673, 2434, 2023}, {36148, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {36148, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {36156, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, {36156, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, 2, 1, 691, 187, {1156,1167,1692,36161,7419,0,0,0,0,0,0,0,0,0},{36171,36191,0,0,0,0,0,0,0,0},{251,843,2850,36203,35523,8353,35534,0,0,0,0,0},{269,848,2862,35567,35581,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3613, 1929, 1932, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 185, 187, {9796,1120,2286,2277,189,198,3809,5518,1692,1735,1681,0,0,0},{1207,1242,0,0,0,0,0,0,0,0},{3594,843,251,0,0,0,0,0,0,0,0,0},{3602,848,269,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 2, 1, 185, 187, {198,189,1120,2286,2293,1139,1167,1692,0,0,0,0,0,0},{4211,4239,4266,0,0,0,0,0,0,0},{843,251,2321,4288,4294,0,0,0,0,0,0,0},{848,269,2337,4302,4311,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {4783, 4792, 4798, 4804, 4813, 4819, 4828}, {4835, 4840, 4845, 4850, 4855, 4860, 4865}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, 0, 0, 2566, 187, {1692,5888,1139,6179,189,3582,0,0,0,0,0,0,0,0},{1242,8579,0,0,0,0,0,0,0,0},{251,843,4288,5011,5021,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {18472, 18485, 18490, {36214, 36222, 36230, 36238, 36250, 36259, 36271}, {18575, 18580, 18585, 18590, 18595, 18600, 18605}, {2023, 2428, 2673, 6293, 2673, 16426, 2436}, {18610, 18627, 18640, 18654, 18667, 18680, 18693, 18707, 18719, 18733, 18747, 18761, 0}, {18610, 18627, 18640, 18654, 18667, 18680, 18693, 18707, 18719, 18733, 18747, 18761, 0}, {36282, 36293, 36300, 36308, 36315, 36322, 36329, 36337, 36343, 36351, 36359, 36367, 0}, {36282, 36293, 36300, 36308, 36315, 36322, 36329, 36337, 36343, 36351, 36359, 36367, 0}, 2, 1, 691, 187, {4753,1156,4762,1692,0,0,0,0,0,0,0,0,0,0},{36374,18862,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, 0, 6, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1327, 1340, 1347, {1354, 1364, 1374, 1384, 1394, 1404, 1414}, {1424, 1431, 1438, 1445, 1452, 1459, 1466}, {1473, 1477, 1481, 1485, 1489, 1493, 1497}, {1501, 1508, 1515, 1522, 1529, 1536, 1543, 1550, 1557, 1564, 1571, 1581, 0}, {1501, 1508, 1515, 1522, 1529, 1536, 1543, 1550, 1557, 1564, 1571, 1581, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, 0, 0, 185, 187, {2277,2286,189,1714,1735,1654,1681,1692,0,0,0,0,0,0},{1744,6632,1822,35285,0,0,0,0,0,0},{1858,1866,843,251,0,0,0,0,0,0,0,0},{1875,1886,848,269,0,0,0,0,0},{1898,0,0,0,0,0,0,0}}, + {1921, 2579, 2585, {2592, 2600, 2607, 2616, 2625, 2636, 2644}, {2652, 2655, 2658, 2661, 2664, 2667, 2670}, {2023, 2428, 2673, 2428, 2673, 2434, 2023}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, 2, 1, 691, 187, {1156,1167,1176,4762,4753,1692,0,0,0,0,0,0,0,0},{36400,2818,36426,36441,0,0,0,0,0,0},{251,843,2321,35512,0,0,0,0,0,0,0,0},{269,35567,2862,35581,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 2566, 187, {1692,198,189,2286,5888,36455,3809,14921,1692,0,0,0,0,0},{3838,20186,36463,6488,0,0,0,0,0,0},{3594,242,251,843,0,0,0,0,0,0,0,0},{3602,257,269,848,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {198,189,9796,2286,1139,1692,0,0,0,0,0,0,0,0},{29578,4239,4266,0,0,0,0,0,0,0},{3594,843,0,0,0,0,0,0,0,0,0,0},{3602,848,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {4783, 4792, 4798, 4804, 4813, 4819, 4828}, {4835, 4840, 4845, 4850, 4855, 4860, 4865}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, 2, 1, 691, 187, {1156,1167,4762,1692,0,0,0,0,0,0,0,0,0,0},{4985,1242,5002,0,0,0,0,0,0,0},{251,843,4288,5011,5021,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 1929, 1932, {9187, 9196, 9208, 9215, 9223, 9233, 9239}, {9246, 9250, 9254, 9258, 9262, 9267, 9271}, {9275, 9277, 9279, 9281, 9283, 9277, 9281}, {9286, 9296, 9305, 9313, 9321, 9329, 9336, 9343, 9351, 2102, 9357, 9365, 0}, {9374, 9384, 9393, 9401, 9409, 9417, 9424, 9431, 9440, 7911, 9446, 9456, 0}, {9465, 9469, 9474, 9479, 9483, 7945, 2239, 9487, 9491, 2255, 9495, 2259, 0}, {9465, 9469, 9474, 9479, 9483, 7945, 2239, 9487, 9491, 2255, 9495, 2259, 0}, 0, 1, 691, 187, {9499,9509,6153,9517,9529,9539,9549,1692,0,0,0,0,0,0},{9561,9575,9590,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {36474, 36485, 13604, 36496, 36507, 36514, 36523, 36536, 36543, 36556, 36569, 36582, 0}, {36474, 36485, 13604, 36496, 36507, 36514, 36523, 36536, 36543, 36556, 36569, 36582, 0}, {36474, 36485, 13604, 36496, 36507, 36514, 36523, 36536, 36543, 36556, 36569, 36582, 0}, {36474, 36485, 13604, 36496, 36507, 36514, 36523, 36536, 36543, 36556, 36569, 36582, 0}, 0, 6, 2566, 187, {1128,1139,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{843,251,242,0,0,0,0,0,0,0,0,0},{848,269,257,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1327, 1340, 1347, {1354, 1364, 1374, 1384, 1394, 1404, 1414}, {35236, 35243, 35250, 35257, 35264, 35271, 35278}, {1473, 1477, 1481, 1485, 1489, 1493, 1497}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, 0, 0, 185, 187, {2277,2286,189,1714,1735,1654,1681,1692,0,0,0,0,0,0},{1744,36595,36622,2568,1822,35285,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1898,1914,0,0,0,0,0,0}}, + {1921, 2579, 2585, {2592, 2600, 2607, 2616, 2625, 2636, 2644}, {2652, 2655, 2658, 2661, 2664, 2667, 2670}, {2023, 2428, 2673, 2428, 2673, 2434, 2023}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {2675, 2682, 2690, 2696, 2702, 2706, 2711, 2716, 2723, 2733, 2741, 2750, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, {2759, 2763, 2767, 2772, 2702, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 0}, 2, 1, 691, 187, {1156,1167,1176,35473,4762,1692,7419,4753,0,0,0,0,0,0},{2818,2300,36638,0,0,0,0,0,0,0},{251,843,35512,35523,2321,0,0,0,0,0,0,0},{269,848,2862,35567,35581,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 7281, 7286, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 185, 187, {9796,1120,189,1176,1692,0,0,0,0,0,0,0,0,0},{1207,1242,0,0,0,0,0,0,0,0},{3594,242,251,843,0,0,0,0,0,0,0,0},{3602,257,269,848,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 1, 185, 187, {198,189,2286,1139,0,0,0,0,0,0,0,0,0,0},{4239,4266,3809,36650,14910,0,0,0,0,0},{242,3594,843,251,0,0,0,0,0,0,0,0},{257,3602,848,269,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {4783, 4792, 4798, 4804, 4813, 4819, 4828}, {4835, 4840, 4845, 4850, 4855, 4860, 4865}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, 2, 1, 185, 187, {198,189,1167,1139,1692,0,0,0,0,0,0,0,0,0},{36659,4985,5002,1242,0,0,0,0,0,0},{251,843,4288,5011,5021,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {12109, 36682, 36692, {9187, 9196, 9208, 9215, 9223, 9233, 9239}, {9246, 9250, 9254, 9258, 9262, 9267, 9271}, {0, 0, 0, 0, 0, 0, 0}, {2438, 2445, 15168, 2459, 2465, 2469, 2474, 12088, 36700, 36710, 36718, 36727, 0}, {2438, 2445, 15168, 2459, 2465, 2469, 2474, 12088, 36700, 36710, 36718, 36727, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, 0, 1, 691, 187, {4753,4762,2266,1156,36736,1167,9806,1692,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {36745, 36756, 13604, 36769, 36507, 36780, 36791, 36804, 36811, 36556, 36822, 36833, 0}, {36745, 36756, 13604, 36769, 36507, 36780, 36791, 36804, 36811, 36556, 36822, 36833, 0}, {36745, 36756, 13604, 36769, 36507, 36780, 36791, 36804, 36811, 36556, 36822, 36833, 0}, {36745, 36756, 13604, 36769, 36507, 36780, 36791, 36804, 36811, 36556, 36822, 36833, 0}, 0, 6, 2566, 187, {1128,1139,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{843,251,242,0,0,0,0,0,0,0,0,0},{848,269,257,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 7281, 7286, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 2, 0, 185, 187, {198,1128,1692,0,0,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {2286,189,1139,1692,0,0,0,0,0,0,0,0,0,0},{29578,4239,4266,0,0,0,0,0,0,0},{3594,843,0,0,0,0,0,0,0,0,0,0},{3602,848,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {4783, 4792, 4798, 4804, 4813, 4819, 4828}, {4835, 4840, 4845, 4850, 4855, 4860, 4865}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4870, 4878, 4887, 4892, 4898, 4902, 4907, 4915, 4921, 4931, 1058, 4939, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, {4949, 4955, 4887, 4962, 4898, 4902, 4967, 4915, 4973, 1105, 1110, 4979, 0}, 2, 1, 185, 187, {198,189,1167,1139,1692,0,0,0,0,0,0,0,0,0},{4985,1242,5002,0,0,0,0,0,0,0},{251,843,4288,5011,5021,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 36682, 36692, {12020, 36844, 9208, 12045, 9223, 9233, 9239}, {9246, 9250, 9254, 12066, 9262, 9267, 9271}, {9275, 9277, 9279, 9281, 9283, 9277, 9281}, {2438, 2445, 15168, 2459, 2465, 2538, 2542, 12088, 36700, 36710, 36718, 36727, 0}, {2438, 2445, 15168, 2459, 2465, 2538, 2542, 12088, 36700, 36710, 36718, 36727, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, 0, 1, 691, 187, {9499,9517,0,0,0,0,0,0,0,0,0,0,0,0},{9561,9575,9590,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{36855,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {36474, 36485, 13604, 36496, 36507, 36514, 36523, 36536, 36543, 36556, 36569, 36582, 0}, {36474, 36485, 13604, 36496, 36507, 36514, 36523, 36536, 36543, 36556, 36569, 36582, 0}, {36474, 36485, 13604, 36496, 36507, 36514, 36523, 36536, 36543, 36556, 36569, 36582, 0}, {36474, 36485, 13604, 36496, 36507, 36514, 36523, 36536, 36543, 36556, 36569, 36582, 0}, 0, 0, 2566, 187, {1128,1139,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{843,251,242,0,0,0,0,0,0,0,0,0},{848,269,257,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {3613, 1929, 1932, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 2566, 187, {1692,0,0,0,0,0,0,0,0,0,0,0,0,0},{5505,0,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {2286,2277,2293,7410,4762,4753,0,0,0,0,0,0,0,0},{29578,4266,0,0,0,0,0,0,0,0},{3594,843,0,0,0,0,0,0,0,0,0,0},{3602,848,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {1921, 36866, 36884, {36899, 36912, 36931, 36944, 36959, 36976, 10975}, {36987, 36994, 37001, 37008, 37015, 37022, 37029}, {456, 459, 37036, 465, 468, 459, 465}, {37039, 37052, 501, 510, 15858, 15865, 15874, 542, 37067, 37086, 37101, 37118, 0}, {37039, 37052, 501, 510, 15858, 15865, 15874, 542, 37067, 37086, 37101, 37118, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, 0, 1, 691, 187, {9499,9517,0,0,0,0,0,0,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, 0, 6, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,843,0,0,0,0,0,0,0,0,0},{257,269,848,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 185, 187, {198,1692,0,0,0,0,0,0,0,0,0,0,0,0},{10751,14921,1128,20186,20206,222,0,0,0,0},{251,242,3594,843,0,0,0,0,0,0,0,0},{269,257,3602,848,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 2566, 187, {1128,198,189,2286,1139,1692,0,0,0,0,0,0,0,0},{29578,4239,4266,0,0,0,0,0,0,0},{242,3594,843,251,0,0,0,0,0,0,0,0},{257,3602,848,269,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {20057, 36866, 36884, {36899, 36912, 36931, 36944, 36959, 36976, 10975}, {36987, 36994, 37001, 37008, 37015, 37022, 37029}, {456, 459, 37036, 465, 468, 459, 465}, {37039, 37052, 501, 510, 15858, 15865, 15874, 542, 37067, 37086, 37101, 37118, 0}, {37039, 37052, 501, 510, 15858, 15865, 15874, 542, 37067, 37086, 37101, 37118, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, 0, 1, 691, 187, {4753,4762,2266,1156,36736,1167,9806,1692,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, 0, 0, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,843,0,0,0,0,0,0,0,0,0},{257,269,848,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {198,189,9796,2286,1139,1692,0,0,0,0,0,0,0,0},{29578,4239,4266,0,0,0,0,0,0,0},{3594,843,0,0,0,0,0,0,0,0,0,0},{3602,848,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {1921, 36682, 36692, {12020, 36844, 9208, 12045, 9223, 9233, 9239}, {9246, 9250, 9254, 12066, 9262, 9267, 9271}, {9275, 9277, 9279, 9281, 9283, 9277, 9281}, {2438, 2445, 15168, 2459, 2465, 2538, 2542, 12088, 36700, 36710, 36718, 36727, 0}, {2438, 2445, 15168, 2459, 2465, 2538, 2542, 12088, 36700, 36710, 36718, 36727, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, 0, 1, 691, 187, {9499,9517,0,0,0,0,0,0,0,0,0,0,0,0},{9561,9575,9590,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{36855,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, 0, 6, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,843,0,0,0,0,0,0,0,0,0},{257,269,848,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 185, 187, {198,1692,0,0,0,0,0,0,0,0,0,0,0,0},{13756,0,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {198,189,2286,1139,1692,0,0,0,0,0,0,0,0,0},{29578,4239,4266,0,0,0,0,0,0,0},{242,3594,843,251,0,0,0,0,0,0,0,0},{257,3602,848,269,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {1921, 36866, 36884, {36899, 36912, 36931, 8714, 36959, 36976, 10975}, {36987, 36994, 37001, 37212, 37015, 37022, 37029}, {456, 459, 37036, 465, 468, 459, 465}, {37039, 37052, 501, 510, 15858, 37163, 37170, 542, 37067, 37086, 37101, 37118, 0}, {37039, 37052, 501, 510, 15858, 37163, 37170, 542, 37067, 37086, 37101, 37118, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, 0, 1, 691, 187, {9499,9517,0,0,0,0,0,0,0,0,0,0,0,0},{9561,9575,9590,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{36855,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, 0, 6, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,843,0,0,0,0,0,0,0,0,0},{257,269,848,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 185, 187, {198,1692,0,0,0,0,0,0,0,0,0,0,0,0},{13756,0,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {37219, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {198,189,2286,1139,1692,0,0,0,0,0,0,0,0,0},{29578,4239,4266,0,0,0,0,0,0,0},{242,3594,251,843,0,0,0,0,0,0,0,0},{257,3602,269,848,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {1921, 36682, 36692, {12020, 36844, 9208, 12045, 9223, 9233, 9239}, {9246, 9250, 9254, 12066, 9262, 9267, 9271}, {9275, 9277, 9279, 9281, 9283, 9277, 9281}, {2438, 2445, 15168, 2459, 2465, 2538, 2542, 12088, 36700, 36710, 36718, 36727, 0}, {2438, 2445, 15168, 2459, 2465, 2538, 2542, 12088, 36700, 36710, 36718, 36727, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, 0, 1, 691, 187, {9499,9509,6153,9517,9529,9539,9549,1692,0,0,0,0,0,0},{9561,9575,9590,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{36855,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, {35305, 35329, 35338, 35347, 35358, 35367, 35380, 35389, 35394, 35405, 35427, 35451, 0}, 0, 1, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,843,0,0,0,0,0,0,0,0,0},{257,269,848,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 185, 187, {198,2277,0,0,0,0,0,0,0,0,0,0,0,0},{1207,1242,5002,10205,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{37232,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 1, 185, 187, {198,189,2286,1139,1692,0,0,0,0,0,0,0,0,0},{29578,4239,4266,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {1921, 36866, 36884, {36899, 36912, 36931, 8714, 36959, 36976, 10975}, {36987, 36994, 37001, 37212, 37015, 37022, 37029}, {456, 459, 37036, 465, 468, 459, 465}, {37039, 37052, 501, 510, 15858, 37163, 37170, 542, 37067, 37086, 37101, 37118, 0}, {37039, 37052, 501, 510, 15858, 37163, 37170, 542, 37067, 37086, 37101, 37118, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, 0, 1, 691, 187, {9499,9509,6153,9517,9529,9539,9549,37242,0,0,0,0,0,0},{9561,9575,9590,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{36855,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, 0, 6, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,843,0,0,0,0,0,0,0,0,0},{257,269,848,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {3613, 1929, 1932, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 185, 187, {3773,3782,3789,3798,1692,1735,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {37254, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 1, 2566, 187, {1128,1139,189,2286,0,0,0,0,0,0,0,0,0,0},{29578,4239,4266,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, 0, 6, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,843,0,0,0,0,0,0,0,0,0},{257,269,848,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 1, 185, 187, {198,189,2286,1139,1692,0,0,0,0,0,0,0,0,0},{29578,4239,4266,0,0,0,0,0,0,0},{843,251,242,3594,0,0,0,0,0,0,0,0},{848,269,257,3602,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, 0, 6, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,843,0,0,0,0,0,0,0,0,0},{257,269,848,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {198,189,2286,1139,1692,0,0,0,0,0,0,0,0,0},{29578,4239,4266,0,0,0,0,0,0,0},{242,3594,843,251,0,0,0,0,0,0,0,0},{257,3602,848,269,0,0,0,0,0},{1286,278,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, {9, 18, 25, 45, 65, 89, 113, 120, 131, 142, 151, 169, 0}, 0, 6, 185, 187, {198,189,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{242,251,843,0,0,0,0,0,0,0,0,0},{257,269,848,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 8151, 22114, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 2566, 187, {1128,1139,2293,4762,1692,0,0,0,0,0,0,0,0,0},{5505,1242,0,0,0,0,0,0,0,0},{251,843,242,0,0,0,0,0,0,0,0,0},{269,848,2326,257,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {37254, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {198,189,2286,1139,0,0,0,0,0,0,0,0,0,0},{29578,4266,0,0,0,0,0,0,0,0},{242,3594,843,251,0,0,0,0,0,0,0,0},{257,3602,848,269,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {198,189,37265,1692,0,0,0,0,0,0,0,0,0,0},{29578,0,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {289, 8151, 22114, {3620, 3627, 3634, 3642, 3652, 3661, 3668}, {3677, 3681, 3685, 3689, 3693, 3697, 3701}, {2023, 2428, 2430, 3705, 2430, 2434, 2023}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {3707, 3715, 3724, 2696, 3730, 3734, 3739, 2716, 2723, 3744, 2741, 3752, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, {2759, 2763, 3761, 2772, 3730, 2776, 2780, 2784, 2788, 3765, 2796, 3769, 0}, 0, 0, 185, 187, {2277,2286,198,189,1692,0,0,0,0,0,0,0,0,0},{1207,1242,0,0,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {198,189,37265,1692,0,0,0,0,0,0,0,0,0,0},{4211,0,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {198,189,37265,1692,0,0,0,0,0,0,0,0,0,0},{4211,0,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{37276,0,0,0,0,0,0,0}}, + {3883, 872, 878, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {198,189,37265,1692,0,0,0,0,0,0,0,0,0,0},{29578,0,0,0,0,0,0,0,0,0},{242,251,0,0,0,0,0,0,0,0,0,0},{257,269,0,0,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {3613, 1929, 1932, {3895, 3903, 3909, 3916, 3927, 3934, 3942}, {3950, 3955, 3960, 3965, 3971, 3976, 3981}, {2673, 2436, 2428, 2428, 3987, 3989, 2023}, {3991, 3997, 4005, 4011, 4017, 4022, 4028, 4034, 4041, 4052, 4060, 4070, 0}, {4080, 4086, 4094, 1012, 4100, 4105, 4111, 4117, 4124, 1050, 4135, 4145, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, {4155, 4160, 3960, 4165, 4170, 4175, 4180, 4185, 4190, 4196, 4201, 4206, 0}, 0, 0, 185, 187, {3773,3782,3789,3798,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{1286,0,0,0,0,0,0,0}}, + {20057, 36866, 36884, {36899, 36912, 36931, 36944, 36959, 36976, 10975}, {36987, 36994, 37001, 37008, 37015, 37022, 37029}, {456, 459, 37036, 465, 468, 459, 465}, {37039, 37052, 501, 510, 15858, 15865, 15874, 542, 37067, 37086, 37101, 37118, 0}, {37039, 37052, 501, 510, 15858, 15865, 15874, 542, 37067, 37086, 37101, 37118, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, 0, 1, 691, 187, {4753,4762,2266,1156,36736,1167,9806,1692,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {12109, 36682, 36692, {9187, 9196, 9208, 9215, 9223, 9233, 9239}, {9246, 9250, 9254, 9258, 9262, 9267, 9271}, {0, 0, 0, 0, 0, 0, 0}, {2438, 2445, 15168, 2459, 2465, 2469, 2474, 12088, 36700, 36710, 36718, 36727, 0}, {2438, 2445, 15168, 2459, 2465, 2469, 2474, 12088, 36700, 36710, 36718, 36727, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, 0, 1, 691, 187, {4753,4762,2266,1156,36736,1167,9806,1692,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1921, 36866, 36884, {36899, 36912, 36931, 8714, 36959, 36976, 10975}, {36987, 36994, 37001, 37212, 37015, 37022, 37029}, {456, 459, 37036, 465, 468, 459, 465}, {37039, 37052, 501, 510, 15858, 37163, 37170, 542, 37067, 37086, 37101, 37118, 0}, {37039, 37052, 501, 510, 15858, 37163, 37170, 542, 37067, 37086, 37101, 37118, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, 0, 1, 691, 187, {9499,9517,0,0,0,0,0,0,0,0,0,0,0,0},{9561,9575,9590,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{36855,0,0,0,0,0,0,0}}, + {1921, 36682, 36692, {12020, 36844, 9208, 12045, 9223, 9233, 9239}, {9246, 9250, 9254, 12066, 9262, 9267, 9271}, {9275, 9277, 9279, 9281, 9283, 9277, 9281}, {2438, 2445, 15168, 2459, 2465, 2538, 2542, 12088, 36700, 36710, 36718, 36727, 0}, {2438, 2445, 15168, 2459, 2465, 2538, 2542, 12088, 36700, 36710, 36718, 36727, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, 0, 1, 691, 187, {9499,9517,0,0,0,0,0,0,0,0,0,0,0,0},{9561,9575,9590,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{36855,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {35735, 35746, 35770, 35800, 35817, 35839, 35848}, {15057, 15060, 15065, 15071, 15075, 7736, 15080}, {6617, 6605, 6607, 6609, 6611, 6613, 6615}, {35859, 35872, 501, 35885, 521, 35896, 35905, 542, 35914, 35931, 35946, 35959, 0}, {35859, 35872, 501, 35885, 521, 35896, 35905, 542, 35914, 35931, 35946, 35959, 0}, {15231, 8135, 2530, 2534, 15179, 15235, 15239, 15243, 15247, 2554, 15251, 15255, 0}, {15231, 8135, 2530, 2534, 15179, 15235, 15239, 15243, 15247, 2554, 15251, 15255, 0}, 0, 1, 691, 187, {1156,1167,4762,189,1692,0,0,0,0,0,0,0,0,0},{1242,5505,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{269,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {1327, 1340, 1347, {1354, 1364, 1374, 1384, 1394, 1404, 1414}, {1424, 1431, 1438, 1445, 1452, 1459, 1466}, {1473, 1477, 1481, 1485, 1489, 1493, 1497}, {1501, 1508, 1515, 1522, 1529, 1536, 1543, 1550, 1557, 1564, 1571, 1581, 0}, {1501, 1508, 1515, 1522, 1529, 1536, 1543, 1550, 1557, 1564, 1571, 1581, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, 0, 0, 185, 187, {1654,1663,1672,1681,1692,1703,1714,1721,1728,1735,0,0,0,0},{1744,1766,1794,1822,1837,0,0,0,0,0},{843,251,1858,1866,0,0,0,0,0,0,0,0},{848,269,1875,1886,0,0,0,0,0},{1898,1914,0,0,0,0,0,0}}, + {1921, 35642, 35647, {2345, 10060, 35652, 2368, 2375, 2383, 35659}, {2398, 35667, 35672, 2411, 2415, 2419, 35676}, {2023, 2428, 2430, 2432, 2430, 2434, 2436}, {2438, 2445, 4887, 2459, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2438, 2445, 4887, 2459, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, 2, 1, 691, 187, {1156,7519,1167,4762,2804,1692,0,0,0,0,0,0,0,0},{2300,4769,0,0,0,0,0,0,0,0},{251,843,7529,7539,4288,2321,7550,7561,0,0,0,0},{269,848,7571,7585,4302,2337,7598,7612,0},{1301,7625,7635,0,0,0,0,0}}, + {12109, 36682, 36692, {9187, 9196, 9208, 9215, 9223, 9233, 9239}, {9246, 9250, 9254, 9258, 9262, 9267, 9271}, {0, 0, 0, 0, 0, 0, 0}, {2438, 2445, 15168, 2459, 2465, 2469, 2474, 12088, 36700, 36710, 36718, 36727, 0}, {2438, 2445, 15168, 2459, 2465, 2469, 2474, 12088, 36700, 36710, 36718, 36727, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, {2522, 2526, 2530, 2534, 2465, 2538, 2542, 12095, 2550, 2554, 2558, 2562, 0}, 0, 1, 691, 187, {4753,4762,2266,1156,36736,1167,9806,1692,0,0,0,0,0,0},{2300,4769,2818,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {14968, 14974, 14988, 15011, 15025, 15041, 15048}, {15057, 15060, 15065, 15071, 15075, 7736, 15080}, {6617, 6605, 6607, 6609, 6611, 6613, 6615}, {15084, 15091, 10374, 15098, 3730, 15104, 15110, 15116, 15123, 15132, 15140, 15147, 0}, {15154, 15161, 15168, 15173, 15179, 15183, 15188, 15193, 15200, 15209, 15217, 15224, 0}, {15231, 8135, 2530, 2534, 15179, 15235, 15239, 15243, 15247, 2554, 15251, 15255, 0}, {15231, 8135, 2530, 2534, 15179, 15235, 15239, 15243, 15247, 2554, 15251, 15255, 0}, 0, 1, 691, 187, {1156,1167,4762,189,1692,0,0,0,0,0,0,0,0,0},{15259,0,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 1929, 1932, {35972, 35987, 36002, 36017, 36034, 36051, 36060}, {36071, 36078, 36085, 36092, 36099, 19832, 36106}, {36113, 19439, 8811, 8814, 8808, 19436, 19846}, {13229, 13240, 8845, 13253, 8867, 13264, 13271, 8892, 13278, 13293, 13306, 13317, 0}, {13229, 13240, 8845, 13253, 8867, 13264, 13271, 8892, 13278, 13293, 13306, 13317, 0}, {13330, 13337, 13344, 13351, 8867, 13264, 13271, 13358, 13365, 13372, 13379, 13386, 0}, {13330, 13337, 13344, 13351, 8867, 13264, 13271, 13358, 13365, 13372, 13379, 13386, 0}, 0, 1, 691, 187, {1156,1167,36116,4762,189,1692,0,0,0,0,0,0,0,0},{36127,1242,5505,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {5619, 26213, 26218, {26223, 26230, 26241, 26254, 26267, 26278, 26291}, {26302, 26307, 26312, 26317, 26322, 26327, 26332}, {6605, 6607, 6609, 6611, 6613, 6615, 6617}, {26337, 26363, 26391, 26421, 26451, 26477, 26507, 26533, 26561, 26585, 26613, 26650, 0}, {26337, 26363, 26391, 26421, 26451, 26477, 26507, 26533, 26561, 26585, 26613, 26650, 0}, {26689, 26701, 26713, 26725, 26737, 26749, 26761, 26773, 26785, 26797, 26810, 26823, 0}, {26689, 26701, 26713, 26725, 26737, 26749, 26761, 26773, 26785, 26797, 26810, 26823, 0}, 0, 0, 2566, 187, {1692,0,0,0,0,0,0,0,0,0,0,0,0,0},{26836,26890,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{26926,0,0,0,0,0,0,0}}, + {1327, 1340, 1347, {1354, 1364, 1374, 1384, 1394, 1404, 1414}, {35236, 35243, 35250, 35257, 35264, 35271, 35278}, {1473, 1477, 1481, 1485, 1489, 1493, 1497}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, 0, 0, 185, 187, {2277,2286,189,1714,1735,1654,1681,1692,0,0,0,0,0,0},{1744,6632,1822,1837,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1898,1914,0,0,0,0,0,0}}, + {1327, 1340, 1347, {1354, 1364, 1374, 1384, 1394, 1404, 1414}, {35236, 35243, 35250, 35257, 35264, 35271, 35278}, {1473, 1477, 1481, 1485, 1489, 1493, 1497}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, {1591, 1596, 1601, 1606, 1611, 1616, 1621, 1626, 1631, 1636, 1642, 1648, 0}, 0, 0, 185, 187, {2277,2286,189,1714,1735,1654,1681,1692,0,0,0,0,0,0},{1744,6632,1822,1837,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{1898,1914,0,0,0,0,0,0}}, + {1921, 7281, 7286, {2345, 2353, 2360, 2368, 2375, 2383, 2390}, {7485, 7490, 7494, 7498, 7502, 7506, 7510}, {2023, 2428, 2430, 2432, 2430, 2434, 2436}, {2438, 2445, 4887, 2459, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2438, 2445, 4887, 2459, 4898, 2469, 2474, 2479, 2486, 2496, 2504, 6121, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, {2522, 2526, 2530, 2534, 4898, 2538, 2542, 2546, 2550, 2554, 2558, 7515, 0}, 2, 1, 691, 187, {1156,7519,1167,4762,2804,1692,0,0,0,0,0,0,0,0},{2300,4769,0,0,0,0,0,0,0,0},{251,843,7529,7539,4288,2321,7550,7561,0,0,0,0},{269,848,7571,7585,4302,2337,7598,7612,0},{1301,7625,7635,0,0,0,0,0}}, + {1921, 36866, 36884, {36899, 36912, 36931, 8714, 36959, 36976, 10975}, {36987, 36994, 37001, 37212, 37015, 37022, 37029}, {456, 459, 37036, 465, 468, 459, 465}, {37039, 37052, 501, 510, 15858, 37163, 37170, 542, 37067, 37086, 37101, 37118, 0}, {37039, 37052, 501, 510, 15858, 37163, 37170, 542, 37067, 37086, 37101, 37118, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, {37135, 37142, 37149, 37156, 15858, 37163, 37170, 37177, 37184, 37191, 37198, 37205, 0}, 0, 1, 691, 187, {9499,9517,0,0,0,0,0,0,0,0,0,0,0,0},{9561,9575,9590,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{36855,0,0,0,0,0,0,0}}, + {1, 13053, 13065, {13077, 13092, 13107, 13122, 13139, 13158, 13169}, {13180, 13187, 13194, 13201, 13208, 13215, 13222}, {0, 0, 0, 0, 0, 0, 0}, {13229, 13240, 8845, 13253, 8867, 13264, 13271, 8892, 13278, 13293, 13306, 13317, 0}, {13229, 13240, 8845, 13253, 8867, 13264, 13271, 8892, 13278, 13293, 13306, 13317, 0}, {13330, 13337, 13344, 13351, 8867, 13264, 13271, 13358, 13365, 13372, 13379, 13386, 0}, {13330, 13337, 13344, 13351, 8867, 13264, 13271, 13358, 13365, 13372, 13379, 13386, 0}, 0, 1, 691, 187, {1156,1167,4762,1128,189,0,0,0,0,0,0,0,0,0},{13393,13411,0,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {20220, 1929, 1932, {20227, 20237, 20246, 20255, 20266, 20276, 20281}, {20288, 20294, 20299, 20304, 20309, 10828, 20313}, {20318, 2673, 2023, 7736, 2018, 3987, 2023}, {15084, 15091, 10374, 15098, 3730, 20320, 20325, 20330, 15123, 15132, 15140, 15147, 0}, {15084, 15091, 10374, 15098, 3730, 20320, 20325, 20330, 15123, 15132, 15140, 15147, 0}, {20337, 20342, 3761, 2772, 3730, 20320, 20325, 20346, 10812, 2792, 20350, 20355, 0}, {20337, 20342, 3761, 2772, 3730, 20320, 20325, 20346, 10812, 2792, 20350, 20355, 0}, 0, 1, 691, 187, {1156,0,0,0,0,0,0,0,0,0,0,0,0,0},{20359,1242,5505,0,0,0,0,0,0,0},{251,843,0,0,0,0,0,0,0,0,0,0},{269,848,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0}}, + {289, 30915, 30925, {30938, 30945, 30951, 30958, 30964, 30970, 30978}, {30988, 30992, 30996, 31000, 31004, 31008, 31012}, {12842, 12842, 12842, 12842, 12842, 12842, 12842}, {31018, 31027, 10131, 31036, 31042, 31048, 31054, 31061, 31067, 31076, 31085, 31093, 0}, {31018, 31027, 10131, 31036, 31042, 31048, 31054, 31061, 31067, 31076, 31085, 31093, 0}, {31102, 31106, 3761, 31110, 3730, 31114, 31118, 31122, 31127, 31131, 31137, 31141, 0}, {31102, 31106, 3761, 31110, 3730, 31114, 31118, 31122, 31127, 31131, 31137, 31141, 0}, 0, 0, 2566, 187, {1128,1139,1692,0,0,0,0,0,0,0,0,0,0,0},{10751,222,0,0,0,0,0,0,0,0},{843,251,0,0,0,0,0,0,0,0,0,0},{848,269,0,0,0,0,0,0,0},{278,0,0,0,0,0,0,0}}, + {289, 0, 0, {31916, 31923, 31931, 31938, 31945, 31953, 31961}, {31968, 31971, 31974, 31977, 31980, 31983, 31986}, {2436, 2436, 2430, 2436, 12842, 3987, 12842}, {31989, 31997, 32007, 32013, 32021, 32026, 32031, 32036, 32043, 20167, 32051, 32059, 0}, {31989, 31997, 32007, 32013, 32021, 32026, 32031, 32036, 32043, 20167, 32051, 32059, 0}, {2759, 32067, 3761, 32071, 3730, 31114, 31118, 32075, 3701, 2792, 32079, 16383, 0}, {2759, 32067, 3761, 32071, 3730, 31114, 31118, 32075, 3701, 2792, 32079, 16383, 0}, 0, 0, 185, 187, {2277,2286,189,198,1735,1692,3809,0,0,0,0,0,0,0},{20186,20206,222,10751,0,0,0,0,0,0},{3594,242,843,251,0,0,0,0,0,0,0,0},{3602,257,848,269,0,0,0,0,0},{278,0,0,0,0,0,0,0}} }; static const NumberFormatEntry number_format_entries [] = { - {754, 36825, 36827, 36830, 36827, 36830, 36833, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36891, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 36913, 36922, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 36930, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 36930, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36933, 36897, 36899, 36903, 36937, 36949, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36961, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 36964, 36975, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 36986, 37000, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 36888, 36825, 36888, 36909, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 37034, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 36899, 36903, 37043, 37051, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37059, 36897, 36899, 36903, 37063, 36874, 37076, 37081, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 37086, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36961, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37015, 37089, 2541, 36907, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37099, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37103, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37107, 37117, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 0, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 37126, 36897, 36899, 36903, 37130, 37149, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37168, 36897, 36899, 36903, 37015, 37089, 2541, 36907, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 37171, 754, 37173, 754, 37173, 37177, 36897, 36899, 36903, 37181, 37190, 2541, 36907, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 0, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 37199, 36897, 37207, 36903, 37224, 37252, 2541, 36907, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37279, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 36899, 36903, 36937, 36949, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 36888, 36825, 36888, 37282, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 5, 1, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 36888, 36825, 36888, 36961, 36897, 37288, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37295, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37299, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37303, 36897, 37306, 36903, 37329, 36874, 37345, 37353, 3, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37361, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 37364, 36897, 37368, 36903, 36864, 36874, 2541, 36907, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 37385, 36897, 0, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37389, 37403, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 37416, 36903, 37430, 37442, 2541, 36907, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 36888, 36825, 36888, 37453, 36897, 36899, 36903, 37456, 37467, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {37477, 36888, 36825, 36825, 36825, 36825, 0, 36897, 0, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, - {239, 36825, 36827, 36830, 36827, 36830, 37479, 36843, 37488, 36861, 37499, 36874, 37514, 37353, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37521, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 754, 36825, 754, 37525, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 754, 36825, 754, 0, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37531, 37541, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37550, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36888, 36825, 36888, 10707, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36888, 36825, 36888, 10707, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 10707, 36897, 37557, 36903, 36864, 36874, 2541, 36907, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36888, 36825, 36888, 10707, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 0, 36897, 37563, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36961, 36897, 37288, 36903, 36864, 36874, 2541, 36907, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 36909, 36897, 0, 36903, 36864, 36874, 2541, 36907, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 37288, 36903, 36864, 36874, 2541, 36907, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 36909, 36897, 0, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37608, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {2541, 36888, 36825, 36888, 36825, 36888, 0, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {2541, 36888, 36825, 36888, 36825, 36888, 0, 36897, 37611, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37628, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36827, 36830, 36827, 36830, 0, 36843, 36899, 36861, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36825, 36825, 36825, 37632, 36897, 37639, 36903, 36864, 36874, 2541, 36907, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 36827, 36825, 36827, 36825, 0, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 0, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 36825, 36825, 36825, 36825, 37604, 36897, 0, 36903, 36864, 36874, 2541, 36907, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {36825, 36888, 754, 36825, 754, 36825, 0, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 36930, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, - {754, 36825, 754, 36825, 754, 36825, 37666, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 754, 36825, 754, 37669, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}}, - {754, 36825, 36825, 754, 36825, 754, 37673, 36897, 37677, 36903, 36864, 36874, 2541, 36907, 4, 1, 0, 0, 0, 0, 2, 2, {3, 0}, {3, 0}, {3, 0}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36825, 36825, 36825, 37604, 36897, 0, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37714, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37722, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}}, - {754, 36825, 36825, 36888, 36825, 36888, 0, 36897, 0, 36903, 37043, 37051, 2541, 36907, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37729, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}}, - {36827, 36830, 36827, 36830, 36827, 36830, 37742, 36843, 0, 36903, 36864, 36874, 2541, 36907, 3, 0, 4, 2, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37745, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 0, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36825, 36825, 36825, 37749, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36888, 36825, 36888, 10707, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36961, 36897, 37288, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, - {754, 36825, 36825, 36825, 36825, 36825, 37749, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 36930, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 0, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 754, 37173, 754, 37173, 0, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36825, 36825, 36825, 37199, 36897, 0, 36903, 36864, 36874, 2541, 36907, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 754, 36825, 754, 37753, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37666, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 36833, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36891, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 36913, 36922, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37756, 36897, 37760, 36903, 36864, 36874, 2541, 36907, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36933, 36897, 36899, 36903, 36937, 36949, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36961, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 36964, 36975, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 36986, 37000, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 37034, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 36899, 36903, 37043, 37051, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37059, 36897, 36899, 36903, 37063, 36874, 37076, 37081, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 37086, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36961, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37015, 37089, 2541, 36907, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37099, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37103, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37107, 37117, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36961, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 37126, 36897, 36899, 36903, 37130, 37149, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37168, 36897, 36899, 36903, 37015, 37089, 2541, 36907, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 37171, 754, 37173, 754, 37173, 37177, 36897, 36899, 36903, 37181, 37190, 2541, 36907, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 0, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 37199, 36897, 37207, 36903, 37224, 37252, 2541, 36907, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37279, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 36899, 36903, 36937, 36949, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 36888, 36825, 36888, 37282, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 5, 1, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 36888, 36825, 36888, 36961, 36897, 37288, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37295, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37299, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37303, 36897, 37306, 36903, 37329, 36874, 37345, 37353, 3, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37361, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 37364, 36897, 37368, 36903, 36864, 36874, 2541, 36907, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 37385, 36897, 0, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37389, 37403, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 37416, 36903, 37430, 37442, 2541, 36907, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 36888, 36825, 36888, 37453, 36897, 36899, 36903, 37456, 37467, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {37477, 36888, 36825, 36825, 36825, 36825, 37770, 36897, 0, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, - {239, 36825, 36827, 36830, 36827, 36830, 37479, 36843, 37488, 36861, 37499, 36874, 37514, 37353, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37521, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 754, 36825, 754, 37525, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 754, 36825, 754, 37777, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37531, 37541, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37550, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36888, 36825, 36888, 10707, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36888, 36825, 36888, 10707, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 10707, 36897, 37557, 36903, 36864, 36874, 2541, 36907, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36888, 36825, 36888, 10707, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 0, 36897, 37563, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36961, 36897, 37288, 36903, 36864, 36874, 2541, 36907, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 36909, 36897, 0, 36903, 36864, 36874, 2541, 36907, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36961, 36897, 37288, 36903, 36864, 36874, 2541, 36907, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37628, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36827, 36830, 36827, 36830, 37782, 36843, 36899, 36861, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36825, 36825, 36825, 37604, 36897, 37639, 36903, 36864, 36874, 2541, 36907, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 0, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 36825, 36825, 36825, 36825, 37604, 36897, 0, 36903, 36864, 36874, 2541, 36907, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 36930, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, - {754, 36825, 754, 36825, 754, 36825, 37666, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 754, 36825, 754, 37669, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}}, - {754, 36825, 36825, 754, 36825, 754, 37673, 36897, 37677, 36903, 36864, 36874, 2541, 36907, 4, 1, 0, 0, 0, 0, 2, 2, {3, 0}, {3, 0}, {3, 0}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36825, 36825, 36825, 37604, 36897, 0, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37714, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}}, - {754, 36825, 754, 36825, 754, 36825, 37722, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}}, - {754, 36825, 754, 36825, 754, 36825, 37729, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}}, - {36827, 36830, 36827, 36830, 36827, 36830, 37742, 36843, 0, 36903, 36864, 36874, 2541, 36907, 3, 0, 4, 2, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37745, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37749, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36825, 36825, 36825, 37749, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36888, 36825, 36888, 10707, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36961, 36897, 37288, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, - {754, 36825, 36825, 36825, 36825, 36825, 37749, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 36930, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 0, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36825, 36825, 36825, 37199, 36897, 0, 36903, 36864, 36874, 2541, 36907, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 754, 36825, 754, 37753, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37666, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 37788, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37099, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 37171, 754, 37171, 754, 37171, 37177, 36897, 36899, 36903, 36964, 36975, 2541, 36907, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37666, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37043, 37051, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 37171, 754, 37171, 754, 37171, 37177, 36897, 36899, 36903, 37015, 37089, 2541, 36907, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37107, 37117, 2541, 36907, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36961, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 36888, 36825, 36888, 36909, 36897, 36899, 36903, 37015, 37089, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 37288, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 754, 36825, 754, 37798, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 36909, 36897, 0, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36827, 36830, 36827, 36830, 37806, 36843, 36899, 36861, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36825, 36825, 36825, 37813, 36897, 37639, 36903, 36864, 36874, 2541, 36907, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {754, 36825, 36827, 36830, 36827, 36830, 37817, 36843, 36899, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 37760, 36903, 36864, 36874, 2541, 36907, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 36964, 36975, 2541, 36907, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 37013, 36897, 36899, 36903, 37043, 37051, 2541, 36907, 15, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 37288, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 754, 36825, 754, 37827, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 0, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 36964, 36975, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 7868, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 37171, 754, 37171, 754, 37171, 37177, 36897, 36899, 36903, 37043, 37051, 2541, 36907, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37837, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 37840, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37850, 36897, 37760, 36903, 36864, 36874, 2541, 36907, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 37171, 754, 37171, 754, 37171, 0, 36897, 36899, 36903, 36964, 36975, 2541, 36907, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37855, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 37043, 37051, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37837, 36897, 0, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 37859, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 36909, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37869, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36909, 36897, 36899, 36903, 37043, 37051, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37837, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 754, 36825, 754, 37873, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 10707, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37883, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 37888, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37898, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37883, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 37902, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37013, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 14, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37912, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 37917, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37927, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37931, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 37939, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37013, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 754, 36825, 754, 37949, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37013, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 36909, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 37959, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37745, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37013, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 9, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 37969, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37013, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 37979, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37989, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 14, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36827, 36830, 36827, 36830, 37993, 36843, 36846, 36861, 36864, 36874, 2541, 36883, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37604, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, - {36825, 754, 36825, 754, 36825, 754, 38003, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 2411, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 38006, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37013, 36897, 36899, 36903, 37015, 37025, 2541, 36907, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}}, - {36825, 754, 36825, 754, 36825, 754, 37883, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37837, 36897, 0, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 38009, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 38017, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 754, 36825, 754, 37798, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 36930, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36961, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 37837, 36897, 0, 36903, 36864, 36874, 2541, 36907, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 754, 36825, 754, 37777, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36827, 36830, 36827, 36830, 37806, 36843, 36899, 36861, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 754, 36825, 754, 36825, 0, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 38022, 36897, 37760, 36903, 36864, 36874, 2541, 36907, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 38022, 36897, 37760, 36903, 36864, 36874, 2541, 36907, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 36888, 36825, 36888, 36825, 36888, 36961, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {36825, 754, 36825, 754, 36825, 754, 38017, 36897, 36899, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {37477, 36888, 36825, 36825, 36825, 36825, 37770, 36897, 0, 36903, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, - {36825, 36888, 36827, 36830, 36827, 36830, 37782, 36843, 36899, 36861, 36864, 36874, 2541, 36907, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 36825, 36888, 36825, 36888, 0, 36897, 0, 36903, 37043, 37051, 2541, 36907, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, - {754, 36825, 754, 36825, 754, 36825, 37749, 36897, 0, 36903, 36864, 36874, 2541, 36907, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}} + {691, 37292, 37294, 37297, 37294, 37297, 37300, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37358, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37380, 37389, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37397, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37397, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37400, 37364, 37366, 37370, 37404, 37416, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37428, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37431, 37442, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37453, 37467, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 37355, 37292, 37355, 37376, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37501, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37366, 37370, 37510, 37518, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37526, 37364, 37366, 37370, 37530, 37341, 37543, 37548, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37553, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37428, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37482, 37556, 2566, 37374, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37566, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37570, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37574, 37584, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 0, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37593, 37364, 37366, 37370, 37597, 37616, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37635, 37364, 37366, 37370, 37482, 37556, 2566, 37374, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37638, 691, 37640, 691, 37640, 37644, 37364, 37366, 37370, 37648, 37657, 2566, 37374, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 0, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37666, 37364, 37674, 37370, 37691, 37719, 2566, 37374, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37746, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37366, 37370, 37404, 37416, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 37355, 37292, 37355, 37749, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 5, 1, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 37355, 37292, 37355, 37428, 37364, 37755, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37762, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37766, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37770, 37364, 37773, 37370, 37796, 37341, 37812, 37820, 3, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37828, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37831, 37364, 37835, 37370, 37331, 37341, 2566, 37374, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37852, 37364, 0, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37856, 37870, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37883, 37370, 37897, 37909, 2566, 37374, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 37355, 37292, 37355, 37920, 37364, 37366, 37370, 37923, 37934, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37944, 37355, 37292, 37292, 37292, 37292, 0, 37364, 0, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, + {185, 37292, 37294, 37297, 37294, 37297, 37946, 37310, 37955, 37328, 37966, 37341, 37981, 37820, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37988, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 691, 37292, 691, 37992, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 691, 37292, 691, 0, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37998, 38008, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38017, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37355, 37292, 37355, 10836, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37355, 37292, 37355, 10836, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 10836, 37364, 38024, 37370, 37331, 37341, 2566, 37374, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37355, 37292, 37355, 10836, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 0, 37364, 38030, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37428, 37364, 37755, 37370, 37331, 37341, 2566, 37374, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 37376, 37364, 0, 37370, 37331, 37341, 2566, 37374, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37755, 37370, 37331, 37341, 2566, 37374, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37376, 37364, 0, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38075, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {2566, 37355, 37292, 37355, 37292, 37355, 0, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {2566, 37355, 37292, 37355, 37292, 37355, 0, 37364, 38078, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38095, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37294, 37297, 37294, 37297, 0, 37310, 37366, 37328, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37292, 37292, 37292, 38099, 37364, 38106, 37370, 37331, 37341, 2566, 37374, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 37294, 37292, 37294, 37292, 0, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 0, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 37292, 37292, 37292, 37292, 38071, 37364, 0, 37370, 37331, 37341, 2566, 37374, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {37292, 37355, 691, 37292, 691, 37292, 0, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37397, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, + {691, 37292, 691, 37292, 691, 37292, 38133, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 691, 37292, 691, 38136, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}}, + {691, 37292, 37292, 691, 37292, 691, 38140, 37364, 38144, 37370, 37331, 37341, 2566, 37374, 4, 1, 0, 0, 0, 0, 2, 2, {3, 0}, {3, 0}, {3, 0}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37292, 37292, 37292, 38071, 37364, 0, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38181, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38189, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}}, + {691, 37292, 37292, 37355, 37292, 37355, 0, 37364, 0, 37370, 37510, 37518, 2566, 37374, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38196, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}}, + {37294, 37297, 37294, 37297, 37294, 37297, 38209, 37310, 0, 37370, 37331, 37341, 2566, 37374, 3, 0, 4, 2, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38212, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 0, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37292, 37292, 37292, 38216, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37355, 37292, 37355, 10836, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37428, 37364, 37755, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, + {691, 37292, 37292, 37292, 37292, 37292, 38216, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37397, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 0, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 691, 37640, 691, 37640, 0, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37292, 37292, 37292, 37666, 37364, 0, 37370, 37331, 37341, 2566, 37374, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 691, 37292, 691, 38220, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38133, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 37300, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37358, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37380, 37389, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38223, 37364, 38227, 37370, 37331, 37341, 2566, 37374, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37400, 37364, 37366, 37370, 37404, 37416, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37428, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37431, 37442, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37453, 37467, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37501, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37366, 37370, 37510, 37518, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37526, 37364, 37366, 37370, 37530, 37341, 37543, 37548, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37553, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37428, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37482, 37556, 2566, 37374, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37566, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37570, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37574, 37584, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37428, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37593, 37364, 37366, 37370, 37597, 37616, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37635, 37364, 37366, 37370, 37482, 37556, 2566, 37374, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37638, 691, 37640, 691, 37640, 37644, 37364, 37366, 37370, 37648, 37657, 2566, 37374, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 0, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37666, 37364, 37674, 37370, 37691, 37719, 2566, 37374, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37746, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37366, 37370, 37404, 37416, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 37355, 37292, 37355, 37749, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 5, 1, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 37355, 37292, 37355, 37428, 37364, 37755, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37762, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37766, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37770, 37364, 37773, 37370, 37796, 37341, 37812, 37820, 3, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37828, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37831, 37364, 37835, 37370, 37331, 37341, 2566, 37374, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37852, 37364, 0, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37856, 37870, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37883, 37370, 37897, 37909, 2566, 37374, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 37355, 37292, 37355, 37920, 37364, 37366, 37370, 37923, 37934, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37944, 37355, 37292, 37292, 37292, 37292, 38237, 37364, 0, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, + {185, 37292, 37294, 37297, 37294, 37297, 37946, 37310, 37955, 37328, 37966, 37341, 37981, 37820, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37988, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 691, 37292, 691, 37992, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 691, 37292, 691, 38244, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37998, 38008, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38017, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37355, 37292, 37355, 10836, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37355, 37292, 37355, 10836, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 10836, 37364, 38024, 37370, 37331, 37341, 2566, 37374, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37355, 37292, 37355, 10836, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 0, 37364, 38030, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37428, 37364, 37755, 37370, 37331, 37341, 2566, 37374, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 37376, 37364, 0, 37370, 37331, 37341, 2566, 37374, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37428, 37364, 37755, 37370, 37331, 37341, 2566, 37374, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38095, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37294, 37297, 37294, 37297, 38249, 37310, 37366, 37328, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37292, 37292, 37292, 38071, 37364, 38106, 37370, 37331, 37341, 2566, 37374, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 0, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 37292, 37292, 37292, 37292, 38071, 37364, 0, 37370, 37331, 37341, 2566, 37374, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 37397, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, + {691, 37292, 691, 37292, 691, 37292, 38133, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 691, 37292, 691, 38136, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}}, + {691, 37292, 37292, 691, 37292, 691, 38140, 37364, 38144, 37370, 37331, 37341, 2566, 37374, 4, 1, 0, 0, 0, 0, 2, 2, {3, 0}, {3, 0}, {3, 0}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37292, 37292, 37292, 38071, 37364, 0, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38181, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}}, + {691, 37292, 691, 37292, 691, 37292, 38189, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}}, + {691, 37292, 691, 37292, 691, 37292, 38196, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}}, + {37294, 37297, 37294, 37297, 37294, 37297, 38209, 37310, 0, 37370, 37331, 37341, 2566, 37374, 3, 0, 4, 2, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38212, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38216, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37292, 37292, 37292, 38216, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37355, 37292, 37355, 10836, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37428, 37364, 37755, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, + {691, 37292, 37292, 37292, 37292, 37292, 38216, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37397, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 0, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37292, 37292, 37292, 37666, 37364, 0, 37370, 37331, 37341, 2566, 37374, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 691, 37292, 691, 38220, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38133, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 38255, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37566, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37638, 691, 37638, 691, 37638, 37644, 37364, 37366, 37370, 37431, 37442, 2566, 37374, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38133, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37510, 37518, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37638, 691, 37638, 691, 37638, 37644, 37364, 37366, 37370, 37482, 37556, 2566, 37374, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37574, 37584, 2566, 37374, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37428, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 37355, 37292, 37355, 37376, 37364, 37366, 37370, 37482, 37556, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37755, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 691, 37292, 691, 38265, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37376, 37364, 0, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37294, 37297, 37294, 37297, 38273, 37310, 37366, 37328, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37292, 37292, 37292, 38280, 37364, 38106, 37370, 37331, 37341, 2566, 37374, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {691, 37292, 37294, 37297, 37294, 37297, 38284, 37310, 37366, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 38227, 37370, 37331, 37341, 2566, 37374, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37431, 37442, 2566, 37374, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37480, 37364, 37366, 37370, 37510, 37518, 2566, 37374, 15, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37755, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 691, 37292, 691, 38294, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 0, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37431, 37442, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 8056, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37638, 691, 37638, 691, 37638, 37644, 37364, 37366, 37370, 37510, 37518, 2566, 37374, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38304, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 38307, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38317, 37364, 38227, 37370, 37331, 37341, 2566, 37374, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37638, 691, 37638, 691, 37638, 0, 37364, 37366, 37370, 37431, 37442, 2566, 37374, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38322, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37510, 37518, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38304, 37364, 0, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 38326, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37376, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38336, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37376, 37364, 37366, 37370, 37510, 37518, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38304, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 691, 37292, 691, 38340, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 10836, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38350, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 38355, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38365, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38350, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 38369, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37480, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 14, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38379, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 38384, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38394, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38398, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 38406, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37480, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 691, 37292, 691, 38416, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37480, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37376, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 38426, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38212, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37480, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 9, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 38436, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 37480, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 38446, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38456, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 14, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37294, 37297, 37294, 37297, 38460, 37310, 37313, 37328, 37331, 37341, 2566, 37350, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38071, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}}, + {37292, 691, 37292, 691, 37292, 691, 38470, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 2436, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38473, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37480, 37364, 37366, 37370, 37482, 37492, 2566, 37374, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}}, + {37292, 691, 37292, 691, 37292, 691, 38350, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38304, 37364, 0, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38476, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38484, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 691, 37292, 691, 38265, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 37397, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37428, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38304, 37364, 0, 37370, 37331, 37341, 2566, 37374, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 691, 37292, 691, 38244, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37294, 37297, 37294, 37297, 38273, 37310, 37366, 37328, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 691, 37292, 691, 37292, 0, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38489, 37364, 38227, 37370, 37331, 37341, 2566, 37374, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38489, 37364, 38227, 37370, 37331, 37341, 2566, 37374, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 37355, 37292, 37355, 37292, 37355, 37428, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37292, 691, 37292, 691, 37292, 691, 38484, 37364, 37366, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {37944, 37355, 37292, 37292, 37292, 37292, 38237, 37364, 0, 37370, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}}, + {37292, 37355, 37294, 37297, 37294, 37297, 38249, 37310, 37366, 37328, 37331, 37341, 2566, 37374, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 37292, 37355, 37292, 37355, 0, 37364, 0, 37370, 37510, 37518, 2566, 37374, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}, + {691, 37292, 691, 37292, 691, 37292, 38216, 37364, 0, 37370, 37331, 37341, 2566, 37374, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}} }; static const CultureInfoEntry culture_entries [] = { - {0x0001, 0x007F, 768, -1, 38026, 38029, 38036, 38051, 38055, 38026, 0, {0, 0, 38059, 0}, 0, 0, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x0002, 0x007F, 257, -1, 38087, 38090, 38100, 38119, 38123, 38087, 0, {38127, 0, 0, 0}, 1, 1, { 1251, 21025, 10007, 866, 0, ';' }}, - {0x0003, 0x007F, 257, -1, 38169, 38172, 38180, 38188, 38192, 38169, 0, {38196, 0, 0, 0}, 2, 2, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0004, 0x0004, 257, -1, 38216, 38223, 38251, 38258, 38262, 38266, 0, {38269, 0, 0, 0}, 3, 3, { 936, 500, 10008, 936, 0, ',' }}, - {0x0004, 0x7804, 257, -1, 38276, 38284, 38251, 38258, 38262, 38266, 0, {38269, 0, 0, 0}, 4, 4, { 936, 500, 10008, 936, 0, ',' }}, - {0x0005, 0x007F, 257, -1, 38305, 38308, 38314, 38324, 38328, 38305, 0, {38332, 0, 0, 0}, 5, 5, { 1250, 500, 10029, 852, 0, ';' }}, - {0x0006, 0x007F, 257, -1, 38358, 38361, 38368, 38374, 38378, 38358, 0, {38382, 0, 0, 0}, 6, 6, { 1252, 20277, 10000, 850, 0, ';' }}, - {0x0007, 0x007F, 257, -1, 38403, 38406, 38413, 38421, 38425, 38403, 0, {38429, 0, 0, 0}, 7, 7, { 1252, 20273, 10000, 850, 0, ';' }}, - {0x0008, 0x007F, 257, -1, 38454, 38457, 38463, 38480, 38484, 38454, 0, {38488, 0, 0, 0}, 8, 8, { 1253, 20273, 10006, 737, 0, ';' }}, - {0x0009, 0x007F, 257, -1, 38530, 38533, 38533, 38541, 38545, 38530, 0, {38549, 0, 0, 0}, 9, 9, { 1252, 37, 10000, 437, 0, ',' }}, - {0x000A, 0x007F, 257, -1, 38568, 38571, 38579, 38588, 38592, 38568, 0, {38596, 0, 0, 0}, 10, 10, { 1252, 20284, 10000, 850, 0, ';' }}, - {0x000B, 0x007F, 257, -1, 38618, 38621, 38629, 38635, 38639, 38618, 0, {38643, 0, 0, 0}, 11, 11, { 1252, 20278, 10000, 850, 0, ';' }}, - {0x000C, 0x007F, 257, -1, 38668, 38671, 38678, 38688, 38692, 38668, 0, {38696, 0, 0, 0}, 12, 12, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x000D, 0x007F, 257, -1, 38718, 38721, 38728, 38739, 38743, 38718, 0, {38747, 0, 0, 0}, 13, 13, { 1255, 500, 10005, 862, 1, ',' }}, - {0x000E, 0x007F, 257, -1, 38780, 38783, 38793, 38800, 38804, 38780, 0, {38808, 0, 0, 0}, 14, 14, { 1250, 500, 10029, 852, 0, ';' }}, - {0x000F, 0x007F, 257, -1, 38824, 38827, 38837, 38847, 38851, 38824, 0, {38855, 0, 0, 0}, 15, 15, { 1252, 20871, 10079, 850, 0, ';' }}, - {0x0010, 0x007F, 257, -1, 38875, 38878, 38886, 38895, 38899, 38875, 0, {38903, 0, 0, 0}, 16, 16, { 1252, 20280, 10000, 850, 0, ';' }}, - {0x0011, 0x007F, 257, -1, 38925, 38928, 38937, 38947, 38951, 38925, 0, {38955, 0, 0, 0}, 17, 17, { 932, 20290, 10001, 932, 0, ',' }}, - {0x0012, 0x007F, 257, -1, 38982, 38985, 38992, 39002, 39006, 38982, 0, {39010, 0, 0, 0}, 18, 18, { 949, 20833, 10003, 949, 0, ',' }}, - {0x0013, 0x007F, 257, -1, 39020, 39023, 39029, 39040, 39044, 39020, 0, {39048, 0, 0, 0}, 19, 19, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0014, 0x007F, 257, -1, 39070, 39073, 39083, 39089, 39093, 39097, 0, {38382, 0, 0, 0}, 20, 20, { 1252, 20277, 10000, 850, 0, ';' }}, - {0x0015, 0x007F, 257, -1, 39100, 39103, 39110, 39117, 39121, 39100, 0, {39125, 0, 0, 0}, 21, 21, { 1250, 20880, 10029, 852, 0, ';' }}, - {0x0016, 0x007F, 257, -1, 39149, 39152, 39163, 39174, 39178, 39149, 0, {39182, 0, 0, 0}, 22, 22, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0017, 0x007F, 257, -1, 39205, 39208, 39216, 39226, 39230, 39205, 0, {39234, 0, 0, 0}, 23, 23, { 1252, 20273, 10000, 850, 0, ';' }}, - {0x0018, 0x007F, 257, -1, 39254, 39257, 39266, 39275, 39279, 39254, 0, {39283, 0, 0, 0}, 24, 24, { 1250, 20880, 10029, 852, 0, ';' }}, - {0x0019, 0x007F, 257, -1, 39302, 39305, 39313, 39328, 39332, 39302, 0, {39336, 0, 0, 0}, 25, 25, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x001A, 0x007F, 257, -1, 39382, 39385, 39394, 39403, 39407, 39382, 0, {39411, 0, 0, 0}, 26, 26, { 1250, 500, 10082, 852, 0, ';' }}, - {0x001B, 0x007F, 257, -1, 12780, 39434, 39441, 39453, 39457, 12780, 0, {39461, 0, 0, 0}, 27, 27, { 1250, 20880, 10029, 852, 0, ';' }}, - {0x001C, 0x007F, 257, -1, 39485, 39488, 39497, 39503, 39507, 39485, 0, {39511, 0, 0, 0}, 28, 28, { 1250, 20880, 10029, 852, 0, ';' }}, - {0x001D, 0x007F, 257, -1, 39531, 39534, 39542, 39550, 39554, 39531, 0, {38382, 0, 0, 0}, 29, 29, { 1252, 20278, 10000, 850, 0, ';' }}, - {0x001E, 0x007F, 512, -1, 39558, 39561, 39566, 39576, 39580, 39558, 0, {0, 39584, 0, 0}, 30, 30, { 874, 20838, 10021, 874, 0, ',' }}, - {0x001F, 0x007F, 257, -1, 12789, 39615, 39623, 39632, 39636, 12789, 0, {39640, 0, 0, 0}, 31, 31, { 1254, 20905, 10081, 857, 0, ';' }}, - {0x0020, 0x007F, 257, -1, 39654, 39657, 39662, 39671, 39675, 39654, 0, {39679, 0, 0, 0}, 32, 32, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x0021, 0x007F, 257, -1, 39709, 39712, 39723, 39740, 39744, 39709, 0, {39748, 0, 0, 0}, 33, 33, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0022, 0x007F, 257, -1, 39767, 39770, 39780, 39801, 39805, 39767, 0, {39809, 0, 0, 0}, 34, 34, { 1251, 500, 10017, 866, 0, ';' }}, - {0x0023, 0x007F, 257, -1, 39855, 39858, 39869, 39890, 39894, 39855, 0, {39898, 0, 0, 0}, 35, 35, { 1251, 500, 10007, 866, 0, ';' }}, - {0x0024, 0x007F, 257, -1, 39940, 39943, 39953, 39967, 39971, 39940, 0, {39975, 0, 0, 0}, 36, 36, { 1250, 20880, 10029, 852, 0, ';' }}, - {0x0025, 0x007F, 257, -1, 39997, 40000, 40009, 40015, 40019, 39997, 0, {40023, 0, 0, 0}, 37, 37, { 1257, 500, 10029, 775, 0, ';' }}, - {0x0026, 0x007F, 257, -1, 40043, 40046, 40054, 40064, 40068, 40043, 0, {40072, 0, 0, 0}, 38, 38, { 1257, 500, 10029, 775, 0, ';' }}, - {0x0027, 0x007F, 257, -1, 40091, 40094, 40105, 40115, 40119, 40091, 0, {40123, 0, 0, 0}, 39, 39, { 1257, 500, 10029, 775, 0, ';' }}, - {0x0028, 0x007F, 257, -1, 40146, 40149, 40155, 40168, 40172, 40146, 0, {0, 0, 0, 0}, 40, 40, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x0029, 0x007F, 257, -1, 40176, 40179, 40187, 40198, 40202, 40176, 0, {40206, 0, 0, 0}, 41, 41, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x002A, 0x007F, 257, -1, 40230, 40233, 40244, 40259, 35156, 40230, 0, {40263, 0, 0, 0}, 42, 42, { 1258, 500, 10000, 1258, 0, ',' }}, - {0x002B, 0x007F, 257, -1, 40278, 40281, 40290, 40305, 40309, 40278, 0, {40313, 0, 0, 0}, 43, 43, { 0, 500, 2, 1, 0, ',' }}, - {0x002C, 0x007F, 257, -1, 40343, 40346, 40358, 40370, 40374, 40343, 0, {40378, 0, 0, 0}, 44, 44, { 1254, 20905, 10081, 857, 0, ';' }}, - {0x002D, 0x007F, 257, -1, 40397, 40400, 40407, 40415, 40419, 40397, 0, {40423, 0, 0, 0}, 45, 45, { 1252, 500, 10000, 850, 0, ';' }}, - {0x002F, 0x007F, 257, -1, 40443, 40446, 40457, 40478, 40482, 40443, 0, {40486, 0, 0, 0}, 46, 46, { 1251, 500, 10007, 866, 0, ';' }}, - {0x0032, 0x007F, 257, -1, 40530, 40533, 40540, 40549, 40553, 40530, 0, {0, 0, 0, 0}, 47, 47, { 1252, 500, 10000, 850, 0, ',' }}, - {0x0034, 0x007F, 257, -1, 40557, 40560, 40566, 40575, 40579, 40557, 0, {0, 0, 0, 0}, 48, 48, { 1252, 500, 10000, 850, 0, ',' }}, - {0x0035, 0x007F, 257, -1, 40583, 40586, 40591, 40599, 40603, 40583, 0, {40607, 0, 0, 0}, 49, 49, { 1252, 500, 10000, 850, 0, ',' }}, - {0x0036, 0x007F, 257, -1, 40628, 40631, 40631, 40641, 40645, 40628, 0, {40649, 0, 0, 0}, 50, 50, { 1252, 500, 10000, 850, 0, ',' }}, - {0x0037, 0x007F, 257, -1, 40669, 40672, 40681, 40703, 40707, 40669, 0, {40711, 0, 0, 0}, 51, 51, { 0, 500, 2, 1, 0, ';' }}, - {0x0038, 0x007F, 257, -1, 40776, 40779, 40787, 40797, 40801, 40776, 0, {0, 0, 0, 0}, 52, 52, { 1252, 20277, 10079, 850, 0, ';' }}, - {0x0039, 0x007F, 257, -1, 40805, 40808, 40814, 40830, 40834, 40805, 0, {40838, 0, 0, 0}, 53, 53, { 0, 500, 2, 1, 0, ',' }}, - {0x003A, 0x007F, 257, -1, 40891, 40894, 40902, 40908, 40912, 40891, 0, {40916, 0, 0, 0}, 54, 54, { 0, 500, 2, 1, 0, ',' }}, - {0x003B, 0x007F, 257, -1, 40937, 40940, 40954, 40971, 40975, 40937, 0, {40979, 0, 0, 0}, 55, 55, { 1252, 20277, 10000, 850, 0, ';' }}, - {0x003C, 0x007F, 257, -1, 40998, 41001, 41007, 41015, 41019, 40998, 0, {41023, 0, 0, 0}, 56, 56, { 1252, 500, 10000, 850, 0, ',' }}, - {0x003E, 0x007F, 257, -1, 41044, 41047, 41053, 41067, 41071, 41044, 0, {41075, 0, 0, 0}, 57, 57, { 1252, 500, 10000, 850, 0, ';' }}, - {0x003F, 0x007F, 257, -1, 41092, 41095, 41102, 41122, 41126, 41092, 0, {41130, 0, 0, 0}, 58, 58, { 0, 500, 2, 1, 0, ';' }}, - {0x0040, 0x007F, 257, -1, 41172, 41175, 41182, 41199, 41203, 41172, 0, {41207, 0, 0, 0}, 59, 59, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x0041, 0x007F, 257, -1, 41245, 41248, 41256, 41266, 41270, 41245, 0, {41274, 0, 0, 0}, 60, 60, { 1252, 500, 10000, 437, 0, ',' }}, - {0x0043, 0x007F, 257, -1, 41295, 41298, 41304, 41315, 41319, 41295, 0, {41323, 0, 0, 0}, 61, 61, { 1254, 500, 10029, 857, 0, ';' }}, - {0x0045, 0x007F, 257, -1, 41343, 41346, 41354, 41370, 41374, 41343, 0, {41378, 0, 0, 0}, 62, 62, { 0, 500, 2, 1, 0, ',' }}, - {0x0046, 0x007F, 257, -1, 41443, 41446, 41454, 41473, 41477, 41443, 0, {41481, 0, 0, 0}, 63, 63, { 0, 500, 2, 1, 0, ',' }}, - {0x0047, 0x007F, 257, -1, 41528, 41531, 41540, 41562, 41566, 41528, 0, {41570, 0, 0, 0}, 64, 64, { 0, 500, 2, 1, 0, ',' }}, - {0x0048, 0x007F, 257, -1, 41626, 41629, 41635, 41651, 41655, 41626, 0, {0, 0, 0, 0}, 65, 65, { 0, 500, 2, 1, 0, ',' }}, - {0x0049, 0x007F, 257, -1, 41659, 41662, 41668, 41684, 41688, 41659, 0, {41692, 0, 0, 0}, 66, 66, { 0, 500, 2, 1, 0, ',' }}, - {0x004A, 0x007F, 257, -1, 41757, 41760, 41767, 41786, 41790, 41757, 0, {41794, 0, 0, 0}, 67, 67, { 0, 500, 2, 1, 0, ',' }}, - {0x004B, 0x007F, 257, -1, 37279, 41859, 41867, 41883, 41887, 37279, 0, {41891, 0, 0, 0}, 68, 68, { 0, 500, 2, 1, 0, ',' }}, - {0x004C, 0x007F, 257, -1, 41956, 41959, 41969, 41988, 41992, 41956, 0, {41996, 0, 0, 0}, 69, 69, { 0, 500, 2, 1, 0, ',' }}, - {0x004D, 0x007F, 257, -1, 42040, 42043, 42052, 42074, 42078, 42040, 0, {42082, 0, 0, 0}, 70, 70, { 0, 500, 2, 1, 0, ',' }}, - {0x004E, 0x007F, 257, -1, 42135, 42138, 42146, 42162, 2505, 42135, 0, {42166, 0, 0, 0}, 71, 71, { 0, 500, 2, 1, 0, ',' }}, - {0x0050, 0x007F, 257, -1, 42228, 42231, 42241, 42254, 42258, 42228, 0, {42262, 0, 0, 0}, 72, 72, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x0051, 0x007F, 257, -1, 42294, 42297, 42305, 42330, 42334, 42294, 0, {0, 0, 0, 0}, 73, 73, { 0, 500, 2, 1, 0, ',' }}, - {0x0052, 0x007F, 257, -1, 42338, 42341, 42347, 42355, 42359, 42338, 0, {42363, 0, 0, 0}, 74, 74, { 1252, 20285, 10000, 850, 0, ',' }}, - {0x0053, 0x007F, 257, -1, 42379, 42382, 42388, 42404, 42408, 42379, 0, {42412, 0, 0, 0}, 75, 75, { 0, 500, 2, 1, 0, ',' }}, - {0x0054, 0x007F, 257, -1, 42467, 42470, 42474, 42484, 42488, 42467, 0, {42492, 0, 0, 0}, 76, 76, { 0, 500, 2, 1, 0, ',' }}, - {0x0056, 0x007F, 257, -1, 42538, 42541, 42550, 42557, 42561, 42538, 0, {38903, 0, 0, 0}, 77, 77, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0057, 0x007F, 257, -1, 42565, 42569, 42577, 42596, 42565, 42565, 0, {0, 0, 0, 0}, 78, 78, { 0, 500, 2, 1, 0, ',' }}, - {0x005B, 0x007F, 257, -1, 42600, 42603, 42611, 42627, 42631, 42600, 0, {42635, 0, 0, 0}, 79, 79, { 0, 500, 2, 1, 0, ',' }}, - {0x005E, 0x007F, 257, -1, 7992, 42694, 42702, 42715, 42719, 7992, 0, {42723, 0, 0, 0}, 80, 80, { 0, 500, 2, 1, 0, ';' }}, - {0x005F, 0x007F, 257, -1, 42768, 42772, 42796, 42806, 42768, 42768, 0, {0, 0, 0, 0}, 81, 81, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x0061, 0x007F, 257, -1, 1987, 42810, 42817, 42836, 42840, 1987, 0, {42844, 0, 0, 0}, 82, 82, { 0, 500, 2, 1, 0, ',' }}, - {0x0063, 0x007F, 1024, -1, 42894, 42897, 42904, 42913, 42917, 42894, 0, {0, 0, 0, 0}, 83, 83, { 0, 500, 2, 1, 1, ';' }}, - {0x0064, 0x007F, 257, -1, 42921, 42925, 42925, 42934, 42921, 42921, 0, {42938, 0, 0, 0}, 84, 84, { 1252, 500, 10000, 437, 0, ',' }}, - {0x0068, 0x007F, 257, -1, 42961, 42964, 42964, 42970, 42974, 42961, 0, {0, 0, 0, 0}, 85, 85, { 1252, 37, 10000, 437, 0, ',' }}, - {0x006A, 0x007F, 257, -1, 42978, 42981, 42988, 43003, 43007, 42978, 0, {0, 0, 0, 0}, 86, 86, { 1252, 37, 10000, 437, 0, ',' }}, - {0x006C, 0x007F, 257, -1, 43011, 43015, 43030, 43047, 43011, 43011, 0, {0, 0, 0, 0}, 87, 87, { 1252, 500, 10000, 850, 0, ',' }}, - {0x006F, 0x007F, 257, -1, 43051, 43054, 43066, 43078, 43082, 43051, 0, {43086, 0, 0, 0}, 88, 88, { 1252, 20277, 10000, 850, 0, ';' }}, - {0x0070, 0x007F, 257, -1, 43113, 43116, 43116, 43121, 43125, 43113, 0, {0, 0, 0, 0}, 89, 89, { 1252, 37, 10000, 437, 0, ',' }}, - {0x0078, 0x007F, 257, -1, 43129, 43132, 43143, 43153, 43157, 43129, 0, {43161, 0, 0, 0}, 90, 90, { 0, 500, 2, 1, 0, ',' }}, - {0x007E, 0x007F, 257, -1, 43174, 43177, 43184, 43194, 43198, 43174, 0, {43202, 0, 0, 0}, 91, 91, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x0084, 0x007F, 257, -1, 43222, 43226, 43239, 43258, 43222, 43222, 0, {43262, 0, 0, 0}, 92, 92, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x0085, 0x007F, 257, -1, 43287, 43291, 43297, 43315, 43287, 43287, 0, {0, 0, 0, 0}, 93, 93, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x0087, 0x007F, 257, -1, 43319, 43322, 43322, 43334, 43338, 43319, 0, {0, 0, 0, 0}, 94, 94, { 1252, 37, 10000, 437, 0, ';' }}, - {0x0091, 0x007F, 257, -1, 43342, 43345, 43361, 43371, 43375, 43342, 0, {43379, 0, 0, 0}, 95, 95, { 1252, 20285, 10000, 850, 0, ',' }}, - {0x0401, 0x0001, 768, 95, 43404, 43410, 43432, 38051, 38055, 38026, 13675, {0, 0, 38059, 0}, 96, 96, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x0402, 0x0002, 257, 11, 43496, 43502, 43523, 38119, 38123, 38087, 43561, {38127, 0, 0, 0}, 97, 97, { 1251, 21025, 10007, 866, 0, ';' }}, - {0x0403, 0x0003, 257, 31, 43564, 43570, 43586, 38188, 38192, 38169, 43604, {38196, 0, 0, 0}, 98, 98, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0404, 0x7C04, 257, 107, 43607, 43613, 43635, 43651, 38262, 38266, 43655, {43658, 0, 0, 0}, 99, 99, { 950, 500, 10002, 950, 0, ',' }}, - {0x0405, 0x0005, 257, 23, 43665, 43671, 43694, 38324, 38328, 38305, 43724, {38332, 0, 0, 0}, 100, 100, { 1250, 500, 10029, 852, 0, ';' }}, - {0x0406, 0x0006, 257, 25, 43727, 43733, 43750, 38374, 38378, 38358, 43766, {38382, 0, 0, 0}, 101, 101, { 1252, 20277, 10000, 850, 0, ';' }}, - {0x0407, 0x0007, 257, 24, 43769, 43775, 43792, 38421, 38425, 38403, 43814, {38429, 0, 0, 0}, 102, 102, { 1252, 20273, 10000, 850, 0, ';' }}, - {0x0408, 0x0008, 257, 39, 43817, 43823, 43838, 38480, 38484, 38454, 43870, {38488, 0, 0, 0}, 103, 103, { 1253, 20273, 10006, 737, 0, ';' }}, - {0x0409, 0x0009, 257, 109, 43873, 43879, 43879, 38541, 38545, 38530, 43903, {38549, 0, 0, 0}, 104, 104, { 1252, 37, 10000, 437, 0, ',' }}, - {0x040B, 0x000B, 257, 33, 43906, 43912, 43930, 38635, 38639, 38618, 43944, {38643, 0, 0, 0}, 105, 105, { 1252, 20278, 10000, 850, 0, ';' }}, - {0x040C, 0x000C, 257, 35, 43947, 43953, 43969, 38688, 38692, 38668, 43988, {38696, 0, 0, 0}, 106, 106, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x040D, 0x000D, 257, 47, 43991, 43997, 44013, 38739, 38743, 38718, 44037, {38747, 0, 0, 0}, 107, 107, { 1255, 500, 10005, 862, 1, ',' }}, - {0x040E, 0x000E, 257, 44, 44040, 44046, 44066, 38800, 38804, 38780, 44089, {38808, 0, 0, 0}, 108, 108, { 1250, 500, 10029, 852, 0, ';' }}, - {0x040F, 0x000F, 257, 51, 44092, 44098, 44118, 38847, 38851, 38824, 44138, {38855, 0, 0, 0}, 109, 109, { 1252, 20871, 10079, 850, 0, ';' }}, - {0x0410, 0x0010, 257, 52, 44141, 44147, 44163, 38895, 38899, 38875, 44181, {38903, 0, 0, 0}, 110, 110, { 1252, 20280, 10000, 850, 0, ';' }}, - {0x0411, 0x0011, 257, 55, 44184, 44190, 44207, 38947, 38951, 38925, 44226, {38955, 0, 0, 0}, 111, 111, { 932, 20290, 10001, 932, 0, ',' }}, - {0x0412, 0x0012, 257, 58, 44229, 44235, 44256, 39002, 39006, 38982, 44281, {39010, 0, 0, 0}, 112, 112, { 949, 20833, 10003, 949, 0, ',' }}, - {0x0413, 0x0013, 257, 77, 44284, 44290, 44310, 39040, 39044, 39020, 44333, {39048, 0, 0, 0}, 113, 113, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0414, 0x7C14, 257, 78, 44336, 44342, 44369, 39089, 39093, 39097, 44391, {38382, 0, 0, 0}, 114, 114, { 1252, 20277, 10000, 850, 0, ';' }}, - {0x0415, 0x0015, 257, 86, 44394, 44400, 44416, 39117, 39121, 39100, 44432, {39125, 0, 0, 0}, 115, 115, { 1250, 20880, 10029, 852, 0, ';' }}, - {0x0416, 0x0016, 257, 14, 44435, 44441, 44461, 39174, 39178, 39149, 44481, {39182, 0, 0, 0}, 116, 116, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0417, 0x0017, 257, 18, 44484, 44490, 44512, 39226, 39230, 39205, 13678, {39234, 0, 0, 0}, 117, 117, { 1252, 20273, 10000, 850, 0, ';' }}, - {0x0418, 0x0018, 257, 91, 44531, 44537, 44556, 39275, 39279, 39254, 44576, {39283, 0, 0, 0}, 118, 118, { 1250, 20880, 10029, 852, 0, ';' }}, - {0x0419, 0x0019, 257, 93, 44579, 44585, 44602, 39328, 39332, 39302, 44632, {39336, 0, 0, 0}, 119, 119, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x041A, 0x001A, 257, 43, 44635, 44641, 44660, 39403, 39407, 39382, 44680, {39411, 0, 0, 0}, 120, 120, { 1250, 500, 10082, 852, 0, ';' }}, - {0x041B, 0x001B, 257, 99, 44683, 44689, 44707, 39453, 39457, 12780, 44731, {39461, 0, 0, 0}, 121, 121, { 1250, 20880, 10029, 852, 0, ';' }}, - {0x041C, 0x001C, 257, 2, 44734, 44740, 44759, 39503, 39507, 39485, 44777, {39511, 0, 0, 0}, 122, 122, { 1250, 20880, 10029, 852, 0, ';' }}, - {0x041D, 0x001D, 257, 96, 44780, 44786, 44803, 39550, 39554, 39531, 44821, {38382, 0, 0, 0}, 123, 123, { 1252, 20278, 10000, 850, 0, ';' }}, - {0x041E, 0x001E, 512, 102, 44824, 44830, 44846, 39576, 39580, 39558, 44868, {0, 39584, 0, 0}, 124, 124, { 874, 20838, 10021, 874, 0, ',' }}, - {0x041F, 0x001F, 257, 105, 44871, 44877, 44894, 39632, 39636, 12789, 44914, {39640, 0, 0, 0}, 125, 125, { 1254, 20905, 10081, 857, 0, ';' }}, - {0x0420, 0x0020, 257, 85, 44917, 44923, 44939, 39671, 39675, 39654, 44965, {39679, 0, 0, 0}, 126, 126, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x0421, 0x0021, 257, 45, 44968, 44974, 44997, 39740, 39744, 39709, 45026, {39748, 0, 0, 0}, 127, 127, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0422, 0x0022, 257, 108, 45029, 45035, 45055, 39801, 39805, 39767, 45093, {39809, 0, 0, 0}, 128, 128, { 1251, 500, 10017, 866, 0, ';' }}, - {0x0423, 0x0023, 257, 15, 45096, 45102, 45123, 39890, 39894, 39855, 45163, {39898, 0, 0, 0}, 129, 129, { 1251, 500, 10007, 866, 0, ';' }}, - {0x0424, 0x0024, 257, 98, 45166, 45172, 45193, 39967, 39971, 39940, 45219, {39975, 0, 0, 0}, 130, 130, { 1250, 20880, 10029, 852, 0, ';' }}, - {0x0425, 0x0025, 257, 29, 45222, 45228, 45247, 40015, 40019, 39997, 45261, {40023, 0, 0, 0}, 131, 131, { 1257, 500, 10029, 775, 0, ';' }}, - {0x0426, 0x0026, 257, 66, 45264, 45270, 45287, 40064, 40068, 40043, 45307, {40072, 0, 0, 0}, 132, 132, { 1257, 500, 10029, 775, 0, ';' }}, - {0x0427, 0x0027, 257, 64, 45310, 45316, 45339, 40115, 40119, 40091, 45359, {40123, 0, 0, 0}, 133, 133, { 1257, 500, 10029, 775, 0, ';' }}, - {0x0428, 0x7C28, 257, 103, 45362, 45373, 45402, 40168, 40172, 40146, 45438, {0, 0, 0, 0}, 134, 134, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x0429, 0x0029, 257, 50, 45441, 45447, 45462, 40198, 40202, 40176, 45486, {40206, 0, 0, 0}, 135, 135, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x042A, 0x002A, 257, 113, 45489, 45495, 45516, 40259, 35156, 40230, 45544, {40263, 0, 0, 0}, 136, 136, { 1258, 500, 10000, 1258, 0, ',' }}, - {0x042B, 0x002B, 257, 3, 45547, 45553, 45572, 40305, 40309, 40278, 1924, {40313, 0, 0, 0}, 137, 137, { 0, 500, 2, 1, 0, ',' }}, - {0x042C, 0x782C, 257, 7, 45606, 45617, 45649, 40370, 40374, 40343, 45675, {40378, 0, 0, 0}, 138, 138, { 1254, 20905, 10081, 857, 0, ';' }}, - {0x042D, 0x002D, 257, 31, 45678, 45684, 45699, 40415, 40419, 40397, 43604, {40423, 0, 0, 0}, 139, 139, { 1252, 500, 10000, 850, 0, ';' }}, - {0x042F, 0x002F, 257, 71, 45718, 45724, 45747, 40478, 40482, 40443, 45791, {40486, 0, 0, 0}, 140, 140, { 1251, 500, 10007, 866, 0, ';' }}, - {0x0432, 0x0032, 257, 115, 45794, 45800, 40540, 40549, 40553, 40530, 45822, {0, 0, 0, 0}, 141, 141, { 1252, 500, 10000, 850, 0, ',' }}, - {0x0434, 0x0034, 257, 115, 45825, 45831, 40566, 40575, 40579, 40557, 45822, {0, 0, 0, 0}, 142, 142, { 1252, 500, 10000, 850, 0, ',' }}, - {0x0435, 0x0035, 257, 115, 45852, 45858, 45878, 40599, 40603, 40583, 45822, {40607, 0, 0, 0}, 143, 143, { 1252, 500, 10000, 850, 0, ',' }}, - {0x0436, 0x0036, 257, 115, 45903, 45909, 45934, 40641, 40645, 40628, 45822, {40649, 0, 0, 0}, 144, 144, { 1252, 500, 10000, 850, 0, ',' }}, - {0x0437, 0x0037, 257, 37, 45958, 45964, 45983, 40703, 40707, 40669, 46038, {40711, 0, 0, 0}, 145, 145, { 0, 500, 2, 1, 0, ';' }}, - {0x0438, 0x0038, 257, 34, 46041, 46047, 46071, 40797, 40801, 40776, 46092, {0, 0, 0, 0}, 146, 146, { 1252, 20277, 10079, 850, 0, ';' }}, - {0x0439, 0x0039, 257, 48, 46095, 46101, 46115, 40830, 40834, 40805, 46146, {40838, 0, 0, 0}, 147, 147, { 0, 500, 2, 1, 0, ',' }}, - {0x043A, 0x003A, 257, 73, 46149, 46155, 46171, 40908, 40912, 40891, 46185, {40916, 0, 0, 0}, 148, 148, { 0, 500, 2, 1, 0, ',' }}, - {0x043B, 0x003B, 257, 78, 46188, 46194, 46217, 40971, 40975, 40937, 44391, {40979, 0, 0, 0}, 149, 149, { 1252, 20277, 10000, 850, 0, ';' }}, - {0x0441, 0x0041, 257, 56, 46242, 46248, 46264, 41266, 41270, 41245, 46282, {41274, 0, 0, 0}, 150, 150, { 1252, 500, 10000, 437, 0, ',' }}, - {0x0443, 0x7C43, 257, 111, 46285, 46296, 46322, 41315, 41319, 41295, 46348, {41323, 0, 0, 0}, 151, 151, { 1254, 500, 10029, 857, 0, ';' }}, - {0x0445, 0x0045, 257, 48, 46351, 46357, 46373, 41370, 41374, 41343, 46146, {41378, 0, 0, 0}, 152, 152, { 0, 500, 2, 1, 0, ',' }}, - {0x0447, 0x0047, 257, 48, 46404, 46410, 46427, 41562, 41566, 41528, 46146, {41570, 0, 0, 0}, 153, 153, { 0, 500, 2, 1, 0, ',' }}, - {0x0448, 0x0048, 257, 48, 46464, 46470, 46484, 41651, 41655, 41626, 46146, {0, 0, 0, 0}, 154, 154, { 0, 500, 2, 1, 0, ',' }}, - {0x0449, 0x0049, 257, 48, 46515, 46521, 46535, 41684, 41688, 41659, 46146, {41692, 0, 0, 0}, 155, 155, { 0, 500, 2, 1, 0, ',' }}, - {0x044A, 0x004A, 257, 48, 46575, 46581, 46596, 41786, 41790, 41757, 46146, {41794, 0, 0, 0}, 156, 156, { 0, 500, 2, 1, 0, ',' }}, - {0x044B, 0x004B, 257, 48, 46643, 46649, 46665, 41883, 41887, 37279, 46146, {41891, 0, 0, 0}, 157, 157, { 0, 500, 2, 1, 0, ',' }}, - {0x044C, 0x004C, 257, 48, 46696, 46702, 46720, 41988, 41992, 41956, 46146, {41996, 0, 0, 0}, 158, 158, { 0, 500, 2, 1, 0, ',' }}, - {0x044D, 0x004D, 257, 48, 46760, 46766, 46783, 42074, 42078, 42040, 46146, {42082, 0, 0, 0}, 159, 159, { 0, 500, 2, 1, 0, ',' }}, - {0x044E, 0x004E, 257, 48, 46820, 46826, 46842, 42162, 2505, 42135, 46146, {42166, 0, 0, 0}, 160, 160, { 0, 500, 2, 1, 0, ',' }}, - {0x0451, 0x0051, 257, 20, 46873, 46879, 46895, 42330, 42334, 42294, 13757, {0, 0, 0, 0}, 161, 161, { 0, 500, 2, 1, 0, ',' }}, - {0x0452, 0x0052, 257, 36, 46941, 46947, 46970, 42355, 42359, 42338, 46997, {42363, 0, 0, 0}, 162, 162, { 1252, 20285, 10000, 850, 0, ',' }}, - {0x0453, 0x0053, 257, 57, 47000, 47006, 47023, 42404, 42408, 42379, 47063, {42412, 0, 0, 0}, 163, 163, { 0, 500, 2, 1, 0, ',' }}, - {0x0454, 0x0054, 257, 60, 47066, 47072, 47083, 42484, 42488, 42467, 47105, {42492, 0, 0, 0}, 164, 164, { 0, 500, 2, 1, 0, ',' }}, - {0x0456, 0x0056, 257, 31, 47108, 47114, 47131, 42557, 42561, 42538, 43604, {38903, 0, 0, 0}, 165, 165, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0457, 0x0057, 257, 48, 47148, 47155, 47171, 42596, 42565, 42565, 46146, {0, 0, 0, 0}, 166, 166, { 0, 500, 2, 1, 0, ',' }}, - {0x045B, 0x005B, 257, 63, 47205, 47211, 47231, 42627, 42631, 42600, 47281, {42635, 0, 0, 0}, 167, 167, { 0, 500, 2, 1, 0, ',' }}, - {0x045E, 0x005E, 257, 32, 47284, 47290, 47309, 42715, 42719, 7992, 47340, {42723, 0, 0, 0}, 168, 168, { 0, 500, 2, 1, 0, ';' }}, - {0x0461, 0x0061, 257, 79, 47343, 47349, 47364, 42836, 42840, 1987, 47401, {42844, 0, 0, 0}, 169, 169, { 0, 500, 2, 1, 0, ',' }}, - {0x0463, 0x0063, 1024, 1, 47404, 47410, 47431, 42913, 42917, 42894, 47461, {0, 0, 0, 0}, 170, 170, { 0, 500, 2, 1, 1, ';' }}, - {0x0464, 0x0064, 257, 84, 47464, 47471, 47494, 42934, 42921, 42921, 47515, {42938, 0, 0, 0}, 171, 171, { 1252, 500, 10000, 437, 0, ',' }}, - {0x0468, 0x7C68, 257, 75, 47518, 47529, 47552, 42970, 42974, 42961, 47569, {0, 0, 0, 0}, 172, 172, { 1252, 37, 10000, 437, 0, ',' }}, - {0x046A, 0x006A, 257, 75, 47572, 47578, 47595, 43003, 43007, 42978, 47569, {0, 0, 0, 0}, 173, 173, { 1252, 37, 10000, 437, 0, ',' }}, - {0x046C, 0x006C, 257, 115, 47641, 47648, 43030, 43047, 43011, 43011, 45822, {0, 0, 0, 0}, 174, 174, { 1252, 500, 10000, 850, 0, ',' }}, - {0x046F, 0x006F, 257, 38, 47678, 47684, 47708, 43078, 43082, 43051, 47739, {43086, 0, 0, 0}, 175, 175, { 1252, 20277, 10000, 850, 0, ';' }}, - {0x0470, 0x0070, 257, 75, 47742, 47748, 47748, 43121, 43125, 43113, 47569, {0, 0, 0, 0}, 176, 176, { 1252, 37, 10000, 437, 0, ',' }}, - {0x0478, 0x0078, 257, 20, 47763, 47769, 47788, 43153, 43157, 43129, 13757, {43161, 0, 0, 0}, 177, 177, { 0, 500, 2, 1, 0, ',' }}, - {0x047E, 0x007E, 257, 35, 47807, 47813, 47829, 43194, 43198, 43174, 43988, {43202, 0, 0, 0}, 178, 178, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x0485, 0x0085, 257, 93, 47848, 47855, 43297, 43315, 43287, 43287, 44632, {0, 0, 0, 0}, 179, 179, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x0487, 0x0087, 257, 94, 47870, 47876, 47876, 43334, 43338, 43319, 47897, {0, 0, 0, 0}, 180, 180, { 1252, 37, 10000, 437, 0, ';' }}, - {0x0491, 0x0091, 257, 36, 47900, 47906, 47939, 43371, 43375, 43342, 46997, {43379, 0, 0, 0}, 181, 181, { 1252, 20285, 10000, 850, 0, ',' }}, - {0x0801, 0x0001, 257, 49, 47975, 47981, 47995, 48025, 38055, 38026, 48029, {38059, 0, 0, 0}, 182, 182, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x0804, 0x0004, 257, 20, 48032, 38284, 48038, 38258, 38262, 38266, 13757, {38269, 0, 0, 0}, 183, 183, { 936, 500, 10008, 936, 0, ',' }}, - {0x0807, 0x0007, 257, 18, 48054, 48060, 48081, 48099, 38425, 38403, 13678, {38429, 0, 0, 0}, 184, 184, { 1252, 20273, 10000, 850, 0, ';' }}, - {0x0809, 0x0009, 257, 36, 48103, 48109, 48109, 48134, 38545, 38530, 46997, {38549, 0, 0, 0}, 185, 185, { 1252, 20285, 10000, 850, 0, ',' }}, - {0x080A, 0x000A, 257, 74, 48138, 48144, 48161, 48180, 38592, 38568, 48184, {38903, 0, 0, 0}, 186, 186, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x080C, 0x000C, 257, 10, 48187, 48193, 48210, 48231, 38692, 38668, 48235, {38696, 0, 0, 0}, 187, 187, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x0810, 0x0010, 257, 18, 48238, 48244, 48266, 48286, 38899, 38875, 13678, {38903, 0, 0, 0}, 188, 188, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0813, 0x0013, 257, 10, 48290, 48296, 48312, 48333, 39044, 39020, 48235, {39048, 0, 0, 0}, 189, 189, { 1252, 500, 10000, 850, 0, ';' }}, - {0x0814, 0x7814, 257, 78, 48337, 48343, 48370, 48386, 48390, 48394, 44391, {38382, 0, 0, 0}, 190, 190, { 1252, 20277, 10000, 850, 0, ';' }}, - {0x0816, 0x0016, 257, 88, 48397, 48403, 48425, 48447, 39178, 39149, 48451, {39182, 0, 0, 0}, 191, 191, { 1252, 500, 10000, 850, 0, ';' }}, - {0x081D, 0x001D, 257, 33, 48454, 48460, 48478, 48496, 39554, 39531, 43944, {38382, 0, 0, 0}, 192, 192, { 1252, 20278, 10000, 850, 0, ';' }}, - {0x082C, 0x742C, 257, 7, 48500, 48511, 45649, 48546, 40374, 40343, 45675, {40378, 0, 0, 0}, 193, 193, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x083C, 0x003C, 257, 46, 48550, 48556, 48572, 41015, 41019, 40998, 48588, {41023, 0, 0, 0}, 194, 194, { 1252, 500, 10000, 850, 0, ',' }}, - {0x0843, 0x7843, 257, 111, 48591, 48602, 46322, 41315, 41319, 41295, 46348, {48631, 0, 0, 0}, 195, 195, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x0845, 0x0045, 257, 9, 48669, 48675, 48696, 48739, 41374, 41343, 48743, {41378, 0, 0, 0}, 196, 196, { 0, 500, 2, 1, 0, ',' }}, - {0x0C01, 0x0001, 257, 30, 48746, 48752, 48767, 48791, 38055, 38026, 48795, {38059, 0, 0, 0}, 197, 197, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x0C04, 0x7C04, 257, 41, 48798, 48804, 48847, 48884, 38262, 38266, 48888, {43658, 0, 0, 0}, 198, 198, { 950, 500, 10002, 950, 0, ',' }}, - {0x0C07, 0x0007, 257, 5, 48891, 48897, 48914, 48936, 38425, 38403, 48940, {38429, 0, 0, 0}, 199, 199, { 1252, 20273, 10000, 850, 0, ';' }}, - {0x0C09, 0x0009, 257, 6, 48943, 48949, 48949, 48969, 38545, 38530, 48973, {38549, 0, 0, 0}, 200, 200, { 1252, 500, 10000, 850, 0, ',' }}, - {0x0C0A, 0x000A, 257, 31, 48976, 48982, 48998, 49017, 38592, 38568, 43604, {38596, 0, 0, 0}, 201, 201, { 1252, 20284, 10000, 850, 0, ';' }}, - {0x0C0C, 0x000C, 257, 17, 49021, 49027, 49043, 49062, 38692, 38668, 49066, {49069, 0, 0, 0}, 202, 202, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x0C3B, 0x003B, 257, 33, 49091, 49097, 49121, 49147, 49151, 40937, 43944, {40979, 0, 0, 0}, 203, 203, { 1252, 20278, 10000, 850, 0, ';' }}, - {0x1001, 0x0001, 257, 67, 49155, 49161, 49176, 49204, 38055, 38026, 49208, {38059, 0, 0, 0}, 204, 204, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x1004, 0x0004, 257, 97, 49211, 49217, 49249, 49268, 38262, 38266, 49272, {38269, 0, 0, 0}, 205, 205, { 936, 500, 10008, 936, 0, ',' }}, - {0x1007, 0x0007, 257, 65, 49275, 49281, 49301, 49321, 38425, 38403, 49325, {38429, 0, 0, 0}, 206, 206, { 1252, 20273, 10000, 850, 0, ';' }}, - {0x1009, 0x0009, 257, 17, 49328, 49334, 49334, 49351, 38545, 38530, 49066, {38549, 0, 0, 0}, 207, 207, { 1252, 37, 10000, 850, 0, ',' }}, - {0x100A, 0x000A, 257, 40, 49355, 49361, 49381, 49402, 38592, 38568, 49406, {38596, 0, 0, 0}, 208, 208, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x100C, 0x000C, 257, 18, 49409, 49415, 49436, 49455, 38692, 38668, 13678, {38696, 0, 0, 0}, 209, 209, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x101A, 0x001A, 257, 8, 49459, 49465, 49499, 49530, 49534, 39382, 49538, {39411, 0, 0, 0}, 210, 210, { 1250, 870, 10082, 852, 0, ';' }}, - {0x1401, 0x0001, 257, 27, 49541, 49547, 49564, 49596, 38055, 38026, 49600, {38059, 0, 0, 0}, 211, 211, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x1404, 0x7C04, 257, 72, 49603, 49609, 49648, 49685, 38262, 38266, 49689, {43658, 0, 0, 0}, 212, 212, { 950, 500, 10002, 950, 0, ',' }}, - {0x1407, 0x0007, 257, 62, 49692, 49698, 49721, 49745, 38425, 38403, 49749, {38429, 0, 0, 0}, 213, 213, { 1252, 20273, 10000, 850, 0, ';' }}, - {0x1409, 0x0009, 257, 80, 49752, 49758, 49758, 49780, 38545, 38530, 49784, {38549, 0, 0, 0}, 214, 214, { 1252, 500, 10000, 850, 0, ',' }}, - {0x140A, 0x000A, 257, 22, 49787, 49793, 49814, 49836, 38592, 38568, 49840, {38596, 0, 0, 0}, 215, 215, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x140C, 0x000C, 257, 65, 49843, 49849, 49869, 49892, 38692, 38668, 49325, {38696, 0, 0, 0}, 216, 216, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x141A, 0x681A, 257, 8, 49896, 49907, 49947, 49978, 49982, 49986, 49538, {49989, 0, 0, 0}, 217, 217, { 1250, 870, 10082, 852, 0, ';' }}, - {0x1801, 0x0001, 257, 68, 50012, 50018, 50035, 50065, 38055, 38026, 50069, {38059, 0, 0, 0}, 218, 218, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x1809, 0x0009, 257, 46, 50072, 50078, 50078, 50096, 38545, 38530, 48588, {38549, 0, 0, 0}, 219, 219, { 1252, 500, 10000, 850, 0, ',' }}, - {0x180A, 0x000A, 257, 82, 50100, 50106, 50123, 50142, 38592, 38568, 50146, {38596, 0, 0, 0}, 220, 220, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x180C, 0x000C, 257, 69, 50149, 50155, 50171, 50190, 38692, 38668, 50194, {38696, 0, 0, 0}, 221, 221, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x181A, 0x701A, 257, 8, 50197, 50208, 50248, 50300, 50304, 50308, 49538, {49989, 0, 0, 0}, 222, 222, { 1250, 870, 10082, 852, 0, ';' }}, - {0x1C01, 0x0001, 257, 104, 50311, 50317, 50334, 50360, 38055, 38026, 50364, {38059, 0, 0, 0}, 223, 223, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x1C09, 0x0009, 257, 115, 50367, 50373, 50373, 50396, 38545, 38530, 45822, {38549, 0, 0, 0}, 224, 224, { 1252, 500, 10000, 437, 0, ',' }}, - {0x1C0A, 0x000A, 257, 26, 50400, 50406, 50435, 50468, 38592, 38568, 50472, {38596, 0, 0, 0}, 225, 225, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x1C1A, 0x6C1A, 257, 8, 50475, 50486, 50248, 50529, 50533, 50308, 49538, {40486, 0, 0, 0}, 226, 226, { 1251, 21025, 10007, 855, 0, ';' }}, - {0x2001, 0x0001, 257, 81, 50537, 50543, 50557, 50585, 38055, 38026, 50589, {38059, 0, 0, 0}, 227, 227, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x2009, 0x0009, 257, 53, 50592, 50598, 50598, 50616, 38545, 38530, 50620, {38549, 0, 0, 0}, 228, 228, { 1252, 500, 10000, 850, 0, ',' }}, - {0x200A, 0x000A, 257, 112, 50623, 50629, 50649, 50670, 38592, 38568, 50674, {38596, 0, 0, 0}, 229, 229, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x201A, 0x641A, 257, 8, 50677, 50688, 49947, 50731, 50735, 49986, 49538, {40486, 0, 0, 0}, 230, 230, { 1251, 870, 10082, 855, 0, ';' }}, - {0x2401, 0x0001, 257, 114, 50739, 50745, 50760, 50788, 38055, 38026, 50792, {38059, 0, 0, 0}, 231, 231, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x240A, 0x000A, 257, 21, 50795, 50801, 50820, 50840, 38592, 38568, 50844, {38596, 0, 0, 0}, 232, 232, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x241A, 0x701A, 257, 92, 50847, 50858, 50882, 50910, 2234, 50308, 50914, {49989, 0, 0, 0}, 233, 233, { 1250, 500, 10029, 852, 0, ';' }}, - {0x2801, 0x0001, 257, 101, 50917, 50923, 50938, 50966, 38055, 38026, 50970, {38059, 0, 0, 0}, 234, 234, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x2809, 0x0009, 257, 16, 50973, 50979, 50979, 50996, 38545, 38530, 51000, {38549, 0, 0, 0}, 235, 235, { 1252, 500, 10000, 850, 0, ';' }}, - {0x280A, 0x000A, 257, 83, 51003, 51009, 51024, 51041, 38592, 38568, 51045, {38596, 0, 0, 0}, 236, 236, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x281A, 0x6C1A, 257, 92, 51048, 51059, 50882, 51086, 2234, 50308, 50914, {40486, 0, 0, 0}, 237, 237, { 1251, 21025, 10007, 855, 0, ';' }}, - {0x2C01, 0x0001, 257, 54, 51090, 51096, 51112, 51142, 38055, 38026, 51146, {38059, 0, 0, 0}, 238, 238, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x2C09, 0x0009, 257, 106, 51149, 51155, 51155, 51185, 38545, 38530, 51189, {38549, 0, 0, 0}, 239, 239, { 1252, 500, 10000, 850, 0, ';' }}, - {0x2C0A, 0x000A, 257, 4, 51192, 51198, 51218, 51239, 38592, 38568, 51243, {38596, 0, 0, 0}, 240, 240, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x2C1A, 0x701A, 257, 70, 51246, 51257, 51285, 51318, 2234, 50308, 51322, {49989, 0, 0, 0}, 241, 241, { 1250, 500, 10029, 852, 0, ';' }}, - {0x3001, 0x0001, 257, 61, 51325, 51331, 51348, 51376, 38055, 38026, 51380, {38059, 0, 0, 0}, 242, 242, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x3009, 0x0009, 257, 116, 51383, 51389, 51389, 51408, 38545, 38530, 51412, {38549, 0, 0, 0}, 243, 243, { 1252, 500, 10000, 437, 0, ',' }}, - {0x300A, 0x000A, 257, 28, 51415, 51421, 51439, 51458, 38592, 38568, 51462, {38596, 0, 0, 0}, 244, 244, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x301A, 0x6C1A, 257, 70, 51465, 51476, 51285, 51507, 2234, 50308, 51322, {40486, 0, 0, 0}, 245, 245, { 1251, 21025, 10007, 855, 0, ';' }}, - {0x3401, 0x0001, 257, 59, 51511, 51517, 51533, 51563, 38055, 38026, 51567, {38059, 0, 0, 0}, 246, 246, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x3409, 0x0009, 257, 84, 51570, 51576, 51576, 51598, 38545, 38530, 47515, {38549, 0, 0, 0}, 247, 247, { 1252, 500, 10000, 437, 0, ',' }}, - {0x340A, 0x000A, 257, 19, 51602, 51608, 51624, 51641, 38592, 38568, 51645, {38596, 0, 0, 0}, 248, 248, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x3801, 0x0001, 257, 0, 51648, 51654, 51684, 51748, 38055, 38026, 51752, {38059, 0, 0, 0}, 249, 249, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x380A, 0x000A, 257, 110, 51755, 51761, 51779, 51798, 38592, 38568, 51802, {38596, 0, 0, 0}, 250, 250, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x3C01, 0x0001, 257, 12, 51805, 51811, 51828, 51860, 38055, 38026, 51864, {38059, 0, 0, 0}, 251, 251, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x3C0A, 0x000A, 257, 89, 51867, 51873, 51892, 51912, 38592, 38568, 51916, {38596, 0, 0, 0}, 252, 252, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x4001, 0x0001, 257, 90, 51919, 51925, 51940, 51964, 38055, 38026, 51968, {38059, 0, 0, 0}, 253, 253, { 1256, 20420, 10004, 720, 1, ';' }}, - {0x4009, 0x0009, 257, 48, 51971, 51977, 51977, 51993, 38545, 38530, 46146, {38549, 0, 0, 0}, 254, 254, { 1252, 37, 10000, 437, 0, ',' }}, - {0x400A, 0x000A, 257, 13, 51997, 52003, 52021, 52040, 38592, 38568, 52044, {38596, 0, 0, 0}, 255, 255, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x440A, 0x000A, 257, 100, 52047, 52053, 52075, 52098, 38592, 38568, 52102, {38596, 0, 0, 0}, 256, 256, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x4809, 0x0009, 257, 97, 52105, 52111, 52111, 52131, 38545, 38530, 49272, {38549, 0, 0, 0}, 257, 257, { 1252, 37, 10000, 437, 0, ',' }}, - {0x480A, 0x000A, 257, 42, 52135, 52141, 52160, 52180, 38592, 38568, 52184, {38596, 0, 0, 0}, 258, 258, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x4C0A, 0x000A, 257, 76, 52187, 52193, 52213, 52234, 38592, 38568, 52238, {38596, 0, 0, 0}, 259, 259, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x500A, 0x000A, 257, 87, 52241, 52247, 52269, 52292, 38592, 38568, 52296, {38596, 0, 0, 0}, 260, 260, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x540A, 0x000A, 257, 109, 52299, 52305, 52329, 52355, 38592, 38568, 43903, {38596, 0, 0, 0}, 261, 261, { 1252, 20284, 10000, 850, 0, ',' }}, - {0x641A, 0x781A, 257, -1, 52359, 52367, 52386, 50731, 50735, 49986, 0, {40486, 0, 0, 0}, 262, 262, { 1251, 870, 10082, 855, 0, ';' }}, - {0x681A, 0x781A, 257, -1, 52395, 52403, 52386, 49978, 49982, 49986, 0, {49989, 0, 0, 0}, 263, 263, { 1250, 870, 10082, 852, 0, ';' }}, - {0x6C1A, 0x7C1A, 257, -1, 52419, 52427, 52446, 51086, 2234, 50308, 0, {40486, 0, 0, 0}, 264, 264, { 1251, 21025, 10007, 855, 0, ';' }}, - {0x701A, 0x7C1A, 257, -1, 52459, 52467, 52446, 50910, 2234, 50308, 0, {49989, 0, 0, 0}, 265, 265, { 1250, 500, 10029, 852, 0, ';' }}, - {0x742C, 0x002C, 257, -1, 52483, 52491, 40358, 48546, 40374, 40343, 0, {40378, 0, 0, 0}, 266, 266, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x7804, 0x007F, 257, -1, 38266, 38284, 38251, 38258, 38262, 38266, 0, {38269, 0, 0, 0}, 267, 267, { 936, 500, 10008, 936, 0, ',' }}, - {0x7814, 0x0014, 257, -1, 48394, 52514, 52532, 48386, 48390, 48394, 0, {38382, 0, 0, 0}, 268, 268, { 1252, 20277, 10000, 850, 0, ';' }}, - {0x781A, 0x007F, 257, -1, 49986, 52540, 52386, 49978, 49982, 49986, 0, {49989, 0, 0, 0}, 269, 269, { 1250, 870, 10082, 852, 0, ';' }}, - {0x782C, 0x002C, 257, -1, 52548, 52556, 40358, 40370, 40374, 40343, 0, {40378, 0, 0, 0}, 270, 270, { 1254, 20905, 10081, 857, 0, ';' }}, - {0x7843, 0x0043, 257, -1, 52576, 52584, 41304, 41315, 41319, 41295, 0, {48631, 0, 0, 0}, 271, 271, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x7850, 0x0050, 257, -1, 52601, 52609, 42241, 52630, 42258, 42228, 0, {42262, 0, 0, 0}, 272, 272, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x7C04, 0x7804, 257, -1, 52634, 43613, 38251, 43651, 38262, 38266, 0, {43658, 0, 0, 0}, 273, 273, { 950, 500, 10002, 950, 0, ',' }}, - {0x7C04, 0x7C04, 257, -1, 52642, 52649, 38251, 43651, 38262, 38266, 0, {43658, 0, 0, 0}, 274, 274, { 950, 500, 10002, 950, 0, ',' }}, - {0x7C14, 0x0014, 257, -1, 39097, 52678, 52696, 39089, 39093, 39097, 0, {38382, 0, 0, 0}, 275, 275, { 1252, 20277, 10000, 850, 0, ';' }}, - {0x7C1A, 0x007F, 257, -1, 50308, 52710, 52446, 52718, 2234, 50308, 0, {40486, 0, 0, 0}, 276, 276, { 1250, 500, 10029, 852, 0, ';' }}, - {0x7C28, 0x0028, 257, -1, 52722, 52730, 40155, 40168, 40172, 40146, 0, {0, 0, 0, 0}, 277, 277, { 1251, 20880, 10007, 866, 0, ';' }}, - {0x7C43, 0x0043, 257, -1, 52747, 52755, 41304, 41315, 41319, 41295, 0, {41323, 0, 0, 0}, 278, 278, { 1254, 500, 10029, 857, 0, ';' }}, - {0x7C5F, 0x005F, 257, -1, 52769, 52778, 42796, 42806, 42768, 42768, 0, {0, 0, 0, 0}, 279, 279, { 1252, 20297, 10000, 850, 0, ';' }}, - {0x7C68, 0x0068, 257, -1, 52810, 52818, 42964, 42970, 42974, 42961, 0, {0, 0, 0, 0}, 280, 280, { 1252, 37, 10000, 437, 0, ',' }} + {0x0001, 0x007F, 768, -1, 38493, 38496, 38503, 38518, 38522, 38493, 0, {0, 0, 38526, 0}, 0, 0, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0002, 0x007F, 257, -1, 38554, 38557, 38567, 38586, 38590, 38554, 0, {38594, 0, 0, 0}, 1, 1, { 1251, 21025, 10007, 866, 0, ';' }}, + {0x0003, 0x007F, 257, -1, 38636, 38639, 38647, 38655, 38659, 38636, 0, {38663, 0, 0, 0}, 2, 2, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0004, 0x0004, 257, -1, 38683, 38690, 38718, 38725, 38729, 38733, 0, {38736, 0, 0, 0}, 3, 3, { 936, 500, 10008, 936, 0, ',' }}, + {0x0004, 0x7804, 257, -1, 38743, 38751, 38718, 38725, 38729, 38733, 0, {38736, 0, 0, 0}, 4, 4, { 936, 500, 10008, 936, 0, ',' }}, + {0x0005, 0x007F, 257, -1, 38772, 38775, 38781, 38791, 38795, 38772, 0, {38799, 0, 0, 0}, 5, 5, { 1250, 500, 10029, 852, 0, ';' }}, + {0x0006, 0x007F, 257, -1, 38825, 38828, 38835, 38841, 38845, 38825, 0, {38849, 0, 0, 0}, 6, 6, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0007, 0x007F, 257, -1, 38870, 38873, 38880, 38888, 38892, 38870, 0, {38896, 0, 0, 0}, 7, 7, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0008, 0x007F, 257, -1, 38921, 38924, 38930, 38947, 38951, 38921, 0, {38955, 0, 0, 0}, 8, 8, { 1253, 20273, 10006, 737, 0, ';' }}, + {0x0009, 0x007F, 257, -1, 38997, 39000, 39000, 39008, 39012, 38997, 0, {39016, 0, 0, 0}, 9, 9, { 1252, 37, 10000, 437, 0, ',' }}, + {0x000A, 0x007F, 257, -1, 39035, 39038, 39046, 39055, 39059, 39035, 0, {39063, 0, 0, 0}, 10, 10, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x000B, 0x007F, 257, -1, 39085, 39088, 39096, 39102, 39106, 39085, 0, {39110, 0, 0, 0}, 11, 11, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x000C, 0x007F, 257, -1, 39135, 39138, 39145, 39155, 39159, 39135, 0, {39163, 0, 0, 0}, 12, 12, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x000D, 0x007F, 257, -1, 39185, 39188, 39195, 39206, 39210, 39185, 0, {39214, 0, 0, 0}, 13, 13, { 1255, 500, 10005, 862, 1, ',' }}, + {0x000E, 0x007F, 257, -1, 39247, 39250, 39260, 39267, 39271, 39247, 0, {39275, 0, 0, 0}, 14, 14, { 1250, 500, 10029, 852, 0, ';' }}, + {0x000F, 0x007F, 257, -1, 39291, 39294, 39304, 39314, 39318, 39291, 0, {39322, 0, 0, 0}, 15, 15, { 1252, 20871, 10079, 850, 0, ';' }}, + {0x0010, 0x007F, 257, -1, 39342, 39345, 39353, 39362, 39366, 39342, 0, {39370, 0, 0, 0}, 16, 16, { 1252, 20280, 10000, 850, 0, ';' }}, + {0x0011, 0x007F, 257, -1, 39392, 39395, 39404, 39414, 39418, 39392, 0, {39422, 0, 0, 0}, 17, 17, { 932, 20290, 10001, 932, 0, ',' }}, + {0x0012, 0x007F, 257, -1, 39449, 39452, 39459, 39469, 39473, 39449, 0, {39477, 0, 0, 0}, 18, 18, { 949, 20833, 10003, 949, 0, ',' }}, + {0x0013, 0x007F, 257, -1, 39487, 39490, 39496, 39507, 39511, 39487, 0, {39515, 0, 0, 0}, 19, 19, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0014, 0x007F, 257, -1, 39537, 39540, 39550, 39556, 39560, 39564, 0, {38849, 0, 0, 0}, 20, 20, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0015, 0x007F, 257, -1, 39567, 39570, 39577, 39584, 39588, 39567, 0, {39592, 0, 0, 0}, 21, 21, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0016, 0x007F, 257, -1, 39616, 39619, 39630, 39641, 39645, 39616, 0, {39649, 0, 0, 0}, 22, 22, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0017, 0x007F, 257, -1, 39672, 39675, 39683, 39693, 39697, 39672, 0, {39701, 0, 0, 0}, 23, 23, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0018, 0x007F, 257, -1, 39721, 39724, 39733, 39742, 39746, 39721, 0, {39750, 0, 0, 0}, 24, 24, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0019, 0x007F, 257, -1, 39769, 39772, 39780, 39795, 39799, 39769, 0, {39803, 0, 0, 0}, 25, 25, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x001A, 0x007F, 257, -1, 39849, 39852, 39861, 39870, 39874, 39849, 0, {39878, 0, 0, 0}, 26, 26, { 1250, 500, 10082, 852, 0, ';' }}, + {0x001B, 0x007F, 257, -1, 12824, 39901, 39908, 39920, 39924, 12824, 0, {39928, 0, 0, 0}, 27, 27, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x001C, 0x007F, 257, -1, 39952, 39955, 39964, 39970, 39974, 39952, 0, {39978, 0, 0, 0}, 28, 28, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x001D, 0x007F, 257, -1, 39998, 40001, 40009, 40017, 40021, 39998, 0, {38849, 0, 0, 0}, 29, 29, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x001E, 0x007F, 512, -1, 40025, 40028, 40033, 40043, 40047, 40025, 0, {0, 40051, 0, 0}, 30, 30, { 874, 20838, 10021, 874, 0, ',' }}, + {0x001F, 0x007F, 257, -1, 12833, 40082, 40090, 40099, 40103, 12833, 0, {40107, 0, 0, 0}, 31, 31, { 1254, 20905, 10081, 857, 0, ';' }}, + {0x0020, 0x007F, 257, -1, 40121, 40124, 40129, 40138, 40142, 40121, 0, {40146, 0, 0, 0}, 32, 32, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0021, 0x007F, 257, -1, 40176, 40179, 40190, 40207, 40211, 40176, 0, {40215, 0, 0, 0}, 33, 33, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0022, 0x007F, 257, -1, 40234, 40237, 40247, 40268, 40272, 40234, 0, {40276, 0, 0, 0}, 34, 34, { 1251, 500, 10017, 866, 0, ';' }}, + {0x0023, 0x007F, 257, -1, 40322, 40325, 40336, 40357, 40361, 40322, 0, {40365, 0, 0, 0}, 35, 35, { 1251, 500, 10007, 866, 0, ';' }}, + {0x0024, 0x007F, 257, -1, 40407, 40410, 40420, 40434, 40438, 40407, 0, {40442, 0, 0, 0}, 36, 36, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0025, 0x007F, 257, -1, 40464, 40467, 40476, 40482, 40486, 40464, 0, {40490, 0, 0, 0}, 37, 37, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0026, 0x007F, 257, -1, 40510, 40513, 40521, 40531, 40535, 40510, 0, {40539, 0, 0, 0}, 38, 38, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0027, 0x007F, 257, -1, 40558, 40561, 40572, 40582, 40586, 40558, 0, {40590, 0, 0, 0}, 39, 39, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0028, 0x007F, 257, -1, 40613, 40616, 40622, 40635, 40639, 40613, 0, {0, 0, 0, 0}, 40, 40, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0029, 0x007F, 257, -1, 40643, 40646, 40654, 40665, 40669, 40643, 0, {40673, 0, 0, 0}, 41, 41, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x002A, 0x007F, 257, -1, 40697, 40700, 40711, 40726, 35604, 40697, 0, {40730, 0, 0, 0}, 42, 42, { 1258, 500, 10000, 1258, 0, ',' }}, + {0x002B, 0x007F, 257, -1, 40745, 40748, 40757, 40772, 40776, 40745, 0, {40780, 0, 0, 0}, 43, 43, { 0, 500, 2, 1, 0, ',' }}, + {0x002C, 0x007F, 257, -1, 40810, 40813, 40825, 40837, 40841, 40810, 0, {40845, 0, 0, 0}, 44, 44, { 1254, 20905, 10081, 857, 0, ';' }}, + {0x002D, 0x007F, 257, -1, 40864, 40867, 40874, 40882, 40886, 40864, 0, {40890, 0, 0, 0}, 45, 45, { 1252, 500, 10000, 850, 0, ';' }}, + {0x002F, 0x007F, 257, -1, 40910, 40913, 40924, 40945, 40949, 40910, 0, {40953, 0, 0, 0}, 46, 46, { 1251, 500, 10007, 866, 0, ';' }}, + {0x0032, 0x007F, 257, -1, 40997, 41000, 41007, 41016, 41020, 40997, 0, {0, 0, 0, 0}, 47, 47, { 1252, 500, 10000, 850, 0, ',' }}, + {0x0034, 0x007F, 257, -1, 41024, 41027, 41033, 41042, 41046, 41024, 0, {0, 0, 0, 0}, 48, 48, { 1252, 500, 10000, 850, 0, ',' }}, + {0x0035, 0x007F, 257, -1, 41050, 41053, 41058, 41066, 41070, 41050, 0, {41074, 0, 0, 0}, 49, 49, { 1252, 500, 10000, 850, 0, ',' }}, + {0x0036, 0x007F, 257, -1, 41095, 41098, 41098, 41108, 41112, 41095, 0, {41116, 0, 0, 0}, 50, 50, { 1252, 500, 10000, 850, 0, ',' }}, + {0x0037, 0x007F, 257, -1, 41136, 41139, 41148, 41170, 41174, 41136, 0, {41178, 0, 0, 0}, 51, 51, { 0, 500, 2, 1, 0, ';' }}, + {0x0038, 0x007F, 257, -1, 41243, 41246, 41254, 41264, 41268, 41243, 0, {0, 0, 0, 0}, 52, 52, { 1252, 20277, 10079, 850, 0, ';' }}, + {0x0039, 0x007F, 257, -1, 41272, 41275, 41281, 41297, 41301, 41272, 0, {41305, 0, 0, 0}, 53, 53, { 0, 500, 2, 1, 0, ',' }}, + {0x003A, 0x007F, 257, -1, 41358, 41361, 41369, 41375, 41379, 41358, 0, {41383, 0, 0, 0}, 54, 54, { 0, 500, 2, 1, 0, ',' }}, + {0x003B, 0x007F, 257, -1, 41404, 41407, 41421, 41438, 41442, 41404, 0, {41446, 0, 0, 0}, 55, 55, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x003C, 0x007F, 257, -1, 41465, 41468, 41474, 41482, 41486, 41465, 0, {41490, 0, 0, 0}, 56, 56, { 1252, 500, 10000, 850, 0, ',' }}, + {0x003E, 0x007F, 257, -1, 41511, 41514, 41520, 41534, 41538, 41511, 0, {41542, 0, 0, 0}, 57, 57, { 1252, 500, 10000, 850, 0, ';' }}, + {0x003F, 0x007F, 257, -1, 41559, 41562, 41569, 41589, 41593, 41559, 0, {41597, 0, 0, 0}, 58, 58, { 0, 500, 2, 1, 0, ';' }}, + {0x0040, 0x007F, 257, -1, 41639, 41642, 41649, 41666, 41670, 41639, 0, {41674, 0, 0, 0}, 59, 59, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0041, 0x007F, 257, -1, 41712, 41715, 41723, 41733, 41737, 41712, 0, {41741, 0, 0, 0}, 60, 60, { 1252, 500, 10000, 437, 0, ',' }}, + {0x0043, 0x007F, 257, -1, 41762, 41765, 41771, 41782, 41786, 41762, 0, {41790, 0, 0, 0}, 61, 61, { 1254, 500, 10029, 857, 0, ';' }}, + {0x0045, 0x007F, 257, -1, 41810, 41813, 41821, 41837, 41841, 41810, 0, {41845, 0, 0, 0}, 62, 62, { 0, 500, 2, 1, 0, ',' }}, + {0x0046, 0x007F, 257, -1, 41910, 41913, 41921, 41940, 41944, 41910, 0, {41948, 0, 0, 0}, 63, 63, { 0, 500, 2, 1, 0, ',' }}, + {0x0047, 0x007F, 257, -1, 41995, 41998, 42007, 42029, 42033, 41995, 0, {42037, 0, 0, 0}, 64, 64, { 0, 500, 2, 1, 0, ',' }}, + {0x0048, 0x007F, 257, -1, 42093, 42096, 42102, 42118, 42122, 42093, 0, {0, 0, 0, 0}, 65, 65, { 0, 500, 2, 1, 0, ',' }}, + {0x0049, 0x007F, 257, -1, 42126, 42129, 42135, 42151, 42155, 42126, 0, {42159, 0, 0, 0}, 66, 66, { 0, 500, 2, 1, 0, ',' }}, + {0x004A, 0x007F, 257, -1, 42224, 42227, 42234, 42253, 42257, 42224, 0, {42261, 0, 0, 0}, 67, 67, { 0, 500, 2, 1, 0, ',' }}, + {0x004B, 0x007F, 257, -1, 37746, 42326, 42334, 42350, 42354, 37746, 0, {42358, 0, 0, 0}, 68, 68, { 0, 500, 2, 1, 0, ',' }}, + {0x004C, 0x007F, 257, -1, 42423, 42426, 42436, 42455, 42459, 42423, 0, {42463, 0, 0, 0}, 69, 69, { 0, 500, 2, 1, 0, ',' }}, + {0x004D, 0x007F, 257, -1, 42507, 42510, 42519, 42541, 42545, 42507, 0, {42549, 0, 0, 0}, 70, 70, { 0, 500, 2, 1, 0, ',' }}, + {0x004E, 0x007F, 257, -1, 42602, 42605, 42613, 42629, 2530, 42602, 0, {42633, 0, 0, 0}, 71, 71, { 0, 500, 2, 1, 0, ',' }}, + {0x0050, 0x007F, 257, -1, 42695, 42698, 42708, 42721, 42725, 42695, 0, {42729, 0, 0, 0}, 72, 72, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0051, 0x007F, 257, -1, 42761, 42764, 42772, 42797, 42801, 42761, 0, {0, 0, 0, 0}, 73, 73, { 0, 500, 2, 1, 0, ',' }}, + {0x0052, 0x007F, 257, -1, 42805, 42808, 42814, 42822, 42826, 42805, 0, {42830, 0, 0, 0}, 74, 74, { 1252, 20285, 10000, 850, 0, ',' }}, + {0x0053, 0x007F, 257, -1, 42846, 42849, 42855, 42871, 42875, 42846, 0, {42879, 0, 0, 0}, 75, 75, { 0, 500, 2, 1, 0, ',' }}, + {0x0054, 0x007F, 257, -1, 42934, 42937, 42941, 42951, 42955, 42934, 0, {42959, 0, 0, 0}, 76, 76, { 0, 500, 2, 1, 0, ',' }}, + {0x0056, 0x007F, 257, -1, 43005, 43008, 43017, 43024, 43028, 43005, 0, {39370, 0, 0, 0}, 77, 77, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0057, 0x007F, 257, -1, 43032, 43036, 43044, 43063, 43032, 43032, 0, {0, 0, 0, 0}, 78, 78, { 0, 500, 2, 1, 0, ',' }}, + {0x005B, 0x007F, 257, -1, 43067, 43070, 43078, 43094, 43098, 43067, 0, {43102, 0, 0, 0}, 79, 79, { 0, 500, 2, 1, 0, ',' }}, + {0x005E, 0x007F, 257, -1, 8151, 43161, 43169, 43182, 43186, 8151, 0, {43190, 0, 0, 0}, 80, 80, { 0, 500, 2, 1, 0, ';' }}, + {0x005F, 0x007F, 257, -1, 43235, 43239, 43263, 43273, 43235, 43235, 0, {0, 0, 0, 0}, 81, 81, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0061, 0x007F, 257, -1, 1992, 43277, 43284, 43303, 43307, 1992, 0, {43311, 0, 0, 0}, 82, 82, { 0, 500, 2, 1, 0, ',' }}, + {0x0063, 0x007F, 1024, -1, 43361, 43364, 43371, 43380, 43384, 43361, 0, {0, 0, 0, 0}, 83, 83, { 0, 500, 2, 1, 1, ';' }}, + {0x0064, 0x007F, 257, -1, 43388, 43392, 43392, 43401, 43388, 43388, 0, {43405, 0, 0, 0}, 84, 84, { 1252, 500, 10000, 437, 0, ',' }}, + {0x0068, 0x007F, 257, -1, 43428, 43431, 43431, 43437, 43441, 43428, 0, {0, 0, 0, 0}, 85, 85, { 1252, 37, 10000, 437, 0, ',' }}, + {0x006A, 0x007F, 257, -1, 43445, 43448, 43455, 43470, 43474, 43445, 0, {0, 0, 0, 0}, 86, 86, { 1252, 37, 10000, 437, 0, ',' }}, + {0x006C, 0x007F, 257, -1, 43478, 43482, 43497, 43514, 43478, 43478, 0, {0, 0, 0, 0}, 87, 87, { 1252, 500, 10000, 850, 0, ',' }}, + {0x006F, 0x007F, 257, -1, 43518, 43521, 43533, 43545, 43549, 43518, 0, {43553, 0, 0, 0}, 88, 88, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0070, 0x007F, 257, -1, 43580, 43583, 43583, 43588, 43592, 43580, 0, {0, 0, 0, 0}, 89, 89, { 1252, 37, 10000, 437, 0, ',' }}, + {0x0078, 0x007F, 257, -1, 43596, 43599, 43610, 43620, 43624, 43596, 0, {43628, 0, 0, 0}, 90, 90, { 0, 500, 2, 1, 0, ',' }}, + {0x007E, 0x007F, 257, -1, 43641, 43644, 43651, 43661, 43665, 43641, 0, {43669, 0, 0, 0}, 91, 91, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0084, 0x007F, 257, -1, 43689, 43693, 43706, 43725, 43689, 43689, 0, {43729, 0, 0, 0}, 92, 92, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0085, 0x007F, 257, -1, 43754, 43758, 43764, 43782, 43754, 43754, 0, {0, 0, 0, 0}, 93, 93, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0087, 0x007F, 257, -1, 43786, 43789, 43789, 43801, 43805, 43786, 0, {0, 0, 0, 0}, 94, 94, { 1252, 37, 10000, 437, 0, ';' }}, + {0x0091, 0x007F, 257, -1, 43809, 43812, 43828, 43838, 43842, 43809, 0, {43846, 0, 0, 0}, 95, 95, { 1252, 20285, 10000, 850, 0, ',' }}, + {0x0401, 0x0001, 768, 95, 43871, 43877, 43899, 38518, 38522, 38493, 13775, {0, 0, 38526, 0}, 96, 96, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0402, 0x0002, 257, 11, 43963, 43969, 43990, 38586, 38590, 38554, 44028, {38594, 0, 0, 0}, 97, 97, { 1251, 21025, 10007, 866, 0, ';' }}, + {0x0403, 0x0003, 257, 31, 44031, 44037, 44053, 38655, 38659, 38636, 44071, {38663, 0, 0, 0}, 98, 98, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0404, 0x7C04, 257, 107, 44074, 44080, 44102, 44118, 38729, 38733, 44122, {44125, 0, 0, 0}, 99, 99, { 950, 500, 10002, 950, 0, ',' }}, + {0x0405, 0x0005, 257, 23, 44132, 44138, 44161, 38791, 38795, 38772, 44191, {38799, 0, 0, 0}, 100, 100, { 1250, 500, 10029, 852, 0, ';' }}, + {0x0406, 0x0006, 257, 25, 44194, 44200, 44217, 38841, 38845, 38825, 44233, {38849, 0, 0, 0}, 101, 101, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0407, 0x0007, 257, 24, 44236, 44242, 44259, 38888, 38892, 38870, 44281, {38896, 0, 0, 0}, 102, 102, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0408, 0x0008, 257, 39, 44284, 44290, 44305, 38947, 38951, 38921, 44337, {38955, 0, 0, 0}, 103, 103, { 1253, 20273, 10006, 737, 0, ';' }}, + {0x0409, 0x0009, 257, 109, 44340, 44346, 44346, 39008, 39012, 38997, 44370, {39016, 0, 0, 0}, 104, 104, { 1252, 37, 10000, 437, 0, ',' }}, + {0x040B, 0x000B, 257, 33, 44373, 44379, 44397, 39102, 39106, 39085, 44411, {39110, 0, 0, 0}, 105, 105, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x040C, 0x000C, 257, 35, 44414, 44420, 44436, 39155, 39159, 39135, 44455, {39163, 0, 0, 0}, 106, 106, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x040D, 0x000D, 257, 47, 44458, 44464, 44480, 39206, 39210, 39185, 44504, {39214, 0, 0, 0}, 107, 107, { 1255, 500, 10005, 862, 1, ',' }}, + {0x040E, 0x000E, 257, 44, 44507, 44513, 44533, 39267, 39271, 39247, 44556, {39275, 0, 0, 0}, 108, 108, { 1250, 500, 10029, 852, 0, ';' }}, + {0x040F, 0x000F, 257, 51, 44559, 44565, 44585, 39314, 39318, 39291, 44605, {39322, 0, 0, 0}, 109, 109, { 1252, 20871, 10079, 850, 0, ';' }}, + {0x0410, 0x0010, 257, 52, 44608, 44614, 44630, 39362, 39366, 39342, 44648, {39370, 0, 0, 0}, 110, 110, { 1252, 20280, 10000, 850, 0, ';' }}, + {0x0411, 0x0011, 257, 55, 44651, 44657, 44674, 39414, 39418, 39392, 44693, {39422, 0, 0, 0}, 111, 111, { 932, 20290, 10001, 932, 0, ',' }}, + {0x0412, 0x0012, 257, 58, 44696, 44702, 44723, 39469, 39473, 39449, 44748, {39477, 0, 0, 0}, 112, 112, { 949, 20833, 10003, 949, 0, ',' }}, + {0x0413, 0x0013, 257, 77, 44751, 44757, 44777, 39507, 39511, 39487, 44800, {39515, 0, 0, 0}, 113, 113, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0414, 0x7C14, 257, 78, 44803, 44809, 44836, 39556, 39560, 39564, 44858, {38849, 0, 0, 0}, 114, 114, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0415, 0x0015, 257, 86, 44861, 44867, 44883, 39584, 39588, 39567, 44899, {39592, 0, 0, 0}, 115, 115, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0416, 0x0016, 257, 14, 44902, 44908, 44928, 39641, 39645, 39616, 44948, {39649, 0, 0, 0}, 116, 116, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0417, 0x0017, 257, 18, 44951, 44957, 44979, 39693, 39697, 39672, 13778, {39701, 0, 0, 0}, 117, 117, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0418, 0x0018, 257, 91, 44998, 45004, 45023, 39742, 39746, 39721, 45043, {39750, 0, 0, 0}, 118, 118, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0419, 0x0019, 257, 93, 45046, 45052, 45069, 39795, 39799, 39769, 45099, {39803, 0, 0, 0}, 119, 119, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x041A, 0x001A, 257, 43, 45102, 45108, 45127, 39870, 39874, 39849, 45147, {39878, 0, 0, 0}, 120, 120, { 1250, 500, 10082, 852, 0, ';' }}, + {0x041B, 0x001B, 257, 99, 45150, 45156, 45174, 39920, 39924, 12824, 45198, {39928, 0, 0, 0}, 121, 121, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x041C, 0x001C, 257, 2, 45201, 45207, 45226, 39970, 39974, 39952, 45244, {39978, 0, 0, 0}, 122, 122, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x041D, 0x001D, 257, 96, 45247, 45253, 45270, 40017, 40021, 39998, 45288, {38849, 0, 0, 0}, 123, 123, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x041E, 0x001E, 512, 102, 45291, 45297, 45313, 40043, 40047, 40025, 45335, {0, 40051, 0, 0}, 124, 124, { 874, 20838, 10021, 874, 0, ',' }}, + {0x041F, 0x001F, 257, 105, 45338, 45344, 45361, 40099, 40103, 12833, 45381, {40107, 0, 0, 0}, 125, 125, { 1254, 20905, 10081, 857, 0, ';' }}, + {0x0420, 0x0020, 257, 85, 45384, 45390, 45406, 40138, 40142, 40121, 45432, {40146, 0, 0, 0}, 126, 126, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0421, 0x0021, 257, 45, 45435, 45441, 45464, 40207, 40211, 40176, 45493, {40215, 0, 0, 0}, 127, 127, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0422, 0x0022, 257, 108, 45496, 45502, 45522, 40268, 40272, 40234, 45560, {40276, 0, 0, 0}, 128, 128, { 1251, 500, 10017, 866, 0, ';' }}, + {0x0423, 0x0023, 257, 15, 45563, 45569, 45590, 40357, 40361, 40322, 45630, {40365, 0, 0, 0}, 129, 129, { 1251, 500, 10007, 866, 0, ';' }}, + {0x0424, 0x0024, 257, 98, 45633, 45639, 45660, 40434, 40438, 40407, 45686, {40442, 0, 0, 0}, 130, 130, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0425, 0x0025, 257, 29, 45689, 45695, 45714, 40482, 40486, 40464, 45728, {40490, 0, 0, 0}, 131, 131, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0426, 0x0026, 257, 66, 45731, 45737, 45754, 40531, 40535, 40510, 45774, {40539, 0, 0, 0}, 132, 132, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0427, 0x0027, 257, 64, 45777, 45783, 45806, 40582, 40586, 40558, 45826, {40590, 0, 0, 0}, 133, 133, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0428, 0x7C28, 257, 103, 45829, 45840, 45869, 40635, 40639, 40613, 45905, {0, 0, 0, 0}, 134, 134, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0429, 0x0029, 257, 50, 45908, 45914, 45929, 40665, 40669, 40643, 45953, {40673, 0, 0, 0}, 135, 135, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x042A, 0x002A, 257, 113, 45956, 45962, 45983, 40726, 35604, 40697, 46011, {40730, 0, 0, 0}, 136, 136, { 1258, 500, 10000, 1258, 0, ',' }}, + {0x042B, 0x002B, 257, 3, 46014, 46020, 46039, 40772, 40776, 40745, 1929, {40780, 0, 0, 0}, 137, 137, { 0, 500, 2, 1, 0, ',' }}, + {0x042C, 0x782C, 257, 7, 46073, 46084, 46116, 40837, 40841, 40810, 46142, {40845, 0, 0, 0}, 138, 138, { 1254, 20905, 10081, 857, 0, ';' }}, + {0x042D, 0x002D, 257, 31, 46145, 46151, 46166, 40882, 40886, 40864, 44071, {40890, 0, 0, 0}, 139, 139, { 1252, 500, 10000, 850, 0, ';' }}, + {0x042F, 0x002F, 257, 71, 46185, 46191, 46214, 40945, 40949, 40910, 46258, {40953, 0, 0, 0}, 140, 140, { 1251, 500, 10007, 866, 0, ';' }}, + {0x0432, 0x0032, 257, 115, 46261, 46267, 41007, 41016, 41020, 40997, 46289, {0, 0, 0, 0}, 141, 141, { 1252, 500, 10000, 850, 0, ',' }}, + {0x0434, 0x0034, 257, 115, 46292, 46298, 41033, 41042, 41046, 41024, 46289, {0, 0, 0, 0}, 142, 142, { 1252, 500, 10000, 850, 0, ',' }}, + {0x0435, 0x0035, 257, 115, 46319, 46325, 46345, 41066, 41070, 41050, 46289, {41074, 0, 0, 0}, 143, 143, { 1252, 500, 10000, 850, 0, ',' }}, + {0x0436, 0x0036, 257, 115, 46370, 46376, 46401, 41108, 41112, 41095, 46289, {41116, 0, 0, 0}, 144, 144, { 1252, 500, 10000, 850, 0, ',' }}, + {0x0437, 0x0037, 257, 37, 46425, 46431, 46450, 41170, 41174, 41136, 46505, {41178, 0, 0, 0}, 145, 145, { 0, 500, 2, 1, 0, ';' }}, + {0x0438, 0x0038, 257, 34, 46508, 46514, 46538, 41264, 41268, 41243, 46559, {0, 0, 0, 0}, 146, 146, { 1252, 20277, 10079, 850, 0, ';' }}, + {0x0439, 0x0039, 257, 48, 46562, 46568, 46582, 41297, 41301, 41272, 46613, {41305, 0, 0, 0}, 147, 147, { 0, 500, 2, 1, 0, ',' }}, + {0x043A, 0x003A, 257, 73, 46616, 46622, 46638, 41375, 41379, 41358, 46652, {41383, 0, 0, 0}, 148, 148, { 0, 500, 2, 1, 0, ',' }}, + {0x043B, 0x003B, 257, 78, 46655, 46661, 46684, 41438, 41442, 41404, 44858, {41446, 0, 0, 0}, 149, 149, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0441, 0x0041, 257, 56, 46709, 46715, 46731, 41733, 41737, 41712, 46749, {41741, 0, 0, 0}, 150, 150, { 1252, 500, 10000, 437, 0, ',' }}, + {0x0443, 0x7C43, 257, 111, 46752, 46763, 46789, 41782, 41786, 41762, 46815, {41790, 0, 0, 0}, 151, 151, { 1254, 500, 10029, 857, 0, ';' }}, + {0x0445, 0x0045, 257, 48, 46818, 46824, 46840, 41837, 41841, 41810, 46613, {41845, 0, 0, 0}, 152, 152, { 0, 500, 2, 1, 0, ',' }}, + {0x0447, 0x0047, 257, 48, 46871, 46877, 46894, 42029, 42033, 41995, 46613, {42037, 0, 0, 0}, 153, 153, { 0, 500, 2, 1, 0, ',' }}, + {0x0448, 0x0048, 257, 48, 46931, 46937, 46951, 42118, 42122, 42093, 46613, {0, 0, 0, 0}, 154, 154, { 0, 500, 2, 1, 0, ',' }}, + {0x0449, 0x0049, 257, 48, 46982, 46988, 47002, 42151, 42155, 42126, 46613, {42159, 0, 0, 0}, 155, 155, { 0, 500, 2, 1, 0, ',' }}, + {0x044A, 0x004A, 257, 48, 47042, 47048, 47063, 42253, 42257, 42224, 46613, {42261, 0, 0, 0}, 156, 156, { 0, 500, 2, 1, 0, ',' }}, + {0x044B, 0x004B, 257, 48, 47110, 47116, 47132, 42350, 42354, 37746, 46613, {42358, 0, 0, 0}, 157, 157, { 0, 500, 2, 1, 0, ',' }}, + {0x044C, 0x004C, 257, 48, 47163, 47169, 47187, 42455, 42459, 42423, 46613, {42463, 0, 0, 0}, 158, 158, { 0, 500, 2, 1, 0, ',' }}, + {0x044D, 0x004D, 257, 48, 47227, 47233, 47250, 42541, 42545, 42507, 46613, {42549, 0, 0, 0}, 159, 159, { 0, 500, 2, 1, 0, ',' }}, + {0x044E, 0x004E, 257, 48, 47287, 47293, 47309, 42629, 2530, 42602, 46613, {42633, 0, 0, 0}, 160, 160, { 0, 500, 2, 1, 0, ',' }}, + {0x0451, 0x0051, 257, 20, 47340, 47346, 47362, 42797, 42801, 42761, 13857, {0, 0, 0, 0}, 161, 161, { 0, 500, 2, 1, 0, ',' }}, + {0x0452, 0x0052, 257, 36, 47408, 47414, 47437, 42822, 42826, 42805, 47464, {42830, 0, 0, 0}, 162, 162, { 1252, 20285, 10000, 850, 0, ',' }}, + {0x0453, 0x0053, 257, 57, 47467, 47473, 47490, 42871, 42875, 42846, 47530, {42879, 0, 0, 0}, 163, 163, { 0, 500, 2, 1, 0, ',' }}, + {0x0454, 0x0054, 257, 60, 47533, 47539, 47550, 42951, 42955, 42934, 47572, {42959, 0, 0, 0}, 164, 164, { 0, 500, 2, 1, 0, ',' }}, + {0x0456, 0x0056, 257, 31, 47575, 47581, 47598, 43024, 43028, 43005, 44071, {39370, 0, 0, 0}, 165, 165, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0457, 0x0057, 257, 48, 47615, 47622, 47638, 43063, 43032, 43032, 46613, {0, 0, 0, 0}, 166, 166, { 0, 500, 2, 1, 0, ',' }}, + {0x045B, 0x005B, 257, 63, 47672, 47678, 47698, 43094, 43098, 43067, 47748, {43102, 0, 0, 0}, 167, 167, { 0, 500, 2, 1, 0, ',' }}, + {0x045E, 0x005E, 257, 32, 47751, 47757, 47776, 43182, 43186, 8151, 47807, {43190, 0, 0, 0}, 168, 168, { 0, 500, 2, 1, 0, ';' }}, + {0x0461, 0x0061, 257, 79, 47810, 47816, 47831, 43303, 43307, 1992, 47868, {43311, 0, 0, 0}, 169, 169, { 0, 500, 2, 1, 0, ',' }}, + {0x0463, 0x0063, 1024, 1, 47871, 47877, 47898, 43380, 43384, 43361, 47928, {0, 0, 0, 0}, 170, 170, { 0, 500, 2, 1, 1, ';' }}, + {0x0464, 0x0064, 257, 84, 47931, 47938, 47961, 43401, 43388, 43388, 47982, {43405, 0, 0, 0}, 171, 171, { 1252, 500, 10000, 437, 0, ',' }}, + {0x0468, 0x7C68, 257, 75, 47985, 47996, 48019, 43437, 43441, 43428, 48036, {0, 0, 0, 0}, 172, 172, { 1252, 37, 10000, 437, 0, ',' }}, + {0x046A, 0x006A, 257, 75, 48039, 48045, 48062, 43470, 43474, 43445, 48036, {0, 0, 0, 0}, 173, 173, { 1252, 37, 10000, 437, 0, ',' }}, + {0x046C, 0x006C, 257, 115, 48108, 48115, 43497, 43514, 43478, 43478, 46289, {0, 0, 0, 0}, 174, 174, { 1252, 500, 10000, 850, 0, ',' }}, + {0x046F, 0x006F, 257, 38, 48145, 48151, 48175, 43545, 43549, 43518, 48206, {43553, 0, 0, 0}, 175, 175, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0470, 0x0070, 257, 75, 48209, 48215, 48215, 43588, 43592, 43580, 48036, {0, 0, 0, 0}, 176, 176, { 1252, 37, 10000, 437, 0, ',' }}, + {0x0478, 0x0078, 257, 20, 48230, 48236, 48255, 43620, 43624, 43596, 13857, {43628, 0, 0, 0}, 177, 177, { 0, 500, 2, 1, 0, ',' }}, + {0x047E, 0x007E, 257, 35, 48274, 48280, 48296, 43661, 43665, 43641, 44455, {43669, 0, 0, 0}, 178, 178, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0485, 0x0085, 257, 93, 48315, 48322, 43764, 43782, 43754, 43754, 45099, {0, 0, 0, 0}, 179, 179, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0487, 0x0087, 257, 94, 48337, 48343, 48343, 43801, 43805, 43786, 48364, {0, 0, 0, 0}, 180, 180, { 1252, 37, 10000, 437, 0, ';' }}, + {0x0491, 0x0091, 257, 36, 48367, 48373, 48406, 43838, 43842, 43809, 47464, {43846, 0, 0, 0}, 181, 181, { 1252, 20285, 10000, 850, 0, ',' }}, + {0x0801, 0x0001, 257, 49, 48442, 48448, 48462, 48492, 38522, 38493, 48496, {38526, 0, 0, 0}, 182, 182, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0804, 0x0004, 257, 20, 48499, 38751, 48505, 38725, 38729, 38733, 13857, {38736, 0, 0, 0}, 183, 183, { 936, 500, 10008, 936, 0, ',' }}, + {0x0807, 0x0007, 257, 18, 48521, 48527, 48548, 48566, 38892, 38870, 13778, {38896, 0, 0, 0}, 184, 184, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0809, 0x0009, 257, 36, 48570, 48576, 48576, 48601, 39012, 38997, 47464, {39016, 0, 0, 0}, 185, 185, { 1252, 20285, 10000, 850, 0, ',' }}, + {0x080A, 0x000A, 257, 74, 48605, 48611, 48628, 48647, 39059, 39035, 48651, {39370, 0, 0, 0}, 186, 186, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x080C, 0x000C, 257, 10, 48654, 48660, 48677, 48698, 39159, 39135, 48702, {39163, 0, 0, 0}, 187, 187, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0810, 0x0010, 257, 18, 48705, 48711, 48733, 48753, 39366, 39342, 13778, {39370, 0, 0, 0}, 188, 188, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0813, 0x0013, 257, 10, 48757, 48763, 48779, 48800, 39511, 39487, 48702, {39515, 0, 0, 0}, 189, 189, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0814, 0x7814, 257, 78, 48804, 48810, 48837, 48853, 48857, 48861, 44858, {38849, 0, 0, 0}, 190, 190, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0816, 0x0016, 257, 88, 48864, 48870, 48892, 48914, 39645, 39616, 48918, {39649, 0, 0, 0}, 191, 191, { 1252, 500, 10000, 850, 0, ';' }}, + {0x081D, 0x001D, 257, 33, 48921, 48927, 48945, 48963, 40021, 39998, 44411, {38849, 0, 0, 0}, 192, 192, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x082C, 0x742C, 257, 7, 48967, 48978, 46116, 49013, 40841, 40810, 46142, {40845, 0, 0, 0}, 193, 193, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x083C, 0x003C, 257, 46, 49017, 49023, 49039, 41482, 41486, 41465, 49055, {41490, 0, 0, 0}, 194, 194, { 1252, 500, 10000, 850, 0, ',' }}, + {0x0843, 0x7843, 257, 111, 49058, 49069, 46789, 41782, 41786, 41762, 46815, {49098, 0, 0, 0}, 195, 195, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0845, 0x0045, 257, 9, 49136, 49142, 49163, 49206, 41841, 41810, 49210, {41845, 0, 0, 0}, 196, 196, { 0, 500, 2, 1, 0, ',' }}, + {0x0C01, 0x0001, 257, 30, 49213, 49219, 49234, 49258, 38522, 38493, 49262, {38526, 0, 0, 0}, 197, 197, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0C04, 0x7C04, 257, 41, 49265, 49271, 49314, 49351, 38729, 38733, 49355, {44125, 0, 0, 0}, 198, 198, { 950, 500, 10002, 950, 0, ',' }}, + {0x0C07, 0x0007, 257, 5, 49358, 49364, 49381, 49403, 38892, 38870, 49407, {38896, 0, 0, 0}, 199, 199, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0C09, 0x0009, 257, 6, 49410, 49416, 49416, 49436, 39012, 38997, 49440, {39016, 0, 0, 0}, 200, 200, { 1252, 500, 10000, 850, 0, ',' }}, + {0x0C0A, 0x000A, 257, 31, 49443, 49449, 49465, 49484, 39059, 39035, 44071, {39063, 0, 0, 0}, 201, 201, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x0C0C, 0x000C, 257, 17, 49488, 49494, 49510, 49529, 39159, 39135, 49533, {49536, 0, 0, 0}, 202, 202, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0C3B, 0x003B, 257, 33, 49558, 49564, 49588, 49614, 49618, 41404, 44411, {41446, 0, 0, 0}, 203, 203, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x1001, 0x0001, 257, 67, 49622, 49628, 49643, 49671, 38522, 38493, 49675, {38526, 0, 0, 0}, 204, 204, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x1004, 0x0004, 257, 97, 49678, 49684, 49716, 49735, 38729, 38733, 49739, {38736, 0, 0, 0}, 205, 205, { 936, 500, 10008, 936, 0, ',' }}, + {0x1007, 0x0007, 257, 65, 49742, 49748, 49768, 49788, 38892, 38870, 49792, {38896, 0, 0, 0}, 206, 206, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x1009, 0x0009, 257, 17, 49795, 49801, 49801, 49818, 39012, 38997, 49533, {39016, 0, 0, 0}, 207, 207, { 1252, 37, 10000, 850, 0, ',' }}, + {0x100A, 0x000A, 257, 40, 49822, 49828, 49848, 49869, 39059, 39035, 49873, {39063, 0, 0, 0}, 208, 208, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x100C, 0x000C, 257, 18, 49876, 49882, 49903, 49922, 39159, 39135, 13778, {39163, 0, 0, 0}, 209, 209, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x101A, 0x001A, 257, 8, 49926, 49932, 49966, 49997, 50001, 39849, 50005, {39878, 0, 0, 0}, 210, 210, { 1250, 870, 10082, 852, 0, ';' }}, + {0x1401, 0x0001, 257, 27, 50008, 50014, 50031, 50063, 38522, 38493, 50067, {38526, 0, 0, 0}, 211, 211, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x1404, 0x7C04, 257, 72, 50070, 50076, 50115, 50152, 38729, 38733, 50156, {44125, 0, 0, 0}, 212, 212, { 950, 500, 10002, 950, 0, ',' }}, + {0x1407, 0x0007, 257, 62, 50159, 50165, 50188, 50212, 38892, 38870, 50216, {38896, 0, 0, 0}, 213, 213, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x1409, 0x0009, 257, 80, 50219, 50225, 50225, 50247, 39012, 38997, 50251, {39016, 0, 0, 0}, 214, 214, { 1252, 500, 10000, 850, 0, ',' }}, + {0x140A, 0x000A, 257, 22, 50254, 50260, 50281, 50303, 39059, 39035, 50307, {39063, 0, 0, 0}, 215, 215, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x140C, 0x000C, 257, 65, 50310, 50316, 50336, 50359, 39159, 39135, 49792, {39163, 0, 0, 0}, 216, 216, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x141A, 0x681A, 257, 8, 50363, 50374, 50414, 50445, 50449, 50453, 50005, {50456, 0, 0, 0}, 217, 217, { 1250, 870, 10082, 852, 0, ';' }}, + {0x1801, 0x0001, 257, 68, 50479, 50485, 50502, 50532, 38522, 38493, 50536, {38526, 0, 0, 0}, 218, 218, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x1809, 0x0009, 257, 46, 50539, 50545, 50545, 50563, 39012, 38997, 49055, {39016, 0, 0, 0}, 219, 219, { 1252, 500, 10000, 850, 0, ',' }}, + {0x180A, 0x000A, 257, 82, 50567, 50573, 50590, 50609, 39059, 39035, 50613, {39063, 0, 0, 0}, 220, 220, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x180C, 0x000C, 257, 69, 50616, 50622, 50638, 50657, 39159, 39135, 50661, {39163, 0, 0, 0}, 221, 221, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x181A, 0x701A, 257, 8, 50664, 50675, 50715, 50767, 50771, 50775, 50005, {50456, 0, 0, 0}, 222, 222, { 1250, 870, 10082, 852, 0, ';' }}, + {0x1C01, 0x0001, 257, 104, 50778, 50784, 50801, 50827, 38522, 38493, 50831, {38526, 0, 0, 0}, 223, 223, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x1C09, 0x0009, 257, 115, 50834, 50840, 50840, 50863, 39012, 38997, 46289, {39016, 0, 0, 0}, 224, 224, { 1252, 500, 10000, 437, 0, ',' }}, + {0x1C0A, 0x000A, 257, 26, 50867, 50873, 50902, 50935, 39059, 39035, 50939, {39063, 0, 0, 0}, 225, 225, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x1C1A, 0x6C1A, 257, 8, 50942, 50953, 50715, 50996, 51000, 50775, 50005, {40953, 0, 0, 0}, 226, 226, { 1251, 21025, 10007, 855, 0, ';' }}, + {0x2001, 0x0001, 257, 81, 51004, 51010, 51024, 51052, 38522, 38493, 51056, {38526, 0, 0, 0}, 227, 227, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x2009, 0x0009, 257, 53, 51059, 51065, 51065, 51083, 39012, 38997, 51087, {39016, 0, 0, 0}, 228, 228, { 1252, 500, 10000, 850, 0, ',' }}, + {0x200A, 0x000A, 257, 112, 51090, 51096, 51116, 51137, 39059, 39035, 51141, {39063, 0, 0, 0}, 229, 229, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x201A, 0x641A, 257, 8, 51144, 51155, 50414, 51198, 51202, 50453, 50005, {40953, 0, 0, 0}, 230, 230, { 1251, 870, 10082, 855, 0, ';' }}, + {0x2401, 0x0001, 257, 114, 51206, 51212, 51227, 51255, 38522, 38493, 51259, {38526, 0, 0, 0}, 231, 231, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x240A, 0x000A, 257, 21, 51262, 51268, 51287, 51307, 39059, 39035, 51311, {39063, 0, 0, 0}, 232, 232, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x241A, 0x701A, 257, 92, 51314, 51325, 51349, 51377, 2239, 50775, 51381, {50456, 0, 0, 0}, 233, 233, { 1250, 500, 10029, 852, 0, ';' }}, + {0x2801, 0x0001, 257, 101, 51384, 51390, 51405, 51433, 38522, 38493, 51437, {38526, 0, 0, 0}, 234, 234, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x2809, 0x0009, 257, 16, 51440, 51446, 51446, 51463, 39012, 38997, 51467, {39016, 0, 0, 0}, 235, 235, { 1252, 500, 10000, 850, 0, ';' }}, + {0x280A, 0x000A, 257, 83, 51470, 51476, 51491, 51508, 39059, 39035, 51512, {39063, 0, 0, 0}, 236, 236, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x281A, 0x6C1A, 257, 92, 51515, 51526, 51349, 51553, 2239, 50775, 51381, {40953, 0, 0, 0}, 237, 237, { 1251, 21025, 10007, 855, 0, ';' }}, + {0x2C01, 0x0001, 257, 54, 51557, 51563, 51579, 51609, 38522, 38493, 51613, {38526, 0, 0, 0}, 238, 238, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x2C09, 0x0009, 257, 106, 51616, 51622, 51622, 51652, 39012, 38997, 51656, {39016, 0, 0, 0}, 239, 239, { 1252, 500, 10000, 850, 0, ';' }}, + {0x2C0A, 0x000A, 257, 4, 51659, 51665, 51685, 51706, 39059, 39035, 51710, {39063, 0, 0, 0}, 240, 240, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x2C1A, 0x701A, 257, 70, 51713, 51724, 51752, 51785, 2239, 50775, 51789, {50456, 0, 0, 0}, 241, 241, { 1250, 500, 10029, 852, 0, ';' }}, + {0x3001, 0x0001, 257, 61, 51792, 51798, 51815, 51843, 38522, 38493, 51847, {38526, 0, 0, 0}, 242, 242, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x3009, 0x0009, 257, 116, 51850, 51856, 51856, 51875, 39012, 38997, 51879, {39016, 0, 0, 0}, 243, 243, { 1252, 500, 10000, 437, 0, ',' }}, + {0x300A, 0x000A, 257, 28, 51882, 51888, 51906, 51925, 39059, 39035, 51929, {39063, 0, 0, 0}, 244, 244, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x301A, 0x6C1A, 257, 70, 51932, 51943, 51752, 51974, 2239, 50775, 51789, {40953, 0, 0, 0}, 245, 245, { 1251, 21025, 10007, 855, 0, ';' }}, + {0x3401, 0x0001, 257, 59, 51978, 51984, 52000, 52030, 38522, 38493, 52034, {38526, 0, 0, 0}, 246, 246, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x3409, 0x0009, 257, 84, 52037, 52043, 52043, 52065, 39012, 38997, 47982, {39016, 0, 0, 0}, 247, 247, { 1252, 500, 10000, 437, 0, ',' }}, + {0x340A, 0x000A, 257, 19, 52069, 52075, 52091, 52108, 39059, 39035, 52112, {39063, 0, 0, 0}, 248, 248, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x3801, 0x0001, 257, 0, 52115, 52121, 52151, 52215, 38522, 38493, 52219, {38526, 0, 0, 0}, 249, 249, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x380A, 0x000A, 257, 110, 52222, 52228, 52246, 52265, 39059, 39035, 52269, {39063, 0, 0, 0}, 250, 250, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x3C01, 0x0001, 257, 12, 52272, 52278, 52295, 52327, 38522, 38493, 52331, {38526, 0, 0, 0}, 251, 251, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x3C0A, 0x000A, 257, 89, 52334, 52340, 52359, 52379, 39059, 39035, 52383, {39063, 0, 0, 0}, 252, 252, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x4001, 0x0001, 257, 90, 52386, 52392, 52407, 52431, 38522, 38493, 52435, {38526, 0, 0, 0}, 253, 253, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x4009, 0x0009, 257, 48, 52438, 52444, 52444, 52460, 39012, 38997, 46613, {39016, 0, 0, 0}, 254, 254, { 1252, 37, 10000, 437, 0, ',' }}, + {0x400A, 0x000A, 257, 13, 52464, 52470, 52488, 52507, 39059, 39035, 52511, {39063, 0, 0, 0}, 255, 255, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x440A, 0x000A, 257, 100, 52514, 52520, 52542, 52565, 39059, 39035, 52569, {39063, 0, 0, 0}, 256, 256, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x4809, 0x0009, 257, 97, 52572, 52578, 52578, 52598, 39012, 38997, 49739, {39016, 0, 0, 0}, 257, 257, { 1252, 37, 10000, 437, 0, ',' }}, + {0x480A, 0x000A, 257, 42, 52602, 52608, 52627, 52647, 39059, 39035, 52651, {39063, 0, 0, 0}, 258, 258, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x4C0A, 0x000A, 257, 76, 52654, 52660, 52680, 52701, 39059, 39035, 52705, {39063, 0, 0, 0}, 259, 259, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x500A, 0x000A, 257, 87, 52708, 52714, 52736, 52759, 39059, 39035, 52763, {39063, 0, 0, 0}, 260, 260, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x540A, 0x000A, 257, 109, 52766, 52772, 52796, 52822, 39059, 39035, 44370, {39063, 0, 0, 0}, 261, 261, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x641A, 0x781A, 257, -1, 52826, 52834, 52853, 51198, 51202, 50453, 0, {40953, 0, 0, 0}, 262, 262, { 1251, 870, 10082, 855, 0, ';' }}, + {0x681A, 0x781A, 257, -1, 52862, 52870, 52853, 50445, 50449, 50453, 0, {50456, 0, 0, 0}, 263, 263, { 1250, 870, 10082, 852, 0, ';' }}, + {0x6C1A, 0x7C1A, 257, -1, 52886, 52894, 52913, 51553, 2239, 50775, 0, {40953, 0, 0, 0}, 264, 264, { 1251, 21025, 10007, 855, 0, ';' }}, + {0x701A, 0x7C1A, 257, -1, 52926, 52934, 52913, 51377, 2239, 50775, 0, {50456, 0, 0, 0}, 265, 265, { 1250, 500, 10029, 852, 0, ';' }}, + {0x742C, 0x002C, 257, -1, 52950, 52958, 40825, 49013, 40841, 40810, 0, {40845, 0, 0, 0}, 266, 266, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x7804, 0x007F, 257, -1, 38733, 38751, 38718, 38725, 38729, 38733, 0, {38736, 0, 0, 0}, 267, 267, { 936, 500, 10008, 936, 0, ',' }}, + {0x7814, 0x0014, 257, -1, 48861, 52981, 52999, 48853, 48857, 48861, 0, {38849, 0, 0, 0}, 268, 268, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x781A, 0x007F, 257, -1, 50453, 53007, 52853, 50445, 50449, 50453, 0, {50456, 0, 0, 0}, 269, 269, { 1250, 870, 10082, 852, 0, ';' }}, + {0x782C, 0x002C, 257, -1, 53015, 53023, 40825, 40837, 40841, 40810, 0, {40845, 0, 0, 0}, 270, 270, { 1254, 20905, 10081, 857, 0, ';' }}, + {0x7843, 0x0043, 257, -1, 53043, 53051, 41771, 41782, 41786, 41762, 0, {49098, 0, 0, 0}, 271, 271, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x7850, 0x0050, 257, -1, 53068, 53076, 42708, 53097, 42725, 42695, 0, {42729, 0, 0, 0}, 272, 272, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x7C04, 0x7804, 257, -1, 53101, 44080, 38718, 44118, 38729, 38733, 0, {44125, 0, 0, 0}, 273, 273, { 950, 500, 10002, 950, 0, ',' }}, + {0x7C04, 0x7C04, 257, -1, 53109, 53116, 38718, 44118, 38729, 38733, 0, {44125, 0, 0, 0}, 274, 274, { 950, 500, 10002, 950, 0, ',' }}, + {0x7C14, 0x0014, 257, -1, 39564, 53145, 53163, 39556, 39560, 39564, 0, {38849, 0, 0, 0}, 275, 275, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x7C1A, 0x007F, 257, -1, 50775, 53177, 52913, 53185, 2239, 50775, 0, {40953, 0, 0, 0}, 276, 276, { 1250, 500, 10029, 852, 0, ';' }}, + {0x7C28, 0x0028, 257, -1, 53189, 53197, 40622, 40635, 40639, 40613, 0, {0, 0, 0, 0}, 277, 277, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x7C43, 0x0043, 257, -1, 53214, 53222, 41771, 41782, 41786, 41762, 0, {41790, 0, 0, 0}, 278, 278, { 1254, 500, 10029, 857, 0, ';' }}, + {0x7C5F, 0x005F, 257, -1, 53236, 53245, 43263, 43273, 43235, 43235, 0, {0, 0, 0, 0}, 279, 279, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x7C68, 0x0068, 257, -1, 53277, 53285, 43431, 43437, 43441, 43428, 0, {0, 0, 0, 0}, 280, 280, { 1252, 37, 10000, 437, 0, ',' }} }; static const CultureInfoNameEntry culture_name_entries [] = { - {40628, 50}, /* af */ - {52832, 144}, /* af-za */ - {7992, 80}, /* am */ - {52838, 168}, /* am-et */ - {38026, 0}, /* ar */ - {52844, 249}, /* ar-ae */ - {52850, 251}, /* ar-bh */ - {52856, 211}, /* ar-dz */ - {52862, 197}, /* ar-eg */ - {52868, 182}, /* ar-iq */ - {52874, 238}, /* ar-jo */ - {52880, 246}, /* ar-kw */ - {52886, 242}, /* ar-lb */ - {52892, 204}, /* ar-ly */ - {52898, 218}, /* ar-ma */ - {52904, 227}, /* ar-om */ - {52910, 253}, /* ar-qa */ - {52916, 96}, /* ar-sa */ - {52922, 234}, /* ar-sy */ - {52928, 223}, /* ar-tn */ - {52934, 231}, /* ar-ye */ - {42040, 70}, /* as */ - {52940, 159}, /* as-in */ - {40343, 44}, /* az */ - {52946, 266}, /* az-cyrl */ - {52954, 193}, /* az-cyrl-az */ - {52965, 270}, /* az-latn */ - {52973, 138}, /* az-latn-az */ - {39855, 35}, /* be */ - {52984, 129}, /* be-by */ - {38087, 1}, /* bg */ - {52990, 97}, /* bg-bg */ - {41343, 62}, /* bn */ - {52996, 196}, /* bn-bd */ - {53002, 152}, /* bn-in */ - {42294, 73}, /* bo */ - {53008, 161}, /* bo-cn */ - {43174, 91}, /* br */ - {53014, 178}, /* br-fr */ - {49986, 269}, /* bs */ - {53020, 262}, /* bs-cyrl */ - {53028, 230}, /* bs-cyrl-ba */ - {53039, 263}, /* bs-latn */ - {53047, 217}, /* bs-latn-ba */ - {38169, 2}, /* ca */ - {53058, 98}, /* ca-es */ - {38305, 5}, /* cs */ - {53064, 100}, /* cs-cz */ - {42338, 74}, /* cy */ - {53070, 162}, /* cy-gb */ - {38358, 6}, /* da */ - {53076, 101}, /* da-dk */ - {38403, 7}, /* de */ - {53082, 199}, /* de-at */ - {53088, 184}, /* de-ch */ - {53094, 102}, /* de-de */ - {53100, 213}, /* de-li */ - {53106, 206}, /* de-lu */ - {38454, 8}, /* el */ - {53112, 103}, /* el-gr */ - {38530, 9}, /* en */ - {53118, 200}, /* en-au */ - {53124, 235}, /* en-bz */ - {53130, 207}, /* en-ca */ - {53136, 185}, /* en-gb */ - {53142, 219}, /* en-ie */ - {53148, 254}, /* en-in */ - {53154, 228}, /* en-jm */ - {53160, 214}, /* en-nz */ - {53166, 247}, /* en-ph */ - {53172, 257}, /* en-sg */ - {53178, 239}, /* en-tt */ - {53184, 104}, /* en-us */ - {53190, 224}, /* en-za */ - {53196, 243}, /* en-zw */ - {38568, 10}, /* es */ - {53202, 240}, /* es-ar */ - {53208, 255}, /* es-bo */ - {53214, 248}, /* es-cl */ - {53220, 232}, /* es-co */ - {53226, 215}, /* es-cr */ - {53232, 225}, /* es-do */ - {53238, 244}, /* es-ec */ - {53244, 201}, /* es-es */ - {53250, 208}, /* es-gt */ - {53256, 258}, /* es-hn */ - {53262, 186}, /* es-mx */ - {53268, 259}, /* es-ni */ - {53274, 220}, /* es-pa */ - {53280, 236}, /* es-pe */ - {53286, 260}, /* es-pr */ - {53292, 252}, /* es-py */ - {53298, 256}, /* es-sv */ - {53304, 261}, /* es-us */ - {53310, 250}, /* es-uy */ - {53316, 229}, /* es-ve */ - {39997, 37}, /* et */ - {53322, 131}, /* et-ee */ - {40397, 45}, /* eu */ - {53328, 139}, /* eu-es */ - {40176, 41}, /* fa */ - {53334, 135}, /* fa-ir */ - {38618, 11}, /* fi */ - {53340, 105}, /* fi-fi */ - {42921, 84}, /* fil */ - {53346, 171}, /* fil-ph */ - {40776, 52}, /* fo */ - {53353, 146}, /* fo-fo */ - {38668, 12}, /* fr */ - {53359, 187}, /* fr-be */ - {53365, 202}, /* fr-ca */ - {53371, 209}, /* fr-ch */ - {53377, 106}, /* fr-fr */ - {53383, 216}, /* fr-lu */ - {53389, 221}, /* fr-mc */ - {40998, 56}, /* ga */ - {53395, 194}, /* ga-ie */ - {43342, 95}, /* gd */ - {53401, 181}, /* gd-gb */ - {42538, 77}, /* gl */ - {53407, 165}, /* gl-es */ - {43222, 92}, /* gsw */ - {41528, 64}, /* gu */ - {53413, 153}, /* gu-in */ - {42961, 85}, /* ha */ - {53419, 280}, /* ha-latn */ - {53427, 172}, /* ha-latn-ng */ - {38718, 13}, /* he */ - {53438, 107}, /* he-il */ - {40805, 53}, /* hi */ - {53444, 147}, /* hi-in */ - {39382, 26}, /* hr */ - {53450, 210}, /* hr-ba */ - {53456, 120}, /* hr-hr */ - {38780, 14}, /* hu */ - {53462, 108}, /* hu-hu */ - {40278, 43}, /* hy */ - {53468, 137}, /* hy-am */ - {39709, 33}, /* id */ - {53474, 127}, /* id-id */ - {43113, 89}, /* ig */ - {53480, 176}, /* ig-ng */ - {43129, 90}, /* ii */ - {53486, 177}, /* ii-cn */ - {38824, 15}, /* is */ - {53492, 109}, /* is-is */ - {38875, 16}, /* it */ - {53498, 188}, /* it-ch */ - {53504, 110}, /* it-it */ - {38925, 17}, /* ja */ - {53510, 111}, /* ja-jp */ - {40669, 51}, /* ka */ - {53516, 145}, /* ka-ge */ - {41092, 58}, /* kk */ - {43051, 88}, /* kl */ - {53522, 175}, /* kl-gl */ - {42379, 75}, /* km */ - {53528, 163}, /* km-kh */ - {37279, 68}, /* kn */ - {53534, 157}, /* kn-in */ - {38982, 18}, /* ko */ - {53540, 112}, /* ko-kr */ - {42565, 78}, /* kok */ - {53546, 166}, /* kok-in */ - {41172, 59}, /* ky */ - {42467, 76}, /* lo */ - {53553, 164}, /* lo-la */ - {40091, 39}, /* lt */ - {53559, 133}, /* lt-lt */ - {40043, 38}, /* lv */ - {53565, 132}, /* lv-lv */ - {40443, 46}, /* mk */ - {53571, 140}, /* mk-mk */ - {41956, 69}, /* ml */ - {53577, 158}, /* ml-in */ - {42228, 72}, /* mn */ - {53583, 272}, /* mn-cyrl */ - {42135, 71}, /* mr */ - {53591, 160}, /* mr-in */ - {41044, 57}, /* ms */ - {40891, 54}, /* mt */ - {53597, 148}, /* mt-mt */ - {39097, 275}, /* nb */ - {53603, 114}, /* nb-no */ - {1987, 82}, /* ne */ - {53609, 169}, /* ne-np */ - {39020, 19}, /* nl */ - {53615, 189}, /* nl-be */ - {53621, 113}, /* nl-nl */ - {48394, 268}, /* nn */ - {53627, 190}, /* nn-no */ - {39070, 20}, /* no */ - {43011, 87}, /* nso */ - {53633, 174}, /* nso-za */ - {41626, 65}, /* or */ - {53640, 154}, /* or-in */ - {41443, 63}, /* pa */ - {39100, 21}, /* pl */ - {53646, 115}, /* pl-pl */ - {42894, 83}, /* ps */ - {53652, 170}, /* ps-af */ - {39149, 22}, /* pt */ - {53658, 116}, /* pt-br */ - {53664, 191}, /* pt-pt */ - {39205, 23}, /* rm */ - {53670, 117}, /* rm-ch */ - {39254, 24}, /* ro */ - {53676, 118}, /* ro-ro */ - {39302, 25}, /* ru */ - {53682, 119}, /* ru-ru */ - {43319, 94}, /* rw */ - {53688, 180}, /* rw-rw */ - {43287, 93}, /* sah */ - {53694, 179}, /* sah-ru */ - {40937, 55}, /* se */ - {53701, 203}, /* se-fi */ - {53707, 149}, /* se-no */ - {42600, 79}, /* si */ - {53713, 167}, /* si-lk */ - {12780, 27}, /* sk */ - {53719, 121}, /* sk-sk */ - {39940, 36}, /* sl */ - {53725, 130}, /* sl-si */ - {39485, 28}, /* sq */ - {53731, 122}, /* sq-al */ - {50308, 276}, /* sr */ - {53737, 264}, /* sr-cyrl */ - {53745, 226}, /* sr-cyrl-ba */ - {53756, 245}, /* sr-cyrl-me */ - {53767, 237}, /* sr-cyrl-rs */ - {53778, 265}, /* sr-latn */ - {53786, 222}, /* sr-latn-ba */ - {53797, 241}, /* sr-latn-me */ - {53808, 233}, /* sr-latn-rs */ - {39531, 29}, /* sv */ - {53819, 192}, /* sv-fi */ - {53825, 123}, /* sv-se */ - {41245, 60}, /* sw */ - {53831, 150}, /* sw-ke */ - {41659, 66}, /* ta */ - {53837, 155}, /* ta-in */ - {41757, 67}, /* te */ - {53843, 156}, /* te-in */ - {40146, 40}, /* tg */ - {53849, 277}, /* tg-cyrl */ - {53857, 134}, /* tg-cyrl-tj */ - {39558, 30}, /* th */ - {53868, 124}, /* th-th */ - {40530, 47}, /* tn */ - {53874, 141}, /* tn-za */ - {12789, 31}, /* tr */ - {53880, 125}, /* tr-tr */ - {42768, 81}, /* tzm */ - {53886, 279}, /* tzm-latn */ - {39767, 34}, /* uk */ - {53895, 128}, /* uk-ua */ - {39654, 32}, /* ur */ - {53901, 126}, /* ur-pk */ - {41295, 61}, /* uz */ - {53907, 271}, /* uz-cyrl */ - {53915, 195}, /* uz-cyrl-uz */ - {53926, 278}, /* uz-latn */ - {53934, 151}, /* uz-latn-uz */ - {40230, 42}, /* vi */ - {53945, 136}, /* vi-vn */ - {40557, 48}, /* xh */ - {53951, 142}, /* xh-za */ - {42978, 86}, /* yo */ - {53957, 173}, /* yo-ng */ - {38266, 267}, /* zh */ - {53963, 3}, /* zh-chs */ - {53970, 274}, /* zh-cht */ - {53977, 183}, /* zh-cn */ - {53983, 4}, /* zh-hans */ - {53991, 273}, /* zh-hant */ - {53999, 198}, /* zh-hk */ - {54005, 212}, /* zh-mo */ - {54011, 205}, /* zh-sg */ - {54017, 99}, /* zh-tw */ - {40583, 49}, /* zu */ - {54023, 143} /* zu-za */ + {41095, 50}, /* af */ + {53299, 144}, /* af-za */ + {8151, 80}, /* am */ + {53305, 168}, /* am-et */ + {38493, 0}, /* ar */ + {53311, 249}, /* ar-ae */ + {53317, 251}, /* ar-bh */ + {53323, 211}, /* ar-dz */ + {53329, 197}, /* ar-eg */ + {53335, 182}, /* ar-iq */ + {53341, 238}, /* ar-jo */ + {53347, 246}, /* ar-kw */ + {53353, 242}, /* ar-lb */ + {53359, 204}, /* ar-ly */ + {53365, 218}, /* ar-ma */ + {53371, 227}, /* ar-om */ + {53377, 253}, /* ar-qa */ + {53383, 96}, /* ar-sa */ + {53389, 234}, /* ar-sy */ + {53395, 223}, /* ar-tn */ + {53401, 231}, /* ar-ye */ + {42507, 70}, /* as */ + {53407, 159}, /* as-in */ + {40810, 44}, /* az */ + {53413, 266}, /* az-cyrl */ + {53421, 193}, /* az-cyrl-az */ + {53432, 270}, /* az-latn */ + {53440, 138}, /* az-latn-az */ + {40322, 35}, /* be */ + {53451, 129}, /* be-by */ + {38554, 1}, /* bg */ + {53457, 97}, /* bg-bg */ + {41810, 62}, /* bn */ + {53463, 196}, /* bn-bd */ + {53469, 152}, /* bn-in */ + {42761, 73}, /* bo */ + {53475, 161}, /* bo-cn */ + {43641, 91}, /* br */ + {53481, 178}, /* br-fr */ + {50453, 269}, /* bs */ + {53487, 262}, /* bs-cyrl */ + {53495, 230}, /* bs-cyrl-ba */ + {53506, 263}, /* bs-latn */ + {53514, 217}, /* bs-latn-ba */ + {38636, 2}, /* ca */ + {53525, 98}, /* ca-es */ + {38772, 5}, /* cs */ + {53531, 100}, /* cs-cz */ + {42805, 74}, /* cy */ + {53537, 162}, /* cy-gb */ + {38825, 6}, /* da */ + {53543, 101}, /* da-dk */ + {38870, 7}, /* de */ + {53549, 199}, /* de-at */ + {53555, 184}, /* de-ch */ + {53561, 102}, /* de-de */ + {53567, 213}, /* de-li */ + {53573, 206}, /* de-lu */ + {38921, 8}, /* el */ + {53579, 103}, /* el-gr */ + {38997, 9}, /* en */ + {53585, 200}, /* en-au */ + {53591, 235}, /* en-bz */ + {53597, 207}, /* en-ca */ + {53603, 185}, /* en-gb */ + {53609, 219}, /* en-ie */ + {53615, 254}, /* en-in */ + {53621, 228}, /* en-jm */ + {53627, 214}, /* en-nz */ + {53633, 247}, /* en-ph */ + {53639, 257}, /* en-sg */ + {53645, 239}, /* en-tt */ + {53651, 104}, /* en-us */ + {53657, 224}, /* en-za */ + {53663, 243}, /* en-zw */ + {39035, 10}, /* es */ + {53669, 240}, /* es-ar */ + {53675, 255}, /* es-bo */ + {53681, 248}, /* es-cl */ + {53687, 232}, /* es-co */ + {53693, 215}, /* es-cr */ + {53699, 225}, /* es-do */ + {53705, 244}, /* es-ec */ + {53711, 201}, /* es-es */ + {53717, 208}, /* es-gt */ + {53723, 258}, /* es-hn */ + {53729, 186}, /* es-mx */ + {53735, 259}, /* es-ni */ + {53741, 220}, /* es-pa */ + {53747, 236}, /* es-pe */ + {53753, 260}, /* es-pr */ + {53759, 252}, /* es-py */ + {53765, 256}, /* es-sv */ + {53771, 261}, /* es-us */ + {53777, 250}, /* es-uy */ + {53783, 229}, /* es-ve */ + {40464, 37}, /* et */ + {53789, 131}, /* et-ee */ + {40864, 45}, /* eu */ + {53795, 139}, /* eu-es */ + {40643, 41}, /* fa */ + {53801, 135}, /* fa-ir */ + {39085, 11}, /* fi */ + {53807, 105}, /* fi-fi */ + {43388, 84}, /* fil */ + {53813, 171}, /* fil-ph */ + {41243, 52}, /* fo */ + {53820, 146}, /* fo-fo */ + {39135, 12}, /* fr */ + {53826, 187}, /* fr-be */ + {53832, 202}, /* fr-ca */ + {53838, 209}, /* fr-ch */ + {53844, 106}, /* fr-fr */ + {53850, 216}, /* fr-lu */ + {53856, 221}, /* fr-mc */ + {41465, 56}, /* ga */ + {53862, 194}, /* ga-ie */ + {43809, 95}, /* gd */ + {53868, 181}, /* gd-gb */ + {43005, 77}, /* gl */ + {53874, 165}, /* gl-es */ + {43689, 92}, /* gsw */ + {41995, 64}, /* gu */ + {53880, 153}, /* gu-in */ + {43428, 85}, /* ha */ + {53886, 280}, /* ha-latn */ + {53894, 172}, /* ha-latn-ng */ + {39185, 13}, /* he */ + {53905, 107}, /* he-il */ + {41272, 53}, /* hi */ + {53911, 147}, /* hi-in */ + {39849, 26}, /* hr */ + {53917, 210}, /* hr-ba */ + {53923, 120}, /* hr-hr */ + {39247, 14}, /* hu */ + {53929, 108}, /* hu-hu */ + {40745, 43}, /* hy */ + {53935, 137}, /* hy-am */ + {40176, 33}, /* id */ + {53941, 127}, /* id-id */ + {43580, 89}, /* ig */ + {53947, 176}, /* ig-ng */ + {43596, 90}, /* ii */ + {53953, 177}, /* ii-cn */ + {39291, 15}, /* is */ + {53959, 109}, /* is-is */ + {39342, 16}, /* it */ + {53965, 188}, /* it-ch */ + {53971, 110}, /* it-it */ + {39392, 17}, /* ja */ + {53977, 111}, /* ja-jp */ + {41136, 51}, /* ka */ + {53983, 145}, /* ka-ge */ + {41559, 58}, /* kk */ + {43518, 88}, /* kl */ + {53989, 175}, /* kl-gl */ + {42846, 75}, /* km */ + {53995, 163}, /* km-kh */ + {37746, 68}, /* kn */ + {54001, 157}, /* kn-in */ + {39449, 18}, /* ko */ + {54007, 112}, /* ko-kr */ + {43032, 78}, /* kok */ + {54013, 166}, /* kok-in */ + {41639, 59}, /* ky */ + {42934, 76}, /* lo */ + {54020, 164}, /* lo-la */ + {40558, 39}, /* lt */ + {54026, 133}, /* lt-lt */ + {40510, 38}, /* lv */ + {54032, 132}, /* lv-lv */ + {40910, 46}, /* mk */ + {54038, 140}, /* mk-mk */ + {42423, 69}, /* ml */ + {54044, 158}, /* ml-in */ + {42695, 72}, /* mn */ + {54050, 272}, /* mn-cyrl */ + {42602, 71}, /* mr */ + {54058, 160}, /* mr-in */ + {41511, 57}, /* ms */ + {41358, 54}, /* mt */ + {54064, 148}, /* mt-mt */ + {39564, 275}, /* nb */ + {54070, 114}, /* nb-no */ + {1992, 82}, /* ne */ + {54076, 169}, /* ne-np */ + {39487, 19}, /* nl */ + {54082, 189}, /* nl-be */ + {54088, 113}, /* nl-nl */ + {48861, 268}, /* nn */ + {54094, 190}, /* nn-no */ + {39537, 20}, /* no */ + {43478, 87}, /* nso */ + {54100, 174}, /* nso-za */ + {42093, 65}, /* or */ + {54107, 154}, /* or-in */ + {41910, 63}, /* pa */ + {39567, 21}, /* pl */ + {54113, 115}, /* pl-pl */ + {43361, 83}, /* ps */ + {54119, 170}, /* ps-af */ + {39616, 22}, /* pt */ + {54125, 116}, /* pt-br */ + {54131, 191}, /* pt-pt */ + {39672, 23}, /* rm */ + {54137, 117}, /* rm-ch */ + {39721, 24}, /* ro */ + {54143, 118}, /* ro-ro */ + {39769, 25}, /* ru */ + {54149, 119}, /* ru-ru */ + {43786, 94}, /* rw */ + {54155, 180}, /* rw-rw */ + {43754, 93}, /* sah */ + {54161, 179}, /* sah-ru */ + {41404, 55}, /* se */ + {54168, 203}, /* se-fi */ + {54174, 149}, /* se-no */ + {43067, 79}, /* si */ + {54180, 167}, /* si-lk */ + {12824, 27}, /* sk */ + {54186, 121}, /* sk-sk */ + {40407, 36}, /* sl */ + {54192, 130}, /* sl-si */ + {39952, 28}, /* sq */ + {54198, 122}, /* sq-al */ + {50775, 276}, /* sr */ + {54204, 264}, /* sr-cyrl */ + {54212, 226}, /* sr-cyrl-ba */ + {54223, 245}, /* sr-cyrl-me */ + {54234, 237}, /* sr-cyrl-rs */ + {54245, 265}, /* sr-latn */ + {54253, 222}, /* sr-latn-ba */ + {54264, 241}, /* sr-latn-me */ + {54275, 233}, /* sr-latn-rs */ + {39998, 29}, /* sv */ + {54286, 192}, /* sv-fi */ + {54292, 123}, /* sv-se */ + {41712, 60}, /* sw */ + {54298, 150}, /* sw-ke */ + {42126, 66}, /* ta */ + {54304, 155}, /* ta-in */ + {42224, 67}, /* te */ + {54310, 156}, /* te-in */ + {40613, 40}, /* tg */ + {54316, 277}, /* tg-cyrl */ + {54324, 134}, /* tg-cyrl-tj */ + {40025, 30}, /* th */ + {54335, 124}, /* th-th */ + {40997, 47}, /* tn */ + {54341, 141}, /* tn-za */ + {12833, 31}, /* tr */ + {54347, 125}, /* tr-tr */ + {43235, 81}, /* tzm */ + {54353, 279}, /* tzm-latn */ + {40234, 34}, /* uk */ + {54362, 128}, /* uk-ua */ + {40121, 32}, /* ur */ + {54368, 126}, /* ur-pk */ + {41762, 61}, /* uz */ + {54374, 271}, /* uz-cyrl */ + {54382, 195}, /* uz-cyrl-uz */ + {54393, 278}, /* uz-latn */ + {54401, 151}, /* uz-latn-uz */ + {40697, 42}, /* vi */ + {54412, 136}, /* vi-vn */ + {41024, 48}, /* xh */ + {54418, 142}, /* xh-za */ + {43445, 86}, /* yo */ + {54424, 173}, /* yo-ng */ + {38733, 267}, /* zh */ + {54430, 3}, /* zh-chs */ + {54437, 274}, /* zh-cht */ + {54444, 183}, /* zh-cn */ + {54450, 4}, /* zh-hans */ + {54458, 273}, /* zh-hant */ + {54466, 198}, /* zh-hk */ + {54472, 212}, /* zh-mo */ + {54478, 205}, /* zh-sg */ + {54484, 99}, /* zh-tw */ + {41050, 49}, /* zu */ + {54490, 143} /* zu-za */ }; static const RegionInfoEntry region_entries [] = { - { 224,51752,48791,48791,54029,54050,37969,54097,54101,54129}, - { 3,47461,54153,54153,54157,54169,37742,54188,54192,54207}, - { 6,44777,54220,54220,54224,54232,37282,54242,54246,54259}, - { 7,1924,50065,50065,54273,54281,37525,54298,54302,54316}, - { 11,51243,49596,49596,54342,54342,37013,50966,54352,54367}, - { 14,48940,54382,54382,54386,54394,36909,54406,54410,54410}, - { 12,48973,54415,54415,54419,54419,37013,54429,54433,54433}, - { 5,45675,40370,40370,54451,54462,37777,54474,54478,54496}, - { 25,49538,54516,54516,54520,54543,37837,54563,54567,54603}, - { 23,48743,54623,54623,54627,54638,37813,54663,54667,54684}, - { 21,48235,39890,39890,54725,54733,36909,54406,54410,54742}, - { 35,43561,38119,38119,54747,54756,36891,54773,54777,54791}, - { 17,51864,54817,54817,54821,54829,37979,54844,54848,54863}, - { 26,52044,54887,54887,54891,54891,38003,42330,54899,54918}, - { 32,44481,54928,54928,54932,54939,37168,54946,54950,54965}, - { 29,45163,54981,54981,54985,54993,37385,55010,55014,55031}, - { 24,51000,55063,55063,55067,55067,37013,55074,55078,55078}, - { 39,49066,55092,55092,55096,55096,37013,55103,55107,55123}, - { 223,13678,55139,55139,55143,55155,37177,37177,55162,55174}, - { 46,51645,55188,55188,55192,55192,37013,55198,55202,55215}, - { 45,13757,55228,55228,55232,55238,36930,55257,55261,55274}, - { 51,50844,55293,55293,55297,55297,37013,55306,55310,55325}, - { 54,49840,55341,55341,55345,55345,37855,55356,55360,55379}, - { 75,43724,55400,55400,55404,55419,36933,55437,55441,55463}, - { 94,43814,38421,38421,55478,55486,36909,54406,54410,54410}, - { 61,43766,55498,55498,55502,55510,36961,55518,55522,55535}, - { 65,50472,55547,55547,55551,55570,37013,55592,55596,55611}, - { 4,49600,55627,55627,55631,55639,37840,55654,55658,55673}, - { 66,51462,55697,55697,55701,55701,37013,55709,55713,55723}, - { 70,45261,52355,52355,55745,55753,36909,54406,54410,54742}, - { 67,48795,55759,55759,55763,55769,37817,55776,55780,55795}, - { 217,43604,38588,38588,55813,55819,36909,54406,54410,54742}, - { 73,47340,55827,55827,55831,55840,37722,55856,55860,55875}, - { 77,43944,38635,38635,55901,55909,36909,54406,54410,54742}, - { 81,46092,55915,55915,55919,55933,36961,55518,55522,55942}, - { 84,43988,38688,38688,55955,55955,36909,54406,54410,54742}, - { 242,46997,55962,55962,55966,55981,37666,55998,56002,56025}, - { 88,46038,56047,56047,56051,56059,0,56090,56094,56108}, - { 93,47739,56143,56143,56147,56157,36961,55518,55522,56174}, - { 98,43870,56194,56194,56198,56205,36909,54406,54410,56218}, - { 99,49406,56227,56227,56231,56231,7868,56241,56245,56264}, - { 104,48888,56285,56285,56289,56309,37013,56337,56341,56358}, - { 106,52184,56365,56365,56369,56369,2411,56378,56382,56399}, - { 108,44680,39403,39403,56418,56426,37279,56435,56439,56453}, - { 109,44089,38800,38800,56467,56475,37086,56489,56493,56510}, - { 111,45026,56524,56524,56528,56528,37361,56538,56542,56560}, - { 68,48588,56577,56577,56581,56589,36909,54406,54410,54410}, - { 117,44037,56595,56595,56599,56606,37059,56617,56621,56640}, - { 113,46146,39740,39740,56647,56653,37604,56666,56670,56683}, - { 121,48029,56718,56718,56722,56727,37788,56740,56744,56756}, - { 116,45486,56778,56778,56782,56787,37479,56798,56802,56815}, - { 110,44138,38847,38847,56835,56843,36961,56851,56855,56872}, - { 118,44181,38895,38895,56888,56894,36909,54406,54410,54410}, - { 124,50620,56901,56901,56905,56905,37013,56913,56917,56917}, - { 126,51146,56933,56933,56937,56944,37939,56957,56961,56977}, - { 122,44226,38947,38947,56999,57005,37099,57012,57016,57029}, - { 129,46282,57039,57039,57043,57043,37628,57049,57053,57069}, - { 40,47063,42404,42404,57087,57096,37669,57118,57122,57137}, - { 134,44281,39002,39002,57169,57181,37103,57194,57198,57215}, - { 136,51567,57232,57232,57236,57243,37959,57256,57260,57274}, - { 138,47105,42484,42484,57296,42474,37673,57301,57305,57317}, - { 139,51380,57337,57337,57341,57349,37949,57360,57364,57379}, - { 145,49749,57401,57401,57405,57405,0,37177,55162,57419}, - { 42,47281,57437,57437,57441,57451,37714,57483,57487,57504}, - { 141,45359,57552,57552,57556,57566,37453,57574,57578,57595}, - { 147,49325,57610,57610,57614,57625,36909,54406,54410,54410}, - { 140,45307,57635,57635,57639,57646,36909,54406,54410,57654}, - { 148,49208,57659,57659,57663,57669,37827,57680,57684,57697}, - { 159,50069,42162,42162,57717,57725,37859,57738,57742,57758}, - { 158,50194,57778,57778,57782,57782,36909,54406,54410,54742}, - { 270,51322,57789,57789,57793,57804,36909,54406,54410,57822}, - { 19618,45791,57827,57827,57831,57841,37550,57827,57862,57879}, - { 151,49689,57911,57911,57915,57931,37850,57959,57963,57979}, - { 163,46185,40908,40908,57989,57989,36909,54406,54410,57995}, - { 166,48184,58000,58000,58004,58011,37013,58019,58023,58036}, - { 175,47569,58050,58050,58054,58062,37749,58071,58075,58090}, - { 182,52238,58096,58096,58100,58100,38006,58110,58114,58134}, - { 176,44333,39040,39040,58157,58169,36909,54406,54410,54410}, - { 177,44391,39089,39089,58179,58186,36961,58192,58196,58212}, - { 178,47401,58226,58226,58230,58236,37729,58252,58256,58271}, - { 183,49784,58312,58312,58316,58316,37013,58328,58332,58332}, - { 164,50589,58351,58351,58355,58360,37888,58371,58375,58386}, - { 192,50146,41473,41473,58406,58413,37869,58421,58425,58443}, - { 187,51045,58460,58460,58464,58469,37927,58475,58479,58498}, - { 201,47515,58516,58516,58520,58532,37745,58542,58546,58546}, - { 190,44965,58562,58562,58566,58575,37303,58590,58594,58610}, - { 191,44432,58638,58638,58642,58649,37126,58656,58660,58673}, - { 202,52296,58687,58687,58691,58691,37013,55709,55713,55723}, - { 193,48451,58703,58703,58707,58707,36909,54406,54410,54410}, - { 185,51916,58716,58716,58720,58720,37989,58729,58733,58752}, - { 197,51968,58771,58771,58775,58781,37993,58788,58792,58804}, - { 200,44576,58822,58822,58826,58834,0,58843,58847,58860}, - { 271,50914,52718,52718,58874,58881,37912,58894,58898,58912}, - { 203,44632,39328,39328,58925,58932,37199,58945,58949,58963}, - { 204,47897,58995,58995,58999,58999,37753,59006,59010,0}, - { 205,13675,59024,59024,59028,59041,36833,59088,59092,59104}, - { 221,44821,59124,59124,59128,59135,36961,59143,59147,59161}, - { 215,49272,59174,59174,59178,59188,37013,59198,59202,59219}, - { 212,45219,59232,59232,59236,59245,36909,54406,54410,59255}, - { 143,44731,59260,59260,59264,59273,36909,54406,54410,54410}, - { 72,52102,39967,39967,59283,59283,37013,55709,55713,55723}, - { 222,50970,59295,59295,59299,59305,37917,59316,59320,59333}, - { 227,44868,39576,39576,59353,39566,37295,59362,59366,59376}, - { 228,45438,59395,59395,59399,59410,37770,59431,59435,59454}, - { 234,50364,59467,59467,59471,59479,37873,59488,59492,59507}, - { 235,44914,59528,59528,59532,59539,37299,59548,59552,59565}, - { 225,51189,59579,59579,59583,59583,37013,59603,59607,59607}, - { 237,43655,59634,59634,59638,59645,37756,59652,59656,59674}, - { 241,45093,39801,39801,59684,59692,37364,59707,59711,59729}, - { 244,43903,59763,59763,59767,59767,37013,55709,55713,55713}, - { 246,51802,59781,59781,59785,59785,37013,59793,59797,59812}, - { 247,46348,41315,41315,59826,59837,37782,59850,59854,59869}, - { 249,50674,59888,59888,59892,59892,37898,59902,59906,59926}, - { 251,45544,59946,59946,59950,59958,37521,59969,59973,59989}, - { 261,50792,60008,60008,60012,60018,37902,60029,60033,60045}, - { 209,45822,60063,60063,60067,0,10707,60080,60084,0}, - { 264,51412,60103,60103,60107,60107,37013,55709,55713,55713} + { 224,52219,49258,49258,54496,54517,38436,54564,54568,54596}, + { 3,47928,54620,54620,54624,54636,38209,54655,54659,54674}, + { 6,45244,54687,54687,54691,54699,37749,54709,54713,54726}, + { 7,1929,50532,50532,54740,54748,37992,54765,54769,54783}, + { 11,51710,50063,50063,54809,54809,37480,51433,54819,54834}, + { 14,49407,54849,54849,54853,54861,37376,54873,54877,54877}, + { 12,49440,54882,54882,54886,54886,37480,54896,54900,54900}, + { 5,46142,40837,40837,54918,54929,38244,54941,54945,54963}, + { 25,50005,54983,54983,54987,55010,38304,55030,55034,55070}, + { 23,49210,55090,55090,55094,55105,38280,55130,55134,55151}, + { 21,48702,40357,40357,55192,55200,37376,54873,54877,55209}, + { 35,44028,38586,38586,55214,55223,37358,55240,55244,55258}, + { 17,52331,55284,55284,55288,55296,38446,55311,55315,55330}, + { 26,52511,55354,55354,55358,55358,38470,42797,55366,55385}, + { 32,44948,55395,55395,55399,55406,37635,55413,55417,55432}, + { 29,45630,55448,55448,55452,55460,37852,55477,55481,55498}, + { 24,51467,55530,55530,55534,55534,37480,55541,55545,55545}, + { 39,49533,55559,55559,55563,55563,37480,55570,55574,55590}, + { 223,13778,55606,55606,55610,55622,37644,37644,55629,55641}, + { 46,52112,55655,55655,55659,55659,37480,55665,55669,55682}, + { 45,13857,55695,55695,55699,55705,37397,55724,55728,55741}, + { 51,51311,55760,55760,55764,55764,37480,55773,55777,55792}, + { 54,50307,55808,55808,55812,55812,38322,55823,55827,55846}, + { 75,44191,55867,55867,55871,55886,37400,55904,55908,55930}, + { 94,44281,38888,38888,55945,55953,37376,54873,54877,54877}, + { 61,44233,55965,55965,55969,55977,37428,55985,55989,56002}, + { 65,50939,56014,56014,56018,56037,37480,56059,56063,56078}, + { 4,50067,56094,56094,56098,56106,38307,56121,56125,56140}, + { 66,51929,56164,56164,56168,56168,37480,56176,56180,56190}, + { 70,45728,52822,52822,56212,56220,37376,54873,54877,55209}, + { 67,49262,56226,56226,56230,56236,38284,56243,56247,56262}, + { 217,44071,39055,39055,56280,56286,37376,54873,54877,55209}, + { 73,47807,56294,56294,56298,56307,38189,56323,56327,56342}, + { 77,44411,39102,39102,56368,56376,37376,54873,54877,55209}, + { 81,46559,56382,56382,56386,56400,37428,55985,55989,56409}, + { 84,44455,39155,39155,56422,56422,37376,54873,54877,55209}, + { 242,47464,56429,56429,56433,56448,38133,56465,56469,56492}, + { 88,46505,56514,56514,56518,56526,0,56557,56561,56575}, + { 93,48206,56610,56610,56614,56624,37428,55985,55989,56641}, + { 98,44337,56661,56661,56665,56672,37376,54873,54877,56685}, + { 99,49873,56694,56694,56698,56698,8056,56708,56712,56731}, + { 104,49355,56752,56752,56756,56776,37480,56804,56808,56825}, + { 106,52651,56832,56832,56836,56836,2436,56845,56849,56866}, + { 108,45147,39870,39870,56885,56893,37746,56902,56906,56920}, + { 109,44556,39267,39267,56934,56942,37553,56956,56960,56977}, + { 111,45493,56991,56991,56995,56995,37828,57005,57009,57027}, + { 68,49055,57044,57044,57048,57056,37376,54873,54877,54877}, + { 117,44504,57062,57062,57066,57073,37526,57084,57088,57107}, + { 113,46613,40207,40207,57114,57120,38071,57133,57137,57150}, + { 121,48496,57185,57185,57189,57194,38255,57207,57211,57223}, + { 116,45953,57245,57245,57249,57254,37946,57265,57269,57282}, + { 110,44605,39314,39314,57302,57310,37428,57318,57322,57339}, + { 118,44648,39362,39362,57355,57361,37376,54873,54877,54877}, + { 124,51087,57368,57368,57372,57372,37480,57380,57384,57384}, + { 126,51613,57400,57400,57404,57411,38406,57424,57428,57444}, + { 122,44693,39414,39414,57466,57472,37566,57479,57483,57496}, + { 129,46749,57506,57506,57510,57510,38095,57516,57520,57536}, + { 40,47530,42871,42871,57554,57563,38136,57585,57589,57604}, + { 134,44748,39469,39469,57636,57648,37570,57661,57665,57682}, + { 136,52034,57699,57699,57703,57710,38426,57723,57727,57741}, + { 138,47572,42951,42951,57763,42941,38140,57768,57772,57784}, + { 139,51847,57804,57804,57808,57816,38416,57827,57831,57846}, + { 145,50216,57868,57868,57872,57872,0,37644,55629,57886}, + { 42,47748,57904,57904,57908,57918,38181,57950,57954,57971}, + { 141,45826,58019,58019,58023,58033,37920,58041,58045,58062}, + { 147,49792,58077,58077,58081,58092,37376,54873,54877,54877}, + { 140,45774,58102,58102,58106,58113,37376,54873,54877,58121}, + { 148,49675,58126,58126,58130,58136,38294,58147,58151,58164}, + { 159,50536,42629,42629,58184,58192,38326,58205,58209,58225}, + { 158,50661,58245,58245,58249,58249,37376,54873,54877,55209}, + { 270,51789,58256,58256,58260,58271,37376,54873,54877,58289}, + { 19618,46258,58294,58294,58298,58308,38017,58294,58329,58346}, + { 151,50156,58378,58378,58382,58398,38317,58426,58430,58446}, + { 163,46652,41375,41375,58456,58456,37376,54873,54877,58462}, + { 166,48651,58467,58467,58471,58478,37480,58486,58490,58503}, + { 175,48036,58517,58517,58521,58529,38216,58538,58542,58557}, + { 182,52705,58563,58563,58567,58567,38473,58577,58581,58601}, + { 176,44800,39507,39507,58624,58636,37376,54873,54877,54877}, + { 177,44858,39556,39556,58646,58653,37428,58659,58663,58679}, + { 178,47868,58693,58693,58697,58703,38196,58719,58723,58738}, + { 183,50251,58779,58779,58783,58783,37480,58795,58799,58799}, + { 164,51056,58818,58818,58822,58827,38355,58838,58842,58853}, + { 192,50613,41940,41940,58873,58880,38336,58888,58892,58910}, + { 187,51512,58927,58927,58931,58936,38394,58942,58946,58965}, + { 201,47982,58983,58983,58987,58999,38212,59009,59013,59013}, + { 190,45432,59029,59029,59033,59042,37770,59057,59061,59077}, + { 191,44899,59105,59105,59109,59116,37593,59123,59127,59140}, + { 202,52763,59154,59154,59158,59158,37480,56176,56180,56190}, + { 193,48918,59170,59170,59174,59174,37376,54873,54877,54877}, + { 185,52383,59183,59183,59187,59187,38456,59196,59200,59219}, + { 197,52435,59238,59238,59242,59248,38460,59255,59259,59271}, + { 200,45043,59289,59289,59293,59301,0,59310,59314,59327}, + { 271,51381,53185,53185,59341,59348,38379,59361,59365,59379}, + { 203,45099,39795,39795,59392,59399,37666,59412,59416,59430}, + { 204,48364,59462,59462,59466,59466,38220,59473,59477,0}, + { 205,13775,59491,59491,59495,59508,37300,59555,59559,59571}, + { 221,45288,59591,59591,59595,59602,37428,59610,59614,59628}, + { 215,49739,59641,59641,59645,59655,37480,59665,59669,59686}, + { 212,45686,59699,59699,59703,59712,37376,54873,54877,59722}, + { 143,45198,59727,59727,59731,59740,37376,54873,54877,54877}, + { 72,52569,40434,40434,59750,59750,37480,56176,56180,56190}, + { 222,51437,59762,59762,59766,59772,38384,59783,59787,59800}, + { 227,45335,40043,40043,59820,40033,37762,59829,59833,59843}, + { 228,45905,59862,59862,59866,59877,38237,59898,59902,59921}, + { 234,50831,59934,59934,59938,59946,38340,59955,59959,59974}, + { 235,45381,59995,59995,59999,60006,37766,60015,60019,60032}, + { 225,51656,60046,60046,60050,60050,37480,60070,60074,60074}, + { 237,44122,60101,60101,60105,60112,38223,60119,60123,60141}, + { 241,45560,40268,40268,60151,60159,37831,60174,60178,60196}, + { 244,44370,60230,60230,60234,60234,37480,56176,56180,56180}, + { 246,52269,60248,60248,60252,60252,37480,60260,60264,60279}, + { 247,46815,41782,41782,60293,60304,38249,60317,60321,60336}, + { 249,51141,60355,60355,60359,60359,38365,60369,60373,60393}, + { 251,46011,60413,60413,60417,60425,37988,60436,60440,60456}, + { 261,51259,60475,60475,60479,60485,38369,60496,60500,60512}, + { 209,46289,60530,60530,60534,0,10836,60547,60551,0}, + { 264,51879,60570,60570,60574,60574,37480,56176,56180,56180} }; static const RegionInfoNameEntry region_name_entries [] = { - {51752, 0}, /* AE */ - {47461, 1}, /* AF */ - {44777, 2}, /* AL */ - {1924, 3}, /* AM */ - {51243, 4}, /* AR */ - {48940, 5}, /* AT */ - {48973, 6}, /* AU */ - {45675, 7}, /* AZ */ - {49538, 8}, /* BA */ - {48743, 9}, /* BD */ - {48235, 10}, /* BE */ - {43561, 11}, /* BG */ - {51864, 12}, /* BH */ - {52044, 13}, /* BO */ - {44481, 14}, /* BR */ - {45163, 15}, /* BY */ - {51000, 16}, /* BZ */ - {49066, 17}, /* CA */ - {13678, 18}, /* CH */ - {51645, 19}, /* CL */ - {13757, 20}, /* CN */ - {50844, 21}, /* CO */ - {49840, 22}, /* CR */ - {43724, 23}, /* CZ */ - {43814, 24}, /* DE */ - {43766, 25}, /* DK */ - {50472, 26}, /* DO */ - {49600, 27}, /* DZ */ - {51462, 28}, /* EC */ - {45261, 29}, /* EE */ - {48795, 30}, /* EG */ - {43604, 31}, /* ES */ - {47340, 32}, /* ET */ - {43944, 33}, /* FI */ - {46092, 34}, /* FO */ - {43988, 35}, /* FR */ - {46997, 36}, /* GB */ - {46038, 37}, /* GE */ - {47739, 38}, /* GL */ - {43870, 39}, /* GR */ - {49406, 40}, /* GT */ - {48888, 41}, /* HK */ - {52184, 42}, /* HN */ - {44680, 43}, /* HR */ - {44089, 44}, /* HU */ - {45026, 45}, /* ID */ - {48588, 46}, /* IE */ - {44037, 47}, /* IL */ - {46146, 48}, /* IN */ - {48029, 49}, /* IQ */ - {45486, 50}, /* IR */ - {44138, 51}, /* IS */ - {44181, 52}, /* IT */ - {50620, 53}, /* JM */ - {51146, 54}, /* JO */ - {44226, 55}, /* JP */ - {46282, 56}, /* KE */ - {47063, 57}, /* KH */ - {44281, 58}, /* KR */ - {51567, 59}, /* KW */ - {47105, 60}, /* LA */ - {51380, 61}, /* LB */ - {49749, 62}, /* LI */ - {47281, 63}, /* LK */ - {45359, 64}, /* LT */ - {49325, 65}, /* LU */ - {45307, 66}, /* LV */ - {49208, 67}, /* LY */ - {50069, 68}, /* MA */ - {50194, 69}, /* MC */ - {51322, 70}, /* ME */ - {45791, 71}, /* MK */ - {49689, 72}, /* MO */ - {46185, 73}, /* MT */ - {48184, 74}, /* MX */ - {47569, 75}, /* NG */ - {52238, 76}, /* NI */ - {44333, 77}, /* NL */ - {44391, 78}, /* NO */ - {47401, 79}, /* NP */ - {49784, 80}, /* NZ */ - {50589, 81}, /* OM */ - {50146, 82}, /* PA */ - {51045, 83}, /* PE */ - {47515, 84}, /* PH */ - {44965, 85}, /* PK */ - {44432, 86}, /* PL */ - {52296, 87}, /* PR */ - {48451, 88}, /* PT */ - {51916, 89}, /* PY */ - {51968, 90}, /* QA */ - {44576, 91}, /* RO */ - {50914, 92}, /* RS */ - {44632, 93}, /* RU */ - {47897, 94}, /* RW */ - {13675, 95}, /* SA */ - {44821, 96}, /* SE */ - {49272, 97}, /* SG */ - {45219, 98}, /* SI */ - {44731, 99}, /* SK */ - {52102, 100}, /* SV */ - {50970, 101}, /* SY */ - {44868, 102}, /* TH */ - {45438, 103}, /* TJ */ - {50364, 104}, /* TN */ - {44914, 105}, /* TR */ - {51189, 106}, /* TT */ - {43655, 107}, /* TW */ - {45093, 108}, /* UA */ - {43903, 109}, /* US */ - {51802, 110}, /* UY */ - {46348, 111}, /* UZ */ - {50674, 112}, /* VE */ - {45544, 113}, /* VN */ - {50792, 114}, /* YE */ - {45822, 115}, /* ZA */ - {51412, 116} /* ZW */ + {52219, 0}, /* AE */ + {47928, 1}, /* AF */ + {45244, 2}, /* AL */ + {1929, 3}, /* AM */ + {51710, 4}, /* AR */ + {49407, 5}, /* AT */ + {49440, 6}, /* AU */ + {46142, 7}, /* AZ */ + {50005, 8}, /* BA */ + {49210, 9}, /* BD */ + {48702, 10}, /* BE */ + {44028, 11}, /* BG */ + {52331, 12}, /* BH */ + {52511, 13}, /* BO */ + {44948, 14}, /* BR */ + {45630, 15}, /* BY */ + {51467, 16}, /* BZ */ + {49533, 17}, /* CA */ + {13778, 18}, /* CH */ + {52112, 19}, /* CL */ + {13857, 20}, /* CN */ + {51311, 21}, /* CO */ + {50307, 22}, /* CR */ + {44191, 23}, /* CZ */ + {44281, 24}, /* DE */ + {44233, 25}, /* DK */ + {50939, 26}, /* DO */ + {50067, 27}, /* DZ */ + {51929, 28}, /* EC */ + {45728, 29}, /* EE */ + {49262, 30}, /* EG */ + {44071, 31}, /* ES */ + {47807, 32}, /* ET */ + {44411, 33}, /* FI */ + {46559, 34}, /* FO */ + {44455, 35}, /* FR */ + {47464, 36}, /* GB */ + {46505, 37}, /* GE */ + {48206, 38}, /* GL */ + {44337, 39}, /* GR */ + {49873, 40}, /* GT */ + {49355, 41}, /* HK */ + {52651, 42}, /* HN */ + {45147, 43}, /* HR */ + {44556, 44}, /* HU */ + {45493, 45}, /* ID */ + {49055, 46}, /* IE */ + {44504, 47}, /* IL */ + {46613, 48}, /* IN */ + {48496, 49}, /* IQ */ + {45953, 50}, /* IR */ + {44605, 51}, /* IS */ + {44648, 52}, /* IT */ + {51087, 53}, /* JM */ + {51613, 54}, /* JO */ + {44693, 55}, /* JP */ + {46749, 56}, /* KE */ + {47530, 57}, /* KH */ + {44748, 58}, /* KR */ + {52034, 59}, /* KW */ + {47572, 60}, /* LA */ + {51847, 61}, /* LB */ + {50216, 62}, /* LI */ + {47748, 63}, /* LK */ + {45826, 64}, /* LT */ + {49792, 65}, /* LU */ + {45774, 66}, /* LV */ + {49675, 67}, /* LY */ + {50536, 68}, /* MA */ + {50661, 69}, /* MC */ + {51789, 70}, /* ME */ + {46258, 71}, /* MK */ + {50156, 72}, /* MO */ + {46652, 73}, /* MT */ + {48651, 74}, /* MX */ + {48036, 75}, /* NG */ + {52705, 76}, /* NI */ + {44800, 77}, /* NL */ + {44858, 78}, /* NO */ + {47868, 79}, /* NP */ + {50251, 80}, /* NZ */ + {51056, 81}, /* OM */ + {50613, 82}, /* PA */ + {51512, 83}, /* PE */ + {47982, 84}, /* PH */ + {45432, 85}, /* PK */ + {44899, 86}, /* PL */ + {52763, 87}, /* PR */ + {48918, 88}, /* PT */ + {52383, 89}, /* PY */ + {52435, 90}, /* QA */ + {45043, 91}, /* RO */ + {51381, 92}, /* RS */ + {45099, 93}, /* RU */ + {48364, 94}, /* RW */ + {13775, 95}, /* SA */ + {45288, 96}, /* SE */ + {49739, 97}, /* SG */ + {45686, 98}, /* SI */ + {45198, 99}, /* SK */ + {52569, 100}, /* SV */ + {51437, 101}, /* SY */ + {45335, 102}, /* TH */ + {45905, 103}, /* TJ */ + {50831, 104}, /* TN */ + {45381, 105}, /* TR */ + {51656, 106}, /* TT */ + {44122, 107}, /* TW */ + {45560, 108}, /* UA */ + {44370, 109}, /* US */ + {52269, 110}, /* UY */ + {46815, 111}, /* UZ */ + {51141, 112}, /* VE */ + {46011, 113}, /* VN */ + {51259, 114}, /* YE */ + {46289, 115}, /* ZA */ + {51879, 116} /* ZW */ }; static const char locale_strings [] = { "\0" - "dd/MMMM/yyyy\0" - "dd/MM/yy\0" - "hh:mm:ss tt\0" - "hh:mm tt\0" - "MMMM, yyyy\0" "dd MMMM\0" "\xd9\x85\xd8\xad\xd8\xb1\xd9\x85\0" "\xd8\xb5\xd9\x81\xd8\xb1\0" @@ -1412,15 +1407,15 @@ static const char locale_strings [] = { "\xd8\xb0\xd9\x88 \xd8\xa7\xd9\x84\xd8\xad\xd8\xac\xd8\xa9\0" "/\0" ":\0" + "dd/MM/yy\0" "dd/MM/yyyy\0" + "dd/MMMM/yyyy\0" "dddd, dd MMMM, yyyy\0" + "hh:mm tt\0" "HH:mm\0" + "hh:mm:ss tt\0" "HH:mm:ss\0" - "dd MMMM yyyy '\xd0\xb3.'\0" - "d.M.yyyy '\xd0\xb3.'\0" - "H:mm:ss\0" - "H:mm\0" - "MMMM yyyy '\xd0\xb3.'\0" + "MMMM, yyyy\0" "d MMMM\0" "\xd0\xbf\xd1\x80.\xd0\xbe\xd0\xb1.\0" "\xd1\x81\xd0\xbb.\xd0\xbe\xd0\xb1.\0" @@ -1464,18 +1459,17 @@ static const char locale_strings [] = { "\xd0\xbd\xd0\xbe\xd0\xb5\xd0\xbc.\0" "\xd0\xb4\xd0\xb5\xd0\xba.\0" ".\0" + "d.M.yyyy '\xd0\xb3.'\0" "dd.M.yyyy '\xd0\xb3.'\0" "d.MM.yyyy '\xd0\xb3.'\0" "dd.MM.yyyy '\xd0\xb3.'\0" + "dd MMMM yyyy '\xd0\xb3.'\0" "d MMMM yyyy '\xd0\xb3.'\0" "dddd, dd MMMM yyyy '\xd0\xb3.'\0" "dddd, d MMMM yyyy '\xd0\xb3.'\0" - "HH:mm '\xd1\x87.'\0" - "H:mm '\xd1\x87.'\0" - "HH:mm:ss '\xd1\x87.'\0" - "H:mm:ss '\xd1\x87.'\0" - "dddd, d MMMM' de 'yyyy\0" - "MMMM' de 'yyyy\0" + "H:mm\0" + "H:mm:ss\0" + "MMMM yyyy '\xd0\xb3.'\0" "a. m.\0" "p. m.\0" "diumenge\0" @@ -1520,19 +1514,23 @@ static const char locale_strings [] = { "oct.\0" "nov.\0" "des.\0" - "yyyy-MM-dd\0" "d/MM/yy\0" - "d/M/yy\0" + "dd-MM-yyyy\0" "dd-MM-yy\0" + "d-MM-yy\0" + "dd.MM.yyyy\0" "dd.MM.yy\0" - "dddd, d' / 'MMMM' / 'yyyy\0" - "d'/'MMMM'/'yyyy\0" - "d' 'MMMM' 'yyyy\0" - "HH'H'mm'\\''\0" - "HH'H'mm'\\''ss'\\'\\''\0" - "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0" - "yyyy/M/d\0" - "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'\0" + "d.MM.yy\0" + "dddd, d MMMM' de 'yyyy\0" + "dddd, d MMMM yyyy\0" + "d MMMM' de 'yyyy\0" + "d MMMM yyyy\0" + "d'-'MMMM'-'yyyy\0" + "ddd, d MMM yyyy\0" + "MMMM' de 'yyyy\0" + "MMMM yyyy\0" + "MMM yyyy\0" + "MMM yy\0" "M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0" "\xe4\xb8\x8a\xe5\x8d\x88\0" "\xe4\xb8\x8b\xe5\x8d\x88\0" @@ -1581,23 +1579,27 @@ static const char locale_strings [] = { "10\xe6\x9c\x88\0" "11\xe6\x9c\x88\0" "12\xe6\x9c\x88\0" + "yyyy/M/d\0" "yyyy-M-d\0" "yyyy.M.d\0" "yyyy/MM/dd\0" + "yyyy-MM-dd\0" "yyyy.MM.dd\0" - "yy-M-d\0" "yy/M/d\0" + "yy-M-d\0" "yy.M.d\0" "yy/MM/dd\0" - "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5',dddd\0" - "dddd,yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0" + "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0" + "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5', dddd\0" + "dddd, yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0" + "yyyy\xe5\xb9\xb4MMMd\xe6\x97\xa5\0" + "yyyy\xe5\xb9\xb4MMMd\xe6\x97\xa5, dddd\0" "tt h:mm\0" "tt hh:mm\0" "tt h:mm:ss\0" "tt hh:mm:ss\0" - "d. MMMM yyyy\0" - "d. M. yyyy\0" - "MMMM yyyy\0" + "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'\0" + "yyyy.M\0" "d. MMMM\0" "AM\0" "PM\0" @@ -1656,13 +1658,15 @@ static const char locale_strings [] = { "lis\0" "pro\0" ". \0" - "d.M.yyyy\0" + "d. M. yyyy\0" + "d/M/yyyy\0" + "d/M/yy\0" "d-M-yy\0" + "d. MMMM yyyy\0" "h.mm tt\0" "H.mm\0" "h.mm.ss tt\0" "H.mm.ss\0" - "dd-MM-yyyy\0" "s\xc3\xb8ndag\0" "mandag\0" "tirsdag\0" @@ -1707,9 +1711,6 @@ static const char locale_strings [] = { "dec\0" "-\0" "yyyy MM dd\0" - "dd. MMMM yyyy\0" - "dddd, d. MMMM yyyy\0" - "dd.MM.yyyy\0" "vorm.\0" "nachm.\0" "Sonntag\0" @@ -1750,18 +1751,11 @@ static const char locale_strings [] = { "Okt\0" "Nov\0" "Dez\0" - "dd.MMM.yyyy\0" - "d.MM.yy\0" - "d.M.yy\0" - "d. MMM yyyy\0" - "H.mm' Uhr'\0" - "H:mm:ss' Uhr'\0" + "dd. MMM. yyyy\0" + "dddd, d. MMMM yyyy\0" + "d. MMM. yyyy\0" + "HH:mm' Uhr'\0" "HH:mm:ss' Uhr'\0" - "HHmmss\0" - "dddd, d MMMM yyyy\0" - "d/M/yyyy\0" - "h:mm:ss tt\0" - "h:mm tt\0" "\xcf\x80.\xce\xbc.\0" "\xce\xbc.\xce\xbc.\0" "\xce\x9a\xcf\x85\xcf\x81\xce\xb9\xce\xb1\xce\xba\xce\xae\0" @@ -1820,9 +1814,8 @@ static const char locale_strings [] = { "\xce\x9d\xce\xbf\xce\xad\0" "\xce\x94\xce\xb5\xce\xba\0" "dd/MMM/yyyy\0" - "d MMMM yyyy\0" - "dddd, MMMM d, yyyy\0" - "M/d/yyyy\0" + "h:mm tt\0" + "h:mm:ss tt\0" "MMMM d\0" "Sunday\0" "Monday\0" @@ -1850,14 +1843,15 @@ static const char locale_strings [] = { "Mar\0" "Oct\0" "Dec\0" + "M/d/yyyy\0" "M/d/yy\0" "MM/dd/yy\0" "MM/dd/yyyy\0" "dd-MMM-yy\0" - "dddd, MMMM dd, yyyy\0" - "MMMM dd, yyyy\0" - "dd MMMM, yyyy\0" - "dddd, d' de 'MMMM' de 'yyyy\0" + "dddd, MMMM d, yyyy\0" + "MMMM d, yyyy\0" + "dddd, d MMMM, yyyy\0" + "d MMMM, yyyy\0" "d' de 'MMMM\0" "domingo\0" "lunes\0" @@ -1908,9 +1902,13 @@ static const char locale_strings [] = { "Oct.\0" "Nov.\0" "Dic.\0" - "dddd, dd' de 'MMMM' de 'yyyy\0" + "dddd, d' de 'MMMM' de 'yyyy\0" "dddd d' de 'MMMM' de 'yyyy\0" "d' de 'MMMM' de 'yyyy\0" + "HH.mm\0" + "HH'H'mm\0" + "HH.mm.ss\0" + "HH'H'mm.ss\0" "d'.' MMMM\0" "ap.\0" "ip.\0" @@ -1965,9 +1963,9 @@ static const char locale_strings [] = { "loka\0" "marras\0" "joulu\0" - "d. MMMM'ta 'yyyy\0" - "dd. MMMM'ta 'yyyy\0" - "dddd d MMMM yyyy\0" + "d.M.yyyy\0" + "d.M.yy\0" + "dd. MMMM yyyy\0" "dimanche\0" "lundi\0" "mardi\0" @@ -1999,11 +1997,10 @@ static const char locale_strings [] = { "juil.\0" "sept.\0" "d\xc3\xa9\x63.\0" + "dddd d MMMM yyyy\0" "d MMM yy\0" - "HH.mm\0" "HH' h 'mm\0" "HH'h'mm\0" - "dddd dd MMMM yyyy\0" "\xd7\x9c\xd7\xa4\xd7\xa0\xd7\x94\xd7\xb4\xd7\xa6\0" "\xd7\x90\xd7\x97\xd7\x94\xd7\xb4\xd7\xa6\0" "\xd7\x99\xd7\x95\xd7\x9d \xd7\xa8\xd7\x90\xd7\xa9\xd7\x95\xd7\x9f\0" @@ -2053,11 +2050,9 @@ static const char locale_strings [] = { "dd-MMMM-yyyy\0" "dd '\xd7\x91'MMMM yyyy\0" "dd MMM yy\0" + "dddd dd MMMM yyyy\0" "dddd dd '\xd7\x91'MMMM yyyy\0" "ddd dd '\xd7\x91'MMMM yyyy\0" - "yyyy. MMMM d.\0" - "yyyy.MM.dd.\0" - "yyyy. MMMM\0" "MMMM d.\0" "de.\0" "du.\0" @@ -2094,8 +2089,11 @@ static const char locale_strings [] = { "szept.\0" "okt.\0" "dec.\0" + "yyyy.MM.dd.\0" "yyyy. MM. dd.\0" "yy-MM-dd\0" + "yyyy. MMMM d.\0" + "yyyy. MMMM\0" "f.h.\0" "e.h.\0" "sunnudagur\0" @@ -2129,6 +2127,7 @@ static const char locale_strings [] = { "d. M. yyyy.\0" "d. M. '\\''yy.\0" "yy MM dd\0" + "dddd d. MMMM yyyy\0" "domenica\0" "luned\xc3\xac\0" "marted\xc3\xac\0" @@ -2172,7 +2171,6 @@ static const char locale_strings [] = { "dic\0" "dd.M.yy\0" "d-MMM-yy\0" - "HH.mm.ss\0" "\xe5\x8d\x88\xe5\x89\x8d\0" "\xe5\x8d\x88\xe5\xbe\x8c\0" "\xe6\x97\xa5\xe6\x9b\x9c\xe6\x97\xa5\0" @@ -2200,14 +2198,13 @@ static const char locale_strings [] = { "10\0" "11\0" "12\0" - "yy/MM/dd' ('ddd')'\0" - "yy/M/d' ('ddd')'\0" - "yyyy/MM/dd' ('ddd')'\0" "yyyy'\xe5\xb9\xb4'MM'\xe6\x9c\x88'dd'\xe6\x97\xa5'\0" - "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5' dddd\0" - "yyyy'\xe5\xb9\xb4'MM'\xe6\x9c\x88'dd'\xe6\x97\xa5' dddd\0" - "yyyy'\xeb\x85\x84' M'\xec\x9b\x94' d'\xec\x9d\xbc' dddd\0" - "yyyy'\xeb\x85\x84' M'\xec\x9b\x94'\0" + "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5 'dddd\0" + "yyyy'\xe5\xb9\xb4'MM'\xe6\x9c\x88'dd'\xe6\x97\xa5 'dddd\0" + "yyyy'\xe5\xb9\xb4'MMM'\xe6\x9c\x88'd'\xe6\x97\xa5'\0" + "yyyy'\xe5\xb9\xb4'MMM'\xe6\x9c\x88'd'\xe6\x97\xa5 'dddd\0" + "yyyy'\xe5\xb9\xb4'MMMMd'\xe6\x97\xa5'\0" + "yyyy'\xe5\xb9\xb4'MMMMd'\xe6\x97\xa5 'dddd\0" "M'\xec\x9b\x94' d'\xec\x9d\xbc'\0" "\xec\x98\xa4\xec\xa0\x84\0" "\xec\x98\xa4\xed\x9b\x84\0" @@ -2237,12 +2234,17 @@ static const char locale_strings [] = { "10\xec\x9b\x94\0" "11\xec\x9b\x94\0" "12\xec\x9b\x94\0" + "yyyy'\xeb\x85\x84' M'\xec\x9b\x94' d'\xec\x9d\xbc' dddd\0" "yyyy'\xeb\x85\x84' M'\xec\x9b\x94' d'\xec\x9d\xbc'\0" "yy'\xeb\x85\x84' M'\xec\x9b\x94' d'\xec\x9d\xbc' dddd\0" "yy'\xeb\x85\x84' M'\xec\x9b\x94' d'\xec\x9d\xbc'\0" "yyyy'\xeb\x85\x84' MM'\xec\x9b\x94' dd'\xec\x9d\xbc' dddd\0" "yyyy'\xeb\x85\x84' MM'\xec\x9b\x94' dd'\xec\x9d\xbc'\0" - "d-M-yyyy\0" + "yyyy'\xeb\x85\x84 'MMM'\xec\x9b\x94 'd'\xec\x9d\xbc 'dddd\0" + "yyyy'\xeb\x85\x84 'MMM'\xec\x9b\x94 'd'\xec\x9d\xbc'\0" + "yyyy'\xeb\x85\x84 'MMMM d'\xec\x9d\xbc 'dddd\0" + "yyyy'\xeb\x85\x84 'MMMM d'\xec\x9d\xbc'\0" + "yyyy'\xeb\x85\x84' M'\xec\x9b\x94'\0" "a.m.\0" "p.m.\0" "zondag\0" @@ -2265,6 +2267,8 @@ static const char locale_strings [] = { "mei\0" "augustus\0" "mrt\0" + "d-M-yyyy\0" + "dd.MMM.yyyy\0" "HH.mm' uur'\0" "HH:mm' uur'\0" "HH.mm.ss' uur'\0" @@ -2277,8 +2281,17 @@ static const char locale_strings [] = { "fr.\0" "l\xc3\xb8.\0" "des\0" + "d.MM.yyyy\0" + "'kl 'H:mm\0" + "'kl 'HH:mm\0" "'kl 'HH.mm\0" + "'kl 'H.mm\0" + "'kl 'HH:mm:ss\0" + "'kl 'H:mm:ss\0" "'kl 'HH.mm.ss\0" + "'kl 'H.mm.ss\0" + "MMM. yyyy\0" + "MM.yyyy\0" "niedziela\0" "poniedzia\xc5\x82\x65k\0" "wtorek\0" @@ -2351,7 +2364,6 @@ static const char locale_strings [] = { "abr\0" "out\0" "dez\0" - "dddd, 'ils\xe2\x80\x99' d. MMMM, yyyy\0" "am\0" "sm\0" "dumengia\0" @@ -2379,20 +2391,8 @@ static const char locale_strings [] = { "zercl.\0" "fan.\0" "sett.\0" - "dd/M/yy\0" - "HH:mm' Ura'\0" - "H:mm' Ura'\0" - "H' Ura'\0" - "HH.mm' h'\0" - "H.mm' h'\0" - "H' h'\0" - "H' Uhr'\0" - "HHmm\0" + "dddd, 'ils\xe2\x80\x99' d. MMMM, yyyy\0" "HH\0" - "HH:mm:ss' Ura'\0" - "H:mm:ss' Ura'\0" - "HH:mm:ss' h'\0" - "H:mm:ss' h'\0" "duminic\xc4\x83\0" "luni\0" "mar\xc8\x9bi\0" @@ -2419,6 +2419,14 @@ static const char locale_strings [] = { "ian.\0" "iun.\0" "iul.\0" + "dd'/'MM'/'yyyy\0" + "dd'/'MM'/'yy\0" + "yyyy'/'MM'/'dd\0" + "d MMM yyyy\0" + "MMMM yy\0" + "MM.yy\0" + "MM'/'yyyy\0" + "MM'/'yy\0" "\xd0\xb4\xd0\xbe \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x83\xd0\xb4\xd0\xbd\xd1\x8f\0" "\xd0\xbf\xd0\xbe\xd1\x81\xd0\xbb\xd0\xb5 \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x83\xd0\xb4\xd0\xbd\xd1\x8f\0" "\xd0\xb2\xd0\xbe\xd1\x81\xd0\xba\xd1\x80\xd0\xb5\xd1\x81\xd0\xb5\xd0\xbd\xd1\x8c\xd0\xb5\0" @@ -2470,8 +2478,6 @@ static const char locale_strings [] = { "\xd0\x9e\xd0\xba\xd1\x82.\0" "\xd0\x9d\xd0\xbe\xd1\x8f\xd0\xb1.\0" "\xd0\x94\xd0\xb5\xd0\xba.\0" - "d. MMMM yyyy.\0" - "d.M.yyyy.\0" "nedjelja\0" "ponedjeljak\0" "utorak\0" @@ -2521,11 +2527,13 @@ static const char locale_strings [] = { "kol\0" "ruj\0" "stu\0" + "d.M.yyyy.\0" "d.M.yy.\0" "dd.MM.yyyy.\0" "d. M. yy.\0" "dd.MM.yy.\0" "dd. MM. yy.\0" + "d. MMMM yyyy.\0" "dd. MMMM yyyy.\0" "dddd, d. MMMM yyyy.\0" "nede\xc4\xbe\x61\0" @@ -2554,7 +2562,9 @@ static const char locale_strings [] = { "okt\xc3\xb3\x62ra\0" "novembra\0" "decembra\0" - "d. M. yy\0" + "dd. MM. yyyy\0" + "d/MM/yyyy\0" + "dd. MM. yy\0" "paradite\0" "pasdite\0" "e diel\0" @@ -2590,9 +2600,6 @@ static const char locale_strings [] = { "Tet\0" "N\xc3\xabn\0" "Dhj\0" - "h:mm.tt\0" - "h:mm:ss.tt\0" - "'den 'd MMMM yyyy\0" "'den 'd MMMM\0" "FM\0" "EM\0" @@ -2612,14 +2619,11 @@ static const char locale_strings [] = { "Mars\0" "Augusti\0" "augusti\0" + "'den 'd MMMM yyyy\0" "dddd' den 'd MMMM yyyy\0" - "'kl 'H:mm\0" - "'kl 'H:mm:ss\0" - "d MMM yyyy\0" "dd MMM yyyy\0" "ddd d MMMM yyyy\0" "'\xe0\xb8\xa7\xe0\xb8\xb1\xe0\xb8\x99'dddd'\xe0\xb8\x97\xe0\xb8\xb5\xe0\xb9\x88' d MMMM gg yyyy\0" - "d MMMM yyyy dddd\0" "\xc3\x96\xc3\x96\0" "\xc3\x96S\0" "Pazar\0" @@ -2659,6 +2663,7 @@ static const char locale_strings [] = { "Eki\0" "Kas\0" "Ara\0" + "d MMMM yyyy dddd\0" "dd MMMM yyyy dddd\0" "\xd9\x82\xd8\xa8\xd9\x84 \xd8\xaf\xd9\x88\xd9\xbe\xdb\x81\xd8\xb1\0" "\xd8\xa8\xd8\xb9\xd8\xaf \xd8\xaf\xd9\x88\xd9\xbe\xdb\x81\xd8\xb1\0" @@ -2681,6 +2686,7 @@ static const char locale_strings [] = { "\xd8\xa7\xda\xa9\xd8\xaa\xd9\x88\xd8\xa8\xd8\xb1\0" "\xd9\x86\xd9\x88\xd9\x85\xd8\xa8\xd8\xb1\0" "\xd8\xaf\xd8\xb3\xd9\x85\xd8\xa8\xd8\xb1\0" + "dd MMMM, yyyy\0" "Minggu\0" "Senin\0" "Selasa\0" @@ -2702,8 +2708,6 @@ static const char locale_strings [] = { "Desember\0" "Agt\0" "Des\0" - "d MMMM yyyy' \xd1\x80.'\0" - "MMMM yyyy' \xd1\x80.'\0" "\xd0\xb4\xd0\xbf\0" "\xd0\xbf\xd0\xbf\0" "\xd0\xbd\xd0\xb5\xd0\xb4\xd1\x96\xd0\xbb\xd1\x8f\0" @@ -2751,6 +2755,8 @@ static const char locale_strings [] = { "\xd0\x96\xd0\xbe\xd0\xb2\0" "\xd0\x9b\xd0\xb8\xd1\x81\0" "\xd0\x93\xd1\x80\xd1\x83\0" + "d MMMM yyyy' \xd1\x80.'\0" + "MMMM yyyy' \xd1\x80.'\0" "\xd1\x80\xd0\xb0\xd0\xbd\xd1\x96\xd1\x86\xd1\x8b\0" "\xd0\xb2\xd0\xb5\xd1\x87\xd0\xb0\xd1\x80\xd0\xb0\0" "\xd0\xbd\xd1\x8f\xd0\xb4\xd0\xb7\xd0\xb5\xd0\xbb\xd1\x8f\0" @@ -2810,8 +2816,7 @@ static const char locale_strings [] = { "julij\0" "avgust\0" "avg\0" - "dd. MM. yy\0" - "d.MM.yyyy\0" + "d. M. yy\0" "dd. MMMM\0" "e.k.\0" "p.k.\0" @@ -2834,10 +2839,6 @@ static const char locale_strings [] = { "veebr\0" "sept\0" "dets\0" - "d. MMMM yyyy'. a.'\0" - "dd. MMMM yyyy'. a.'\0" - "dddd, yyyy'. gada 'd. MMMM\0" - "yyyy'. gada 'MMMM\0" "priek\xc5\xa1pusdien\xc4\x81\0" "p\xc4\x93\x63pusdien\xc4\x81\0" "sv\xc4\x93tdiena\0" @@ -2885,9 +2886,9 @@ static const char locale_strings [] = { "Aug.\0" "Okt.\0" "Dec.\0" - "yy.MM.dd.\0" - "yyyy 'm.' MMMM d 'd.'\0" - "yyyy 'm.' MMMM\0" + "dd-MM-yyyy.\0" + "dddd, yyyy'. gada 'd. MMMM\0" + "yyyy'. gada 'MMMM\0" "MMMM d 'd.'\0" "pr.p.\0" "sekmadienis\0" @@ -2928,7 +2929,8 @@ static const char locale_strings [] = { "spal.\0" "lapkr.\0" "gruod.\0" - "d MMMM yyyy' \xd1\x81.'\0" + "yyyy 'm.' MMMM d 'd.'\0" + "yyyy 'm.' MMMM\0" "\xd0\xbf\xd0\xb5. \xd1\x87\xd0\xbe.\0" "\xd0\xbf\xd0\xb0. \xd1\x87\xd0\xbe.\0" "\xd0\xaf\xd0\xba\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb5\0" @@ -2963,7 +2965,8 @@ static const char locale_strings [] = { "\xd0\x9e\xd0\xba\xd1\x82\0" "\xd0\x9d\xd0\xbe\xd1\x8f\0" "\xd0\x94\xd0\xb5\xd0\xba\0" - "dddd, dd MMMM yyyy\0" + "d MMMM yyyy' \xd1\x81.'\0" + "dd MMMM yyyy' \xd1\x81.'\0" "\xd9\x82\xd8\xa8\xd9\x84\xe2\x80\x8c\xd8\xa7\xd8\xb2\xd8\xb8\xd9\x87\xd8\xb1\0" "\xd8\xa8\xd8\xb9\xd8\xaf\xd8\xa7\xd8\xb2\xd8\xb8\xd9\x87\xd8\xb1\0" "\xdb\x8c\xda\xa9\xd8\xb4\xd9\x86\xd8\xa8\xd9\x87\0" @@ -2996,6 +2999,7 @@ static const char locale_strings [] = { "\xd9\x81\xd9\x88\xd8\xb1\xdb\x8c\xd9\x87\xd9\x94\0" "\xd9\x85\xd9\x87\xd9\x94\0" "\xda\x98\xd9\x88\xd8\xa6\xdb\x8c\xd9\x87\xd9\x94\0" + "dddd, dd MMMM yyyy\0" "SA\0" "CH\0" "Ch\xe1\xbb\xa7 Nh\xe1\xba\xadt\0" @@ -3054,7 +3058,6 @@ static const char locale_strings [] = { "Thg 10\0" "Thg 11\0" "Thg 12\0" - "d MMMM, yyyy\0" "\xd5\xaf\xd5\xa5\xd5\xbd\xd6\x85\xd6\x80\xd5\xab\xd6\x81 \xd5\xa1\xd5\xbc\xd5\xa1\xd5\xbb\0" "\xd5\xaf\xd5\xa5\xd5\xbd\xd6\x85\xd6\x80\xd5\xab\xd6\x81 \xd5\xb0\xd5\xa5\xd5\xbf\xd5\xb8\0" "\xd5\xaf\xd5\xab\xd6\x80\xd5\xa1\xd5\xaf\xd5\xab\0" @@ -3113,13 +3116,11 @@ static const char locale_strings [] = { "\xd5\xb0\xd5\xaf\xd5\xbf\0" "\xd5\xb6\xd5\xb5\xd5\xb4\0" "\xd5\xa4\xd5\xaf\xd5\xbf\0" - "d/MM/yyyy\0" "d/MMM/yyyy\0" "d-MMM-yyyy\0" "dd-MMM-yyyy\0" "ddd, d-MMMM-yyyy\0" "ddd, dd-MMMM-yyyy\0" - "dd MMMM yyyy'-c\xc3\xbc il'\0" "bazar\0" "bazar ert\xc9\x99si\0" "\xc3\xa7\xc9\x99r\xc5\x9f\xc9\x99nb\xc9\x99 ax\xc5\x9f\x61m\xc4\xb1\0" @@ -3162,8 +3163,7 @@ static const char locale_strings [] = { "sen\0" "noy\0" "dek\0" - "dddd, yyyy'(e)ko' MMMM'ren' d'a'\0" - "yyyy'(e)ko' MMMM\0" + "dd MMMM yyyy'-c\xc3\xbc il'\0" "MMMM'ren' d'a'\0" "igandea\0" "astelehena\0" @@ -3215,7 +3215,8 @@ static const char locale_strings [] = { "urr.\0" "aza.\0" "abe.\0" - "dddd, yyyy.'eko' MMMM'k 'd\0" + "dddd, yyyy'(e)ko' MMMM'ren' d'a'\0" + "yyyy'(e)ko' MMMM\0" "\xd0\xbf\xd1\x80\xd0\xb5\xd1\x82\xd0\xbf\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xbd\xd0\xb5\0" "\xd0\xbf\xd0\xbe\xd0\xbf\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xbd\xd0\xb5\0" "\xd0\xbd\xd0\xb5\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0\0" @@ -3238,6 +3239,7 @@ static const char locale_strings [] = { "\xd0\xbc\xd0\xb0\xd1\x80.\0" "\xd1\x98\xd1\x83\xd0\xbd.\0" "\xd1\x98\xd1\x83\xd0\xbb.\0" + "d. M. yyyy '\xd0\xb3.'\0" "Tshipi\0" "Mosopulogo\0" "Labobedi\0" @@ -3348,7 +3350,6 @@ static const char locale_strings [] = { "Julie\0" "Augustus\0" "yyyy/MMM/dd\0" - "dddd, d MMMM, yyyy '\xe1\x83\xac\xe1\x83\x94\xe1\x83\x9a\xe1\x83\x98'\0" "\xe1\x83\x99\xe1\x83\x95\xe1\x83\x98\xe1\x83\xa0\xe1\x83\x90\0" "\xe1\x83\x9d\xe1\x83\xa0\xe1\x83\xa8\xe1\x83\x90\xe1\x83\x91\xe1\x83\x90\xe1\x83\x97\xe1\x83\x98\0" "\xe1\x83\xa1\xe1\x83\x90\xe1\x83\x9b\xe1\x83\xa8\xe1\x83\x90\xe1\x83\x91\xe1\x83\x90\xe1\x83\x97\xe1\x83\x98\0" @@ -3393,7 +3394,10 @@ static const char locale_strings [] = { "\xe1\x83\x9d\xe1\x83\xa5\xe1\x83\xa2\0" "\xe1\x83\x9c\xe1\x83\x9d\xe1\x83\x94\0" "\xe1\x83\x93\xe1\x83\x94\xe1\x83\x99\0" - "yyyy '\xe1\x83\xac\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1' dd MM, dddd\0" + "dddd, d MMMM, yyyy '\xe1\x83\xac\xe1\x83\x94\xe1\x83\x9a\xe1\x83\x98'\0" + "yyyy '\xe1\x83\xac\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1' d MMMM, dddd\0" + "d MMMM, yyyy '\xe1\x83\xac\xe1\x83\x94\xe1\x83\x9a\xe1\x83\x98', dddd\0" + "d MMM. yyyy\0" "f.p.\0" "s.p.\0" "m\xc3\xa1nadagur\0" @@ -3453,7 +3457,6 @@ static const char locale_strings [] = { "\xe0\xa4\x85\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x82\0" "\xe0\xa4\xa8\xe0\xa4\xb5\xe0\xa4\x82\0" "\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa4\x82\0" - "dddd, d' ta\\' 'MMMM yyyy\0" "d' ta\\' 'MMMM\0" "QN\0" "WN\0" @@ -3493,8 +3496,8 @@ static const char locale_strings [] = { "Ott\0" "Di\xc4\x8b\0" "ddMMyyyy\0" + "dddd, d' ta\\' 'MMMM yyyy\0" "d' ta\\' 'MMMM yyyy\0" - "dddd, MMMM d'. b. 'yyyy\0" "MMMM d'. b.'\0" "i.b.\0" "e.b.\0" @@ -3536,6 +3539,7 @@ static const char locale_strings [] = { "golg\0" "sk\xc3\xa1\x62\0" "juov\0" + "dddd, MMMM d'. b. 'yyyy\0" "MMMM d'. b. 'yyyy\0" "D\xc3\xa9 Domhnaigh\0" "D\xc3\xa9 Luain\0" @@ -3587,7 +3591,6 @@ static const char locale_strings [] = { "Ogos\0" "Disember\0" "Ogo\0" - "d MMMM yyyy '\xd0\xb6.'\0" "\xd1\x82\xd2\xaf\xd1\x81\xd0\xba\xd0\xb5 \xd0\xb4\xd0\xb5\xd0\xb9\xd1\x96\xd0\xbd\0" "\xd1\x82\xd2\xaf\xd1\x81\xd1\x82\xd0\xb5\xd0\xbd \xd0\xba\xd0\xb5\xd0\xb9\xd1\x96\xd0\xbd\0" "\xd0\xb6\xd0\xb5\xd0\xba\xd1\x81\xd0\xb5\xd0\xbd\xd1\x96\0" @@ -3631,10 +3634,8 @@ static const char locale_strings [] = { "\xd2\x9b\xd0\xb0\xd0\xb7.\0" "\xd2\x9b\xd0\xb0\xd1\x80.\0" "\xd0\xb6\xd0\xb5\xd0\xbb\xd1\x82.\0" + "d MMMM yyyy '\xd0\xb6.'\0" "dd MMMM yyyy '\xd0\xb6.'\0" - "dd'-'MMMM yyyy'-\xd0\xb6.'\0" - "d-MMM yy\0" - "MMMM yyyy'-\xd0\xb6.'\0" "d'-'MMMM\0" "\xd1\x82\xd2\xaf\xd1\x88\xd0\xba\xd3\xa9 \xd1\x87\xd0\xb5\xd0\xb9\xd0\xb8\xd0\xbd\xd0\xba\xd0\xb8\0" "\xd1\x82\xd2\xaf\xd1\x88\xd1\x82\xd3\xa9\xd0\xbd \xd0\xba\xd0\xb8\xd0\xb9\xd0\xb8\xd0\xbd\xd0\xba\xd0\xb8\0" @@ -3661,7 +3662,9 @@ static const char locale_strings [] = { "\xd0\xb8\xd1\x8e\xd0\xbb.\0" "\xd1\x81\xd0\xb5\xd0\xbd.\0" "\xd0\xbd\xd0\xbe\xd1\x8f.\0" - "d'-'MMMM yyyy'-\xd0\xb6.'\0" + "d-MMM yy\0" + "dd'-'MMMM yyyy'-\xd0\xb6.'\0" + "MMMM yyyy'-\xd0\xb6.'\0" "MMMM dd\0" "Jumapili\0" "Jumatatu\0" @@ -3683,7 +3686,8 @@ static const char locale_strings [] = { "Oktoba\0" "Desemba\0" "Ago\0" - "yyyy 'yil' d-MMMM\0" + "dddd, MMMM dd, yyyy\0" + "MMMM dd, yyyy\0" "d-MMMM\0" "yakshanba\0" "dushanba\0" @@ -3707,7 +3711,7 @@ static const char locale_strings [] = { "Avg\0" "Noya\0" "Dek\0" - "dd/MM yyyy\0" + "yyyy 'yil' d-MMMM\0" "\xe0\xa6\xaa\xe0\xa7\x82\xe0\xa6\xb0\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb9\xe0\xa7\x8d\xe0\xa6\xa3\0" "\xe0\xa6\x85\xe0\xa6\xaa\xe0\xa6\xb0\xe0\xa6\xbe\xe0\xa6\xb9\xe0\xa7\x8d\xe0\xa6\xa3\0" "\xe0\xa6\xb0\xe0\xa6\xac\xe0\xa6\xbf\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb0\0" @@ -3743,6 +3747,8 @@ static const char locale_strings [] = { "\xe0\xa6\x85\xe0\xa6\x95\xe0\xa7\x8d\xe0\xa6\x9f\xe0\xa7\x8b\xe0\xa6\xac\xe0\xa6\xb0\0" "\xe0\xa6\xa8\xe0\xa6\xad\xe0\xa7\x87\xe0\xa6\xae\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa6\xb0\0" "\xe0\xa6\xa1\xe0\xa6\xbf\xe0\xa6\xb8\xe0\xa7\x87\xe0\xa6\xae\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa6\xb0\0" + "dd'-'MM'-'yy\0" + "dd'-'MM'-'yyyy\0" "tt hh.mm\0" "tt h.mm\0" "tt hh.mm.ss\0" @@ -4019,8 +4025,6 @@ static const char locale_strings [] = { "\xe0\xb4\x92\xe0\xb4\x95\xe0\xb5\x8d\xe0\xb4\x9f\xe0\xb5\x8b\0" "\xe0\xb4\xa8\xe0\xb4\xb5\xe0\xb4\x82\0" "\xe0\xb4\xa1\xe0\xb4\xbf\xe0\xb4\xb8\xe0\xb4\x82\0" - "yyyy,MMMM dd, dddd\0" - "MMMM,yy\0" "\xe0\xa6\xaa\xe0\xa7\x82\xe0\xa7\xb0\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb9\xe0\xa7\x8d\xe0\xa6\xa3\0" "\xe0\xa6\x85\xe0\xa6\xaa\xe0\xa7\xb0\xe0\xa6\xbe\xe0\xa6\xb9\xe0\xa7\x8d\xe0\xa6\xa3\0" "\xe0\xa6\xa6\xe0\xa7\x87\xe0\xa6\x93\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa7\xb0\0" @@ -4049,6 +4053,9 @@ static const char locale_strings [] = { "\xe0\xa6\x85\xe0\xa6\x95\xe0\xa7\x8d\xe0\xa6\x9f\xe0\xa7\x8b\0" "\xe0\xa6\xa8\xe0\xa6\xad\xe0\xa7\x87\0" "\xe0\xa6\xa1\xe0\xa6\xbf\xe0\xa6\xb8\xe0\xa7\x87\0" + "yyyy,MMMM dd, dddd\0" + "MMMM,yy\0" + "MMMM,yyyy\0" "\xe0\xa4\xae\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xb3\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\0" "\xe0\xa4\xae\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xb3\0" "\xe0\xa4\x9c\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x80\0" @@ -4069,8 +4076,6 @@ static const char locale_strings [] = { "\xe0\xa4\x91\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x8b\0" "\xe0\xa4\xa8\xe0\xa5\x8b\xe0\xa4\xb5\xe0\xa5\x8d\xe0\xa4\xb9\xe0\xa5\x87\xe0\xa4\x82\0" "\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\x82\0" - "yyyy '\xd0\xbe\xd0\xbd\xd1\x8b' M'-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\xd1\x8b\xd0\xbd' d. dddd '\xd0\xb3\xd0\xb0\xd1\x80\xd0\xb8\xd0\xb3'.\0" - "yyyy '\xd0\xbe\xd0\xbd\xd1\x8b' MMMM\0" "\xd2\xae\xd3\xa8\0" "\xd2\xae\xd0\xa5\0" "\xd0\xbd\xd1\x8f\xd0\xbc\0" @@ -4111,10 +4116,9 @@ static const char locale_strings [] = { "10-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" "11-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" "12-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" - "yy.MM.dd\0" - "yyyy '\xd0\xbe\xd0\xbd\xd1\x8b' MMMM d\0" - "yyyy'\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3' M'\xe0\xbd\x9a\xe0\xbd\xba\xe0\xbd\xa6' d\0" - "yyyy'\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b' M\0" + "yyyy '\xd0\xbe\xd0\xbd\xd1\x8b' M'-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\xd1\x8b\xd0\xbd' d. dddd '\xd0\xb3\xd0\xb0\xd1\x80\xd0\xb8\xd0\xb3'.\0" + "yyyy \xd0\xbe\xd0\xbd\xd1\x8b MMM d. dddd \xd0\xb3\xd0\xb0\xd1\x80\xd0\xb8\xd0\xb3.\0" + "yyyy '\xd0\xbe\xd0\xbd\xd1\x8b' MMMM\0" "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8bM\xe0\xbd\x9a\xe0\xbd\xba\xe0\xbd\xa6\xe0\xbc\x8b\x64\0" "\xe0\xbd\xa6\xe0\xbe\x94\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbe\xb2\xe0\xbd\xbc\xe0\xbc\x8b\0" "\xe0\xbd\x95\xe0\xbe\xb1\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbe\xb2\xe0\xbd\xbc\xe0\xbc\x8b\0" @@ -4163,7 +4167,11 @@ static const char locale_strings [] = { "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa1\xe0\xbc\xa0\0" "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa1\xe0\xbc\xa1\0" "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa1\xe0\xbc\xa2\0" + "yyyy'\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3' M'\xe0\xbd\x9a\xe0\xbd\xba\xe0\xbd\xa6' d\0" "yyyy'\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3' M'\xe0\xbd\x9a\xe0\xbd\xba\xe0\xbd\xa6' d dddd\0" + "yyyy\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3 MMM d\0" + "yyyy\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3 MMM d dddd\0" + "yyyy'\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b' M\0" "Dydd Sul\0" "Dydd Llun\0" "Dydd Mawrth\0" @@ -4198,7 +4206,6 @@ static const char locale_strings [] = { "Hyd\0" "Tach\0" "Rhag\0" - "'\xe1\x9e\x81\xe1\x9f\x82' MM '\xe1\x9e\x86\xe1\x9f\x92\xe1\x9e\x93\xe1\x9e\xb6\xe1\x9f\x86' yyyy\0" "\xe1\x9e\x96\xe1\x9f\x92\xe1\x9e\x9a\xe1\x9e\xb9\xe1\x9e\x80\0" "\xe1\x9e\x9b\xe1\x9f\x92\xe1\x9e\x84\xe1\x9e\xb6\xe1\x9e\x85\0" "\xe1\x9e\xa2\xe1\x9e\xb6\xe1\x9e\x91\xe1\x9e\xb7\xe1\x9e\x8f\xe1\x9f\x92\xe1\x9e\x99\0" @@ -4220,7 +4227,7 @@ static const char locale_strings [] = { "\xe1\x9e\x8f\xe1\x9e\xbb\xe1\x9e\x9b\xe1\x9e\xb6\0" "\xe1\x9e\x9c\xe1\x9e\xb7\xe1\x9e\x85\xe1\x9f\x92\xe1\x9e\x86\xe1\x9e\xb7\xe1\x9e\x80\xe1\x9e\xb6\0" "\xe1\x9e\x92\xe1\x9f\x92\xe1\x9e\x93\xe1\x9e\xbc\0" - "H:mm tt\0" + "'\xe1\x9e\x81\xe1\x9f\x82' MM '\xe1\x9e\x86\xe1\x9f\x92\xe1\x9e\x93\xe1\x9e\xb6\xe1\x9f\x86' yyyy\0" "\xe0\xba\x81\xe0\xbb\x88\xe0\xba\xad\xe0\xba\x99\xe0\xba\x97\xe0\xbb\x88\xe0\xba\xbd\xe0\xba\x87\0" "\xe0\xba\xab\xe0\xba\xbc\xe0\xba\xb1\xe0\xba\x87\xe0\xba\x97\xe0\xbb\x88\xe0\xba\xbd\xe0\xba\x87\0" "\xe0\xba\xa7\xe0\xba\xb1\xe0\xba\x99\xe0\xba\xad\xe0\xba\xb2\xe0\xba\x97\xe0\xba\xb4\xe0\xba\x94\0" @@ -4261,6 +4268,7 @@ static const char locale_strings [] = { "\xe0\xba\x95.\xe0\xba\xa5.\0" "\xe0\xba\x9e.\xe0\xba\x88.\0" "\xe0\xba\x97.\xe0\xba\xa7.\0" + "dd.M.yyyy\0" "luns\0" "m\xc3\xa9rcores\0" "xoves\0" @@ -4290,6 +4298,9 @@ static const char locale_strings [] = { "Xu\xc3\xb1\0" "Xul\0" "Out\0" + "dddd, dd' de 'MMMM' de 'yyyy\0" + "HH'H'mm'\\''\0" + "HH'H'mm'\\''ss'\\'\\''\0" "\xe0\xa4\xae.\xe0\xa4\xaa\xe0\xa5\x82.\0" "\xe0\xa4\xae.\xe0\xa4\xa8\xe0\xa4\x82.\0" "\xe0\xa4\x86\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xa4\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\0" @@ -4297,8 +4308,6 @@ static const char locale_strings [] = { "\xe0\xa4\x93\xe0\xa4\x97\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\x9f\0" "\xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x87\xe0\xa4\x82\xe0\xa4\xac\xe0\xa4\xb0\0" "\xe0\xa4\x93\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x8b\xe0\xa4\xac\xe0\xa4\xb0\0" - "yyyy MMMM' \xe0\xb6\xb8\xe0\xb7\x83 'dd' \xe0\xb7\x80\xe0\xb7\x90\xe0\xb6\xb1\xe0\xb7\x92\xe0\xb6\xaf\xe0\xb7\x8f 'dddd\0" - "yyyy MMMM\0" "\xe0\xb6\xb4\xe0\xb7\x99.\xe0\xb7\x80.\0" "\xe0\xb6\xb4.\xe0\xb7\x80.\0" "\xe0\xb6\x89\xe0\xb6\xbb\xe0\xb7\x92\xe0\xb6\xaf\xe0\xb7\x8f\0" @@ -4339,7 +4348,8 @@ static const char locale_strings [] = { "\xe0\xb6\x94\xe0\xb6\x9a\xe0\xb7\x8a\0" "\xe0\xb6\xb1\xe0\xb7\x9c\xe0\xb7\x80\xe0\xb7\x90\0" "\xe0\xb6\xaf\xe0\xb7\x99\xe0\xb7\x83\xe0\xb7\x90\0" - "dddd '\xe1\x8d\xa3' MMMM d '\xe1\x89\x80\xe1\x8a\x95' yyyy\0" + "yyyy MMMM' \xe0\xb6\xb8\xe0\xb7\x83 'dd' \xe0\xb7\x80\xe0\xb7\x90\xe0\xb6\xb1\xe0\xb7\x92\xe0\xb6\xaf\xe0\xb7\x8f 'dddd\0" + "yyyy MMMM\0" "MMMM d' \xe1\x89\x80\xe1\x8a\x95'\0" "\xe1\x8c\xa5\xe1\x8b\x8b\xe1\x89\xb5\0" "\xe1\x8a\xa8\xe1\x88\xb0\xe1\x8b\x93\xe1\x89\xb5\0" @@ -4379,6 +4389,7 @@ static const char locale_strings [] = { "\xe1\x8a\xa6\xe1\x8a\xad\xe1\x89\xb6\0" "\xe1\x8a\x96\xe1\x89\xac\xe1\x88\x9d\0" "\xe1\x8b\xb2\xe1\x88\xb4\xe1\x88\x9d\0" + "dddd '\xe1\x8d\xa3' MMMM d '\xe1\x89\x80\xe1\x8a\x95' yyyy\0" "Zdat azal\0" "\xe1\xb8\x8c\x65\x66\x66ir aza\0" "Asamas\0" @@ -4416,8 +4427,6 @@ static const char locale_strings [] = { "K\xe1\xb9\xadu\0" "Nwa\0" "Duj\0" - "hh:mm\0" - "MMMM,yyyy\0" "\xe0\xa4\xaa\xe0\xa5\x82\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xb5 \xe0\xa4\xae\xe0\xa4\xa7\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xb9\0" "\xe0\xa4\x89\xe0\xa4\xa4\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xb0 \xe0\xa4\xae\xe0\xa4\xa7\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xb9\0" "\xe0\xa4\x86\xe0\xa4\x87\xe0\xa4\xa4\xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xb0\0" @@ -4441,7 +4450,6 @@ static const char locale_strings [] = { "\xe0\xa4\x85\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x8b\xe0\xa4\xac\xe0\xa4\xb0\0" "\xe0\xa4\xa8\xe0\xa5\x8b\xe0\xa4\xad\xe0\xa5\x87\xe0\xa4\xae\xe0\xa5\x8d\xe0\xa4\xac\xe0\xa4\xb0\0" "\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\xae\xe0\xa5\x8d\xe0\xa4\xac\xe0\xa4\xb0\0" - "yyyy, dd, MMMM, dddd\0" "\xd9\x88\xd8\xb1\xdb\x8c\0" "\xd8\xba\xd9\x88\xdb\x8c\xdb\x8c\0" "\xd8\xba\xd8\xa8\xd8\xb1\xda\xab\xd9\x88\xd9\x84\xdb\x8c\0" @@ -4454,7 +4462,8 @@ static const char locale_strings [] = { "\xd9\x85\xd8\xb1\xd8\xba\xd9\x88\xd9\x85\xdb\x8c\0" "\xd8\xb3\xd9\x84\xd9\x88\xd8\xa7\xd8\xba\xd9\x87\0" "\xda\xa9\xd8\xa8\0" - "dd/MM/yyyy '\xd9\x87\xd9\x80'\0" + "yyyy, dd, MMMM, dddd\0" + "yyyy, dd, MMMM\0" "MM/dd\0" "Linggo\0" "Lunes\0" @@ -4564,7 +4573,6 @@ static const char locale_strings [] = { "Disemere\0" "Apo\0" "Nof\0" - "MMMM d'.-at, 'yyyy\0" "MMMM d'.-at'\0" "u.t.\0" "u.k.\0" @@ -4588,6 +4596,7 @@ static const char locale_strings [] = { "oktoberi\0" "novemberi\0" "decemberi\0" + "MMMM d'.-at, 'yyyy\0" "A.M.\0" "P.M.\0" "Mb\xe1\xbb\x8ds\xe1\xbb\x8b \xe1\xbb\xa4ka\0" @@ -4617,8 +4626,6 @@ static const char locale_strings [] = { "Juu\0" "\xe1\xbb\x8cg\xe1\xbb\x8d\0" "\xe1\xbb\x8ckt\0" - "yyyy'\xea\x88\x8e' M'\xea\x86\xaa' d'\xea\x91\x8d'\0" - "yyyy'\xea\x88\x8e' M'\xea\x86\xaa'\0" "M'\xe2\x80\x99 \xea\x86\xaa\xe2\x80\x99'd'\xe2\x80\x99 \xea\x91\x8d\xe2\x80\x99'\0" "\xea\x8e\xb8\xea\x84\x91\0" "\xea\x81\xaf\xea\x8b\x92\0" @@ -4655,8 +4662,12 @@ static const char locale_strings [] = { "\xea\x8a\xb0\xea\x86\xaa\0" "\xea\x8a\xb0\xea\x8a\xaa\xea\x86\xaa\0" "\xea\x8a\xb0\xea\x91\x8b\xea\x86\xaa\0" + "yyyy'\xea\x88\x8e' M'\xea\x86\xaa' d'\xea\x91\x8d'\0" "dddd, yyyy'\xea\x88\x8e' M'\xea\x86\xaa' d'\xea\x91\x8d'\0" "yyyy'\xea\x88\x8e' M'\xea\x86\xaa' d'\xea\x91\x8d', dddd\0" + "yyyy\xea\x88\x8e MMM d\xea\x91\x8d\0" + "dddd, yyyy\xea\x88\x8e MMM d\xea\x91\x8d\0" + "yyyy'\xea\x88\x8e' M'\xea\x86\xaa'\0" "Meurzh\0" "Merc\xca\xbcher\0" "Yaou\0" @@ -4712,8 +4723,6 @@ static const char locale_strings [] = { "Oktoober\0" "Nov\xc3\xa4mber\0" "Dez\xc3\xa4mber\0" - "dddd, yyyy '\xd1\x81.' MMMM d '\xd0\xba\xd2\xaf\xd0\xbd\xd1\x8d'\0" - "yyyy '\xd1\x81.' MMMM\0" "MMMM d '\xd0\xba\xd2\xaf\xd0\xbd\xd1\x8d'\0" "\xd0\xad\xd0\x98\0" "\xd0\xad\xd0\x9a\0" @@ -4755,12 +4764,12 @@ static const char locale_strings [] = { "\xd0\x90\xd0\xbb\xd1\x82\0" "\xd0\xa1\xd1\x8d\xd1\x82\0" "\xd0\x90\xd1\x85\xd1\x81\0" - "MM.dd.yyyy\0" - "MM.dd.yy\0" - "MM-dd-yyyy\0" - "MMMM d yyyy '\xd1\x81.'\0" - "MMMM dd yyyy '\xd1\x81.'\0" - "d ' ' MMMM ' ' yyyy\0" + "yyyy MM d\0" + "dd yyyy MM d\0" + "dddd, yyyy '\xd1\x81.' MMMM d '\xd0\xba\xd2\xaf\xd0\xbd\xd1\x8d'\0" + "yyyy '\xd1\x81.' MMMM d '\xd0\xba\xd2\xaf\xd0\xbd\xd1\x8d'\0" + "dddd, MMMM d '\xd0\xba\xd2\xaf\xd0\xbd\xd1\x8d' yyyy '\xd1\x81.'\0" + "yyyy '\xd1\x81.' MMMM\0" "Ku cyumweru\0" "Kuwa mbere\0" "Kuwa kabiri\0" @@ -4798,6 +4807,7 @@ static const char locale_strings [] = { "ukw.\0" "ugu.\0" "uku.\0" + "d ' ' MMMM ' ' yyyy\0" "m\0" "f\0" "DiD\xc3\xb2mhnaich\0" @@ -4844,6 +4854,7 @@ static const char locale_strings [] = { "\xe9\x80\xb1\xe5\x9b\x9b\0" "\xe9\x80\xb1\xe4\xba\x94\0" "\xe9\x80\xb1\xe5\x85\xad\0" + "dddd yyyy\xe5\xb9\xb4MMMd\xe6\x97\xa5\0" "\xd9\x83\xd8\xa7\xd9\x86\xd9\x88\xd9\x86 \xd8\xa7\xd9\x84\xd8\xab\xd8\xa7\xd9\x86\xd9\x8a\0" "\xd8\xb4\xd8\xa8\xd8\xa7\xd8\xb7\0" "\xd8\xa2\xd8\xb0\xd8\xa7\xd8\xb1\0" @@ -4858,6 +4869,16 @@ static const char locale_strings [] = { "\xd9\x83\xd8\xa7\xd9\x86\xd9\x88\xd9\x86 \xd8\xa7\xd9\x84\xd8\xa3\xd9\x88\xd9\x84\0" "dd. M. yy\0" "d. MMM yy\0" + "H.mm' h'\0" + "HH.mm' h'\0" + "H.mm' Uhr'\0" + "HHmm\0" + "H' h'\0" + "H' Uhr'\0" + "HH:mm:ss' h'\0" + "H:mm:ss' h'\0" + "H:mm:ss' Uhr'\0" + "HHmmss\0" "dom.\0" "mi\xc3\xa9.\0" "jue.\0" @@ -4881,9 +4902,7 @@ static const char locale_strings [] = { "Junho\0" "Julho\0" "Dezembro\0" - "d/MMM/yy\0" - "d.MMM.yy\0" - "HH'H'mm'm'\0" + "yy.MM.dd\0" "\xd0\xb1\xd0\xb0\xd0\xb7\xd0\xb0\xd1\x80\0" "\xd0\xb1\xd0\xb0\xd0\xb7\xd0\xb0\xd1\x80 \xd0\xb5\xd1\x80\xd1\x82\xd3\x99\xd1\x81\xd0\xb8\0" "\xd1\x87\xd3\x99\xd1\x80\xd1\x88\xd3\x99\xd0\xbd\xd0\xb1\xd3\x99 \xd0\xb0\xd1\x85\xd1\x88\xd0\xb0\xd0\xbc\xd1\x8b\0" @@ -4900,7 +4919,6 @@ static const char locale_strings [] = { "\xd0\xbe\xd0\xba\xd1\x82\xd1\x98\xd0\xb0\xd0\xb1\xd1\x80\0" "\xd0\xbd\xd0\xbe\xd1\x98\xd0\xb0\xd0\xb1\xd1\x80\0" "\xd0\xb4\xd0\xb5\xd0\xba\xd0\xb0\xd0\xb1\xd1\x80\0" - "yyyy '\xd0\xb9\xd0\xb8\xd0\xbb' d-MMMM\0" "\xd1\x8f\xd0\xba\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb0\0" "\xd0\xb4\xd1\x83\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb0\0" "\xd1\x81\xd0\xb5\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb0\0" @@ -4915,15 +4933,14 @@ static const char locale_strings [] = { "\xd0\x9f\xd0\xb0\xd0\xb9\0" "\xd0\xa8\xd0\xb0\xd0\xbd\0" "\xd0\xaf\0" - "dddd, dd. MMMM yyyy\0" + "dd/MM yyyy\0" + "yyyy '\xd0\xb9\xd0\xb8\xd0\xbb' d-MMMM\0" "J\xc3\xa4nner\0" "J\xc3\xa4n\0" - "dd.M.yyyy\0" + "dd.MMM.yy\0" + "dddd, dd. MMMM yyyy\0" "d.MMMM yyyy\0" - "d.MMMyyyy\0" - "HH:mm' Uhr'\0" "H:mm' Uhr'\0" - "dddd', 'MMMM d'. b. 'yyyy\0" "aejlege\0" "m\xc3\xa5\x61nta\0" "d\xc3\xa4jsta\0" @@ -4943,8 +4960,10 @@ static const char locale_strings [] = { "golggot\0" "sk\xc3\xa1\x62ma\0" "juovla\0" + "dddd', 'MMMM d'. b. 'yyyy\0" "dddd' den 'd'.' MMMM yyyy\0" - "MMMM d, yyyy\0" + "d'.' MMMM yyyy\0" + "d'. 'MMM yyyy\0" "M/dd/yy\0" "MMMM-dd-yy\0" "\xd8\xac\xd8\xa7\xd9\x86\xd9\x81\xd9\x8a\0" @@ -4960,6 +4979,8 @@ static const char locale_strings [] = { "\xd8\xaf\xd9\x8a\xd8\xb3\xd9\x85\xd8\xa8\xd8\xb1\0" "dddd yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0" "dddd yyyy MM dd\0" + "d. MMM yyyy\0" + "d/MMM/yy\0" "dddd', le 'd MMMM yyyy\0" "pre podne\0" "popodne\0" @@ -4967,6 +4988,7 @@ static const char locale_strings [] = { "oktobar\0" "novembar\0" "decembar\0" + "d. M. yy\0" "\xd9\x8a\xd9\x86\xd8\xa7\xd9\x8a\xd8\xb1\0" "\xd9\x81\xd8\xa8\xd8\xb1\xd8\xa7\xd9\x8a\xd8\xb1\0" "\xd8\xa3\xd8\xa8\xd8\xb1\xd9\x8a\xd9\x84\0" @@ -4976,8 +4998,8 @@ static const char locale_strings [] = { "\xd8\xb4\xd8\xaa\xd9\x86\xd8\xa8\xd8\xb1\0" "\xd9\x86\xd9\x88\xd9\x86\xd8\xa8\xd8\xb1\0" "\xd8\xaf\xd8\xac\xd9\x86\xd8\xa8\xd8\xb1\0" - "MMMM yyyy.\0" "ponedeljak\0" + "MMMM yyyy.\0" "\xd0\xbf\xd1\x80\xd0\xb5 \xd0\xbf\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xb5\0" "\xd0\xbf\xd0\xbe\xd0\xbf\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xb5\0" "\xd0\xbd\xd0\xb5\xd0\xb4\xd0\xb5\xd1\x99\xd0\xb0\0" @@ -5014,8 +5036,9 @@ static const char locale_strings [] = { "\xd1\x81\xd1\x80\xd0\xb5\0" "dd' de 'MMMM\0" "MMMM/yyyy\0" + "yyyy-MM-dd.\0" "d' de 'MMM\0" - "dddd, d MMMM, yyyy\0" + "MM-dd-yyyy\0" "MMMM' del 'yyyy\0" ",\0" "\xd9\xab\0" diff --git a/mta-mono/vendor/mono/metadata/culture-info.h b/mta-mono/vendor/mono/metadata/culture-info.h index 5ee2eaf..67640e3 100644 --- a/mta-mono/vendor/mono/metadata/culture-info.h +++ b/mta-mono/vendor/mono/metadata/culture-info.h @@ -11,9 +11,10 @@ #define NUM_CALENDARS 4 #define NUM_SHORT_DATE_PATTERNS 14 -#define NUM_LONG_DATE_PATTERNS 8 +#define NUM_LONG_DATE_PATTERNS 10 #define NUM_SHORT_TIME_PATTERNS 12 #define NUM_LONG_TIME_PATTERNS 9 +#define NUM_YEAR_MONTH_PATTERNS 8 #define idx2string(idx) (locale_strings + (idx)) @@ -21,13 +22,7 @@ typedef guint16 stridx_t; typedef struct { - const stridx_t long_date_pattern; - const stridx_t short_date_pattern; - const stridx_t long_time_pattern; - const stridx_t short_time_pattern; - const stridx_t year_month_pattern; const stridx_t month_day_pattern; - const stridx_t am_designator; const stridx_t pm_designator; @@ -49,6 +44,7 @@ typedef struct { const stridx_t long_date_patterns [NUM_LONG_DATE_PATTERNS]; const stridx_t short_time_patterns [NUM_SHORT_TIME_PATTERNS]; const stridx_t long_time_patterns [NUM_LONG_TIME_PATTERNS]; + const stridx_t year_month_patterns [NUM_YEAR_MONTH_PATTERNS]; } DateTimeFormatEntry; typedef struct { diff --git a/mta-mono/vendor/mono/metadata/debug-mono-symfile.c b/mta-mono/vendor/mono/metadata/debug-mono-symfile.c index 79f6cda..0a98906 100644 --- a/mta-mono/vendor/mono/metadata/debug-mono-symfile.c +++ b/mta-mono/vendor/mono/metadata/debug-mono-symfile.c @@ -411,13 +411,12 @@ mono_debug_symfile_lookup_location (MonoDebugMethodInfo *minfo, uint32_t offset) } static void -add_line (StatementMachine *stm, GPtrArray *il_offset_array, GPtrArray *line_number_array, GPtrArray *source_file_array) +add_line (StatementMachine *stm, GPtrArray *il_offset_array, GPtrArray *line_number_array, GPtrArray *source_file_array, GPtrArray *hidden_array) { - if (stm->line > 0) { - g_ptr_array_add (il_offset_array, GUINT_TO_POINTER (stm->offset)); - g_ptr_array_add (line_number_array, GUINT_TO_POINTER (stm->line)); - g_ptr_array_add (source_file_array, GUINT_TO_POINTER (stm->file)); - } + g_ptr_array_add (il_offset_array, GUINT_TO_POINTER (stm->offset)); + g_ptr_array_add (line_number_array, GUINT_TO_POINTER (stm->line)); + g_ptr_array_add (source_file_array, GUINT_TO_POINTER (stm->file)); + g_ptr_array_add (hidden_array, GUINT_TO_POINTER (stm->is_hidden || stm->line <= 0)); if (!stm->is_hidden && !stm->first_file) stm->first_file = stm->file; @@ -514,9 +513,9 @@ mono_debug_symfile_get_line_numbers_full (MonoDebugMethodInfo *minfo, char **sou MonoSymbolFile *symfile; const unsigned char *ptr; StatementMachine stm; - uint32_t i; + uint32_t i, j; LineNumberTableFlags flags; - GPtrArray *il_offset_array, *line_number_array, *source_file_array; + GPtrArray *il_offset_array, *line_number_array, *source_file_array, *hidden_array; gboolean has_column_info, has_end_info; gboolean column_info_read = FALSE; @@ -549,6 +548,7 @@ mono_debug_symfile_get_line_numbers_full (MonoDebugMethodInfo *minfo, char **sou il_offset_array = g_ptr_array_new (); line_number_array = g_ptr_array_new (); source_file_array = g_ptr_array_new (); + hidden_array = g_ptr_array_new(); stm.line_base = read32 (&symfile->offset_table->_line_number_table_line_base); stm.line_range = read32 (&symfile->offset_table->_line_number_table_line_range); @@ -596,7 +596,7 @@ mono_debug_symfile_get_line_numbers_full (MonoDebugMethodInfo *minfo, char **sou } else if (opcode < stm.opcode_base) { switch (opcode) { case DW_LNS_copy: - add_line (&stm, il_offset_array, line_number_array, source_file_array); + add_line (&stm, il_offset_array, line_number_array, source_file_array, hidden_array); break; case DW_LNS_advance_pc: stm.offset += read_leb128 (ptr, &ptr); @@ -620,7 +620,7 @@ mono_debug_symfile_get_line_numbers_full (MonoDebugMethodInfo *minfo, char **sou stm.offset += opcode / stm.line_range; stm.line += stm.line_base + (opcode % stm.line_range); - add_line (&stm, il_offset_array, line_number_array, source_file_array); + add_line (&stm, il_offset_array, line_number_array, source_file_array, hidden_array); } } @@ -662,32 +662,49 @@ mono_debug_symfile_get_line_numbers_full (MonoDebugMethodInfo *minfo, char **sou } } - if (n_il_offsets) + if (n_il_offsets) { *n_il_offsets = il_offset_array->len; + for (i = 0; i < il_offset_array->len; i++) { + if (GPOINTER_TO_UINT (g_ptr_array_index (hidden_array, i))) { + (*n_il_offsets)--; + } + } + } if (il_offsets && line_numbers) { - *il_offsets = g_malloc (il_offset_array->len * sizeof (int)); - *line_numbers = g_malloc (il_offset_array->len * sizeof (int)); + *il_offsets = g_malloc (*n_il_offsets * sizeof (int)); + *line_numbers = g_malloc (*n_il_offsets * sizeof (int)); + j = 0; for (i = 0; i < il_offset_array->len; ++i) { - (*il_offsets) [i] = GPOINTER_TO_UINT (g_ptr_array_index (il_offset_array, i)); - (*line_numbers) [i] = GPOINTER_TO_UINT (g_ptr_array_index (line_number_array, i)); + if (!GPOINTER_TO_UINT (g_ptr_array_index (hidden_array, i))) { + (*il_offsets)[j] = GPOINTER_TO_UINT (g_ptr_array_index (il_offset_array, i)); + (*line_numbers)[j] = GPOINTER_TO_UINT (g_ptr_array_index (line_number_array, i)); + j++; + } } } if (column_numbers && has_column_info) { column_info_read = TRUE; - *column_numbers = g_malloc (il_offset_array->len * sizeof (int)); - for (i = 0; i < il_offset_array->len; ++i) - (*column_numbers) [i] = read_leb128 (ptr, &ptr); + *column_numbers = g_malloc (*n_il_offsets * sizeof (int)); + j = 0; + for (i = 0; i < il_offset_array->len; ++i) { + int column = read_leb128 (ptr, &ptr); + if (!GPOINTER_TO_UINT (g_ptr_array_index (hidden_array, i))) { + (*column_numbers) [j] = column; + j++; + } + } } if (has_end_info && end_line_numbers) { g_assert (end_column_numbers); - *end_line_numbers = g_malloc (il_offset_array->len * sizeof (int)); - *end_column_numbers = g_malloc (il_offset_array->len * sizeof (int)); + *end_line_numbers = g_malloc (*n_il_offsets * sizeof (int)); + *end_column_numbers = g_malloc (*n_il_offsets * sizeof (int)); if (has_column_info && !column_info_read) { for (i = 0; i < il_offset_array->len; ++i) read_leb128 (ptr, &ptr); } + j = 0; for (i = 0; i < il_offset_array->len; ++i) { int end_row, end_column = -1; @@ -695,14 +712,18 @@ mono_debug_symfile_get_line_numbers_full (MonoDebugMethodInfo *minfo, char **sou if (end_row != 0xffffff) { end_row += GPOINTER_TO_UINT (g_ptr_array_index (line_number_array, i)); end_column = read_leb128 (ptr, &ptr); - (*end_line_numbers) [i] = end_row; - (*end_column_numbers) [i] = end_column; + if (!GPOINTER_TO_UINT (g_ptr_array_index (hidden_array, i))) { + (*end_line_numbers)[j] = end_row; + (*end_column_numbers)[j] = end_column; + j++; + } } } } g_ptr_array_free (il_offset_array, TRUE); g_ptr_array_free (line_number_array, TRUE); + g_ptr_array_free (hidden_array, TRUE); mono_debugger_unlock (); return; diff --git a/mta-mono/vendor/mono/metadata/debug-mono-symfile.h b/mta-mono/vendor/mono/metadata/debug-mono-symfile.h index 9decc58..6d9a3c2 100644 --- a/mta-mono/vendor/mono/metadata/debug-mono-symfile.h +++ b/mta-mono/vendor/mono/metadata/debug-mono-symfile.h @@ -161,6 +161,9 @@ mono_debug_symfile_get_line_numbers (MonoDebugMethodInfo *minfo, char **source_f MONO_API void mono_debug_symfile_get_line_numbers_full (MonoDebugMethodInfo *minfo, char **source_file, GPtrArray **source_file_list, int *n_il_offsets, int **il_offsets, int **line_numbers, int **column_numbers, int **source_files, int **end_line_numbers, int **end_column_numbers); +gboolean +mono_debug_image_has_debug_info (MonoImage *image); + MONO_END_DECLS #endif /* __MONO_SYMFILE_H__ */ diff --git a/mta-mono/vendor/mono/metadata/decimal-ms.c b/mta-mono/vendor/mono/metadata/decimal-ms.c new file mode 100644 index 0000000..798a10d --- /dev/null +++ b/mta-mono/vendor/mono/metadata/decimal-ms.c @@ -0,0 +1,3149 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// +// Copyright 2015 Xamarin Inc +// +// File: decimal.c +// +// Ported from C++ to C and adjusted to Mono runtime +// +// Pending: +// DoToCurrency (they look like new methods we do not have) +// +#ifndef DISABLE_DECIMAL +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_MEMORY_H +#include +#endif +#ifdef _MSC_VER +#include +#endif +#include "decimal-ms.h" + +#define min(a, b) (((a) < (b)) ? (a) : (b)) + +typedef enum { + MONO_DECIMAL_OK, + MONO_DECIMAL_OVERFLOW, + MONO_DECIMAL_INVALID_ARGUMENT, + MONO_DECIMAL_DIVBYZERO, + MONO_DECIMAL_ARGUMENT_OUT_OF_RANGE +} MonoDecimalStatus; + +#ifndef FC_GC_POLL +# define FC_GC_POLL() +#endif + +static const uint32_t ten_to_nine = 1000000000U; +static const uint32_t ten_to_ten_div_4 = 2500000000U; +#define POWER10_MAX 9 +#define DECIMAL_NEG ((uint8_t)0x80) +#define DECMAX 28 +#define DECIMAL_SCALE(dec) ((dec).u.u.scale) +#define DECIMAL_SIGN(dec) ((dec).u.u.sign) +#define DECIMAL_SIGNSCALE(dec) ((dec).u.signscale) +#define DECIMAL_LO32(dec) ((dec).v.v.Lo32) +#define DECIMAL_MID32(dec) ((dec).v.v.Mid32) +#define DECIMAL_HI32(dec) ((dec).Hi32) +#define DECIMAL_LO64_GET(dec) ((dec).v.Lo64) +#define DECIMAL_LO64_SET(dec,value) {(dec).v.Lo64 = value; } + +#define DECIMAL_SETZERO(dec) {DECIMAL_LO32(dec) = 0; DECIMAL_MID32(dec) = 0; DECIMAL_HI32(dec) = 0; DECIMAL_SIGNSCALE(dec) = 0;} +#define COPYDEC(dest, src) {DECIMAL_SIGNSCALE(dest) = DECIMAL_SIGNSCALE(src); DECIMAL_HI32(dest) = DECIMAL_HI32(src); \ + DECIMAL_MID32(dest) = DECIMAL_MID32(src); DECIMAL_LO32(dest) = DECIMAL_LO32(src); } + +#define DEC_SCALE_MAX 28 +#define POWER10_MAX 9 + +#define OVFL_MAX_9_HI 4 +#define OVFL_MAX_9_MID 1266874889 +#define OVFL_MAX_9_LO 3047500985u + +#define OVFL_MAX_5_HI 42949 +#define OVFL_MAX_5_MID 2890341191 + +#define OVFL_MAX_1_HI 429496729 + +typedef union { + uint64_t int64; + struct { +#if BYTE_ORDER == G_BIG_ENDIAN + uint32_t Hi; + uint32_t Lo; +#else + uint32_t Lo; + uint32_t Hi; +#endif + } u; +} SPLIT64; + +static const SPLIT64 ten_to_eighteen = { 1000000000000000000ULL }; +// Double Bias +#define DBLBIAS 1022 + +// Structure to access an encoded double floating point +typedef union{ + struct { +#if BYTE_ORDER == G_BIG_ENDIAN + unsigned int sign:1; + unsigned int exp:11; + unsigned int mantHi:20; + unsigned int mantLo; +#else // BIGENDIAN + unsigned int mantLo; + unsigned int mantHi:20; + unsigned int exp:11; + unsigned int sign:1; +#endif + } u; + double dbl; +} DoubleStructure; + +#if BYTE_ORDER == G_BIG_ENDIAN +#define DEFDS(Lo, Hi, exp, sign) { {sign, exp, Hi, Lo } } +#else +#define DEFDS(Lo, Hi, exp, sign) { {Lo, Hi, exp, sign} } +#endif + +const DoubleStructure ds2to64 = DEFDS(0, 0, DBLBIAS + 65, 0); + +// Single floating point Bias +#define SNGBIAS 126 + +// Structure to access an encoded single floating point +typedef struct { +#if BYTE_ORDER == G_BIG_ENDIAN + unsigned int sign:1; + unsigned int exp:8; + unsigned int mant:23; +#else + unsigned int mant:23; + unsigned int exp:8; + unsigned int sign:1; +#endif +} SingleStructure; + +// +// Data tables +// + +static const uint32_t power10 [POWER10_MAX+1] = { + 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 +}; + + +static const double double_power10[] = { + 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, + 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, + 1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39, + 1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47, 1e48, 1e49, + 1e50, 1e51, 1e52, 1e53, 1e54, 1e55, 1e56, 1e57, 1e58, 1e59, + 1e60, 1e61, 1e62, 1e63, 1e64, 1e65, 1e66, 1e67, 1e68, 1e69, + 1e70, 1e71, 1e72, 1e73, 1e74, 1e75, 1e76, 1e77, 1e78, 1e79, + 1e80 }; + +const SPLIT64 sdl_power10[] = { {10000000000ULL}, // 1E10 + {100000000000ULL}, // 1E11 + {1000000000000ULL}, // 1E12 + {10000000000000ULL}, // 1E13 + {100000000000000ULL} }; // 1E14 + +static const uint64_t long_power10[] = { + 1, + 10ULL, + 100ULL, + 1000ULL, + 10000ULL, + 100000ULL, + 1000000ULL, + 10000000ULL, + 100000000ULL, + 1000000000ULL, + 10000000000ULL, + 100000000000ULL, + 1000000000000ULL, + 10000000000000ULL, + 100000000000000ULL, + 1000000000000000ULL, + 10000000000000000ULL, + 100000000000000000ULL, + 1000000000000000000ULL, + 10000000000000000000ULL}; + +typedef struct { + uint32_t Hi, Mid, Lo; +} DECOVFL; + +const DECOVFL power_overflow[] = { +// This is a table of the largest values that can be in the upper two +// ULONGs of a 96-bit number that will not overflow when multiplied +// by a given power. For the upper word, this is a table of +// 2^32 / 10^n for 1 <= n <= 9. For the lower word, this is the +// remaining fraction part * 2^32. 2^32 = 4294967296. +// + { 429496729u, 2576980377u, 2576980377u }, // 10^1 remainder 0.6 + { 42949672u, 4123168604u, 687194767u }, // 10^2 remainder 0.16 + { 4294967u, 1271310319u, 2645699854u }, // 10^3 remainder 0.616 + { 429496u, 3133608139u, 694066715u }, // 10^4 remainder 0.1616 + { 42949u, 2890341191u, 2216890319u }, // 10^5 remainder 0.51616 + { 4294u, 4154504685u, 2369172679u }, // 10^6 remainder 0.551616 + { 429u, 2133437386u, 4102387834u }, // 10^7 remainder 0.9551616 + { 42u, 4078814305u, 410238783u }, // 10^8 remainder 0.09991616 + { 4u, 1266874889u, 3047500985u }, // 10^9 remainder 0.709551616 +}; + + +#define UInt32x32To64(a, b) ((uint64_t)((uint32_t)(a)) * (uint64_t)((uint32_t)(b))) +#define Div64by32(num, den) ((uint32_t)((uint64_t)(num) / (uint32_t)(den))) +#define Mod64by32(num, den) ((uint32_t)((uint64_t)(num) % (uint32_t)(den))) + +static double +fnDblPower10(int ix) +{ + const int maxIx = (sizeof(double_power10)/sizeof(double_power10[0])); + g_assert(ix >= 0); + if (ix < maxIx) + return double_power10[ix]; + return pow(10.0, ix); +} // double fnDblPower10() + + +static inline int64_t +DivMod32by32(int32_t num, int32_t den) +{ + SPLIT64 sdl; + + sdl.u.Lo = num / den; + sdl.u.Hi = num % den; + return sdl.int64; +} + +static inline int64_t +DivMod64by32(int64_t num, int32_t den) +{ + SPLIT64 sdl; + + sdl.u.Lo = Div64by32(num, den); + sdl.u.Hi = Mod64by32(num, den); + return sdl.int64; +} + +static uint64_t +UInt64x64To128(SPLIT64 op1, SPLIT64 op2, uint64_t *hi) +{ + SPLIT64 tmp1; + SPLIT64 tmp2; + SPLIT64 tmp3; + + tmp1.int64 = UInt32x32To64(op1.u.Lo, op2.u.Lo); // lo partial prod + tmp2.int64 = UInt32x32To64(op1.u.Lo, op2.u.Hi); // mid 1 partial prod + tmp1.u.Hi += tmp2.u.Lo; + if (tmp1.u.Hi < tmp2.u.Lo) // test for carry + tmp2.u.Hi++; + tmp3.int64 = UInt32x32To64(op1.u.Hi, op2.u.Hi) + (uint64_t)tmp2.u.Hi; + tmp2.int64 = UInt32x32To64(op1.u.Hi, op2.u.Lo); + tmp1.u.Hi += tmp2.u.Lo; + if (tmp1.u.Hi < tmp2.u.Lo) // test for carry + tmp2.u.Hi++; + tmp3.int64 += (uint64_t)tmp2.u.Hi; + + *hi = tmp3.int64; + return tmp1.int64; +} + +/** +* FullDiv64By32: +* +* Entry: +* pdlNum - Pointer to 64-bit dividend +* ulDen - 32-bit divisor +* +* Purpose: +* Do full divide, yielding 64-bit result and 32-bit remainder. +* +* Exit: +* Quotient overwrites dividend. +* Returns remainder. +* +* Exceptions: +* None. +*/ +// Was: FullDiv64By32 +static uint32_t +FullDiv64By32 (uint64_t *num, uint32_t den) +{ + SPLIT64 tmp; + SPLIT64 res; + + tmp.int64 = *num; + res.u.Hi = 0; + + if (tmp.u.Hi >= den) { + // DivMod64by32 returns quotient in Lo, remainder in Hi. + // + res.u.Lo = tmp.u.Hi; + res.int64 = DivMod64by32(res.int64, den); + tmp.u.Hi = res.u.Hi; + res.u.Hi = res.u.Lo; + } + + tmp.int64 = DivMod64by32(tmp.int64, den); + res.u.Lo = tmp.u.Lo; + *num = res.int64; + return tmp.u.Hi; +} + +/*** + * SearchScale + * + * Entry: + * res_hi - Top uint32_t of quotient + * res_mid - Middle uint32_t of quotient + * res_lo - Bottom uint32_t of quotient + * scale - Scale factor of quotient, range -DEC_SCALE_MAX to DEC_SCALE_MAX + * + * Purpose: + * Determine the max power of 10, <= 9, that the quotient can be scaled + * up by and still fit in 96 bits. + * + * Exit: + * Returns power of 10 to scale by, -1 if overflow error. + * + ***********************************************************************/ + +static int +SearchScale(uint32_t res_hi, uint32_t res_mid, uint32_t res_lo, int scale) +{ + int cur_scale; + + // Quick check to stop us from trying to scale any more. + // + if (res_hi > OVFL_MAX_1_HI || scale >= DEC_SCALE_MAX) { + cur_scale = 0; + goto HaveScale; + } + + if (scale > DEC_SCALE_MAX - 9) { + // We can't scale by 10^9 without exceeding the max scale factor. + // See if we can scale to the max. If not, we'll fall into + // standard search for scale factor. + // + cur_scale = DEC_SCALE_MAX - scale; + if (res_hi < power_overflow[cur_scale - 1].Hi) + goto HaveScale; + + if (res_hi == power_overflow[cur_scale - 1].Hi) { + UpperEq: + if (res_mid > power_overflow[cur_scale - 1].Mid || + (res_mid == power_overflow[cur_scale - 1].Mid && res_lo > power_overflow[cur_scale - 1].Lo)) { + cur_scale--; + } + goto HaveScale; + } + } else if (res_hi < OVFL_MAX_9_HI || (res_hi == OVFL_MAX_9_HI && res_mid < OVFL_MAX_9_MID) || (res_hi == OVFL_MAX_9_HI && res_mid == OVFL_MAX_9_MID && res_lo <= OVFL_MAX_9_LO)) + return 9; + + // Search for a power to scale by < 9. Do a binary search + // on power_overflow[]. + // + cur_scale = 5; + if (res_hi < OVFL_MAX_5_HI) + cur_scale = 7; + else if (res_hi > OVFL_MAX_5_HI) + cur_scale = 3; + else + goto UpperEq; + + // cur_scale is 3 or 7. + // + if (res_hi < power_overflow[cur_scale - 1].Hi) + cur_scale++; + else if (res_hi > power_overflow[cur_scale - 1].Hi) + cur_scale--; + else + goto UpperEq; + + // cur_scale is 2, 4, 6, or 8. + // + // In all cases, we already found we could not use the power one larger. + // So if we can use this power, it is the biggest, and we're done. If + // we can't use this power, the one below it is correct for all cases + // unless it's 10^1 -- we might have to go to 10^0 (no scaling). + // + if (res_hi > power_overflow[cur_scale - 1].Hi) + cur_scale--; + + if (res_hi == power_overflow[cur_scale - 1].Hi) + goto UpperEq; + +HaveScale: + // cur_scale = largest power of 10 we can scale by without overflow, + // cur_scale < 9. See if this is enough to make scale factor + // positive if it isn't already. + // + if (cur_scale + scale < 0) + cur_scale = -1; + + return cur_scale; +} + + +/** +* Div96By32 +* +* Entry: +* rgulNum - Pointer to 96-bit dividend as array of uint32_ts, least-sig first +* ulDen - 32-bit divisor. +* +* Purpose: +* Do full divide, yielding 96-bit result and 32-bit remainder. +* +* Exit: +* Quotient overwrites dividend. +* Returns remainder. +* +* Exceptions: +* None. +* +*/ +static uint32_t +Div96By32(uint32_t *num, uint32_t den) +{ + SPLIT64 tmp; + + tmp.u.Hi = 0; + + if (num[2] != 0) + goto Div3Word; + + if (num[1] >= den) + goto Div2Word; + + tmp.u.Hi = num[1]; + num[1] = 0; + goto Div1Word; + +Div3Word: + tmp.u.Lo = num[2]; + tmp.int64 = DivMod64by32(tmp.int64, den); + num[2] = tmp.u.Lo; +Div2Word: + tmp.u.Lo = num[1]; + tmp.int64 = DivMod64by32(tmp.int64, den); + num[1] = tmp.u.Lo; +Div1Word: + tmp.u.Lo = num[0]; + tmp.int64 = DivMod64by32(tmp.int64, den); + num[0] = tmp.u.Lo; + return tmp.u.Hi; +} + +/*** + * DecFixInt + * + * Entry: + * pdecRes - Pointer to Decimal result location + * operand - Pointer to Decimal operand + * + * Purpose: + * Chop the value to integer. Return remainder so Int() function + * can round down if non-zero. + * + * Exit: + * Returns remainder. + * + * Exceptions: + * None. + * + ***********************************************************************/ + +static uint32_t +DecFixInt(MonoDecimal * result, MonoDecimal * operand) +{ + uint32_t num[3]; + uint32_t rem; + uint32_t pwr; + int scale; + + if (operand->u.u.scale > 0) { + num[0] = operand->v.v.Lo32; + num[1] = operand->v.v.Mid32; + num[2] = operand->Hi32; + scale = operand->u.u.scale; + result->u.u.sign = operand->u.u.sign; + rem = 0; + + do { + if (scale > POWER10_MAX) + pwr = ten_to_nine; + else + pwr = power10[scale]; + + rem |= Div96By32(num, pwr); + scale -= 9; + }while (scale > 0); + + result->v.v.Lo32 = num[0]; + result->v.v.Mid32 = num[1]; + result->Hi32 = num[2]; + result->u.u.scale = 0; + + return rem; + } + + COPYDEC(*result, *operand); + // Odd, the Microsoft code does not set result->reserved to zero on this case + return 0; +} + +/** + * ScaleResult: + * + * Entry: + * res - Array of uint32_ts with value, least-significant first. + * hi_res - Index of last non-zero value in res. + * scale - Scale factor for this value, range 0 - 2 * DEC_SCALE_MAX + * + * Purpose: + * See if we need to scale the result to fit it in 96 bits. + * Perform needed scaling. Adjust scale factor accordingly. + * + * Exit: + * res updated in place, always 3 uint32_ts. + * New scale factor returned, -1 if overflow error. + * + */ +static int +ScaleResult(uint32_t *res, int hi_res, int scale) +{ + int new_scale; + int cur; + uint32_t pwr; + uint32_t tmp; + uint32_t sticky; + SPLIT64 sdlTmp; + + // See if we need to scale the result. The combined scale must + // be <= DEC_SCALE_MAX and the upper 96 bits must be zero. + // + // Start by figuring a lower bound on the scaling needed to make + // the upper 96 bits zero. hi_res is the index into res[] + // of the highest non-zero uint32_t. + // + new_scale = hi_res * 32 - 64 - 1; + if (new_scale > 0) { + + // Find the MSB. + // + tmp = res[hi_res]; + if (!(tmp & 0xFFFF0000)) { + new_scale -= 16; + tmp <<= 16; + } + if (!(tmp & 0xFF000000)) { + new_scale -= 8; + tmp <<= 8; + } + if (!(tmp & 0xF0000000)) { + new_scale -= 4; + tmp <<= 4; + } + if (!(tmp & 0xC0000000)) { + new_scale -= 2; + tmp <<= 2; + } + if (!(tmp & 0x80000000)) { + new_scale--; + tmp <<= 1; + } + + // Multiply bit position by log10(2) to figure it's power of 10. + // We scale the log by 256. log(2) = .30103, * 256 = 77. Doing this + // with a multiply saves a 96-byte lookup table. The power returned + // is <= the power of the number, so we must add one power of 10 + // to make it's integer part zero after dividing by 256. + // + // Note: the result of this multiplication by an approximation of + // log10(2) have been exhaustively checked to verify it gives the + // correct result. (There were only 95 to check...) + // + new_scale = ((new_scale * 77) >> 8) + 1; + + // new_scale = min scale factor to make high 96 bits zero, 0 - 29. + // This reduces the scale factor of the result. If it exceeds the + // current scale of the result, we'll overflow. + // + if (new_scale > scale) + return -1; + } + else + new_scale = 0; + + // Make sure we scale by enough to bring the current scale factor + // into valid range. + // + if (new_scale < scale - DEC_SCALE_MAX) + new_scale = scale - DEC_SCALE_MAX; + + if (new_scale != 0) { + // Scale by the power of 10 given by new_scale. Note that this is + // NOT guaranteed to bring the number within 96 bits -- it could + // be 1 power of 10 short. + // + scale -= new_scale; + sticky = 0; + sdlTmp.u.Hi = 0; // initialize remainder + + for (;;) { + + sticky |= sdlTmp.u.Hi; // record remainder as sticky bit + + if (new_scale > POWER10_MAX) + pwr = ten_to_nine; + else + pwr = power10[new_scale]; + + // Compute first quotient. + // DivMod64by32 returns quotient in Lo, remainder in Hi. + // + sdlTmp.int64 = DivMod64by32(res[hi_res], pwr); + res[hi_res] = sdlTmp.u.Lo; + cur = hi_res - 1; + + if (cur >= 0) { + // If first quotient was 0, update hi_res. + // + if (sdlTmp.u.Lo == 0) + hi_res--; + + // Compute subsequent quotients. + // + do { + sdlTmp.u.Lo = res[cur]; + sdlTmp.int64 = DivMod64by32(sdlTmp.int64, pwr); + res[cur] = sdlTmp.u.Lo; + cur--; + } while (cur >= 0); + + } + + new_scale -= POWER10_MAX; + if (new_scale > 0) + continue; // scale some more + + // If we scaled enough, hi_res would be 2 or less. If not, + // divide by 10 more. + // + if (hi_res > 2) { + new_scale = 1; + scale--; + continue; // scale by 10 + } + + // Round final result. See if remainder >= 1/2 of divisor. + // If remainder == 1/2 divisor, round up if odd or sticky bit set. + // + pwr >>= 1; // power of 10 always even + if ( pwr <= sdlTmp.u.Hi && (pwr < sdlTmp.u.Hi || + ((res[0] & 1) | sticky)) ) { + cur = -1; + while (++res[++cur] == 0); + + if (cur > 2) { + // The rounding caused us to carry beyond 96 bits. + // Scale by 10 more. + // + hi_res = cur; + sticky = 0; // no sticky bit + sdlTmp.u.Hi = 0; // or remainder + new_scale = 1; + scale--; + continue; // scale by 10 + } + } + + // We may have scaled it more than we planned. Make sure the scale + // factor hasn't gone negative, indicating overflow. + // + if (scale < 0) + return -1; + + return scale; + } // for(;;) + } + return scale; +} + +// Decimal multiply +// Returns: MONO_DECIMAL_OVERFLOW or MONO_DECIMAL_OK +static MonoDecimalStatus +MONO_VarDecMul(MonoDecimal * left, MonoDecimal * right, MonoDecimal * result) +{ + SPLIT64 tmp; + SPLIT64 tmp2; + SPLIT64 tmp3; + int scale; + int hi_prod; + uint32_t pwr; + uint32_t rem_lo; + uint32_t rem_hi; + uint32_t prod[6]; + + scale = left->u.u.scale + right->u.u.scale; + + if ((left->Hi32 | left->v.v.Mid32 | right->Hi32 | right->v.v.Mid32) == 0) { + // Upper 64 bits are zero. + // + tmp.int64 = UInt32x32To64(left->v.v.Lo32, right->v.v.Lo32); + if (scale > DEC_SCALE_MAX) + { + // Result scale is too big. Divide result by power of 10 to reduce it. + // If the amount to divide by is > 19 the result is guaranteed + // less than 1/2. [max value in 64 bits = 1.84E19] + // + scale -= DEC_SCALE_MAX; + if (scale > 19) { + ReturnZero: + DECIMAL_SETZERO(*result); + return MONO_DECIMAL_OK; + } + + if (scale > POWER10_MAX) { + // Divide by 1E10 first, to get the power down to a 32-bit quantity. + // 1E10 itself doesn't fit in 32 bits, so we'll divide by 2.5E9 now + // then multiply the next divisor by 4 (which will be a max of 4E9). + // + rem_lo = FullDiv64By32(&tmp.int64, ten_to_ten_div_4); + pwr = power10[scale - 10] << 2; + } else { + pwr = power10[scale]; + rem_lo = 0; + } + + // Power to divide by fits in 32 bits. + // + rem_hi = FullDiv64By32(&tmp.int64, pwr); + + // Round result. See if remainder >= 1/2 of divisor. + // Divisor is a power of 10, so it is always even. + // + pwr >>= 1; + if (rem_hi >= pwr && (rem_hi > pwr || (rem_lo | (tmp.u.Lo & 1)))) + tmp.int64++; + + scale = DEC_SCALE_MAX; + } + DECIMAL_LO32(*result) = tmp.u.Lo; + DECIMAL_MID32(*result) = tmp.u.Hi; + DECIMAL_HI32(*result) = 0; + } else { + // At least one operand has bits set in the upper 64 bits. + // + // Compute and accumulate the 9 partial products into a + // 192-bit (24-byte) result. + // + // [l-h][l-m][l-l] left high, middle, low + // x [r-h][r-m][r-l] right high, middle, low + // ------------------------------ + // + // [0-h][0-l] l-l * r-l + // [1ah][1al] l-l * r-m + // [1bh][1bl] l-m * r-l + // [2ah][2al] l-m * r-m + // [2bh][2bl] l-l * r-h + // [2ch][2cl] l-h * r-l + // [3ah][3al] l-m * r-h + // [3bh][3bl] l-h * r-m + // [4-h][4-l] l-h * r-h + // ------------------------------ + // [p-5][p-4][p-3][p-2][p-1][p-0] prod[] array + // + tmp.int64 = UInt32x32To64(left->v.v.Lo32, right->v.v.Lo32); + prod[0] = tmp.u.Lo; + + tmp2.int64 = UInt32x32To64(left->v.v.Lo32, right->v.v.Mid32) + tmp.u.Hi; + + tmp.int64 = UInt32x32To64(left->v.v.Mid32, right->v.v.Lo32); + tmp.int64 += tmp2.int64; // this could generate carry + prod[1] = tmp.u.Lo; + if (tmp.int64 < tmp2.int64) // detect carry + tmp2.u.Hi = 1; + else + tmp2.u.Hi = 0; + tmp2.u.Lo = tmp.u.Hi; + + tmp.int64 = UInt32x32To64(left->v.v.Mid32, right->v.v.Mid32) + tmp2.int64; + + if (left->Hi32 | right->Hi32) { + // Highest 32 bits is non-zero. Calculate 5 more partial products. + // + tmp2.int64 = UInt32x32To64(left->v.v.Lo32, right->Hi32); + tmp.int64 += tmp2.int64; // this could generate carry + if (tmp.int64 < tmp2.int64) // detect carry + tmp3.u.Hi = 1; + else + tmp3.u.Hi = 0; + + tmp2.int64 = UInt32x32To64(left->Hi32, right->v.v.Lo32); + tmp.int64 += tmp2.int64; // this could generate carry + prod[2] = tmp.u.Lo; + if (tmp.int64 < tmp2.int64) // detect carry + tmp3.u.Hi++; + tmp3.u.Lo = tmp.u.Hi; + + tmp.int64 = UInt32x32To64(left->v.v.Mid32, right->Hi32); + tmp.int64 += tmp3.int64; // this could generate carry + if (tmp.int64 < tmp3.int64) // detect carry + tmp3.u.Hi = 1; + else + tmp3.u.Hi = 0; + + tmp2.int64 = UInt32x32To64(left->Hi32, right->v.v.Mid32); + tmp.int64 += tmp2.int64; // this could generate carry + prod[3] = tmp.u.Lo; + if (tmp.int64 < tmp2.int64) // detect carry + tmp3.u.Hi++; + tmp3.u.Lo = tmp.u.Hi; + + tmp.int64 = UInt32x32To64(left->Hi32, right->Hi32) + tmp3.int64; + prod[4] = tmp.u.Lo; + prod[5] = tmp.u.Hi; + + hi_prod = 5; + } + else { + prod[2] = tmp.u.Lo; + prod[3] = tmp.u.Hi; + hi_prod = 3; + } + + // Check for leading zero uint32_ts on the product + // + while (prod[hi_prod] == 0) { + hi_prod--; + if (hi_prod < 0) + goto ReturnZero; + } + + scale = ScaleResult(prod, hi_prod, scale); + if (scale == -1) + return MONO_DECIMAL_OVERFLOW; + + result->v.v.Lo32 = prod[0]; + result->v.v.Mid32 = prod[1]; + result->Hi32 = prod[2]; + } + + result->u.u.sign = right->u.u.sign ^ left->u.u.sign; + result->u.u.scale = (char)scale; + return MONO_DECIMAL_OK; +} + +// Addition and subtraction +static MonoDecimalStatus +DecAddSub(MonoDecimal *left, MonoDecimal *right, MonoDecimal *result, int8_t sign) +{ + uint32_t num[6]; + uint32_t pwr; + int scale; + int hi_prod; + int cur; + SPLIT64 tmp; + MonoDecimal decRes; + MonoDecimal decTmp; + MonoDecimal *pdecTmp; + + sign ^= (right->u.u.sign ^ left->u.u.sign) & DECIMAL_NEG; + + if (right->u.u.scale == left->u.u.scale) { + // Scale factors are equal, no alignment necessary. + // + decRes.u.signscale = left->u.signscale; + + AlignedAdd: + if (sign) { + // Signs differ - subtract + // + DECIMAL_LO64_SET(decRes, DECIMAL_LO64_GET(*left) - DECIMAL_LO64_GET(*right)); + DECIMAL_HI32(decRes) = DECIMAL_HI32(*left) - DECIMAL_HI32(*right); + + // Propagate carry + // + if (DECIMAL_LO64_GET(decRes) > DECIMAL_LO64_GET(*left)) { + decRes.Hi32--; + if (decRes.Hi32 >= left->Hi32) + goto SignFlip; + } else if (decRes.Hi32 > left->Hi32) { + // Got negative result. Flip its sign. + // + SignFlip: + DECIMAL_LO64_SET(decRes, -(uint64_t)DECIMAL_LO64_GET(decRes)); + decRes.Hi32 = ~decRes.Hi32; + if (DECIMAL_LO64_GET(decRes) == 0) + decRes.Hi32++; + decRes.u.u.sign ^= DECIMAL_NEG; + } + + } else { + // Signs are the same - add + // + DECIMAL_LO64_SET(decRes, DECIMAL_LO64_GET(*left) + DECIMAL_LO64_GET(*right)); + decRes.Hi32 = left->Hi32 + right->Hi32; + + // Propagate carry + // + if (DECIMAL_LO64_GET(decRes) < DECIMAL_LO64_GET(*left)) { + decRes.Hi32++; + if (decRes.Hi32 <= left->Hi32) + goto AlignedScale; + } else if (decRes.Hi32 < left->Hi32) { + AlignedScale: + // The addition carried above 96 bits. Divide the result by 10, + // dropping the scale factor. + // + if (decRes.u.u.scale == 0) + return MONO_DECIMAL_OVERFLOW; + decRes.u.u.scale--; + + tmp.u.Lo = decRes.Hi32; + tmp.u.Hi = 1; + tmp.int64 = DivMod64by32(tmp.int64, 10); + decRes.Hi32 = tmp.u.Lo; + + tmp.u.Lo = decRes.v.v.Mid32; + tmp.int64 = DivMod64by32(tmp.int64, 10); + decRes.v.v.Mid32 = tmp.u.Lo; + + tmp.u.Lo = decRes.v.v.Lo32; + tmp.int64 = DivMod64by32(tmp.int64, 10); + decRes.v.v.Lo32 = tmp.u.Lo; + + // See if we need to round up. + // + if (tmp.u.Hi >= 5 && (tmp.u.Hi > 5 || (decRes.v.v.Lo32 & 1))) { + DECIMAL_LO64_SET(decRes, DECIMAL_LO64_GET(decRes)+1) + if (DECIMAL_LO64_GET(decRes) == 0) + decRes.Hi32++; + } + } + } + } + else { + // Scale factors are not equal. Assume that a larger scale + // factor (more decimal places) is likely to mean that number + // is smaller. Start by guessing that the right operand has + // the larger scale factor. The result will have the larger + // scale factor. + // + decRes.u.u.scale = right->u.u.scale; // scale factor of "smaller" + decRes.u.u.sign = left->u.u.sign; // but sign of "larger" + scale = decRes.u.u.scale - left->u.u.scale; + + if (scale < 0) { + // Guessed scale factor wrong. Swap operands. + // + scale = -scale; + decRes.u.u.scale = left->u.u.scale; + decRes.u.u.sign ^= sign; + pdecTmp = right; + right = left; + left = pdecTmp; + } + + // *left will need to be multiplied by 10^scale so + // it will have the same scale as *right. We could be + // extending it to up to 192 bits of precision. + // + if (scale <= POWER10_MAX) { + // Scaling won't make it larger than 4 uint32_ts + // + pwr = power10[scale]; + DECIMAL_LO64_SET(decTmp, UInt32x32To64(left->v.v.Lo32, pwr)); + tmp.int64 = UInt32x32To64(left->v.v.Mid32, pwr); + tmp.int64 += decTmp.v.v.Mid32; + decTmp.v.v.Mid32 = tmp.u.Lo; + decTmp.Hi32 = tmp.u.Hi; + tmp.int64 = UInt32x32To64(left->Hi32, pwr); + tmp.int64 += decTmp.Hi32; + if (tmp.u.Hi == 0) { + // Result fits in 96 bits. Use standard aligned add. + // + decTmp.Hi32 = tmp.u.Lo; + left = &decTmp; + goto AlignedAdd; + } + num[0] = decTmp.v.v.Lo32; + num[1] = decTmp.v.v.Mid32; + num[2] = tmp.u.Lo; + num[3] = tmp.u.Hi; + hi_prod = 3; + } + else { + // Have to scale by a bunch. Move the number to a buffer + // where it has room to grow as it's scaled. + // + num[0] = left->v.v.Lo32; + num[1] = left->v.v.Mid32; + num[2] = left->Hi32; + hi_prod = 2; + + // Scan for zeros in the upper words. + // + if (num[2] == 0) { + hi_prod = 1; + if (num[1] == 0) { + hi_prod = 0; + if (num[0] == 0) { + // Left arg is zero, return right. + // + DECIMAL_LO64_SET(decRes, DECIMAL_LO64_GET(*right)); + decRes.Hi32 = right->Hi32; + decRes.u.u.sign ^= sign; + goto RetDec; + } + } + } + + // Scaling loop, up to 10^9 at a time. hi_prod stays updated + // with index of highest non-zero uint32_t. + // + for (; scale > 0; scale -= POWER10_MAX) { + if (scale > POWER10_MAX) + pwr = ten_to_nine; + else + pwr = power10[scale]; + + tmp.u.Hi = 0; + for (cur = 0; cur <= hi_prod; cur++) { + tmp.int64 = UInt32x32To64(num[cur], pwr) + tmp.u.Hi; + num[cur] = tmp.u.Lo; + } + + if (tmp.u.Hi != 0) + // We're extending the result by another uint32_t. + num[++hi_prod] = tmp.u.Hi; + } + } + + // Scaling complete, do the add. Could be subtract if signs differ. + // + tmp.u.Lo = num[0]; + tmp.u.Hi = num[1]; + + if (sign) { + // Signs differ, subtract. + // + DECIMAL_LO64_SET(decRes, tmp.int64 - DECIMAL_LO64_GET(*right)); + decRes.Hi32 = num[2] - right->Hi32; + + // Propagate carry + // + if (DECIMAL_LO64_GET(decRes) > tmp.int64) { + decRes.Hi32--; + if (decRes.Hi32 >= num[2]) + goto LongSub; + } + else if (decRes.Hi32 > num[2]) { + LongSub: + // If num has more than 96 bits of precision, then we need to + // carry the subtraction into the higher bits. If it doesn't, + // then we subtracted in the wrong order and have to flip the + // sign of the result. + // + if (hi_prod <= 2) + goto SignFlip; + + cur = 3; + while(num[cur++]-- == 0); + if (num[hi_prod] == 0) + hi_prod--; + } + } + else { + // Signs the same, add. + // + DECIMAL_LO64_SET(decRes, tmp.int64 + DECIMAL_LO64_GET(*right)); + decRes.Hi32 = num[2] + right->Hi32; + + // Propagate carry + // + if (DECIMAL_LO64_GET(decRes) < tmp.int64) { + decRes.Hi32++; + if (decRes.Hi32 <= num[2]) + goto LongAdd; + } + else if (decRes.Hi32 < num[2]) { + LongAdd: + // Had a carry above 96 bits. + // + cur = 3; + do { + if (hi_prod < cur) { + num[cur] = 1; + hi_prod = cur; + break; + } + }while (++num[cur++] == 0); + } + } + + if (hi_prod > 2) { + num[0] = decRes.v.v.Lo32; + num[1] = decRes.v.v.Mid32; + num[2] = decRes.Hi32; + decRes.u.u.scale = ScaleResult(num, hi_prod, decRes.u.u.scale); + if (decRes.u.u.scale == (uint8_t) -1) + return MONO_DECIMAL_OVERFLOW; + + decRes.v.v.Lo32 = num[0]; + decRes.v.v.Mid32 = num[1]; + decRes.Hi32 = num[2]; + } + } + +RetDec: + COPYDEC(*result, decRes); + // Odd, the Microsoft code does not set result->reserved to zero on this case + return MONO_DECIMAL_OK; +} + +// Decimal addition +static MonoDecimalStatus +MONO_VarDecAdd(MonoDecimal *left, MonoDecimal *right, MonoDecimal *result) +{ + return DecAddSub (left, right, result, 0); +} + +// Decimal subtraction +static MonoDecimalStatus +MONO_VarDecSub(MonoDecimal *left, MonoDecimal *right, MonoDecimal *result) +{ + return DecAddSub (left, right, result, DECIMAL_NEG); +} + +/** + * IncreaseScale: + * + * Entry: + * num - Pointer to 96-bit number as array of uint32_ts, least-sig first + * pwr - Scale factor to multiply by + * + * Purpose: + * Multiply the two numbers. The low 96 bits of the result overwrite + * the input. The last 32 bits of the product are the return value. + * + * Exit: + * Returns highest 32 bits of product. + * + * Exceptions: + * None. + * + */ +static uint32_t +IncreaseScale(uint32_t *num, uint32_t pwr) +{ + SPLIT64 sdlTmp; + + sdlTmp.int64 = UInt32x32To64(num[0], pwr); + num[0] = sdlTmp.u.Lo; + sdlTmp.int64 = UInt32x32To64(num[1], pwr) + sdlTmp.u.Hi; + num[1] = sdlTmp.u.Lo; + sdlTmp.int64 = UInt32x32To64(num[2], pwr) + sdlTmp.u.Hi; + num[2] = sdlTmp.u.Lo; + return sdlTmp.u.Hi; +} + +/** + * Div96By64: + * + * Entry: + * rgulNum - Pointer to 96-bit dividend as array of uint32_ts, least-sig first + * sdlDen - 64-bit divisor. + * + * Purpose: + * Do partial divide, yielding 32-bit result and 64-bit remainder. + * Divisor must be larger than upper 64 bits of dividend. + * + * Exit: + * Remainder overwrites lower 64-bits of dividend. + * Returns quotient. + * + * Exceptions: + * None. + * + */ +static uint32_t +Div96By64(uint32_t *num, SPLIT64 den) +{ + SPLIT64 quo; + SPLIT64 sdlNum; + SPLIT64 prod; + + sdlNum.u.Lo = num[0]; + + if (num[2] >= den.u.Hi) { + // Divide would overflow. Assume a quotient of 2^32, and set + // up remainder accordingly. Then jump to loop which reduces + // the quotient. + // + sdlNum.u.Hi = num[1] - den.u.Lo; + quo.u.Lo = 0; + goto NegRem; + } + + // Hardware divide won't overflow + // + if (num[2] == 0 && num[1] < den.u.Hi) + // Result is zero. Entire dividend is remainder. + // + return 0; + + // DivMod64by32 returns quotient in Lo, remainder in Hi. + // + quo.u.Lo = num[1]; + quo.u.Hi = num[2]; + quo.int64 = DivMod64by32(quo.int64, den.u.Hi); + sdlNum.u.Hi = quo.u.Hi; // remainder + + // Compute full remainder, rem = dividend - (quo * divisor). + // + prod.int64 = UInt32x32To64(quo.u.Lo, den.u.Lo); // quo * lo divisor + sdlNum.int64 -= prod.int64; + + if (sdlNum.int64 > ~prod.int64) { + NegRem: + // Remainder went negative. Add divisor back in until it's positive, + // a max of 2 times. + // + do { + quo.u.Lo--; + sdlNum.int64 += den.int64; + }while (sdlNum.int64 >= den.int64); + } + + num[0] = sdlNum.u.Lo; + num[1] = sdlNum.u.Hi; + return quo.u.Lo; +} + +/*** +* Div128By96 +* +* Entry: +* rgulNum - Pointer to 128-bit dividend as array of uint32_ts, least-sig first +* den - Pointer to 96-bit divisor. +* +* Purpose: +* Do partial divide, yielding 32-bit result and 96-bit remainder. +* Top divisor uint32_t must be larger than top dividend uint32_t. This is +* assured in the initial call because the divisor is normalized +* and the dividend can't be. In subsequent calls, the remainder +* is multiplied by 10^9 (max), so it can be no more than 1/4 of +* the divisor which is effectively multiplied by 2^32 (4 * 10^9). +* +* Exit: +* Remainder overwrites lower 96-bits of dividend. +* Returns quotient. +* +* Exceptions: +* None. +* +***********************************************************************/ + +static uint32_t +Div128By96(uint32_t *num, uint32_t *den) +{ + SPLIT64 sdlQuo; + SPLIT64 sdlNum; + SPLIT64 sdlProd1; + SPLIT64 sdlProd2; + + sdlNum.u.Lo = num[0]; + sdlNum.u.Hi = num[1]; + + if (num[3] == 0 && num[2] < den[2]){ + // Result is zero. Entire dividend is remainder. + // + return 0; + } + + // DivMod64by32 returns quotient in Lo, remainder in Hi. + // + sdlQuo.u.Lo = num[2]; + sdlQuo.u.Hi = num[3]; + sdlQuo.int64 = DivMod64by32(sdlQuo.int64, den[2]); + + // Compute full remainder, rem = dividend - (quo * divisor). + // + sdlProd1.int64 = UInt32x32To64(sdlQuo.u.Lo, den[0]); // quo * lo divisor + sdlProd2.int64 = UInt32x32To64(sdlQuo.u.Lo, den[1]); // quo * mid divisor + sdlProd2.int64 += sdlProd1.u.Hi; + sdlProd1.u.Hi = sdlProd2.u.Lo; + + sdlNum.int64 -= sdlProd1.int64; + num[2] = sdlQuo.u.Hi - sdlProd2.u.Hi; // sdlQuo.Hi is remainder + + // Propagate carries + // + if (sdlNum.int64 > ~sdlProd1.int64) { + num[2]--; + if (num[2] >= ~sdlProd2.u.Hi) + goto NegRem; + } else if (num[2] > ~sdlProd2.u.Hi) { + NegRem: + // Remainder went negative. Add divisor back in until it's positive, + // a max of 2 times. + // + sdlProd1.u.Lo = den[0]; + sdlProd1.u.Hi = den[1]; + + for (;;) { + sdlQuo.u.Lo--; + sdlNum.int64 += sdlProd1.int64; + num[2] += den[2]; + + if (sdlNum.int64 < sdlProd1.int64) { + // Detected carry. Check for carry out of top + // before adding it in. + // + if (num[2]++ < den[2]) + break; + } + if (num[2] < den[2]) + break; // detected carry + } + } + + num[0] = sdlNum.u.Lo; + num[1] = sdlNum.u.Hi; + return sdlQuo.u.Lo; +} + +// Add a 32 bit unsigned long to an array of 3 unsigned longs representing a 96 integer +// Returns FALSE if there is an overflow +static gboolean +Add32To96(uint32_t *num, uint32_t value) +{ + num[0] += value; + if (num[0] < value) { + if (++num[1] == 0) { + if (++num[2] == 0) { + return FALSE; + } + } + } + return TRUE; +} + +static void +OverflowUnscale (uint32_t *quo, gboolean remainder) +{ + SPLIT64 sdlTmp; + + // We have overflown, so load the high bit with a one. + sdlTmp.u.Hi = 1u; + sdlTmp.u.Lo = quo[2]; + sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10u); + quo[2] = sdlTmp.u.Lo; + sdlTmp.u.Lo = quo[1]; + sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10u); + quo[1] = sdlTmp.u.Lo; + sdlTmp.u.Lo = quo[0]; + sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10u); + quo[0] = sdlTmp.u.Lo; + // The remainder is the last digit that does not fit, so we can use it to work out if we need to round up + if ((sdlTmp.u.Hi > 5) || ((sdlTmp.u.Hi == 5) && ( remainder || (quo[0] & 1)))) { + Add32To96(quo, 1u); + } +} + +// MONO_VarDecDiv - Decimal divide +static MonoDecimalStatus +MONO_VarDecDiv(MonoDecimal *left, MonoDecimal *right, MonoDecimal *result) +{ + uint32_t quo[3]; + uint32_t quoSave[3]; + uint32_t rem[4]; + uint32_t divisor[3]; + uint32_t pwr; + uint32_t utmp; + uint32_t utmp1; + SPLIT64 sdlTmp; + SPLIT64 sdlDivisor; + int scale; + int cur_scale; + + scale = left->u.u.scale - right->u.u.scale; + divisor[0] = right->v.v.Lo32; + divisor[1] = right->v.v.Mid32; + divisor[2] = right->Hi32; + + if (divisor[1] == 0 && divisor[2] == 0) { + // Divisor is only 32 bits. Easy divide. + // + if (divisor[0] == 0) + return MONO_DECIMAL_DIVBYZERO; + + quo[0] = left->v.v.Lo32; + quo[1] = left->v.v.Mid32; + quo[2] = left->Hi32; + rem[0] = Div96By32(quo, divisor[0]); + + for (;;) { + if (rem[0] == 0) { + if (scale < 0) { + cur_scale = min(9, -scale); + goto HaveScale; + } + break; + } + + // We have computed a quotient based on the natural scale + // ( - ). We have a non-zero + // remainder, so now we should increase the scale if possible to + // include more quotient bits. + // + // If it doesn't cause overflow, we'll loop scaling by 10^9 and + // computing more quotient bits as long as the remainder stays + // non-zero. If scaling by that much would cause overflow, we'll + // drop out of the loop and scale by as much as we can. + // + // Scaling by 10^9 will overflow if quo[2].quo[1] >= 2^32 / 10^9 + // = 4.294 967 296. So the upper limit is quo[2] == 4 and + // quo[1] == 0.294 967 296 * 2^32 = 1,266,874,889.7+. Since + // quotient bits in quo[0] could be all 1's, then 1,266,874,888 + // is the largest value in quo[1] (when quo[2] == 4) that is + // assured not to overflow. + // + cur_scale = SearchScale(quo[2], quo[1], quo [0], scale); + if (cur_scale == 0) { + // No more scaling to be done, but remainder is non-zero. + // Round quotient. + // + utmp = rem[0] << 1; + if (utmp < rem[0] || (utmp >= divisor[0] && + (utmp > divisor[0] || (quo[0] & 1)))) { + RoundUp: + if (++quo[0] == 0) + if (++quo[1] == 0) + quo[2]++; + } + break; + } + + if (cur_scale == -1) + return MONO_DECIMAL_OVERFLOW; + + HaveScale: + pwr = power10[cur_scale]; + scale += cur_scale; + + if (IncreaseScale(quo, pwr) != 0) + return MONO_DECIMAL_OVERFLOW; + + sdlTmp.int64 = DivMod64by32(UInt32x32To64(rem[0], pwr), divisor[0]); + rem[0] = sdlTmp.u.Hi; + + quo[0] += sdlTmp.u.Lo; + if (quo[0] < sdlTmp.u.Lo) { + if (++quo[1] == 0) + quo[2]++; + } + } // for (;;) + } + else { + // Divisor has bits set in the upper 64 bits. + // + // Divisor must be fully normalized (shifted so bit 31 of the most + // significant uint32_t is 1). Locate the MSB so we know how much to + // normalize by. The dividend will be shifted by the same amount so + // the quotient is not changed. + // + if (divisor[2] == 0) + utmp = divisor[1]; + else + utmp = divisor[2]; + + cur_scale = 0; + if (!(utmp & 0xFFFF0000)) { + cur_scale += 16; + utmp <<= 16; + } + if (!(utmp & 0xFF000000)) { + cur_scale += 8; + utmp <<= 8; + } + if (!(utmp & 0xF0000000)) { + cur_scale += 4; + utmp <<= 4; + } + if (!(utmp & 0xC0000000)) { + cur_scale += 2; + utmp <<= 2; + } + if (!(utmp & 0x80000000)) { + cur_scale++; + utmp <<= 1; + } + + // Shift both dividend and divisor left by cur_scale. + // + sdlTmp.int64 = DECIMAL_LO64_GET(*left) << cur_scale; + rem[0] = sdlTmp.u.Lo; + rem[1] = sdlTmp.u.Hi; + sdlTmp.u.Lo = left->v.v.Mid32; + sdlTmp.u.Hi = left->Hi32; + sdlTmp.int64 <<= cur_scale; + rem[2] = sdlTmp.u.Hi; + rem[3] = (left->Hi32 >> (31 - cur_scale)) >> 1; + + sdlDivisor.u.Lo = divisor[0]; + sdlDivisor.u.Hi = divisor[1]; + sdlDivisor.int64 <<= cur_scale; + + if (divisor[2] == 0) { + // Have a 64-bit divisor in sdlDivisor. The remainder + // (currently 96 bits spread over 4 uint32_ts) will be < divisor. + // + sdlTmp.u.Lo = rem[2]; + sdlTmp.u.Hi = rem[3]; + + quo[2] = 0; + quo[1] = Div96By64(&rem[1], sdlDivisor); + quo[0] = Div96By64(rem, sdlDivisor); + + for (;;) { + if ((rem[0] | rem[1]) == 0) { + if (scale < 0) { + cur_scale = min(9, -scale); + goto HaveScale64; + } + break; + } + + // Remainder is non-zero. Scale up quotient and remainder by + // powers of 10 so we can compute more significant bits. + // + cur_scale = SearchScale(quo[2], quo[1], quo [0], scale); + if (cur_scale == 0) { + // No more scaling to be done, but remainder is non-zero. + // Round quotient. + // + sdlTmp.u.Lo = rem[0]; + sdlTmp.u.Hi = rem[1]; + if (sdlTmp.u.Hi >= 0x80000000 || (sdlTmp.int64 <<= 1) > sdlDivisor.int64 || + (sdlTmp.int64 == sdlDivisor.int64 && (quo[0] & 1))) + goto RoundUp; + break; + } + + if (cur_scale == -1) + return MONO_DECIMAL_OVERFLOW; + + HaveScale64: + pwr = power10[cur_scale]; + scale += cur_scale; + + if (IncreaseScale(quo, pwr) != 0) + return MONO_DECIMAL_OVERFLOW; + + rem[2] = 0; // rem is 64 bits, IncreaseScale uses 96 + IncreaseScale(rem, pwr); + utmp = Div96By64(rem, sdlDivisor); + quo[0] += utmp; + if (quo[0] < utmp) + if (++quo[1] == 0) + quo[2]++; + + } // for (;;) + } + else { + // Have a 96-bit divisor in divisor[]. + // + // Start by finishing the shift left by cur_scale. + // + sdlTmp.u.Lo = divisor[1]; + sdlTmp.u.Hi = divisor[2]; + sdlTmp.int64 <<= cur_scale; + divisor[0] = sdlDivisor.u.Lo; + divisor[1] = sdlDivisor.u.Hi; + divisor[2] = sdlTmp.u.Hi; + + // The remainder (currently 96 bits spread over 4 uint32_ts) + // will be < divisor. + // + quo[2] = 0; + quo[1] = 0; + quo[0] = Div128By96(rem, divisor); + + for (;;) { + if ((rem[0] | rem[1] | rem[2]) == 0) { + if (scale < 0) { + cur_scale = min(9, -scale); + goto HaveScale96; + } + break; + } + + // Remainder is non-zero. Scale up quotient and remainder by + // powers of 10 so we can compute more significant bits. + // + cur_scale = SearchScale(quo[2], quo[1], quo [0], scale); + if (cur_scale == 0) { + // No more scaling to be done, but remainder is non-zero. + // Round quotient. + // + if (rem[2] >= 0x80000000) + goto RoundUp; + + utmp = rem[0] > 0x80000000; + utmp1 = rem[1] > 0x80000000; + rem[0] <<= 1; + rem[1] = (rem[1] << 1) + utmp; + rem[2] = (rem[2] << 1) + utmp1; + + if ((rem[2] > divisor[2] || rem[2] == divisor[2]) && + ((rem[1] > divisor[1] || rem[1] == divisor[1]) && + ((rem[0] > divisor[0] || rem[0] == divisor[0]) && + (quo[0] & 1)))) + goto RoundUp; + break; + } + + if (cur_scale == -1) + return MONO_DECIMAL_OVERFLOW; + + HaveScale96: + pwr = power10[cur_scale]; + scale += cur_scale; + + if (IncreaseScale(quo, pwr) != 0) + return MONO_DECIMAL_OVERFLOW; + + rem[3] = IncreaseScale(rem, pwr); + utmp = Div128By96(rem, divisor); + quo[0] += utmp; + if (quo[0] < utmp) + if (++quo[1] == 0) + quo[2]++; + + } // for (;;) + } + } + + // No more remainder. Try extracting any extra powers of 10 we may have + // added. We do this by trying to divide out 10^8, 10^4, 10^2, and 10^1. + // If a division by one of these powers returns a zero remainder, then + // we keep the quotient. If the remainder is not zero, then we restore + // the previous value. + // + // Since 10 = 2 * 5, there must be a factor of 2 for every power of 10 + // we can extract. We use this as a quick test on whether to try a + // given power. + // + while ((quo[0] & 0xFF) == 0 && scale >= 8) { + quoSave[0] = quo[0]; + quoSave[1] = quo[1]; + quoSave[2] = quo[2]; + + if (Div96By32(quoSave, 100000000) == 0) { + quo[0] = quoSave[0]; + quo[1] = quoSave[1]; + quo[2] = quoSave[2]; + scale -= 8; + } + else + break; + } + + if ((quo[0] & 0xF) == 0 && scale >= 4) { + quoSave[0] = quo[0]; + quoSave[1] = quo[1]; + quoSave[2] = quo[2]; + + if (Div96By32(quoSave, 10000) == 0) { + quo[0] = quoSave[0]; + quo[1] = quoSave[1]; + quo[2] = quoSave[2]; + scale -= 4; + } + } + + if ((quo[0] & 3) == 0 && scale >= 2) { + quoSave[0] = quo[0]; + quoSave[1] = quo[1]; + quoSave[2] = quo[2]; + + if (Div96By32(quoSave, 100) == 0) { + quo[0] = quoSave[0]; + quo[1] = quoSave[1]; + quo[2] = quoSave[2]; + scale -= 2; + } + } + + if ((quo[0] & 1) == 0 && scale >= 1) { + quoSave[0] = quo[0]; + quoSave[1] = quo[1]; + quoSave[2] = quo[2]; + + if (Div96By32(quoSave, 10) == 0) { + quo[0] = quoSave[0]; + quo[1] = quoSave[1]; + quo[2] = quoSave[2]; + scale -= 1; + } + } + + result->Hi32 = quo[2]; + result->v.v.Mid32 = quo[1]; + result->v.v.Lo32 = quo[0]; + result->u.u.scale = scale; + result->u.u.sign = left->u.u.sign ^ right->u.u.sign; + return MONO_DECIMAL_OK; +} + +// MONO_VarDecAbs - Decimal Absolute Value +static void +MONO_VarDecAbs (MonoDecimal *pdecOprd, MonoDecimal *result) +{ + COPYDEC(*result, *pdecOprd); + result->u.u.sign &= ~DECIMAL_NEG; + // Microsoft does not set reserved here +} + +// MONO_VarDecFix - Decimal Fix (chop to integer) +static void +MONO_VarDecFix (MonoDecimal *pdecOprd, MonoDecimal *result) +{ + DecFixInt(result, pdecOprd); +} + + +// MONO_VarDecInt - Decimal Int (round down to integer) +static void +MONO_VarDecInt (MonoDecimal *pdecOprd, MonoDecimal *result) +{ + if (DecFixInt(result, pdecOprd) != 0 && (result->u.u.sign & DECIMAL_NEG)) { + // We have chopped off a non-zero amount from a negative value. Since + // we round toward -infinity, we must increase the integer result by + // 1 to make it more negative. This will never overflow because + // in order to have a remainder, we must have had a non-zero scale factor. + // Our scale factor is back to zero now. + // + DECIMAL_LO64_SET(*result, DECIMAL_LO64_GET(*result) + 1); + if (DECIMAL_LO64_GET(*result) == 0) + result->Hi32++; + } +} + + +// MONO_VarDecNeg - Decimal Negate +static void +MONO_VarDecNeg (MonoDecimal *pdecOprd, MonoDecimal *result) +{ + COPYDEC(*result, *pdecOprd); + // Microsoft does not set result->reserved to zero on this case. + result->u.u.sign ^= DECIMAL_NEG; +} + +// +// Returns: MONO_DECIMAL_INVALID_ARGUMENT, MONO_DECIMAL_OK +// +static MonoDecimalStatus +MONO_VarDecRound(MonoDecimal *input, int cDecimals, MonoDecimal *result) +{ + uint32_t num[3]; + uint32_t rem; + uint32_t sticky; + uint32_t pwr; + int scale; + + if (cDecimals < 0) + return MONO_DECIMAL_INVALID_ARGUMENT; + + scale = input->u.u.scale - cDecimals; + if (scale > 0) { + num[0] = input->v.v.Lo32; + num[1] = input->v.v.Mid32; + num[2] = input->Hi32; + result->u.u.sign = input->u.u.sign; + rem = sticky = 0; + + do { + sticky |= rem; + if (scale > POWER10_MAX) + pwr = ten_to_nine; + else + pwr = power10[scale]; + + rem = Div96By32(num, pwr); + scale -= 9; + }while (scale > 0); + + // Now round. rem has last remainder, sticky has sticky bits. + // To do IEEE rounding, we add LSB of result to sticky bits so + // either causes round up if remainder * 2 == last divisor. + // + sticky |= num[0] & 1; + rem = (rem << 1) + (sticky != 0); + if (pwr < rem && + ++num[0] == 0 && + ++num[1] == 0 + ) + ++num[2]; + + result->v.v.Lo32 = num[0]; + result->v.v.Mid32 = num[1]; + result->Hi32 = num[2]; + result->u.u.scale = cDecimals; + return MONO_DECIMAL_OK; + } + + COPYDEC(*result, *input); + // Odd, the Microsoft source does not set the result->reserved to zero here. + return MONO_DECIMAL_OK; +} + +// +// Returns MONO_DECIMAL_OK or MONO_DECIMAL_OVERFLOW +static MonoDecimalStatus +MONO_VarDecFromR4 (float input, MonoDecimal* result) +{ + int exp; // number of bits to left of binary point + int power; + uint32_t mant; + double dbl; + SPLIT64 sdlLo; + SPLIT64 sdlHi; + int lmax, cur; // temps used during scale reduction + + // The most we can scale by is 10^28, which is just slightly more + // than 2^93. So a float with an exponent of -94 could just + // barely reach 0.5, but smaller exponents will always round to zero. + // + if ((exp = ((SingleStructure *)&input)->exp - SNGBIAS) < -94 ) { + DECIMAL_SETZERO(*result); + return MONO_DECIMAL_OK; + } + + if (exp > 96) + return MONO_DECIMAL_OVERFLOW; + + // Round the input to a 7-digit integer. The R4 format has + // only 7 digits of precision, and we want to keep garbage digits + // out of the Decimal were making. + // + // Calculate max power of 10 input value could have by multiplying + // the exponent by log10(2). Using scaled integer multiplcation, + // log10(2) * 2 ^ 16 = .30103 * 65536 = 19728.3. + // + dbl = fabs(input); + power = 6 - ((exp * 19728) >> 16); + + if (power >= 0) { + // We have less than 7 digits, scale input up. + // + if (power > DECMAX) + power = DECMAX; + + dbl = dbl * double_power10[power]; + } else { + if (power != -1 || dbl >= 1E7) + dbl = dbl / fnDblPower10(-power); + else + power = 0; // didn't scale it + } + + g_assert (dbl < 1E7); + if (dbl < 1E6 && power < DECMAX) { + dbl *= 10; + power++; + g_assert(dbl >= 1E6); + } + + // Round to integer + // + mant = (int32_t)dbl; + dbl -= (double)mant; // difference between input & integer + if ( dbl > 0.5 || (dbl == 0.5 && (mant & 1))) + mant++; + + if (mant == 0) { + DECIMAL_SETZERO(*result); + return MONO_DECIMAL_OK; + } + + if (power < 0) { + // Add -power factors of 10, -power <= (29 - 7) = 22. + // + power = -power; + if (power < 10) { + sdlLo.int64 = UInt32x32To64(mant, (uint32_t)long_power10[power]); + + DECIMAL_LO32(*result) = sdlLo.u.Lo; + DECIMAL_MID32(*result) = sdlLo.u.Hi; + DECIMAL_HI32(*result) = 0; + } else { + // Have a big power of 10. + // + if (power > 18) { + sdlLo.int64 = UInt32x32To64(mant, (uint32_t)long_power10[power - 18]); + sdlLo.int64 = UInt64x64To128(sdlLo, ten_to_eighteen, &sdlHi.int64); + + if (sdlHi.u.Hi != 0) + return MONO_DECIMAL_OVERFLOW; + } + else { + sdlLo.int64 = UInt32x32To64(mant, (uint32_t)long_power10[power - 9]); + sdlHi.int64 = UInt32x32To64(ten_to_nine, sdlLo.u.Hi); + sdlLo.int64 = UInt32x32To64(ten_to_nine, sdlLo.u.Lo); + sdlHi.int64 += sdlLo.u.Hi; + sdlLo.u.Hi = sdlHi.u.Lo; + sdlHi.u.Lo = sdlHi.u.Hi; + } + DECIMAL_LO32(*result) = sdlLo.u.Lo; + DECIMAL_MID32(*result) = sdlLo.u.Hi; + DECIMAL_HI32(*result) = sdlHi.u.Lo; + } + DECIMAL_SCALE(*result) = 0; + } else { + // Factor out powers of 10 to reduce the scale, if possible. + // The maximum number we could factor out would be 6. This + // comes from the fact we have a 7-digit number, and the + // MSD must be non-zero -- but the lower 6 digits could be + // zero. Note also the scale factor is never negative, so + // we can't scale by any more than the power we used to + // get the integer. + // + // DivMod32by32 returns the quotient in Lo, the remainder in Hi. + // + lmax = min(power, 6); + + // lmax is the largest power of 10 to try, lmax <= 6. + // We'll try powers 4, 2, and 1 unless they're too big. + // + for (cur = 4; cur > 0; cur >>= 1) + { + if (cur > lmax) + continue; + + sdlLo.int64 = DivMod32by32(mant, (uint32_t)long_power10[cur]); + + if (sdlLo.u.Hi == 0) { + mant = sdlLo.u.Lo; + power -= cur; + lmax -= cur; + } + } + DECIMAL_LO32(*result) = mant; + DECIMAL_MID32(*result) = 0; + DECIMAL_HI32(*result) = 0; + DECIMAL_SCALE(*result) = power; + } + + DECIMAL_SIGN(*result) = (char)((SingleStructure *)&input)->sign << 7; + return MONO_DECIMAL_OK; +} + +// +// Returns MONO_DECIMAL_OK or MONO_DECIMAL_OVERFLOW +static MonoDecimalStatus +MONO_VarDecFromR8 (double input, MonoDecimal *result) +{ + int exp; // number of bits to left of binary point + int power; // power-of-10 scale factor + SPLIT64 sdlMant; + SPLIT64 sdlLo; + double dbl; + int lmax, cur; // temps used during scale reduction + uint32_t pwr_cur; + uint32_t quo; + + + // The most we can scale by is 10^28, which is just slightly more + // than 2^93. So a float with an exponent of -94 could just + // barely reach 0.5, but smaller exponents will always round to zero. + // + if ((exp = ((DoubleStructure *)&input)->u.exp - DBLBIAS) < -94) { + DECIMAL_SETZERO(*result); + return MONO_DECIMAL_OK; + } + + if (exp > 96) + return MONO_DECIMAL_OVERFLOW; + + // Round the input to a 15-digit integer. The R8 format has + // only 15 digits of precision, and we want to keep garbage digits + // out of the Decimal were making. + // + // Calculate max power of 10 input value could have by multiplying + // the exponent by log10(2). Using scaled integer multiplcation, + // log10(2) * 2 ^ 16 = .30103 * 65536 = 19728.3. + // + dbl = fabs(input); + power = 14 - ((exp * 19728) >> 16); + + if (power >= 0) { + // We have less than 15 digits, scale input up. + // + if (power > DECMAX) + power = DECMAX; + + dbl = dbl * double_power10[power]; + } else { + if (power != -1 || dbl >= 1E15) + dbl = dbl / fnDblPower10(-power); + else + power = 0; // didn't scale it + } + + g_assert (dbl < 1E15); + if (dbl < 1E14 && power < DECMAX) { + dbl *= 10; + power++; + g_assert(dbl >= 1E14); + } + + // Round to int64 + // + sdlMant.int64 = (int64_t)dbl; + dbl -= (double)(int64_t)sdlMant.int64; // dif between input & integer + if ( dbl > 0.5 || (dbl == 0.5 && (sdlMant.u.Lo & 1))) + sdlMant.int64++; + + if (sdlMant.int64 == 0) { + DECIMAL_SETZERO(*result); + return MONO_DECIMAL_OK; + } + + if (power < 0) { + // Add -power factors of 10, -power <= (29 - 15) = 14. + // + power = -power; + if (power < 10) { + sdlLo.int64 = UInt32x32To64(sdlMant.u.Lo, (uint32_t)long_power10[power]); + sdlMant.int64 = UInt32x32To64(sdlMant.u.Hi, (uint32_t)long_power10[power]); + sdlMant.int64 += sdlLo.u.Hi; + sdlLo.u.Hi = sdlMant.u.Lo; + sdlMant.u.Lo = sdlMant.u.Hi; + } + else { + // Have a big power of 10. + // + g_assert(power <= 14); + sdlLo.int64 = UInt64x64To128(sdlMant, sdl_power10[power-10], &sdlMant.int64); + + if (sdlMant.u.Hi != 0) + return MONO_DECIMAL_OVERFLOW; + } + DECIMAL_LO32(*result) = sdlLo.u.Lo; + DECIMAL_MID32(*result) = sdlLo.u.Hi; + DECIMAL_HI32(*result) = sdlMant.u.Lo; + DECIMAL_SCALE(*result) = 0; + } + else { + // Factor out powers of 10 to reduce the scale, if possible. + // The maximum number we could factor out would be 14. This + // comes from the fact we have a 15-digit number, and the + // MSD must be non-zero -- but the lower 14 digits could be + // zero. Note also the scale factor is never negative, so + // we can't scale by any more than the power we used to + // get the integer. + // + // DivMod64by32 returns the quotient in Lo, the remainder in Hi. + // + lmax = min(power, 14); + + // lmax is the largest power of 10 to try, lmax <= 14. + // We'll try powers 8, 4, 2, and 1 unless they're too big. + // + for (cur = 8; cur > 0; cur >>= 1) + { + if (cur > lmax) + continue; + + pwr_cur = (uint32_t)long_power10[cur]; + + if (sdlMant.u.Hi >= pwr_cur) { + // Overflow if we try to divide in one step. + // + sdlLo.int64 = DivMod64by32(sdlMant.u.Hi, pwr_cur); + quo = sdlLo.u.Lo; + sdlLo.u.Lo = sdlMant.u.Lo; + sdlLo.int64 = DivMod64by32(sdlLo.int64, pwr_cur); + } + else { + quo = 0; + sdlLo.int64 = DivMod64by32(sdlMant.int64, pwr_cur); + } + + if (sdlLo.u.Hi == 0) { + sdlMant.u.Hi = quo; + sdlMant.u.Lo = sdlLo.u.Lo; + power -= cur; + lmax -= cur; + } + } + + DECIMAL_HI32(*result) = 0; + DECIMAL_SCALE(*result) = power; + DECIMAL_LO32(*result) = sdlMant.u.Lo; + DECIMAL_MID32(*result) = sdlMant.u.Hi; + } + + DECIMAL_SIGN(*result) = (char)((DoubleStructure *)&input)->u.sign << 7; + return MONO_DECIMAL_OK; +} + +// Returns: MONO_DECIMAL_OK, or MONO_DECIMAL_INVALID_ARGUMENT +static MonoDecimalStatus +MONO_VarR8FromDec(MonoDecimal *input, double *result) +{ + SPLIT64 tmp; + double dbl; + + if (DECIMAL_SCALE(*input) > DECMAX || (DECIMAL_SIGN(*input) & ~DECIMAL_NEG) != 0) + return MONO_DECIMAL_INVALID_ARGUMENT; + + tmp.u.Lo = DECIMAL_LO32(*input); + tmp.u.Hi = DECIMAL_MID32(*input); + + if ((int32_t)DECIMAL_MID32(*input) < 0) + dbl = (ds2to64.dbl + (double)(int64_t)tmp.int64 + + (double)DECIMAL_HI32(*input) * ds2to64.dbl) / fnDblPower10(DECIMAL_SCALE(*input)) ; + else + dbl = ((double)(int64_t)tmp.int64 + + (double)DECIMAL_HI32(*input) * ds2to64.dbl) / fnDblPower10(DECIMAL_SCALE(*input)); + + if (DECIMAL_SIGN(*input)) + dbl = -dbl; + + *result = dbl; + return MONO_DECIMAL_OK; +} + +// Returns: MONO_DECIMAL_OK, or MONO_DECIMAL_INVALID_ARGUMENT +static MonoDecimalStatus +MONO_VarR4FromDec(MonoDecimal *input, float *result) +{ + double dbl; + + if (DECIMAL_SCALE(*input) > DECMAX || (DECIMAL_SIGN(*input) & ~DECIMAL_NEG) != 0) + return MONO_DECIMAL_INVALID_ARGUMENT; + + // Can't overflow; no errors possible. + // + MONO_VarR8FromDec(input, &dbl); + *result = (float)dbl; + return MONO_DECIMAL_OK; +} + +static void +DecShiftLeft(MonoDecimal* value) +{ + g_assert(value != NULL); + + unsigned int c0 = DECIMAL_LO32(*value) & 0x80000000? 1: 0; + unsigned int c1 = DECIMAL_MID32(*value) & 0x80000000? 1: 0; + DECIMAL_LO32(*value) <<= 1; + DECIMAL_MID32(*value) = DECIMAL_MID32(*value) << 1 | c0; + DECIMAL_HI32(*value) = DECIMAL_HI32(*value) << 1 | c1; +} + +static int +D32AddCarry(uint32_t* value, uint32_t i) +{ + uint32_t v = *value; + uint32_t sum = v + i; + *value = sum; + return sum < v || sum < i? 1: 0; +} + +static void +DecAdd(MonoDecimal *value, MonoDecimal* d) +{ + g_assert(value != NULL && d != NULL); + + if (D32AddCarry(&DECIMAL_LO32(*value), DECIMAL_LO32(*d))) { + if (D32AddCarry(&DECIMAL_MID32(*value), 1)) { + D32AddCarry(&DECIMAL_HI32(*value), 1); + } + } + if (D32AddCarry(&DECIMAL_MID32(*value), DECIMAL_MID32(*d))) { + D32AddCarry(&DECIMAL_HI32(*value), 1); + } + D32AddCarry(&DECIMAL_HI32(*value), DECIMAL_HI32(*d)); +} + +static void +DecMul10(MonoDecimal* value) +{ + g_assert (value != NULL); + + MonoDecimal d = *value; + DecShiftLeft(value); + DecShiftLeft(value); + DecAdd(value, &d); + DecShiftLeft(value); +} + +static void +DecAddInt32(MonoDecimal* value, unsigned int i) +{ + g_assert(value != NULL); + + if (D32AddCarry(&DECIMAL_LO32(*value), i)) { + if (D32AddCarry(&DECIMAL_MID32(*value), 1)) { + D32AddCarry(&DECIMAL_HI32(*value), 1); + } + } +} + +MonoDecimalCompareResult +mono_decimal_compare (MonoDecimal *left, MonoDecimal *right) +{ + uint32_t left_sign; + uint32_t right_sign; + + // First check signs and whether either are zero. If both are + // non-zero and of the same sign, just use subtraction to compare. + // + left_sign = left->v.v.Lo32 | left->v.v.Mid32 | left->Hi32; + right_sign = right->v.v.Lo32 | right->v.v.Mid32 | right->Hi32; + if (left_sign != 0) + left_sign = (left->u.u.sign & DECIMAL_NEG) | 1; + + if (right_sign != 0) + right_sign = (right->u.u.sign & DECIMAL_NEG) | 1; + + // left_sign & right_sign have values 1, 0, or 0x81 depending on if the left/right + // operand is +, 0, or -. + // + if (left_sign == right_sign) { + if (left_sign == 0) // both are zero + return MONO_DECIMAL_CMP_EQ; // return equal + + MonoDecimal result; + + DecAddSub(left, right, &result, DECIMAL_NEG); + if (DECIMAL_LO64_GET(result) == 0 && result.Hi32 == 0) + return MONO_DECIMAL_CMP_EQ; + if (result.u.u.sign & DECIMAL_NEG) + return MONO_DECIMAL_CMP_LT; + return MONO_DECIMAL_CMP_GT; + } + + // + // Signs are different. Used signed byte compares + // + if ((char)left_sign > (char)right_sign) + return MONO_DECIMAL_CMP_GT; + return MONO_DECIMAL_CMP_LT; +} + +void +mono_decimal_init_single (MonoDecimal *_this, float value) +{ + if (MONO_VarDecFromR4 (value, _this) == MONO_DECIMAL_OVERFLOW) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + _this->reserved = 0; +} + +void +mono_decimal_init_double (MonoDecimal *_this, double value) +{ + if (MONO_VarDecFromR8 (value, _this) == MONO_DECIMAL_OVERFLOW) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + _this->reserved = 0; +} + +void +mono_decimal_floor (MonoDecimal *d) +{ + MonoDecimal decRes; + + MONO_VarDecInt(d, &decRes); + + // copy decRes into d + COPYDEC(*d, decRes); + d->reserved = 0; + FC_GC_POLL (); +} + +int32_t +mono_decimal_get_hash_code (MonoDecimal *d) +{ + double dbl; + + if (MONO_VarR8FromDec(d, &dbl) != MONO_DECIMAL_OK) + return 0; + + if (dbl == 0.0) { + // Ensure 0 and -0 have the same hash code + return 0; + } + // conversion to double is lossy and produces rounding errors so we mask off the lowest 4 bits + // + // For example these two numerically equal decimals with different internal representations produce + // slightly different results when converted to double: + // + // decimal a = new decimal(new int[] { 0x76969696, 0x2fdd49fa, 0x409783ff, 0x00160000 }); + // => (decimal)1999021.176470588235294117647000000000 => (double)1999021.176470588 + // decimal b = new decimal(new int[] { 0x3f0f0f0f, 0x1e62edcc, 0x06758d33, 0x00150000 }); + // => (decimal)1999021.176470588235294117647000000000 => (double)1999021.1764705882 + // + return ((((int *)&dbl)[0]) & 0xFFFFFFF0) ^ ((int *)&dbl)[1]; + +} + +void +mono_decimal_multiply (MonoDecimal *d1, MonoDecimal *d2) +{ + MonoDecimal decRes; + + MonoDecimalStatus status = MONO_VarDecMul(d1, d2, &decRes); + if (status != MONO_DECIMAL_OK) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + + COPYDEC(*d1, decRes); + d1->reserved = 0; + + FC_GC_POLL (); +} + +void +mono_decimal_round (MonoDecimal *d, int32_t decimals) +{ + MonoDecimal decRes; + + // GC is only triggered for throwing, no need to protect result + if (decimals < 0 || decimals > 28) { + mono_set_pending_exception (mono_get_exception_argument_out_of_range ("d")); + return; + } + + MONO_VarDecRound(d, decimals, &decRes); + + // copy decRes into d + COPYDEC(*d, decRes); + d->reserved = 0; + + FC_GC_POLL(); +} + +void +mono_decimal_tocurrency (MonoDecimal *decimal) +{ + // TODO +} + +double +mono_decimal_to_double (MonoDecimal d) +{ + double result = 0.0; + // Note: this can fail if the input is an invalid decimal, but for compatibility we should return 0 + MONO_VarR8FromDec(&d, &result); + return result; +} + +int32_t +mono_decimal_to_int32 (MonoDecimal d) +{ + MonoDecimal result; + + // The following can not return an error, it only returns INVALID_ARG if the decimals is < 0 + MONO_VarDecRound(&d, 0, &result); + + if (DECIMAL_SCALE(result) != 0) { + d = result; + MONO_VarDecFix (&d, &result); + } + + if (DECIMAL_HI32(result) == 0 && DECIMAL_MID32(result) == 0) { + int32_t i = DECIMAL_LO32(result); + if ((int16_t)DECIMAL_SIGNSCALE(result) >= 0) { + if (i >= 0) + return i; + } else { + i = -i; + if (i <= 0) + return i; + } + } + + mono_set_pending_exception (mono_get_exception_overflow ()); + return 0; +} + +float +mono_decimal_to_float (MonoDecimal d) +{ + float result = 0.0f; + // Note: this can fail if the input is an invalid decimal, but for compatibility we should return 0 + MONO_VarR4FromDec(&d, &result); + return result; +} + +void +mono_decimal_truncate (MonoDecimal *d) +{ + MonoDecimal decRes; + + MONO_VarDecFix(d, &decRes); + + // copy decRes into d + COPYDEC(*d, decRes); + d->reserved = 0; + FC_GC_POLL(); +} + +void +mono_decimal_addsub (MonoDecimal *left, MonoDecimal *right, uint8_t sign) +{ + MonoDecimal result, decTmp; + MonoDecimal *pdecTmp, *leftOriginal; + uint32_t num[6], pwr; + int scale, hi_prod, cur; + SPLIT64 sdlTmp; + + g_assert(sign == 0 || sign == DECIMAL_NEG); + + leftOriginal = left; + + sign ^= (DECIMAL_SIGN(*right) ^ DECIMAL_SIGN(*left)) & DECIMAL_NEG; + + if (DECIMAL_SCALE(*right) == DECIMAL_SCALE(*left)) { + // Scale factors are equal, no alignment necessary. + // + DECIMAL_SIGNSCALE(result) = DECIMAL_SIGNSCALE(*left); + + AlignedAdd: + if (sign) { + // Signs differ - subtract + // + DECIMAL_LO64_SET(result, (DECIMAL_LO64_GET(*left) - DECIMAL_LO64_GET(*right))); + DECIMAL_HI32(result) = DECIMAL_HI32(*left) - DECIMAL_HI32(*right); + + // Propagate carry + // + if (DECIMAL_LO64_GET(result) > DECIMAL_LO64_GET(*left)) { + DECIMAL_HI32(result)--; + if (DECIMAL_HI32(result) >= DECIMAL_HI32(*left)) + goto SignFlip; + } else if (DECIMAL_HI32(result) > DECIMAL_HI32(*left)) { + // Got negative result. Flip its sign. + // + SignFlip: + DECIMAL_LO64_SET(result, -(int64_t)DECIMAL_LO64_GET(result)); + DECIMAL_HI32(result) = ~DECIMAL_HI32(result); + if (DECIMAL_LO64_GET(result) == 0) + DECIMAL_HI32(result)++; + DECIMAL_SIGN(result) ^= DECIMAL_NEG; + } + + } else { + // Signs are the same - add + // + DECIMAL_LO64_SET(result, (DECIMAL_LO64_GET(*left) + DECIMAL_LO64_GET(*right))); + DECIMAL_HI32(result) = DECIMAL_HI32(*left) + DECIMAL_HI32(*right); + + // Propagate carry + // + if (DECIMAL_LO64_GET(result) < DECIMAL_LO64_GET(*left)) { + DECIMAL_HI32(result)++; + if (DECIMAL_HI32(result) <= DECIMAL_HI32(*left)) + goto AlignedScale; + } else if (DECIMAL_HI32(result) < DECIMAL_HI32(*left)) { + AlignedScale: + // The addition carried above 96 bits. Divide the result by 10, + // dropping the scale factor. + // + if (DECIMAL_SCALE(result) == 0) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + DECIMAL_SCALE(result)--; + + sdlTmp.u.Lo = DECIMAL_HI32(result); + sdlTmp.u.Hi = 1; + sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10); + DECIMAL_HI32(result) = sdlTmp.u.Lo; + + sdlTmp.u.Lo = DECIMAL_MID32(result); + sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10); + DECIMAL_MID32(result) = sdlTmp.u.Lo; + + sdlTmp.u.Lo = DECIMAL_LO32(result); + sdlTmp.int64 = DivMod64by32(sdlTmp.int64, 10); + DECIMAL_LO32(result) = sdlTmp.u.Lo; + + // See if we need to round up. + // + if (sdlTmp.u.Hi >= 5 && (sdlTmp.u.Hi > 5 || (DECIMAL_LO32(result) & 1))) { + DECIMAL_LO64_SET(result, DECIMAL_LO64_GET(result)+1); + if (DECIMAL_LO64_GET(result) == 0) + DECIMAL_HI32(result)++; + } + } + } + } else { + // Scale factors are not equal. Assume that a larger scale + // factor (more decimal places) is likely to mean that number + // is smaller. Start by guessing that the right operand has + // the larger scale factor. The result will have the larger + // scale factor. + // + DECIMAL_SCALE(result) = DECIMAL_SCALE(*right); // scale factor of "smaller" + DECIMAL_SIGN(result) = DECIMAL_SIGN(*left); // but sign of "larger" + scale = DECIMAL_SCALE(result)- DECIMAL_SCALE(*left); + + if (scale < 0) { + // Guessed scale factor wrong. Swap operands. + // + scale = -scale; + DECIMAL_SCALE(result) = DECIMAL_SCALE(*left); + DECIMAL_SIGN(result) ^= sign; + pdecTmp = right; + right = left; + left = pdecTmp; + } + + // *left will need to be multiplied by 10^scale so + // it will have the same scale as *right. We could be + // extending it to up to 192 bits of precision. + // + if (scale <= POWER10_MAX) { + // Scaling won't make it larger than 4 uint32_ts + // + pwr = power10[scale]; + DECIMAL_LO64_SET(decTmp, UInt32x32To64(DECIMAL_LO32(*left), pwr)); + sdlTmp.int64 = UInt32x32To64(DECIMAL_MID32(*left), pwr); + sdlTmp.int64 += DECIMAL_MID32(decTmp); + DECIMAL_MID32(decTmp) = sdlTmp.u.Lo; + DECIMAL_HI32(decTmp) = sdlTmp.u.Hi; + sdlTmp.int64 = UInt32x32To64(DECIMAL_HI32(*left), pwr); + sdlTmp.int64 += DECIMAL_HI32(decTmp); + if (sdlTmp.u.Hi == 0) { + // Result fits in 96 bits. Use standard aligned add. + // + DECIMAL_HI32(decTmp) = sdlTmp.u.Lo; + left = &decTmp; + goto AlignedAdd; + } + num[0] = DECIMAL_LO32(decTmp); + num[1] = DECIMAL_MID32(decTmp); + num[2] = sdlTmp.u.Lo; + num[3] = sdlTmp.u.Hi; + hi_prod = 3; + } else { + // Have to scale by a bunch. Move the number to a buffer + // where it has room to grow as it's scaled. + // + num[0] = DECIMAL_LO32(*left); + num[1] = DECIMAL_MID32(*left); + num[2] = DECIMAL_HI32(*left); + hi_prod = 2; + + // Scan for zeros in the upper words. + // + if (num[2] == 0) { + hi_prod = 1; + if (num[1] == 0) { + hi_prod = 0; + if (num[0] == 0) { + // Left arg is zero, return right. + // + DECIMAL_LO64_SET(result, DECIMAL_LO64_GET(*right)); + DECIMAL_HI32(result) = DECIMAL_HI32(*right); + DECIMAL_SIGN(result) ^= sign; + goto RetDec; + } + } + } + + // Scaling loop, up to 10^9 at a time. hi_prod stays updated + // with index of highest non-zero uint32_t. + // + for (; scale > 0; scale -= POWER10_MAX) { + if (scale > POWER10_MAX) + pwr = ten_to_nine; + else + pwr = power10[scale]; + + sdlTmp.u.Hi = 0; + for (cur = 0; cur <= hi_prod; cur++) { + sdlTmp.int64 = UInt32x32To64(num[cur], pwr) + sdlTmp.u.Hi; + num[cur] = sdlTmp.u.Lo; + } + + if (sdlTmp.u.Hi != 0) + // We're extending the result by another uint32_t. + num[++hi_prod] = sdlTmp.u.Hi; + } + } + + // Scaling complete, do the add. Could be subtract if signs differ. + // + sdlTmp.u.Lo = num[0]; + sdlTmp.u.Hi = num[1]; + + if (sign) { + // Signs differ, subtract. + // + DECIMAL_LO64_SET(result, (sdlTmp.int64 - DECIMAL_LO64_GET(*right))); + DECIMAL_HI32(result) = num[2] - DECIMAL_HI32(*right); + + // Propagate carry + // + if (DECIMAL_LO64_GET(result) > sdlTmp.int64) { + DECIMAL_HI32(result)--; + if (DECIMAL_HI32(result) >= num[2]) + goto LongSub; + } else if (DECIMAL_HI32(result) > num[2]) { + LongSub: + // If num has more than 96 bits of precision, then we need to + // carry the subtraction into the higher bits. If it doesn't, + // then we subtracted in the wrong order and have to flip the + // sign of the result. + // + if (hi_prod <= 2) + goto SignFlip; + + cur = 3; + while(num[cur++]-- == 0); + if (num[hi_prod] == 0) + hi_prod--; + } + } else { + // Signs the same, add. + // + DECIMAL_LO64_SET(result, (sdlTmp.int64 + DECIMAL_LO64_GET(*right))); + DECIMAL_HI32(result) = num[2] + DECIMAL_HI32(*right); + + // Propagate carry + // + if (DECIMAL_LO64_GET(result) < sdlTmp.int64) { + DECIMAL_HI32(result)++; + if (DECIMAL_HI32(result) <= num[2]) + goto LongAdd; + } else if (DECIMAL_HI32(result) < num[2]) { + LongAdd: + // Had a carry above 96 bits. + // + cur = 3; + do { + if (hi_prod < cur) { + num[cur] = 1; + hi_prod = cur; + break; + } + }while (++num[cur++] == 0); + } + } + + if (hi_prod > 2) { + num[0] = DECIMAL_LO32(result); + num[1] = DECIMAL_MID32(result); + num[2] = DECIMAL_HI32(result); + DECIMAL_SCALE(result) = (uint8_t)ScaleResult(num, hi_prod, DECIMAL_SCALE(result)); + if (DECIMAL_SCALE(result) == (uint8_t)-1) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + + DECIMAL_LO32(result) = num[0]; + DECIMAL_MID32(result) = num[1]; + DECIMAL_HI32(result) = num[2]; + } + } + +RetDec: + left = leftOriginal; + COPYDEC(*left, result); + left->reserved = 0; +} + +void +mono_decimal_divide (MonoDecimal *left, MonoDecimal *right) +{ + uint32_t quo[3], quo_save[3],rem[4], divisor[3]; + uint32_t pwr, tmp, tmp1; + SPLIT64 sdlTmp, sdlDivisor; + int scale, cur_scale; + gboolean unscale; + + scale = DECIMAL_SCALE(*left) - DECIMAL_SCALE(*right); + unscale = FALSE; + divisor[0] = DECIMAL_LO32(*right); + divisor[1] = DECIMAL_MID32(*right); + divisor[2] = DECIMAL_HI32(*right); + + if (divisor[1] == 0 && divisor[2] == 0) { + // Divisor is only 32 bits. Easy divide. + // + if (divisor[0] == 0) { + mono_set_pending_exception (mono_get_exception_divide_by_zero ()); + return; + } + + quo[0] = DECIMAL_LO32(*left); + quo[1] = DECIMAL_MID32(*left); + quo[2] = DECIMAL_HI32(*left); + rem[0] = Div96By32(quo, divisor[0]); + + for (;;) { + if (rem[0] == 0) { + if (scale < 0) { + cur_scale = min(9, -scale); + goto HaveScale; + } + break; + } + // We need to unscale if and only if we have a non-zero remainder + unscale = TRUE; + + // We have computed a quotient based on the natural scale + // ( - ). We have a non-zero + // remainder, so now we should increase the scale if possible to + // include more quotient bits. + // + // If it doesn't cause overflow, we'll loop scaling by 10^9 and + // computing more quotient bits as long as the remainder stays + // non-zero. If scaling by that much would cause overflow, we'll + // drop out of the loop and scale by as much as we can. + // + // Scaling by 10^9 will overflow if quo[2].quo[1] >= 2^32 / 10^9 + // = 4.294 967 296. So the upper limit is quo[2] == 4 and + // quo[1] == 0.294 967 296 * 2^32 = 1,266,874,889.7+. Since + // quotient bits in quo[0] could be all 1's, then 1,266,874,888 + // is the largest value in quo[1] (when quo[2] == 4) that is + // assured not to overflow. + // + cur_scale = SearchScale(quo[2], quo[1], quo[0], scale); + if (cur_scale == 0) { + // No more scaling to be done, but remainder is non-zero. + // Round quotient. + // + tmp = rem[0] << 1; + if (tmp < rem[0] || (tmp >= divisor[0] && + (tmp > divisor[0] || (quo[0] & 1)))) { + RoundUp: + if (!Add32To96(quo, 1)) { + if (scale == 0) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + scale--; + OverflowUnscale(quo, TRUE); + break; + } + } + break; + } + + if (cur_scale < 0) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + + HaveScale: + pwr = power10[cur_scale]; + scale += cur_scale; + + if (IncreaseScale(quo, pwr) != 0) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + + sdlTmp.int64 = DivMod64by32(UInt32x32To64(rem[0], pwr), divisor[0]); + rem[0] = sdlTmp.u.Hi; + + if (!Add32To96(quo, sdlTmp.u.Lo)) { + if (scale == 0) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + scale--; + OverflowUnscale(quo, (rem[0] != 0)); + break; + } + } // for (;;) + } else { + // Divisor has bits set in the upper 64 bits. + // + // Divisor must be fully normalized (shifted so bit 31 of the most + // significant uint32_t is 1). Locate the MSB so we know how much to + // normalize by. The dividend will be shifted by the same amount so + // the quotient is not changed. + // + if (divisor[2] == 0) + tmp = divisor[1]; + else + tmp = divisor[2]; + + cur_scale = 0; + if (!(tmp & 0xFFFF0000)) { + cur_scale += 16; + tmp <<= 16; + } + if (!(tmp & 0xFF000000)) { + cur_scale += 8; + tmp <<= 8; + } + if (!(tmp & 0xF0000000)) { + cur_scale += 4; + tmp <<= 4; + } + if (!(tmp & 0xC0000000)) { + cur_scale += 2; + tmp <<= 2; + } + if (!(tmp & 0x80000000)) { + cur_scale++; + tmp <<= 1; + } + + // Shift both dividend and divisor left by cur_scale. + // + sdlTmp.int64 = DECIMAL_LO64_GET(*left) << cur_scale; + rem[0] = sdlTmp.u.Lo; + rem[1] = sdlTmp.u.Hi; + sdlTmp.u.Lo = DECIMAL_MID32(*left); + sdlTmp.u.Hi = DECIMAL_HI32(*left); + sdlTmp.int64 <<= cur_scale; + rem[2] = sdlTmp.u.Hi; + rem[3] = (DECIMAL_HI32(*left) >> (31 - cur_scale)) >> 1; + + sdlDivisor.u.Lo = divisor[0]; + sdlDivisor.u.Hi = divisor[1]; + sdlDivisor.int64 <<= cur_scale; + + if (divisor[2] == 0) { + // Have a 64-bit divisor in sdlDivisor. The remainder + // (currently 96 bits spread over 4 uint32_ts) will be < divisor. + // + sdlTmp.u.Lo = rem[2]; + sdlTmp.u.Hi = rem[3]; + + quo[2] = 0; + quo[1] = Div96By64(&rem[1], sdlDivisor); + quo[0] = Div96By64(rem, sdlDivisor); + + for (;;) { + if ((rem[0] | rem[1]) == 0) { + if (scale < 0) { + cur_scale = min(9, -scale); + goto HaveScale64; + } + break; + } + + // We need to unscale if and only if we have a non-zero remainder + unscale = TRUE; + + // Remainder is non-zero. Scale up quotient and remainder by + // powers of 10 so we can compute more significant bits. + // + cur_scale = SearchScale(quo[2], quo[1], quo[0], scale); + if (cur_scale == 0) { + // No more scaling to be done, but remainder is non-zero. + // Round quotient. + // + sdlTmp.u.Lo = rem[0]; + sdlTmp.u.Hi = rem[1]; + if (sdlTmp.u.Hi >= 0x80000000 || (sdlTmp.int64 <<= 1) > sdlDivisor.int64 || + (sdlTmp.int64 == sdlDivisor.int64 && (quo[0] & 1))) + goto RoundUp; + break; + } + + if (cur_scale < 0) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + + HaveScale64: + pwr = power10[cur_scale]; + scale += cur_scale; + + if (IncreaseScale(quo, pwr) != 0) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + + rem[2] = 0; // rem is 64 bits, IncreaseScale uses 96 + IncreaseScale(rem, pwr); + tmp = Div96By64(rem, sdlDivisor); + if (!Add32To96(quo, tmp)) { + if (scale == 0) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + scale--; + OverflowUnscale(quo, (rem[0] != 0 || rem[1] != 0)); + break; + } + + } // for (;;) + } else { + // Have a 96-bit divisor in divisor[]. + // + // Start by finishing the shift left by cur_scale. + // + sdlTmp.u.Lo = divisor[1]; + sdlTmp.u.Hi = divisor[2]; + sdlTmp.int64 <<= cur_scale; + divisor[0] = sdlDivisor.u.Lo; + divisor[1] = sdlDivisor.u.Hi; + divisor[2] = sdlTmp.u.Hi; + + // The remainder (currently 96 bits spread over 4 uint32_ts) + // will be < divisor. + // + quo[2] = 0; + quo[1] = 0; + quo[0] = Div128By96(rem, divisor); + + for (;;) { + if ((rem[0] | rem[1] | rem[2]) == 0) { + if (scale < 0) { + cur_scale = min(9, -scale); + goto HaveScale96; + } + break; + } + + // We need to unscale if and only if we have a non-zero remainder + unscale = TRUE; + + // Remainder is non-zero. Scale up quotient and remainder by + // powers of 10 so we can compute more significant bits. + // + cur_scale = SearchScale(quo[2], quo[1], quo[0], scale); + if (cur_scale == 0) { + // No more scaling to be done, but remainder is non-zero. + // Round quotient. + // + if (rem[2] >= 0x80000000) + goto RoundUp; + + tmp = rem[0] > 0x80000000; + tmp1 = rem[1] > 0x80000000; + rem[0] <<= 1; + rem[1] = (rem[1] << 1) + tmp; + rem[2] = (rem[2] << 1) + tmp1; + + if (rem[2] > divisor[2] || (rem[2] == divisor[2] && (rem[1] > divisor[1] || rem[1] == (divisor[1] && (rem[0] > divisor[0] || (rem[0] == divisor[0] && (quo[0] & 1))))))) + goto RoundUp; + break; + } + + if (cur_scale < 0) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + + HaveScale96: + pwr = power10[cur_scale]; + scale += cur_scale; + + if (IncreaseScale(quo, pwr) != 0) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + + rem[3] = IncreaseScale(rem, pwr); + tmp = Div128By96(rem, divisor); + if (!Add32To96(quo, tmp)) { + if (scale == 0) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return; + } + + scale--; + OverflowUnscale(quo, (rem[0] != 0 || rem[1] != 0 || rem[2] != 0 || rem[3] != 0)); + break; + } + + } // for (;;) + } + } + + // We need to unscale if and only if we have a non-zero remainder + if (unscale) { + // Try extracting any extra powers of 10 we may have + // added. We do this by trying to divide out 10^8, 10^4, 10^2, and 10^1. + // If a division by one of these powers returns a zero remainder, then + // we keep the quotient. If the remainder is not zero, then we restore + // the previous value. + // + // Since 10 = 2 * 5, there must be a factor of 2 for every power of 10 + // we can extract. We use this as a quick test on whether to try a + // given power. + // + while ((quo[0] & 0xFF) == 0 && scale >= 8) { + quo_save[0] = quo[0]; + quo_save[1] = quo[1]; + quo_save[2] = quo[2]; + + if (Div96By32(quo_save, 100000000) == 0) { + quo[0] = quo_save[0]; + quo[1] = quo_save[1]; + quo[2] = quo_save[2]; + scale -= 8; + } else + break; + } + + if ((quo[0] & 0xF) == 0 && scale >= 4) { + quo_save[0] = quo[0]; + quo_save[1] = quo[1]; + quo_save[2] = quo[2]; + + if (Div96By32(quo_save, 10000) == 0) { + quo[0] = quo_save[0]; + quo[1] = quo_save[1]; + quo[2] = quo_save[2]; + scale -= 4; + } + } + + if ((quo[0] & 3) == 0 && scale >= 2) { + quo_save[0] = quo[0]; + quo_save[1] = quo[1]; + quo_save[2] = quo[2]; + + if (Div96By32(quo_save, 100) == 0) { + quo[0] = quo_save[0]; + quo[1] = quo_save[1]; + quo[2] = quo_save[2]; + scale -= 2; + } + } + + if ((quo[0] & 1) == 0 && scale >= 1) { + quo_save[0] = quo[0]; + quo_save[1] = quo[1]; + quo_save[2] = quo[2]; + + if (Div96By32(quo_save, 10) == 0) { + quo[0] = quo_save[0]; + quo[1] = quo_save[1]; + quo[2] = quo_save[2]; + scale -= 1; + } + } + } + + DECIMAL_SIGN(*left) = DECIMAL_SIGN(*left) ^ DECIMAL_SIGN(*right); + DECIMAL_HI32(*left) = quo[2]; + DECIMAL_MID32(*left) = quo[1]; + DECIMAL_LO32(*left) = quo[0]; + DECIMAL_SCALE(*left) = (uint8_t)scale; + left->reserved = 0; + +} + +#define DECIMAL_PRECISION 29 +#define NUMBER_MAXDIGITS 50 +typedef struct { + int32_t precision; + int32_t scale; + int32_t sign; + uint16_t digits[NUMBER_MAXDIGITS + 1]; + uint16_t* allDigits; +} CLRNumber; + +int +mono_decimal_from_number (void *from, MonoDecimal *target) +{ + CLRNumber *number = (CLRNumber *) from; + g_assert(number != NULL); + g_assert(target != NULL); + + MonoDecimal d; + d.reserved = 0; + DECIMAL_SIGNSCALE(d) = 0; + DECIMAL_HI32(d) = 0; + DECIMAL_LO32(d) = 0; + DECIMAL_MID32(d) = 0; + uint16_t* p = number->digits; + g_assert(p != NULL); + int e = number->scale; + if (!*p) { + // To avoid risking an app-compat issue with pre 4.5 (where some app was illegally using Reflection to examine the internal scale bits), we'll only force + // the scale to 0 if the scale was previously positive + if (e > 0) { + e = 0; + } + } else { + if (e > DECIMAL_PRECISION) return 0; + while ((e > 0 || (*p && e > -28)) && (DECIMAL_HI32(d) < 0x19999999 || (DECIMAL_HI32(d) == 0x19999999 && (DECIMAL_MID32(d) < 0x99999999 || (DECIMAL_MID32(d) == 0x99999999 && (DECIMAL_LO32(d) < 0x99999999 || (DECIMAL_LO32(d) == 0x99999999 && *p <= '5'))))))) { + DecMul10(&d); + if (*p) + DecAddInt32(&d, *p++ - '0'); + e--; + } + if (*p++ >= '5') { + gboolean round = TRUE; + if (*(p-1) == '5' && *(p-2) % 2 == 0) { // Check if previous digit is even, only if the when we are unsure whether hows to do Banker's rounding + // For digits > 5 we will be roundinp up anyway. + int count = 20; // Look at the next 20 digits to check to round + while (*p == '0' && count != 0) { + p++; + count--; + } + if (*p == '\0' || count == 0) + round = FALSE;// Do nothing + } + + if (round) { + DecAddInt32(&d, 1); + if ((DECIMAL_HI32(d) | DECIMAL_MID32(d) | DECIMAL_LO32(d)) == 0) { + DECIMAL_HI32(d) = 0x19999999; + DECIMAL_MID32(d) = 0x99999999; + DECIMAL_LO32(d) = 0x9999999A; + e++; + } + } + } + } + if (e > 0) + return 0; + if (e <= -DECIMAL_PRECISION) { + // Parsing a large scale zero can give you more precision than fits in the decimal. + // This should only happen for actual zeros or very small numbers that round to zero. + DECIMAL_SIGNSCALE(d) = 0; + DECIMAL_HI32(d) = 0; + DECIMAL_LO32(d) = 0; + DECIMAL_MID32(d) = 0; + DECIMAL_SCALE(d) = (DECIMAL_PRECISION - 1); + } else { + DECIMAL_SCALE(d) = (uint8_t)(-e); + } + + DECIMAL_SIGN(d) = number->sign? DECIMAL_NEG: 0; + *target = d; + return 1; +} + + +#endif diff --git a/mta-mono/vendor/mono/metadata/decimal-ms.h b/mta-mono/vendor/mono/metadata/decimal-ms.h new file mode 100644 index 0000000..d60dd15 --- /dev/null +++ b/mta-mono/vendor/mono/metadata/decimal-ms.h @@ -0,0 +1,61 @@ +#ifndef __MONO_DECIMAL_MS_H__ +#define __MONO_DECIMAL_MS_H__ +typedef struct tagDECIMAL { + // Decimal.cs treats the first two shorts as one long + // And they seriable the data so we need to little endian + // seriliazation + // The wReserved overlaps with Variant's vt member +#if G_BYTE_ORDER != G_LITTLE_ENDIAN + union { + struct { + uint8_t sign; + uint8_t scale; + } u; + uint16_t signscale; + } u; + uint16_t reserved; +#else + uint16_t reserved; + union { + struct { + uint8_t scale; + uint8_t sign; + } u; + uint16_t signscale; + } u; +#endif + uint32_t Hi32; + union { + struct { + uint32_t Lo32; + uint32_t Mid32; + } v; + uint64_t Lo64; + } v; +} MonoDecimal; + +typedef enum { + MONO_DECIMAL_CMP_LT=-1, + MONO_DECIMAL_CMP_EQ, + MONO_DECIMAL_CMP_GT +} MonoDecimalCompareResult; + +MonoDecimalCompareResult + mono_decimal_compare (MonoDecimal *left, MonoDecimal *right) MONO_INTERNAL; + +void mono_decimal_init_single (MonoDecimal *_this, float value) MONO_INTERNAL; +void mono_decimal_init_double (MonoDecimal *_this, double value) MONO_INTERNAL; +void mono_decimal_floor (MonoDecimal *d) MONO_INTERNAL; +int32_t mono_decimal_get_hash_code (MonoDecimal *d) MONO_INTERNAL; +void mono_decimal_multiply (MonoDecimal *d1, MonoDecimal *d2) MONO_INTERNAL; +void mono_decimal_round (MonoDecimal *d, int32_t decimals) MONO_INTERNAL; +void mono_decimal_tocurrency (MonoDecimal *decimal) MONO_INTERNAL; +double mono_decimal_to_double (MonoDecimal d) MONO_INTERNAL; +int32_t mono_decimal_to_int32 (MonoDecimal d) MONO_INTERNAL; +float mono_decimal_to_float (MonoDecimal d) MONO_INTERNAL; +void mono_decimal_truncate (MonoDecimal *d) MONO_INTERNAL; +void mono_decimal_addsub (MonoDecimal *left, MonoDecimal *right, uint8_t sign); +void mono_decimal_divide (MonoDecimal *left, MonoDecimal *right); +int mono_decimal_from_number (void *from, MonoDecimal *target); + +#endif diff --git a/mta-mono/vendor/mono/metadata/domain-internals.h b/mta-mono/vendor/mono/metadata/domain-internals.h index 065e045..ca3d6cd 100644 --- a/mta-mono/vendor/mono/metadata/domain-internals.h +++ b/mta-mono/vendor/mono/metadata/domain-internals.h @@ -219,13 +219,11 @@ struct _MonoJitInfo { gboolean has_arch_eh_info:1; gboolean from_aot:1; gboolean from_llvm:1; - gboolean dbg_hidden_inited:1; + gboolean dbg_attrs_inited:1; gboolean dbg_hidden:1; /* Whenever this jit info was loaded in async context */ gboolean async:1; - gboolean dbg_step_through_inited:1; gboolean dbg_step_through:1; - gboolean dbg_non_user_code_inited:1; gboolean dbg_non_user_code:1; /* FIXME: Embed this after the structure later*/ @@ -663,7 +661,10 @@ MONO_API void mono_domain_add_class_static_data (MonoDomain *domain, MonoClass *klass, gpointer data, guint32 *bitmap); MonoReflectionAssembly * -mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, gboolean refonly) MONO_INTERNAL; +mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, MonoAssembly *requesting, gboolean refonly) MONO_INTERNAL; + +MonoAssembly * +mono_domain_assembly_postload_search (MonoAssemblyName *aname, MonoAssembly *requesting, gboolean refonly) MONO_INTERNAL; MonoAssembly* mono_assembly_load_full_nosearch (MonoAssemblyName *aname, const char *basedir, diff --git a/mta-mono/vendor/mono/metadata/domain.c b/mta-mono/vendor/mono/metadata/domain.c index e30c034..1b0f53d 100644 --- a/mta-mono/vendor/mono/metadata/domain.c +++ b/mta-mono/vendor/mono/metadata/domain.c @@ -119,8 +119,6 @@ static const MonoRuntimeInfo *current_runtime = NULL; /* This is the list of runtime versions supported by this JIT. */ static const MonoRuntimeInfo supported_runtimes[] = { - {"v2.0.50215","2.0", { {2,0,0,0}, { 8,0,0,0}, {3,5,0,0}, {3,0,0,0} } }, - {"v2.0.50727","2.0", { {2,0,0,0}, { 8,0,0,0}, {3,5,0,0}, {3,0,0,0} } }, {"v4.0.30319","4.5", { {4,0,0,0}, {10,0,0,0}, {4,0,0,0}, {4,0,0,0} } }, {"v4.0.30128","4.0", { {4,0,0,0}, {10,0,0,0}, {4,0,0,0}, {4,0,0,0} } }, {"v4.0.20506","4.0", { {4,0,0,0}, {10,0,0,0}, {4,0,0,0}, {4,0,0,0} } }, @@ -130,7 +128,7 @@ static const MonoRuntimeInfo supported_runtimes[] = { /* The stable runtime version */ -#define DEFAULT_RUNTIME_VERSION "v2.0.50727" +#define DEFAULT_RUNTIME_VERSION "v4.0.30319" /* Callbacks installed by the JIT */ static MonoCreateDomainFunc create_domain_hook; @@ -139,9 +137,6 @@ static MonoFreeDomainFunc free_domain_hook; /* AOT cache configuration */ static MonoAotCacheConfig aot_cache_config; -/* This is intentionally not in the header file, so people don't misuse it. */ -extern void _mono_debug_init_corlib (MonoDomain *domain); - static void get_runtimes_from_exe (const char *exe_file, MonoImage **exe_image, const MonoRuntimeInfo** runtimes); @@ -512,6 +507,7 @@ mono_init_internal (const char *filename, const char *exe_filename, const char * #ifndef DISABLE_PERFCOUNTERS mono_perfcounters_init (); #endif + mono_counters_init (); mono_counters_register ("Max native code in a domain", MONO_COUNTER_INT|MONO_COUNTER_JIT, &max_domain_code_size); mono_counters_register ("Max code space allocated in a domain", MONO_COUNTER_INT|MONO_COUNTER_JIT, &max_domain_code_alloc); @@ -835,8 +831,6 @@ mono_init_internal (const char *filename, const char *exe_filename, const char * mono_defaults.customattribute_data_class = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "CustomAttributeData"); - /* these are initialized lazily when COM features are used */ - mono_class_init (mono_defaults.array_class); mono_defaults.generic_nullable_class = mono_class_from_name ( mono_defaults.corlib, "System", "Nullable`1"); @@ -847,8 +841,6 @@ mono_init_internal (const char *filename, const char *exe_filename, const char * domain->friendly_name = g_path_get_basename (filename); - _mono_debug_init_corlib (domain); - return domain; } diff --git a/mta-mono/vendor/mono/metadata/environment.c b/mta-mono/vendor/mono/metadata/environment.c index 019ba8e..03c60f3 100644 --- a/mta-mono/vendor/mono/metadata/environment.c +++ b/mta-mono/vendor/mono/metadata/environment.c @@ -43,8 +43,6 @@ ves_icall_System_Environment_GetOSVersionString (void) #ifdef HOST_WIN32 OSVERSIONINFOEX verinfo; - MONO_ARCH_SAVE_REGS; - verinfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX); if (GetVersionEx ((OSVERSIONINFO*)&verinfo)) { char version [128]; @@ -60,8 +58,6 @@ ves_icall_System_Environment_GetOSVersionString (void) #elif defined(HAVE_SYS_UTSNAME_H) struct utsname name; - MONO_ARCH_SAVE_REGS; - if (uname (&name) >= 0) { return mono_string_new (mono_domain_get (), name.release); } diff --git a/mta-mono/vendor/mono/metadata/exception.c b/mta-mono/vendor/mono/metadata/exception.c index cf42445..23cb946 100644 --- a/mta-mono/vendor/mono/metadata/exception.c +++ b/mta-mono/vendor/mono/metadata/exception.c @@ -775,12 +775,25 @@ mono_get_exception_reflection_type_load (MonoArray *types, MonoArray *exceptions MonoException * mono_get_exception_runtime_wrapped (MonoObject *wrapped_exception) { - MonoRuntimeWrappedException *ex = (MonoRuntimeWrappedException*) - mono_exception_from_name (mono_get_corlib (), "System.Runtime.CompilerServices", - "RuntimeWrappedException"); + MonoClass *klass; + MonoObject *o; + MonoMethod *method; + MonoDomain *domain = mono_domain_get (); + gpointer params [16]; - MONO_OBJECT_SETREF (ex, wrapped_exception, wrapped_exception); - return (MonoException*)ex; + klass = mono_class_from_name (mono_get_corlib (), "System.Runtime.CompilerServices", "RuntimeWrappedException"); + g_assert (klass); + + o = mono_object_new (domain, klass); + g_assert (o != NULL); + + method = mono_class_get_method_from_name (klass, ".ctor", 1); + g_assert (method); + + params [0] = wrapped_exception; + mono_runtime_invoke (method, o, params, NULL); + + return (MonoException *)o; } static gboolean diff --git a/mta-mono/vendor/mono/metadata/exception.h b/mta-mono/vendor/mono/metadata/exception.h index 1727950..a03bde4 100644 --- a/mta-mono/vendor/mono/metadata/exception.h +++ b/mta-mono/vendor/mono/metadata/exception.h @@ -1,9 +1,6 @@ #ifndef _MONO_METADATA_EXCEPTION_H_ #define _MONO_METADATA_EXCEPTION_H_ -/* here for compat: should not be used anymore */ -#define MONO_ARCH_SAVE_REGS - #include #include diff --git a/mta-mono/vendor/mono/metadata/file-io.c b/mta-mono/vendor/mono/metadata/file-io.c index 097da28..d1b19fa 100644 --- a/mta-mono/vendor/mono/metadata/file-io.c +++ b/mta-mono/vendor/mono/metadata/file-io.c @@ -270,8 +270,6 @@ ves_icall_System_IO_MonoIO_CreateDirectory (MonoString *path, gint32 *error) { gboolean ret; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; ret=CreateDirectory (mono_string_chars (path), NULL); @@ -287,8 +285,6 @@ ves_icall_System_IO_MonoIO_RemoveDirectory (MonoString *path, gint32 *error) { gboolean ret; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; ret=RemoveDirectory (mono_string_chars (path)); @@ -326,8 +322,6 @@ ves_icall_System_IO_MonoIO_GetFileSystemEntries (MonoString *path, gchar *utf8_path, *utf8_result, *full_name; gint32 attributes; - MONO_ARCH_SAVE_REGS; - result = NULL; *error = ERROR_SUCCESS; @@ -519,8 +513,6 @@ ves_icall_System_IO_MonoIO_GetCurrentDirectory (gint32 *error) gunichar2 *buf; int len, res_len; - MONO_ARCH_SAVE_REGS; - len = MAX_PATH + 1; /*FIXME this is too smal under most unix systems.*/ buf = g_new (gunichar2, len); @@ -555,8 +547,6 @@ ves_icall_System_IO_MonoIO_SetCurrentDirectory (MonoString *path, { gboolean ret; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; ret=SetCurrentDirectory (mono_string_chars (path)); @@ -573,8 +563,6 @@ ves_icall_System_IO_MonoIO_MoveFile (MonoString *path, MonoString *dest, { gboolean ret; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; ret=MoveFile (mono_string_chars (path), mono_string_chars (dest)); @@ -594,8 +582,6 @@ ves_icall_System_IO_MonoIO_ReplaceFile (MonoString *sourceFileName, MonoString * gunichar2 *utf16_sourceFileName = NULL, *utf16_destinationFileName = NULL, *utf16_destinationBackupFileName = NULL; guint32 replaceFlags = REPLACEFILE_WRITE_THROUGH; - MONO_ARCH_SAVE_REGS; - if (sourceFileName) utf16_sourceFileName = mono_string_chars (sourceFileName); if (destinationFileName) @@ -622,8 +608,6 @@ ves_icall_System_IO_MonoIO_CopyFile (MonoString *path, MonoString *dest, { gboolean ret; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; ret=CopyFile (mono_string_chars (path), mono_string_chars (dest), !overwrite); @@ -639,8 +623,6 @@ ves_icall_System_IO_MonoIO_DeleteFile (MonoString *path, gint32 *error) { gboolean ret; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; ret=DeleteFile (mono_string_chars (path)); @@ -656,8 +638,6 @@ ves_icall_System_IO_MonoIO_GetFileAttributes (MonoString *path, gint32 *error) { gint32 ret; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; ret=get_file_attributes (mono_string_chars (path)); @@ -682,8 +662,6 @@ ves_icall_System_IO_MonoIO_SetFileAttributes (MonoString *path, gint32 attrs, { gboolean ret; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; ret=SetFileAttributes (mono_string_chars (path), @@ -700,8 +678,6 @@ ves_icall_System_IO_MonoIO_GetFileType (HANDLE handle, gint32 *error) { gboolean ret; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; ret=GetFileType (handle); @@ -722,8 +698,6 @@ ves_icall_System_IO_MonoIO_GetFileStat (MonoString *path, MonoIOStat *stat, gboolean result; WIN32_FILE_ATTRIBUTE_DATA data; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; result = get_file_attributes_ex (mono_string_chars (path), &data); @@ -747,8 +721,6 @@ ves_icall_System_IO_MonoIO_Open (MonoString *filename, gint32 mode, int attributes, attrs; gunichar2 *chars = mono_string_chars (filename); - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; if (options != 0){ @@ -799,8 +771,6 @@ ves_icall_System_IO_MonoIO_Close (HANDLE handle, gint32 *error) { gboolean ret; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; ret=CloseHandle (handle); @@ -820,14 +790,14 @@ ves_icall_System_IO_MonoIO_Read (HANDLE handle, MonoArray *dest, gboolean result; guint32 n; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; - MONO_CHECK_ARG_NULL (dest); + MONO_CHECK_ARG_NULL (dest, 0); - if (dest_offset > mono_array_length (dest) - count) - mono_raise_exception (mono_get_exception_argument ("array", "array too small. numBytes/offset wrong.")); + if (dest_offset > mono_array_length (dest) - count) { + mono_set_pending_exception (mono_get_exception_argument ("array", "array too small. numBytes/offset wrong.")); + return 0; + } buffer = mono_array_addr (dest, guchar, dest_offset); result = ReadFile (handle, buffer, count, &n, NULL); @@ -849,14 +819,14 @@ ves_icall_System_IO_MonoIO_Write (HANDLE handle, MonoArray *src, gboolean result; guint32 n; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; - MONO_CHECK_ARG_NULL (src); + MONO_CHECK_ARG_NULL (src, 0); - if (src_offset > mono_array_length (src) - count) - mono_raise_exception (mono_get_exception_argument ("array", "array too small. numBytes/offset wrong.")); + if (src_offset > mono_array_length (src) - count) { + mono_set_pending_exception (mono_get_exception_argument ("array", "array too small. numBytes/offset wrong.")); + return 0; + } buffer = mono_array_addr (src, guchar, src_offset); result = WriteFile (handle, buffer, count, &n, NULL); @@ -875,8 +845,6 @@ ves_icall_System_IO_MonoIO_Seek (HANDLE handle, gint64 offset, gint32 origin, { gint32 offset_hi; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; offset_hi = offset >> 32; @@ -895,8 +863,6 @@ ves_icall_System_IO_MonoIO_Flush (HANDLE handle, gint32 *error) { gboolean ret; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; ret=FlushFileBuffers (handle); @@ -913,8 +879,6 @@ ves_icall_System_IO_MonoIO_GetLength (HANDLE handle, gint32 *error) gint64 length; guint32 length_hi; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; length = GetFileSize (handle, &length_hi); @@ -934,8 +898,6 @@ ves_icall_System_IO_MonoIO_SetLength (HANDLE handle, gint64 length, gint32 length_hi; gboolean result; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; /* save file pointer */ @@ -985,8 +947,6 @@ ves_icall_System_IO_MonoIO_SetFileTime (HANDLE handle, gint64 creation_time, const FILETIME *last_access_filetime; const FILETIME *last_write_filetime; - MONO_ARCH_SAVE_REGS; - *error=ERROR_SUCCESS; if (creation_time < 0) @@ -1015,24 +975,18 @@ ves_icall_System_IO_MonoIO_SetFileTime (HANDLE handle, gint64 creation_time, HANDLE ves_icall_System_IO_MonoIO_get_ConsoleOutput () { - MONO_ARCH_SAVE_REGS; - return GetStdHandle (STD_OUTPUT_HANDLE); } HANDLE ves_icall_System_IO_MonoIO_get_ConsoleInput () { - MONO_ARCH_SAVE_REGS; - return GetStdHandle (STD_INPUT_HANDLE); } HANDLE ves_icall_System_IO_MonoIO_get_ConsoleError () { - MONO_ARCH_SAVE_REGS; - return GetStdHandle (STD_ERROR_HANDLE); } @@ -1043,8 +997,6 @@ ves_icall_System_IO_MonoIO_CreatePipe (HANDLE *read_handle, SECURITY_ATTRIBUTES attr; gboolean ret; - MONO_ARCH_SAVE_REGS; - attr.nLength=sizeof(SECURITY_ATTRIBUTES); attr.bInheritHandle=TRUE; attr.lpSecurityDescriptor=NULL; @@ -1065,8 +1017,6 @@ MonoBoolean ves_icall_System_IO_MonoIO_DuplicateHandle (HANDLE source_process_ha /* This is only used on Windows */ gboolean ret; - MONO_ARCH_SAVE_REGS; - ret=DuplicateHandle (source_process_handle, source_handle, target_process_handle, target_handle, access, inherit, options); if(ret==FALSE) { /* FIXME: throw an exception? */ @@ -1147,8 +1097,6 @@ ves_icall_System_IO_MonoIO_get_InvalidPathChars () MonoDomain *domain; int i, n; - MONO_ARCH_SAVE_REGS; - domain = mono_domain_get (); n = sizeof (invalid_path_chars) / sizeof (gunichar2); chars = mono_array_new (domain, mono_defaults.char_class, n); diff --git a/mta-mono/vendor/mono/metadata/file-mmap-posix.c b/mta-mono/vendor/mono/metadata/file-mmap-posix.c index 32f555a..e4b2bd7 100644 --- a/mta-mono/vendor/mono/metadata/file-mmap-posix.c +++ b/mta-mono/vendor/mono/metadata/file-mmap-posix.c @@ -81,10 +81,10 @@ enum { MMAP_FILE_ACCESS_READ_WRITE_EXECUTE = 5, }; -#ifdef PLATFORM_ANDROID -#define DEFAULT_FILEMODE 0666 -#else +#ifdef DEFFILEMODE #define DEFAULT_FILEMODE DEFFILEMODE +#else +#define DEFAULT_FILEMODE 0666 #endif static int mmap_init_state; @@ -280,9 +280,7 @@ open_file_map (MonoString *path, int input_fd, int mode, gint64 *capacity, int a goto done; } - *capacity = align_up_to_page_size ((size_t)*capacity); - - if (*capacity > buf.st_size) { + if (result != 0 || *capacity > buf.st_size) { int unused G_GNUC_UNUSED = ftruncate (fd, (off_t)*capacity); } @@ -481,13 +479,15 @@ mono_mmap_map (void *handle, gint64 offset, gint64 *size, int access, void **mma struct stat buf = { 0 }; fstat (fh->fd, &buf); //FIXME error handling + if (offset > buf.st_size || ((eff_size + offset) > buf.st_size && !is_special_zero_size_file (&buf))) + goto error; /** * We use the file size if one of the following conditions is true: * -input size is zero * -input size is bigger than the file and the file is not a magical zero size file such as /dev/mem. */ - if (eff_size == 0 || (eff_size > buf.st_size && !is_special_zero_size_file (&buf))) - eff_size = buf.st_size; + if (eff_size == 0) + eff_size = align_up_to_page_size (buf.st_size) - offset; *size = eff_size; mmap_offset = align_down_to_page_size (offset); @@ -502,6 +502,7 @@ mono_mmap_map (void *handle, gint64 offset, gint64 *size, int access, void **mma return 0; } +error: *mmap_handle = NULL; *base_address = NULL; return COULD_NOT_MAP_MEMORY; diff --git a/mta-mono/vendor/mono/metadata/filewatcher.c b/mta-mono/vendor/mono/metadata/filewatcher.c index 7b971aa..5523df5 100644 --- a/mta-mono/vendor/mono/metadata/filewatcher.c +++ b/mta-mono/vendor/mono/metadata/filewatcher.c @@ -54,8 +54,6 @@ ves_icall_System_IO_FSW_SupportsFSW (void) void *iter; char *err; - MONO_ARCH_SAVE_REGS; - inotify_instance = ves_icall_System_IO_InotifyWatcher_GetInotifyInstance (); if (inotify_instance != -1) { close (inotify_instance); @@ -104,8 +102,6 @@ ves_icall_System_IO_FAMW_InternalFAMNextEvent (gpointer conn, { FAMEvent ev; - MONO_ARCH_SAVE_REGS; - if (FAMNextEvent (conn, &ev) == 1) { *filename = mono_string_new (mono_domain_get (), ev.filename); *code = ev.code; @@ -148,8 +144,6 @@ ves_icall_System_IO_InotifyWatcher_AddWatch (int fd, MonoString *name, gint32 ma char *str, *path; int retval; - MONO_ARCH_SAVE_REGS; - if (name == NULL) return -1; diff --git a/mta-mono/vendor/mono/metadata/gc-internal.h b/mta-mono/vendor/mono/metadata/gc-internal.h index 7b88363..489f60d 100644 --- a/mta-mono/vendor/mono/metadata/gc-internal.h +++ b/mta-mono/vendor/mono/metadata/gc-internal.h @@ -16,11 +16,11 @@ #include typedef struct { - int minor_gc_count; - int major_gc_count; - long long minor_gc_time; - long long major_gc_time; - long long major_gc_time_concurrent; + guint minor_gc_count; + guint major_gc_count; + guint64 minor_gc_time; + guint64 major_gc_time; + guint64 major_gc_time_concurrent; } GCStats; #define mono_domain_finalizers_lock(domain) mono_mutex_lock (&(domain)->finalizable_objects_hash_lock); @@ -220,7 +220,8 @@ typedef struct { int alloc_type; } AllocatorWrapperInfo; -MonoMethod* mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box) MONO_INTERNAL; +int mono_gc_get_aligned_size_for_allocator (int size) MONO_INTERNAL; +MonoMethod* mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box, gboolean known_instance_size) MONO_INTERNAL; MonoMethod* mono_gc_get_managed_array_allocator (MonoClass *klass) MONO_INTERNAL; MonoMethod *mono_gc_get_managed_allocator_by_type (int atype) MONO_INTERNAL; @@ -369,7 +370,7 @@ typedef struct { void (*object_queued_for_finalization) (MonoObject *object); } MonoGCFinalizerCallbacks; -void mono_gc_register_finalizer_callbacks (MonoGCFinalizerCallbacks *callbacks); +MONO_API void mono_gc_register_finalizer_callbacks (MonoGCFinalizerCallbacks *callbacks); #ifdef HOST_WIN32 diff --git a/mta-mono/vendor/mono/metadata/gc.c b/mta-mono/vendor/mono/metadata/gc.c index 4e02538..4c5d596 100644 --- a/mta-mono/vendor/mono/metadata/gc.c +++ b/mta-mono/vendor/mono/metadata/gc.c @@ -415,8 +415,6 @@ ves_icall_System_GC_InternalCollect (int generation) gint64 ves_icall_System_GC_GetTotalMemory (MonoBoolean forceCollection) { - MONO_ARCH_SAVE_REGS; - if (forceCollection) mono_gc_collect (mono_gc_max_generation ()); return mono_gc_get_used_size (); @@ -425,8 +423,6 @@ ves_icall_System_GC_GetTotalMemory (MonoBoolean forceCollection) void ves_icall_System_GC_KeepAlive (MonoObject *obj) { - MONO_ARCH_SAVE_REGS; - /* * Does nothing. */ @@ -435,8 +431,7 @@ ves_icall_System_GC_KeepAlive (MonoObject *obj) void ves_icall_System_GC_ReRegisterForFinalize (MonoObject *obj) { - if (!obj) - mono_raise_exception (mono_get_exception_argument_null ("obj")); + MONO_CHECK_ARG_NULL (obj,); object_register_finalizer (obj, mono_gc_run_finalize); } @@ -444,8 +439,7 @@ ves_icall_System_GC_ReRegisterForFinalize (MonoObject *obj) void ves_icall_System_GC_SuppressFinalize (MonoObject *obj) { - if (!obj) - mono_raise_exception (mono_get_exception_argument_null ("obj")); + MONO_CHECK_ARG_NULL (obj,); /* delegates have no finalizers, but we register them to deal with the * unmanaged->managed trampoline. We don't let the user suppress it @@ -491,8 +485,10 @@ void ves_icall_System_GC_register_ephemeron_array (MonoObject *array) { #ifdef HAVE_SGEN_GC - if (!mono_gc_ephemeron_array_add (array)) - mono_raise_exception (mono_object_domain (array)->out_of_memory_ex); + if (!mono_gc_ephemeron_array_add (array)) { + mono_set_pending_exception (mono_object_domain (array)->out_of_memory_ex); + return; + } #endif } @@ -1070,6 +1066,7 @@ finalizer_thread (gpointer unused) */ g_assert (mono_domain_get () == mono_get_root_domain ()); + mono_gc_set_skip_thread (TRUE); if (wait) { /* An alertable wait is required so this thread can be suspended on windows */ @@ -1080,6 +1077,7 @@ finalizer_thread (gpointer unused) #endif } wait = TRUE; + mono_gc_set_skip_thread (FALSE); mono_threads_perform_thread_dump (); @@ -1149,12 +1147,11 @@ mono_gc_init (void) MONO_GC_REGISTER_ROOT_FIXED (gc_handles [HANDLE_NORMAL].entries); MONO_GC_REGISTER_ROOT_FIXED (gc_handles [HANDLE_PINNED].entries); - mono_counters_register ("Created object count", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &mono_stats.new_object_count); - mono_counters_register ("Minor GC collections", MONO_COUNTER_GC | MONO_COUNTER_INT, &gc_stats.minor_gc_count); - mono_counters_register ("Major GC collections", MONO_COUNTER_GC | MONO_COUNTER_INT, &gc_stats.major_gc_count); - mono_counters_register ("Minor GC time", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &gc_stats.minor_gc_time); - mono_counters_register ("Major GC time", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &gc_stats.major_gc_time); - mono_counters_register ("Major GC time concurrent", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &gc_stats.major_gc_time_concurrent); + mono_counters_register ("Minor GC collections", MONO_COUNTER_GC | MONO_COUNTER_UINT, &gc_stats.minor_gc_count); + mono_counters_register ("Major GC collections", MONO_COUNTER_GC | MONO_COUNTER_UINT, &gc_stats.major_gc_count); + mono_counters_register ("Minor GC time", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &gc_stats.minor_gc_time); + mono_counters_register ("Major GC time", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &gc_stats.major_gc_time); + mono_counters_register ("Major GC time concurrent", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &gc_stats.major_gc_time_concurrent); mono_gc_base_init (); @@ -1224,7 +1221,7 @@ mono_gc_cleanup (void) ret = WaitForSingleObjectEx (gc_thread->handle, INFINITE, TRUE); g_assert (ret == WAIT_OBJECT_0); - mono_thread_join (MONO_UINT_TO_NATIVE_THREAD_ID (gc_thread->tid)); + mono_thread_join (GUINT_TO_POINTER (gc_thread->tid)); } } gc_thread = NULL; diff --git a/mta-mono/vendor/mono/metadata/icall-def.h b/mta-mono/vendor/mono/metadata/icall-def.h index 257b833..c6ac27f 100644 --- a/mta-mono/vendor/mono/metadata/icall-def.h +++ b/mta-mono/vendor/mono/metadata/icall-def.h @@ -115,9 +115,6 @@ ICALL(BUFFER_2, "ByteLengthInternal", ves_icall_System_Buffer_ByteLengthInternal ICALL(BUFFER_3, "GetByteInternal", ves_icall_System_Buffer_GetByteInternal) ICALL(BUFFER_4, "SetByteInternal", ves_icall_System_Buffer_SetByteInternal) -ICALL_TYPE(CHAR, "System.Char", CHAR_1) -ICALL(CHAR_1, "GetDataTablePointers", ves_icall_System_Char_GetDataTablePointers) - ICALL_TYPE (COMPO_W, "System.ComponentModel.Win32Exception", COMPO_W_1) ICALL (COMPO_W_1, "W32ErrorMessage", ves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage) @@ -137,33 +134,27 @@ ICALL(CONSOLE_3, "SetBreak", ves_icall_System_ConsoleDriver_SetBreak ) ICALL(CONSOLE_4, "SetEcho", ves_icall_System_ConsoleDriver_SetEcho ) ICALL(CONSOLE_5, "TtySetup", ves_icall_System_ConsoleDriver_TtySetup ) -ICALL_TYPE(CONVERT, "System.Convert", CONVERT_1) -ICALL(CONVERT_1, "InternalFromBase64CharArray", InternalFromBase64CharArray ) -ICALL(CONVERT_2, "InternalFromBase64String", InternalFromBase64String ) - ICALL_TYPE(TZONE, "System.CurrentSystemTimeZone", TZONE_1) ICALL(TZONE_1, "GetTimeZoneData", ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData) ICALL_TYPE(DTIME, "System.DateTime", DTIME_1) -ICALL(DTIME_1, "GetNow", mono_100ns_datetime) -ICALL(DTIME_2, "GetTimeMonotonic", mono_100ns_ticks) +ICALL(DTIME_1, "GetSystemTimeAsFileTime", mono_100ns_datetime) #ifndef DISABLE_DECIMAL ICALL_TYPE(DECIMAL, "System.Decimal", DECIMAL_1) -ICALL(DECIMAL_1, "decimal2Int64", mono_decimal2Int64) -ICALL(DECIMAL_2, "decimal2UInt64", mono_decimal2UInt64) -ICALL(DECIMAL_3, "decimal2double", mono_decimal2double) -//ICALL(DECIMAL_4, "decimal2string", mono_decimal2string) -ICALL(DECIMAL_5, "decimalCompare", mono_decimalCompare) -ICALL(DECIMAL_6, "decimalDiv", mono_decimalDiv) -ICALL(DECIMAL_7, "decimalFloorAndTrunc", mono_decimalFloorAndTrunc) -ICALL(DECIMAL_8, "decimalIncr", mono_decimalIncr) -ICALL(DECIMAL_9, "decimalIntDiv", mono_decimalIntDiv) -ICALL(DECIMAL_10, "decimalMult", mono_decimalMult) -ICALL(DECIMAL_11, "decimalRound", mono_decimalRound) -ICALL(DECIMAL_12, "decimalSetExponent", mono_decimalSetExponent) -ICALL(DECIMAL_13, "double2decimal", mono_double2decimal) /* FIXME: wrong signature. */ -ICALL(DECIMAL_14, "string2decimal", mono_string2decimal) +ICALL(DECIMAL_1, ".ctor(double)", mono_decimal_init_double) +ICALL(DECIMAL_2, ".ctor(single)", mono_decimal_init_single) +ICALL(DECIMAL_3, "FCallAddSub(System.Decimal&,System.Decimal&,byte)", mono_decimal_addsub) +ICALL(DECIMAL_4, "FCallCompare", mono_decimal_compare) +ICALL(DECIMAL_5, "FCallDivide", mono_decimal_divide) +ICALL(DECIMAL_6, "FCallFloor", mono_decimal_floor) +ICALL(DECIMAL_7, "FCallMultiply", mono_decimal_multiply) +ICALL(DECIMAL_8, "FCallRound", mono_decimal_round) +ICALL(DECIMAL_9, "FCallToInt32", mono_decimal_to_int32) +ICALL(DECIMAL_10, "FCallTruncate", mono_decimal_truncate) +ICALL(DECIMAL_11, "GetHashCode", mono_decimal_get_hash_code) +ICALL(DECIMAL_12, "ToDouble", mono_decimal_to_double) +ICALL(DECIMAL_13, "ToSingle", mono_decimal_to_float) #endif ICALL_TYPE(DELEGATE, "System.Delegate", DELEGATE_1) @@ -231,12 +222,13 @@ ICALL(STOPWATCH_1, "GetTimestamp", mono_100ns_ticks) ICALL_TYPE(DOUBLE, "System.Double", DOUBLE_1) ICALL(DOUBLE_1, "ParseImpl", mono_double_ParseImpl) -ICALL_TYPE(ENUM, "System.Enum", ENUM_1) +ICALL_TYPE(ENUM, "System.Enum", ENUM_6) +ICALL(ENUM_6, "InternalHasFlag", ves_icall_System_Enum_InternalHasFlag) ICALL(ENUM_1, "ToObject", ves_icall_System_Enum_ToObject) -ICALL(ENUM_5, "compare_value_to", ves_icall_System_Enum_compare_value_to) -ICALL(ENUM_4, "get_hashcode", ves_icall_System_Enum_get_hashcode) -ICALL(ENUM_3, "get_underlying_type", ves_icall_System_Enum_get_underlying_type) -ICALL(ENUM_2, "get_value", ves_icall_System_Enum_get_value) +ICALL(ENUM_2, "compare_value_to", ves_icall_System_Enum_compare_value_to) +ICALL(ENUM_3, "get_hashcode", ves_icall_System_Enum_get_hashcode) +ICALL(ENUM_4, "get_underlying_type", ves_icall_System_Enum_get_underlying_type) +ICALL(ENUM_5, "get_value", ves_icall_System_Enum_get_value) ICALL_TYPE(ENV, "System.Environment", ENV_1) ICALL(ENV_1, "Exit", ves_icall_System_Environment_Exit) @@ -276,6 +268,9 @@ ICALL(GC_7, "get_MaxGeneration", mono_gc_max_generation) ICALL(GC_9, "get_ephemeron_tombstone", ves_icall_System_GC_get_ephemeron_tombstone) ICALL(GC_8, "register_ephemeron_array", ves_icall_System_GC_register_ephemeron_array) +ICALL_TYPE(CALDATA, "System.Globalization.CalendarData", CALDATA_1) +ICALL(CALDATA_1, "fill_calendar_data", ves_icall_System_Globalization_CalendarData_fill_calendar_data) + ICALL_TYPE(COMPINF, "System.Globalization.CompareInfo", COMPINF_1) ICALL(COMPINF_1, "assign_sortkey(object,string,System.Globalization.CompareOptions)", ves_icall_System_Globalization_CompareInfo_assign_sortkey) ICALL(COMPINF_2, "construct_compareinfo(string)", ves_icall_System_Globalization_CompareInfo_construct_compareinfo) @@ -284,8 +279,10 @@ ICALL(COMPINF_4, "internal_compare(string,int,int,string,int,int,System.Globaliz ICALL(COMPINF_5, "internal_index(string,int,int,char,System.Globalization.CompareOptions,bool)", ves_icall_System_Globalization_CompareInfo_internal_index_char) ICALL(COMPINF_6, "internal_index(string,int,int,string,System.Globalization.CompareOptions,bool)", ves_icall_System_Globalization_CompareInfo_internal_index) -ICALL_TYPE(CULINF, "System.Globalization.CultureInfo", CULINF_2) -ICALL(CULINF_2, "construct_datetime_format", ves_icall_System_Globalization_CultureInfo_construct_datetime_format) +ICALL_TYPE(CULDATA, "System.Globalization.CultureData", CULDATA_1) +ICALL(CULDATA_1, "fill_culture_data", ves_icall_System_Globalization_CultureData_fill_culture_data) + +ICALL_TYPE(CULINF, "System.Globalization.CultureInfo", CULINF_5) ICALL(CULINF_5, "construct_internal_locale_from_lcid", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid) ICALL(CULINF_6, "construct_internal_locale_from_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name) ICALL(CULINF_8, "construct_number_format", ves_icall_System_Globalization_CultureInfo_construct_number_format) @@ -297,6 +294,9 @@ ICALL_TYPE(REGINF, "System.Globalization.RegionInfo", REGINF_1) ICALL(REGINF_1, "construct_internal_region_from_lcid", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_lcid) ICALL(REGINF_2, "construct_internal_region_from_name", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name) +ICALL_TYPE(TXTINF, "System.Globalization.TextInfo", TXTINF_1) +ICALL(TXTINF_1, "GetDataTablePointersLite", ves_icall_System_Globalization_TextInfo_GetDataTablePointersLite) + #ifndef PLATFORM_NO_DRIVEINFO ICALL_TYPE(IODRIVEINFO, "System.IO.DriveInfo", IODRIVEINFO_1) ICALL(IODRIVEINFO_1, "GetDiskFreeSpaceInternal", ves_icall_System_IO_DriveInfo_GetDiskFreeSpace) @@ -443,6 +443,11 @@ ICALL(NDNS_1, "GetHostByAddr_internal(string,string&,string[]&,string[]&)", ves_ ICALL(NDNS_2, "GetHostByName_internal(string,string&,string[]&,string[]&)", ves_icall_System_Net_Dns_GetHostByName_internal) ICALL(NDNS_3, "GetHostName_internal(string&)", ves_icall_System_Net_Dns_GetHostName_internal) +#if defined(PLATFORM_MACOSX) || defined(PLATFORM_BSD) +ICALL_TYPE(MAC_IFACE_PROPS, "System.Net.NetworkInformation.MacOsIPInterfaceProperties", MAC_IFACE_PROPS_1) +ICALL(MAC_IFACE_PROPS_1, "ParseRouteInfo_internal", ves_icall_System_Net_NetworkInformation_MacOsIPInterfaceProperties_ParseRouteInfo_internal) +#endif + ICALL_TYPE(SOCK, "System.Net.Sockets.Socket", SOCK_1) ICALL(SOCK_1, "Accept_internal(intptr,int&,bool)", ves_icall_System_Net_Sockets_Socket_Accept_internal) ICALL(SOCK_2, "Available_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Available_internal) @@ -476,6 +481,8 @@ ICALL_TYPE(SOCKEX, "System.Net.Sockets.SocketException", SOCKEX_1) ICALL(SOCKEX_1, "WSAGetLastError_internal", ves_icall_System_Net_Sockets_SocketException_WSAGetLastError_internal) #endif /* !DISABLE_SOCKETS */ +ICALL_TYPE(NUMBER, "System.Number", NUMBER_1) +ICALL(NUMBER_1, "NumberBufferToDecimal", mono_decimal_from_number) ICALL_TYPE(NUMBER_FORMATTER, "System.NumberFormatter", NUMBER_FORMATTER_1) ICALL(NUMBER_FORMATTER_1, "GetFormatterTables", ves_icall_System_NumberFormatter_GetFormatterTables) @@ -799,8 +806,8 @@ ICALL(STRING_10, "InternalIntern", ves_icall_System_String_InternalIntern) ICALL(STRING_11, "InternalIsInterned", ves_icall_System_String_InternalIsInterned) ICALL(STRING_12, "InternalSetLength", ves_icall_System_String_InternalSetLength) -ICALL_TYPE(TENC, "System.Text.Encoding", TENC_1) -ICALL(TENC_1, "InternalCodePage", ves_icall_System_Text_Encoding_InternalCodePage) +ICALL_TYPE(TENC, "System.Text.EncodingHelper", TENC_1) +ICALL(TENC_1, "InternalCodePage", ves_icall_System_Text_EncodingHelper_InternalCodePage) ICALL_TYPE(ILOCK, "System.Threading.Interlocked", ILOCK_1) ICALL(ILOCK_1, "Add(int&,int)", ves_icall_System_Threading_Interlocked_Add_Int) @@ -808,22 +815,23 @@ ICALL(ILOCK_2, "Add(long&,long)", ves_icall_System_Threading_Interlocked_Add_Lon ICALL(ILOCK_3, "CompareExchange(T&,T,T)", ves_icall_System_Threading_Interlocked_CompareExchange_T) ICALL(ILOCK_4, "CompareExchange(double&,double,double)", ves_icall_System_Threading_Interlocked_CompareExchange_Double) ICALL(ILOCK_5, "CompareExchange(int&,int,int)", ves_icall_System_Threading_Interlocked_CompareExchange_Int) -ICALL(ILOCK_6, "CompareExchange(intptr&,intptr,intptr)", ves_icall_System_Threading_Interlocked_CompareExchange_IntPtr) -ICALL(ILOCK_7, "CompareExchange(long&,long,long)", ves_icall_System_Threading_Interlocked_CompareExchange_Long) -ICALL(ILOCK_8, "CompareExchange(object&,object,object)", ves_icall_System_Threading_Interlocked_CompareExchange_Object) -ICALL(ILOCK_9, "CompareExchange(single&,single,single)", ves_icall_System_Threading_Interlocked_CompareExchange_Single) -ICALL(ILOCK_10, "Decrement(int&)", ves_icall_System_Threading_Interlocked_Decrement_Int) -ICALL(ILOCK_11, "Decrement(long&)", ves_icall_System_Threading_Interlocked_Decrement_Long) -ICALL(ILOCK_12, "Exchange(T&,T)", ves_icall_System_Threading_Interlocked_Exchange_T) -ICALL(ILOCK_13, "Exchange(double&,double)", ves_icall_System_Threading_Interlocked_Exchange_Double) -ICALL(ILOCK_14, "Exchange(int&,int)", ves_icall_System_Threading_Interlocked_Exchange_Int) -ICALL(ILOCK_15, "Exchange(intptr&,intptr)", ves_icall_System_Threading_Interlocked_Exchange_IntPtr) -ICALL(ILOCK_16, "Exchange(long&,long)", ves_icall_System_Threading_Interlocked_Exchange_Long) -ICALL(ILOCK_17, "Exchange(object&,object)", ves_icall_System_Threading_Interlocked_Exchange_Object) -ICALL(ILOCK_18, "Exchange(single&,single)", ves_icall_System_Threading_Interlocked_Exchange_Single) -ICALL(ILOCK_19, "Increment(int&)", ves_icall_System_Threading_Interlocked_Increment_Int) -ICALL(ILOCK_20, "Increment(long&)", ves_icall_System_Threading_Interlocked_Increment_Long) -ICALL(ILOCK_21, "Read(long&)", ves_icall_System_Threading_Interlocked_Read_Long) +ICALL(ILOCK_6, "CompareExchange(int&,int,int,bool&)", ves_icall_System_Threading_Interlocked_CompareExchange_Int_Success) +ICALL(ILOCK_7, "CompareExchange(intptr&,intptr,intptr)", ves_icall_System_Threading_Interlocked_CompareExchange_IntPtr) +ICALL(ILOCK_8, "CompareExchange(long&,long,long)", ves_icall_System_Threading_Interlocked_CompareExchange_Long) +ICALL(ILOCK_9, "CompareExchange(object&,object,object)", ves_icall_System_Threading_Interlocked_CompareExchange_Object) +ICALL(ILOCK_10, "CompareExchange(single&,single,single)", ves_icall_System_Threading_Interlocked_CompareExchange_Single) +ICALL(ILOCK_11, "Decrement(int&)", ves_icall_System_Threading_Interlocked_Decrement_Int) +ICALL(ILOCK_12, "Decrement(long&)", ves_icall_System_Threading_Interlocked_Decrement_Long) +ICALL(ILOCK_13, "Exchange(T&,T)", ves_icall_System_Threading_Interlocked_Exchange_T) +ICALL(ILOCK_14, "Exchange(double&,double)", ves_icall_System_Threading_Interlocked_Exchange_Double) +ICALL(ILOCK_15, "Exchange(int&,int)", ves_icall_System_Threading_Interlocked_Exchange_Int) +ICALL(ILOCK_16, "Exchange(intptr&,intptr)", ves_icall_System_Threading_Interlocked_Exchange_IntPtr) +ICALL(ILOCK_17, "Exchange(long&,long)", ves_icall_System_Threading_Interlocked_Exchange_Long) +ICALL(ILOCK_18, "Exchange(object&,object)", ves_icall_System_Threading_Interlocked_Exchange_Object) +ICALL(ILOCK_19, "Exchange(single&,single)", ves_icall_System_Threading_Interlocked_Exchange_Single) +ICALL(ILOCK_20, "Increment(int&)", ves_icall_System_Threading_Interlocked_Increment_Int) +ICALL(ILOCK_21, "Increment(long&)", ves_icall_System_Threading_Interlocked_Increment_Long) +ICALL(ILOCK_22, "Read(long&)", ves_icall_System_Threading_Interlocked_Read_Long) ICALL_TYPE(ITHREAD, "System.Threading.InternalThread", ITHREAD_1) ICALL(ITHREAD_1, "Thread_free_internal", ves_icall_System_Threading_InternalThread_Thread_free_internal) @@ -869,6 +877,7 @@ ICALL(THREAD_4, "FreeLocalSlotValues", mono_thread_free_local_slot_values) ICALL(THREAD_55, "GetAbortExceptionState", ves_icall_System_Threading_Thread_GetAbortExceptionState) ICALL(THREAD_7, "GetDomainID", ves_icall_System_Threading_Thread_GetDomainID) ICALL(THREAD_8, "GetName_internal(System.Threading.InternalThread)", ves_icall_System_Threading_Thread_GetName_internal) +ICALL(THREAD_57, "GetPriority(System.Threading.InternalThread)", ves_icall_System_Threading_Thread_GetPriority) ICALL(THREAD_11, "GetState(System.Threading.InternalThread)", ves_icall_System_Threading_Thread_GetState) ICALL(THREAD_53, "Interrupt_internal(System.Threading.InternalThread)", ves_icall_System_Threading_Thread_Interrupt_internal) ICALL(THREAD_12, "Join_internal(System.Threading.InternalThread,int,intptr)", ves_icall_System_Threading_Thread_Join_internal) @@ -876,6 +885,7 @@ ICALL(THREAD_13, "MemoryBarrier", ves_icall_System_Threading_Thread_MemoryBarrie ICALL(THREAD_14, "ResetAbort_internal()", ves_icall_System_Threading_Thread_ResetAbort) ICALL(THREAD_15, "Resume_internal()", ves_icall_System_Threading_Thread_Resume) ICALL(THREAD_18, "SetName_internal(System.Threading.InternalThread,string)", ves_icall_System_Threading_Thread_SetName_internal) +ICALL(THREAD_58, "SetPriority(System.Threading.InternalThread,int)", ves_icall_System_Threading_Thread_SetPriority) ICALL(THREAD_21, "SetState(System.Threading.InternalThread,System.Threading.ThreadState)", ves_icall_System_Threading_Thread_SetState) ICALL(THREAD_22, "Sleep_internal", ves_icall_System_Threading_Thread_Sleep_internal) ICALL(THREAD_54, "SpinWait_nop", ves_icall_System_Threading_Thread_SpinWait_nop) @@ -919,6 +929,9 @@ ICALL(THREADP_35, "SetMaxThreads", ves_icall_System_Threading_ThreadPool_SetMaxT ICALL(THREADP_4, "SetMinThreads", ves_icall_System_Threading_ThreadPool_SetMinThreads) ICALL(THREADP_5, "pool_queue", icall_append_job) +ICALL_TYPE(TTIMER, "System.Threading.Timer", TTIMER_1) +ICALL(TTIMER_1, "GetTimeMonotonic", mono_100ns_ticks) + ICALL_TYPE(VOLATILE, "System.Threading.Volatile", VOLATILE_28) ICALL(VOLATILE_28, "Read(T&)", ves_icall_System_Threading_Volatile_Read_T) ICALL(VOLATILE_1, "Read(bool&)", ves_icall_System_Threading_Volatile_Read1) diff --git a/mta-mono/vendor/mono/metadata/icall.c b/mta-mono/vendor/mono/metadata/icall.c index 763b2f6..b39ed3e 100644 --- a/mta-mono/vendor/mono/metadata/icall.c +++ b/mta-mono/vendor/mono/metadata/icall.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -94,7 +95,7 @@ #include #include #endif -#include "decimal.h" +#include "decimal-ms.h" extern MonoString* ves_icall_System_Environment_GetOSVersionString (void) MONO_INTERNAL; @@ -125,8 +126,6 @@ mono_double_ParseImpl (char *ptr, double *result) gchar *endptr = NULL; *result = 0.0; - MONO_ARCH_SAVE_REGS; - if (*ptr){ /* mono_strtod () is not thread-safe */ mono_mutex_lock (&mono_strtod_mutex); @@ -148,8 +147,6 @@ ves_icall_System_Array_GetValueImpl (MonoObject *this, guint32 pos) gint32 esize; gpointer *ea; - MONO_ARCH_SAVE_REGS; - ao = (MonoArray *)this; ac = (MonoClass *)ao->obj.vtable->klass; @@ -169,9 +166,7 @@ ves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs) MonoArray *ao, *io; gint32 i, pos, *ind; - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (idxs); + MONO_CHECK_ARG_NULL (idxs, NULL); io = (MonoArray *)idxs; ic = (MonoClass *)io->obj.vtable->klass; @@ -180,22 +175,29 @@ ves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs) ac = (MonoClass *)ao->obj.vtable->klass; g_assert (ic->rank == 1); - if (io->bounds != NULL || io->max_length != ac->rank) - mono_raise_exception (mono_get_exception_argument (NULL, NULL)); + if (io->bounds != NULL || io->max_length != ac->rank) { + mono_set_pending_exception (mono_get_exception_argument (NULL, NULL)); + return NULL; + } ind = (gint32 *)io->vector; if (ao->bounds == NULL) { - if (*ind < 0 || *ind >= ao->max_length) - mono_raise_exception (mono_get_exception_index_out_of_range ()); + if (*ind < 0 || *ind >= ao->max_length) { + mono_set_pending_exception (mono_get_exception_index_out_of_range ()); + return NULL; + } return ves_icall_System_Array_GetValueImpl (this, *ind); } - for (i = 0; i < ac->rank; i++) + for (i = 0; i < ac->rank; i++) { if ((ind [i] < ao->bounds [i].lower_bound) || - (ind [i] >= (mono_array_lower_bound_t)ao->bounds [i].length + ao->bounds [i].lower_bound)) - mono_raise_exception (mono_get_exception_index_out_of_range ()); + (ind [i] >= (mono_array_lower_bound_t)ao->bounds [i].length + ao->bounds [i].lower_bound)) { + mono_set_pending_exception (mono_get_exception_index_out_of_range ()); + return NULL; + } + } pos = ind [0] - ao->bounds [0].lower_bound; for (i = 1; i < ac->rank; i++) @@ -217,8 +219,6 @@ ves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32 gint64 i64 = 0; gdouble r64 = 0; - MONO_ARCH_SAVE_REGS; - if (value) vc = value->vtable->klass; else @@ -242,19 +242,23 @@ ves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32 } #define NO_WIDENING_CONVERSION G_STMT_START{\ - mono_raise_exception (mono_get_exception_argument ( \ + mono_set_pending_exception (mono_get_exception_argument ( \ "value", "not a widening conversion")); \ + return; \ }G_STMT_END #define CHECK_WIDENING_CONVERSION(extra) G_STMT_START{\ - if (esize < vsize + (extra)) \ - mono_raise_exception (mono_get_exception_argument ( \ + if (esize < vsize + (extra)) { \ + mono_set_pending_exception (mono_get_exception_argument ( \ "value", "not a widening conversion")); \ + return; \ + } \ }G_STMT_END #define INVALID_CAST G_STMT_START{ \ mono_get_runtime_callbacks ()->set_cast_details (vc, ec); \ - mono_raise_exception (mono_get_exception_invalid_cast ()); \ + mono_set_pending_exception (mono_get_exception_invalid_cast ()); \ + return; \ }G_STMT_END /* Check element (destination) type. */ @@ -490,22 +494,24 @@ ves_icall_System_Array_SetValue (MonoArray *this, MonoObject *value, MonoClass *ac, *ic; gint32 i, pos, *ind; - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (idxs); + MONO_CHECK_ARG_NULL (idxs,); ic = idxs->obj.vtable->klass; ac = this->obj.vtable->klass; g_assert (ic->rank == 1); - if (idxs->bounds != NULL || idxs->max_length != ac->rank) - mono_raise_exception (mono_get_exception_argument (NULL, NULL)); + if (idxs->bounds != NULL || idxs->max_length != ac->rank) { + mono_set_pending_exception (mono_get_exception_argument (NULL, NULL)); + return; + } ind = (gint32 *)idxs->vector; if (this->bounds == NULL) { - if (*ind < 0 || *ind >= this->max_length) - mono_raise_exception (mono_get_exception_index_out_of_range ()); + if (*ind < 0 || *ind >= this->max_length) { + mono_set_pending_exception (mono_get_exception_index_out_of_range ()); + return; + } ves_icall_System_Array_SetValueImpl (this, value, *ind); return; @@ -513,8 +519,10 @@ ves_icall_System_Array_SetValue (MonoArray *this, MonoObject *value, for (i = 0; i < ac->rank; i++) if ((ind [i] < this->bounds [i].lower_bound) || - (ind [i] >= (mono_array_lower_bound_t)this->bounds [i].length + this->bounds [i].lower_bound)) - mono_raise_exception (mono_get_exception_index_out_of_range ()); + (ind [i] >= (mono_array_lower_bound_t)this->bounds [i].length + this->bounds [i].lower_bound)) { + mono_set_pending_exception (mono_get_exception_index_out_of_range ()); + return; + } pos = ind [0] - this->bounds [0].lower_bound; for (i = 1; i < ac->rank; i++) @@ -532,18 +540,19 @@ ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray * uintptr_t *sizes, i; gboolean bounded = FALSE; - MONO_ARCH_SAVE_REGS; + MONO_CHECK_ARG_NULL (type, NULL); + MONO_CHECK_ARG_NULL (lengths, NULL); - MONO_CHECK_ARG_NULL (type); - MONO_CHECK_ARG_NULL (lengths); - - MONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0); + MONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0, NULL); if (bounds) - MONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds)); + MONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds), NULL); - for (i = 0; i < mono_array_length (lengths); i++) - if (mono_array_get (lengths, gint32, i) < 0) - mono_raise_exception (mono_get_exception_argument_out_of_range (NULL)); + for (i = 0; i < mono_array_length (lengths); i++) { + if (mono_array_get (lengths, gint32, i) < 0) { + mono_set_pending_exception (mono_get_exception_argument_out_of_range (NULL)); + return NULL; + } + } klass = mono_class_from_mono_type (type->type); mono_class_init_or_throw (klass); @@ -578,19 +587,20 @@ ves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray uintptr_t *sizes, i; gboolean bounded = FALSE; - MONO_ARCH_SAVE_REGS; + MONO_CHECK_ARG_NULL (type, NULL); + MONO_CHECK_ARG_NULL (lengths, NULL); - MONO_CHECK_ARG_NULL (type); - MONO_CHECK_ARG_NULL (lengths); - - MONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0); + MONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0, NULL); if (bounds) - MONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds)); + MONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds), NULL); - for (i = 0; i < mono_array_length (lengths); i++) + for (i = 0; i < mono_array_length (lengths); i++) { if ((mono_array_get (lengths, gint64, i) < 0) || - (mono_array_get (lengths, gint64, i) > MONO_ARRAY_MAX_INDEX)) - mono_raise_exception (mono_get_exception_argument_out_of_range (NULL)); + (mono_array_get (lengths, gint64, i) > MONO_ARRAY_MAX_INDEX)) { + mono_set_pending_exception (mono_get_exception_argument_out_of_range (NULL)); + return NULL; + } + } klass = mono_class_from_mono_type (type->type); mono_class_init_or_throw (klass); @@ -620,8 +630,6 @@ ves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray ICALL_EXPORT gint32 ves_icall_System_Array_GetRank (MonoObject *this) { - MONO_ARCH_SAVE_REGS; - return this->vtable->klass->rank; } @@ -631,10 +639,10 @@ ves_icall_System_Array_GetLength (MonoArray *this, gint32 dimension) gint32 rank = ((MonoObject *)this)->vtable->klass->rank; uintptr_t length; - MONO_ARCH_SAVE_REGS; - - if ((dimension < 0) || (dimension >= rank)) - mono_raise_exception (mono_get_exception_index_out_of_range ()); + if ((dimension < 0) || (dimension >= rank)) { + mono_set_pending_exception (mono_get_exception_index_out_of_range ()); + return 0; + } if (this->bounds == NULL) length = this->max_length; @@ -642,8 +650,10 @@ ves_icall_System_Array_GetLength (MonoArray *this, gint32 dimension) length = this->bounds [dimension].length; #ifdef MONO_BIG_ARRAYS - if (length > G_MAXINT32) - mono_raise_exception (mono_get_exception_overflow ()); + if (length > G_MAXINT32) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return 0; + } #endif return length; } @@ -653,10 +663,10 @@ ves_icall_System_Array_GetLongLength (MonoArray *this, gint32 dimension) { gint32 rank = ((MonoObject *)this)->vtable->klass->rank; - MONO_ARCH_SAVE_REGS; - - if ((dimension < 0) || (dimension >= rank)) - mono_raise_exception (mono_get_exception_index_out_of_range ()); + if ((dimension < 0) || (dimension >= rank)) { + mono_set_pending_exception (mono_get_exception_index_out_of_range ()); + return 0; + } if (this->bounds == NULL) return this->max_length; @@ -669,10 +679,10 @@ ves_icall_System_Array_GetLowerBound (MonoArray *this, gint32 dimension) { gint32 rank = ((MonoObject *)this)->vtable->klass->rank; - MONO_ARCH_SAVE_REGS; - - if ((dimension < 0) || (dimension >= rank)) - mono_raise_exception (mono_get_exception_index_out_of_range ()); + if ((dimension < 0) || (dimension >= rank)) { + mono_set_pending_exception (mono_get_exception_index_out_of_range ()); + return 0; + } if (this->bounds == NULL) return 0; @@ -759,8 +769,6 @@ ves_icall_System_Array_GetGenericValueImpl (MonoObject *this, guint32 pos, gpoin gint32 esize; gpointer *ea; - MONO_ARCH_SAVE_REGS; - ao = (MonoArray *)this; ac = (MonoClass *)ao->obj.vtable->klass; @@ -778,8 +786,6 @@ ves_icall_System_Array_SetGenericValueImpl (MonoObject *this, guint32 pos, gpoin gint32 esize; gpointer *ea; - MONO_ARCH_SAVE_REGS; - ao = (MonoArray *)this; ac = (MonoClass *)ao->obj.vtable->klass; ec = ac->element_class; @@ -812,13 +818,15 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoAr if (MONO_TYPE_IS_REFERENCE (type) || type->type == MONO_TYPE_VALUETYPE) { MonoException *exc = mono_get_exception_argument("array", "Cannot initialize array of non-primitive type."); - mono_raise_exception (exc); + mono_set_pending_exception (exc); + return; } if (!(field_handle->type->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA)) { MonoException *exc = mono_get_exception_argument("field_handle", "Field doesn't have an RVA"); - mono_raise_exception (exc); + mono_set_pending_exception (exc); + return; } size *= array->max_length; @@ -827,7 +835,8 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoAr if (size > mono_type_size (field_handle->type, &align)) { MonoException *exc = mono_get_exception_argument("field_handle", "Field not large enough to fill array"); - mono_raise_exception (exc); + mono_set_pending_exception (exc); + return; } #if G_BYTE_ORDER != G_LITTLE_ENDIAN @@ -871,16 +880,12 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoAr ICALL_EXPORT gint ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData (void) { - MONO_ARCH_SAVE_REGS; - return offsetof (MonoString, chars); } ICALL_EXPORT MonoObject * ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue (MonoObject *obj) { - MONO_ARCH_SAVE_REGS; - if ((obj == NULL) || (! (obj->vtable->klass->valuetype))) return obj; else @@ -893,10 +898,10 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor (Mo MonoClass *klass; MonoVTable *vtable; - MONO_CHECK_ARG_NULL (handle); + MONO_CHECK_ARG_NULL (handle,); klass = mono_class_from_mono_type (handle); - MONO_CHECK_ARG (handle, klass); + MONO_CHECK_ARG (handle, klass,); vtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE); @@ -949,8 +954,6 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_SufficientExecutionStac ICALL_EXPORT MonoObject * ves_icall_System_Object_MemberwiseClone (MonoObject *this) { - MONO_ARCH_SAVE_REGS; - return mono_object_clone (this); } @@ -965,8 +968,6 @@ ves_icall_System_ValueType_InternalGetHashCode (MonoObject *this, MonoArray **fi MonoClassField* field; gpointer iter; - MONO_ARCH_SAVE_REGS; - klass = mono_object_class (this); if (mono_class_num_fields (klass) == 0) @@ -1024,9 +1025,7 @@ ves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray gpointer iter; int count = 0; - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (that); + MONO_CHECK_ARG_NULL (that, FALSE); if (this->vtable != that->vtable) return FALSE; @@ -1129,8 +1128,6 @@ ves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray ICALL_EXPORT MonoReflectionType * ves_icall_System_Object_GetType (MonoObject *obj) { - MONO_ARCH_SAVE_REGS; - #ifndef DISABLE_REMOTING if (obj->vtable->klass == mono_defaults.transparent_proxy_class) return mono_type_get_object (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg); @@ -1142,8 +1139,6 @@ ves_icall_System_Object_GetType (MonoObject *obj) ICALL_EXPORT void mono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj) { - MONO_ARCH_SAVE_REGS; - mtype->type = &obj->vtable->klass->byval_arg; g_assert (mtype->type->type); } @@ -1151,9 +1146,7 @@ mono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj) ICALL_EXPORT gint32 ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *obj, gboolean create_open_instance) { - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (obj); + MONO_CHECK_ARG_NULL (obj, 0); return mono_image_create_token (mb->dynamic_image, obj, create_open_instance, TRUE); } @@ -1163,9 +1156,7 @@ ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb, MonoReflectionMethod *method, MonoArray *opt_param_types) { - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (method); + MONO_CHECK_ARG_NULL (method, 0); return mono_image_create_method_token ( mb->dynamic_image, (MonoObject *) method, opt_param_types); @@ -1174,24 +1165,18 @@ ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb, ICALL_EXPORT void ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file) { - MONO_ARCH_SAVE_REGS; - mono_image_create_pefile (mb, file); } ICALL_EXPORT void ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb) { - MONO_ARCH_SAVE_REGS; - mono_image_build_metadata (mb); } ICALL_EXPORT void ves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilder *mb, MonoObject *obj, guint32 token) { - MONO_ARCH_SAVE_REGS; - mono_image_register_token (mb->dynamic_image, token, obj); } @@ -1270,8 +1255,6 @@ type_from_name (const char *str, MonoBoolean ignoreCase) char *temp_str = g_strdup (str); gboolean type_resolve = FALSE; - MONO_ARCH_SAVE_REGS; - /* mono_reflection_parse_type() mangles the string */ if (!mono_reflection_parse_type (temp_str, &info)) { mono_reflection_free_type_info (&info); @@ -1362,8 +1345,10 @@ ves_icall_type_from_name (MonoString *name, e = mono_get_exception_type_load (name, NULL); mono_loader_clear_error (); - if (e != NULL) - mono_raise_exception (e); + if (e) { + mono_set_pending_exception (e); + return NULL; + } } return type; @@ -1375,16 +1360,12 @@ ves_icall_type_from_handle (MonoType *handle) { MonoDomain *domain = mono_domain_get (); - MONO_ARCH_SAVE_REGS; - return mono_type_get_object (domain, handle); } ICALL_EXPORT MonoBoolean ves_icall_System_Type_EqualsInternal (MonoReflectionType *type, MonoReflectionType *c) { - MONO_ARCH_SAVE_REGS; - if (c && type->type && c->type) return mono_metadata_type_equal (type->type, c->type); else @@ -1418,8 +1399,6 @@ ves_icall_type_GetTypeCodeInternal (MonoReflectionType *type) { int t = type->type->type; - MONO_ARCH_SAVE_REGS; - if (type->type->byref) return TYPECODE_OBJECT; @@ -1504,8 +1483,6 @@ ves_icall_type_is_subtype_of (MonoReflectionType *type, MonoReflectionType *c, M MonoClass *klass; MonoClass *klassc; - MONO_ARCH_SAVE_REGS; - g_assert (type != NULL); domain = ((MonoObject *)type)->vtable->domain; @@ -1557,8 +1534,6 @@ ves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType MonoClass *klass; MonoClass *klassc; - MONO_ARCH_SAVE_REGS; - g_assert (type != NULL); domain = ((MonoObject *)type)->vtable->domain; @@ -1691,7 +1666,6 @@ ves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info) MonoError error; MonoDomain *domain = mono_domain_get (); MonoMethodSignature* sig; - MONO_ARCH_SAVE_REGS; sig = mono_method_signature_checked (method, &error); if (!mono_error_ok (&error)) @@ -1758,7 +1732,6 @@ ICALL_EXPORT MonoReflectionType* ves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring) { MonoClass *parent; - MONO_ARCH_SAVE_REGS; parent = declaring? field->field->parent: field->klass; @@ -1772,9 +1745,11 @@ ves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *ob MonoClassField *cf = field->field; MonoDomain *domain = mono_object_domain (field); - if (fklass->image->assembly->ref_only) - mono_raise_exception (mono_get_exception_invalid_operation ( + if (fklass->image->assembly->ref_only) { + mono_set_pending_exception (mono_get_exception_invalid_operation ( "It is illegal to get the value on a field on a type loaded using the ReflectionOnly methods.")); + return NULL; + } if (mono_security_core_clr_enabled ()) mono_security_core_clr_ensure_reflection_access_field (cf); @@ -1790,11 +1765,11 @@ ves_icall_MonoField_SetValueInternal (MonoReflectionField *field, MonoObject *ob MonoType *type; gchar *v; - MONO_ARCH_SAVE_REGS; - - if (field->klass->image->assembly->ref_only) - mono_raise_exception (mono_get_exception_invalid_operation ( + if (field->klass->image->assembly->ref_only) { + mono_set_pending_exception (mono_get_exception_invalid_operation ( "It is illegal to set the value on a field on a type loaded using the ReflectionOnly methods.")); + return; + } if (mono_security_core_clr_enabled ()) mono_security_core_clr_ensure_reflection_access_field (cf); @@ -1886,25 +1861,38 @@ ves_icall_MonoField_GetRawConstantValue (MonoReflectionField *this) MonoType *t; MonoError error; - MONO_ARCH_SAVE_REGS; - mono_class_init (field->parent); t = mono_field_get_type_checked (field, &error); if (!mono_error_ok (&error)) mono_error_raise_exception (&error); - if (!(t->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT)) - mono_raise_exception (mono_get_exception_invalid_operation (NULL)); - - if (image_is_dynamic (field->parent->image)) { - /* FIXME: */ - g_assert_not_reached (); + if (!(t->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT)) { + mono_set_pending_exception (mono_get_exception_invalid_operation (NULL)); + return NULL; } - def_value = mono_class_get_field_default_value (field, &def_type); - if (!def_value) /*FIXME, maybe we should try to raise TLE if field->parent is broken */ - mono_raise_exception (mono_get_exception_invalid_operation (NULL)); + if (image_is_dynamic (field->parent->image)) { + MonoClass *klass = field->parent; + int fidx = field - klass->fields; + + g_assert (fidx >= 0 && fidx < klass->field.count); + g_assert (klass->ext); + g_assert (klass->ext->field_def_values); + def_type = klass->ext->field_def_values [fidx].def_type; + def_value = klass->ext->field_def_values [fidx].data; + if (def_type == MONO_TYPE_END) { + mono_set_pending_exception (mono_get_exception_invalid_operation (NULL)); + return NULL; + } + } else { + def_value = mono_class_get_field_default_value (field, &def_type); + /* FIXME, maybe we should try to raise TLE if field->parent is broken */ + if (!def_value) { + mono_set_pending_exception (mono_get_exception_invalid_operation (NULL)); + return NULL; + } + } /*FIXME unify this with reflection.c:mono_get_object_from_blob*/ switch (def_type) { @@ -1979,8 +1967,6 @@ ves_icall_get_property_info (MonoReflectionProperty *property, MonoPropertyInfo { MonoDomain *domain = mono_object_domain (property); - MONO_ARCH_SAVE_REGS; - if ((req_info & PInfo_ReflectedType) != 0) MONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &property->klass->byval_arg)); if ((req_info & PInfo_DeclaringType) != 0) @@ -2010,8 +1996,6 @@ ves_icall_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info) { MonoDomain *domain = mono_object_domain (event); - MONO_ARCH_SAVE_REGS; - MONO_STRUCT_SETREF (info, reflected_type, mono_type_get_object (domain, &event->klass->byval_arg)); MONO_STRUCT_SETREF (info, declaring_type, mono_type_get_object (domain, &event->event->parent->byval_arg)); @@ -2146,7 +2130,6 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType int i = 0, len, ioffset; MonoDomain *domain; - MONO_ARCH_SAVE_REGS; mono_class_init_or_throw (class); mono_class_init_or_throw (iclass); @@ -2191,8 +2174,6 @@ ves_icall_MonoType_GetElementType (MonoReflectionType *type) { MonoClass *class; - MONO_ARCH_SAVE_REGS; - if (!type->type->byref && type->type->type == MONO_TYPE_SZARRAY) return mono_type_get_object (mono_object_domain (type), &type->type->data.klass->byval_arg); @@ -2221,24 +2202,18 @@ ves_icall_get_type_parent (MonoReflectionType *type) ICALL_EXPORT MonoBoolean ves_icall_type_ispointer (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; - return type->type->type == MONO_TYPE_PTR; } ICALL_EXPORT MonoBoolean ves_icall_type_isprimitive (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; - return (!type->type->byref && (((type->type->type >= MONO_TYPE_BOOLEAN) && (type->type->type <= MONO_TYPE_R8)) || (type->type->type == MONO_TYPE_I) || (type->type->type == MONO_TYPE_U))); } ICALL_EXPORT MonoBoolean ves_icall_type_isbyref (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; - return type->type->byref; } @@ -2272,8 +2247,6 @@ ves_icall_MonoType_get_DeclaringType (MonoReflectionType *type) MonoDomain *domain = mono_domain_get (); MonoClass *class; - MONO_ARCH_SAVE_REGS; - if (type->type->byref) return NULL; if (type->type->type == MONO_TYPE_VAR) { @@ -2327,8 +2300,10 @@ ves_icall_MonoType_GetArrayRank (MonoReflectionType *type) { MonoClass *class; - if (type->type->type != MONO_TYPE_ARRAY && type->type->type != MONO_TYPE_SZARRAY) - mono_raise_exception (mono_get_exception_argument ("type", "Type must be an array type")); + if (type->type->type != MONO_TYPE_ARRAY && type->type->type != MONO_TYPE_SZARRAY) { + mono_set_pending_exception (mono_get_exception_argument ("type", "Type must be an array type")); + return 0; + } class = mono_class_from_mono_type (type->type); @@ -2343,7 +2318,6 @@ ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type) MonoDomain *domain = mono_object_domain (type); MonoVTable *array_vtable = mono_class_vtable_full (domain, mono_array_class_get_cached (mono_defaults.systemtype_class, 1), TRUE); int i; - MONO_ARCH_SAVE_REGS; klass = mono_class_from_mono_type (type->type); @@ -2369,7 +2343,6 @@ ICALL_EXPORT gboolean ves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type) { MonoClass *klass; - MONO_ARCH_SAVE_REGS; if (!IS_MONOTYPE (type)) return FALSE; @@ -2385,7 +2358,6 @@ ICALL_EXPORT MonoReflectionType* ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type) { MonoClass *klass; - MONO_ARCH_SAVE_REGS; if (type->type->byref) return NULL; @@ -2435,8 +2407,10 @@ ves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array) class = mono_class_from_mono_type (geninst); /*we might inflate to the GTD*/ - if (class->generic_class && !mono_verifier_class_is_valid_generic_instantiation (class)) - mono_raise_exception (mono_get_exception_argument ("typeArguments", "Invalid generic arguments")); + if (class->generic_class && !mono_verifier_class_is_valid_generic_instantiation (class)) { + mono_set_pending_exception (mono_get_exception_argument ("typeArguments", "Invalid generic arguments")); + return NULL; + } return mono_type_get_object (mono_object_domain (type), geninst); } @@ -2445,7 +2419,6 @@ ICALL_EXPORT gboolean ves_icall_Type_get_IsGenericInstance (MonoReflectionType *type) { MonoClass *klass; - MONO_ARCH_SAVE_REGS; if (type->type->byref) return FALSE; @@ -2459,7 +2432,6 @@ ICALL_EXPORT gboolean ves_icall_Type_get_IsGenericType (MonoReflectionType *type) { MonoClass *klass; - MONO_ARCH_SAVE_REGS; if (!IS_MONOTYPE (type)) return FALSE; @@ -2474,8 +2446,6 @@ ves_icall_Type_get_IsGenericType (MonoReflectionType *type) ICALL_EXPORT gint32 ves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; - if (!IS_MONOTYPE (type)) return -1; @@ -2487,8 +2457,6 @@ ves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type) ICALL_EXPORT GenericParameterAttributes ves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; - g_assert (IS_MONOTYPE (type)); g_assert (is_generic_parameter (type->type)); return mono_generic_param_info (type->type->data.generic_param)->flags; @@ -2503,8 +2471,6 @@ ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type) MonoArray *res; int i, count; - MONO_ARCH_SAVE_REGS; - g_assert (IS_MONOTYPE (type)); domain = mono_object_domain (type); @@ -2523,14 +2489,12 @@ ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type) ICALL_EXPORT MonoBoolean ves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; return is_generic_parameter (type->type); } ICALL_EXPORT MonoBoolean ves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb) { - MONO_ARCH_SAVE_REGS; return is_generic_parameter (tb->type.type); } @@ -2550,8 +2514,6 @@ ves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type, MonoMethod *method; gpointer iter; - MONO_ARCH_SAVE_REGS; - domain = ((MonoObject *)type)->vtable->domain; klass = mono_class_from_mono_type (type->type); @@ -2574,10 +2536,10 @@ ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *ref_type) MonoMethod *method; MonoType *type = ref_type->type; - MONO_ARCH_SAVE_REGS; - - if (type->byref || (type->type != MONO_TYPE_MVAR && type->type != MONO_TYPE_VAR)) - mono_raise_exception (mono_get_exception_invalid_operation ("DeclaringMethod can only be used on generic arguments")); + if (type->byref || (type->type != MONO_TYPE_MVAR && type->type != MONO_TYPE_VAR)) { + mono_set_pending_exception (mono_get_exception_invalid_operation ("DeclaringMethod can only be used on generic arguments")); + return NULL; + } if (type->type == MONO_TYPE_VAR) return NULL; @@ -2623,7 +2585,7 @@ ves_icall_MonoMethod_GetDllImportAttribute (MonoMethod *method) } if (!import || !scope) { - mono_raise_exception (mono_get_exception_argument ("method", "System.Reflection.Emit method with invalid pinvoke information")); + mono_set_pending_exception (mono_get_exception_argument ("method", "System.Reflection.Emit method with invalid pinvoke information")); return NULL; } } @@ -2662,8 +2624,6 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method) MonoMethodInflated *imethod; MonoMethod *result; - MONO_ARCH_SAVE_REGS; - if (method->method->is_generic) return method; @@ -2696,8 +2656,11 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method) if (imethod->context.class_inst) { MonoClass *klass = ((MonoMethod *) imethod)->klass; /*Generic methods gets the context of the GTD.*/ - if (mono_class_get_context (klass)) - result = mono_class_inflate_generic_method_full (result, klass, mono_class_get_context (klass)); + if (mono_class_get_context (klass)) { + MonoError error; + result = mono_class_inflate_generic_method_full_checked (result, klass, mono_class_get_context (klass), &error); + mono_error_raise_exception (&error); + } } return mono_method_get_object (mono_object_domain (method), result, NULL); @@ -2706,16 +2669,12 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method) ICALL_EXPORT gboolean ves_icall_MonoMethod_get_IsGenericMethod (MonoReflectionMethod *method) { - MONO_ARCH_SAVE_REGS; - return mono_method_signature (method->method)->generic_param_count != 0; } ICALL_EXPORT gboolean ves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method) { - MONO_ARCH_SAVE_REGS; - return method->method->is_generic; } @@ -2725,7 +2684,6 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method) MonoArray *res; MonoDomain *domain; int count, i; - MONO_ARCH_SAVE_REGS; domain = mono_object_domain (method); @@ -2772,8 +2730,6 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoAr int pcount; void *obj = this; - MONO_ARCH_SAVE_REGS; - *exc = NULL; if (mono_security_core_clr_enabled ()) @@ -2843,6 +2799,18 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoAr for (i = 0; i < pcount; ++i) lengths [i] = *(int32_t*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject)); + if (m->klass->rank == 1 && sig->param_count == 2 && m->klass->element_class->rank) { + /* This is a ctor for jagged arrays. MS creates an array of arrays. */ + MonoArray *arr = mono_array_new_full (mono_object_domain (params), m->klass, lengths, NULL); + + for (i = 0; i < mono_array_length (arr); ++i) { + MonoArray *subarray = mono_array_new_full (mono_object_domain (params), m->klass->element_class, &lengths [1], NULL); + + mono_array_setref_fast (arr, i, subarray); + } + return (MonoObject*)arr; + } + if (m->klass->rank == pcount) { /* Only lengths provided. */ lower_bounds = NULL; @@ -2869,10 +2837,7 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoA MonoObject *result; int i, j, outarg_count = 0; - MONO_ARCH_SAVE_REGS; - if (m->klass == mono_defaults.object_class) { - if (!strcmp (m->name, "FieldGetter")) { MonoClass *k = this->vtable->klass; MonoString *name; @@ -2992,10 +2957,12 @@ static guint64 read_enum_value (char *mem, int type) { switch (type) { + case MONO_TYPE_BOOLEAN: case MONO_TYPE_U1: return *(guint8*)mem; case MONO_TYPE_I1: return *(gint8*)mem; + case MONO_TYPE_CHAR: case MONO_TYPE_U2: return *(guint16*)mem; case MONO_TYPE_I2: @@ -3057,10 +3024,8 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value) MonoType *etype; guint64 val; - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (enumType); - MONO_CHECK_ARG_NULL (value); + MONO_CHECK_ARG_NULL (enumType, NULL); + MONO_CHECK_ARG_NULL (value, NULL); domain = mono_object_domain (enumType); enumc = mono_class_from_mono_type (enumType->type); @@ -3069,15 +3034,21 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value) objc = value->vtable->klass; - if (!enumc->enumtype) - mono_raise_exception (mono_get_exception_argument ("enumType", "Type provided must be an Enum.")); - if (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 && objc->byval_arg.type <= MONO_TYPE_U8))) - mono_raise_exception (mono_get_exception_argument ("value", "The value passed in must be an enum base or an underlying type for an enum, such as an Int32.")); + if (!enumc->enumtype) { + mono_set_pending_exception (mono_get_exception_argument ("enumType", "Type provided must be an Enum.")); + return NULL; + } + if (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_BOOLEAN && objc->byval_arg.type <= MONO_TYPE_U8))) { + mono_set_pending_exception (mono_get_exception_argument ("value", "The value passed in must be an enum base or an underlying type for an enum, such as an Int32.")); + return NULL; + } etype = mono_class_enum_basetype (enumc); - if (!etype) + if (!etype) { /* MS throws this for typebuilders */ - mono_raise_exception (mono_get_exception_argument ("Type must be a type provided by the runtime.", "enumType")); + mono_set_pending_exception (mono_get_exception_argument ("Type must be a type provided by the runtime.", "enumType")); + return NULL; + } res = mono_object_new (domain, enumc); val = read_enum_value ((char *)value + sizeof (MonoObject), objc->enumtype? mono_class_enum_basetype (objc)->type: objc->byval_arg.type); @@ -3086,6 +3057,18 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value) return res; } +ICALL_EXPORT MonoBoolean +ves_icall_System_Enum_InternalHasFlag (MonoObject *a, MonoObject *b) +{ + int size = mono_class_value_size (a->vtable->klass, NULL); + guint64 a_val = 0, b_val = 0; + + memcpy (&a_val, mono_object_unbox (a), size); + memcpy (&b_val, mono_object_unbox (b), size); + + return (a_val & b_val) == b_val; +} + ICALL_EXPORT MonoObject * ves_icall_System_Enum_get_value (MonoObject *this) { @@ -3095,8 +3078,6 @@ ves_icall_System_Enum_get_value (MonoObject *this) gpointer src; int size; - MONO_ARCH_SAVE_REGS; - if (!this) return NULL; @@ -3119,15 +3100,15 @@ ves_icall_System_Enum_get_underlying_type (MonoReflectionType *type) MonoType *etype; MonoClass *klass; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (type->type); mono_class_init_or_throw (klass); etype = mono_class_enum_basetype (klass); - if (!etype) + if (!etype) { /* MS throws this for typebuilders */ - mono_raise_exception (mono_get_exception_argument ("Type must be a type provided by the runtime.", "enumType")); + mono_set_pending_exception (mono_get_exception_argument ("Type must be a type provided by the runtime.", "enumType")); + return NULL; + } return mono_type_get_object (mono_object_domain (type), etype); } @@ -3215,8 +3196,6 @@ ves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info) gpointer iter; MonoClassField *field; - MONO_ARCH_SAVE_REGS; - mono_class_init_or_throw (enumc); MONO_STRUCT_SETREF (info, utype, mono_type_get_object (domain, mono_class_enum_basetype (enumc))); @@ -3298,16 +3277,20 @@ ves_icall_Type_GetField (MonoReflectionType *type, MonoString *name, guint32 bfl domain = ((MonoObject *)type)->vtable->domain; klass = startklass = mono_class_from_mono_type (type->type); - if (!name) - mono_raise_exception (mono_get_exception_argument_null ("name")); + if (!name) { + mono_set_pending_exception (mono_get_exception_argument_null ("name")); + return NULL; + } if (type->type->byref) return NULL; compare_func = (bflags & BFLAGS_IgnoreCase) ? mono_utf8_strcasecmp : strcmp; handle_parent: - if (klass->exception_type != MONO_EXCEPTION_NONE) - mono_raise_exception (mono_class_get_exception_for_failure (klass)); + if (klass->exception_type != MONO_EXCEPTION_NONE) { + mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); + return NULL; + } iter = NULL; while ((field = mono_class_get_fields_lazy (klass, &iter))) { @@ -3367,8 +3350,6 @@ ves_icall_Type_GetFields_internal (MonoReflectionType *type, guint32 bflags, Mon MonoClassField *field; MonoPtrArray tmp_array; - MONO_ARCH_SAVE_REGS; - domain = ((MonoObject *)type)->vtable->domain; if (type->type->byref) return mono_array_new (domain, mono_defaults.field_info_class, 0); @@ -3380,7 +3361,8 @@ ves_icall_Type_GetFields_internal (MonoReflectionType *type, guint32 bflags, Mon handle_parent: if (klass->exception_type != MONO_EXCEPTION_NONE) { mono_ptr_array_destroy (tmp_array); - mono_raise_exception (mono_class_get_exception_for_failure (klass)); + mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); + return NULL; } iter = NULL; @@ -3473,6 +3455,7 @@ mono_class_get_methods_by_name (MonoClass *klass, const char *name, guint32 bfla return array; } + mono_class_setup_methods (klass); mono_class_setup_vtable (klass); if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ()) goto loader_error; @@ -3488,6 +3471,7 @@ mono_class_get_methods_by_name (MonoClass *klass, const char *name, guint32 bfla memset (method_slots, 0, sizeof (method_slots_default)); } handle_parent: + mono_class_setup_methods (klass); mono_class_setup_vtable (klass); if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ()) goto loader_error; @@ -3586,12 +3570,13 @@ ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, gui method_array = mono_class_get_methods_by_name (klass, mname, bflags, ignore_case, FALSE, &ex); g_free ((char*)mname); - if (ex) - mono_raise_exception (ex); + if (ex) { + mono_set_pending_exception (ex); + return NULL; + } res = mono_array_new_specific (array_vtable, method_array->len); - for (i = 0; i < method_array->len; ++i) { MonoMethod *method = g_ptr_array_index (method_array, i); mono_array_setref (res, i, mono_method_get_object (domain, method, refklass)); @@ -3614,8 +3599,6 @@ ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflag gpointer iter = NULL; MonoPtrArray tmp_array; - MONO_ARCH_SAVE_REGS; - mono_ptr_array_init (tmp_array, 4); /*FIXME, guestimating*/ domain = ((MonoObject *)type)->vtable->domain; @@ -3628,6 +3611,12 @@ ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflag System_Reflection_ConstructorInfo = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "ConstructorInfo"); + mono_class_setup_methods (klass); + if (klass->exception_type != MONO_EXCEPTION_NONE) { + mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); + return NULL; + } + iter = NULL; while ((method = mono_class_get_methods (klass, &iter))) { match = 0; @@ -3718,8 +3707,6 @@ ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, GHashTable *properties = NULL; MonoPtrArray tmp_array; - MONO_ARCH_SAVE_REGS; - mono_ptr_array_init (tmp_array, 8); /*This the average for ASP.NET types*/ if (!System_Reflection_PropertyInfo) @@ -3738,6 +3725,7 @@ ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, properties = g_hash_table_new (property_hash, (GEqualFunc)property_equal); handle_parent: + mono_class_setup_methods (klass); mono_class_setup_vtable (klass); if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ()) goto loader_error; @@ -3817,7 +3805,7 @@ loader_error: ex = mono_loader_error_prepare_exception (mono_loader_get_last_error ()); mono_loader_clear_error (); } - mono_raise_exception (ex); + mono_set_pending_exception (ex); return NULL; } @@ -3832,8 +3820,6 @@ ves_icall_MonoType_GetEvent (MonoReflectionType *type, MonoString *name, guint32 gchar *event_name; int (*compare_func) (const char *s1, const char *s2); - MONO_ARCH_SAVE_REGS; - event_name = mono_string_to_utf8 (name); if (type->type->byref) return NULL; @@ -3844,8 +3830,10 @@ ves_icall_MonoType_GetEvent (MonoReflectionType *type, MonoString *name, guint32 compare_func = (bflags & BFLAGS_IgnoreCase) ? mono_utf8_strcasecmp : strcmp; handle_parent: - if (klass->exception_type != MONO_EXCEPTION_NONE) - mono_raise_exception (mono_class_get_exception_for_failure (klass)); + if (klass->exception_type != MONO_EXCEPTION_NONE) { + mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); + return NULL; + } iter = NULL; while ((event = mono_class_get_events (klass, &iter))) { @@ -3922,8 +3910,6 @@ ves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, Mon GHashTable *events = NULL; MonoPtrArray tmp_array; - MONO_ARCH_SAVE_REGS; - mono_ptr_array_init (tmp_array, 4); if (!System_Reflection_EventInfo) @@ -3937,6 +3923,7 @@ ves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, Mon events = g_hash_table_new (event_hash, (GEqualFunc)event_equal); handle_parent: + mono_class_setup_methods (klass); mono_class_setup_vtable (klass); if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ()) goto loader_error; @@ -4009,7 +3996,7 @@ loader_error: ex = mono_loader_error_prepare_exception (mono_loader_get_last_error ()); mono_loader_clear_error (); } - mono_raise_exception (ex); + mono_set_pending_exception (ex); return NULL; } @@ -4022,10 +4009,10 @@ ves_icall_Type_GetNestedType (MonoReflectionType *type, MonoString *name, guint3 char *str; gpointer iter; - MONO_ARCH_SAVE_REGS; - - if (name == NULL) - mono_raise_exception (mono_get_exception_argument_null ("name")); + if (name == NULL) { + mono_set_pending_exception (mono_get_exception_argument_null ("name")); + return NULL; + } domain = ((MonoObject *)type)->vtable->domain; if (type->type->byref) @@ -4035,8 +4022,10 @@ ves_icall_Type_GetNestedType (MonoReflectionType *type, MonoString *name, guint3 str = mono_string_to_utf8 (name); handle_parent: - if (klass->exception_type != MONO_EXCEPTION_NONE) - mono_raise_exception (mono_class_get_exception_for_failure (klass)); + if (klass->exception_type != MONO_EXCEPTION_NONE) { + mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); + return NULL; + } /* * If a nested type is generic, return its generic type definition. @@ -4085,8 +4074,6 @@ ves_icall_Type_GetNestedTypes (MonoReflectionType *type, guint32 bflags) gpointer iter; MonoPtrArray tmp_array; - MONO_ARCH_SAVE_REGS; - domain = ((MonoObject *)type)->vtable->domain; if (type->type->byref) return mono_array_new (domain, mono_defaults.monotype_class, 0); @@ -4139,8 +4126,6 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as MonoTypeNameParse info; gboolean type_resolve; - MONO_ARCH_SAVE_REGS; - /* On MS.NET, this does not fire a TypeResolve event */ type_resolve = TRUE; str = mono_string_to_utf8 (name); @@ -4148,8 +4133,11 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as if (!mono_reflection_parse_type (str, &info)) { g_free (str); mono_reflection_free_type_info (&info); - if (throwOnError) /* uhm: this is a parse error, though... */ - mono_raise_exception (mono_get_exception_type_load (name, NULL)); + if (throwOnError) { + /* uhm: this is a parse error, though... */ + mono_set_pending_exception (mono_get_exception_type_load (name, NULL)); + return NULL; + } /*g_print ("failed parse\n");*/ return NULL; } @@ -4160,9 +4148,10 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as if (throwOnError) { /* 1.0 and 2.0 throw different exceptions */ if (mono_defaults.generic_ilist_class) - mono_raise_exception (mono_get_exception_argument (NULL, "Type names passed to Assembly.GetType() must not specify an assembly.")); + mono_set_pending_exception (mono_get_exception_argument (NULL, "Type names passed to Assembly.GetType() must not specify an assembly.")); else - mono_raise_exception (mono_get_exception_type_load (name, NULL)); + mono_set_pending_exception (mono_get_exception_type_load (name, NULL)); + return NULL; } return NULL; } @@ -4214,12 +4203,13 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as mono_loader_clear_error (); if (e != NULL) - mono_raise_exception (e); - + mono_set_pending_exception (e); return NULL; } else if (mono_loader_get_last_error ()) { - if (throwOnError) - mono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ())); + if (throwOnError) { + mono_set_pending_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ())); + return NULL; + } mono_loader_clear_error (); } @@ -4235,7 +4225,8 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as /* report SecurityException (or others) that occured when loading the assembly */ MonoException *exc = mono_class_get_exception_for_failure (klass); mono_loader_clear_error (); - mono_raise_exception (exc); + mono_set_pending_exception (exc); + return NULL; } else if (mono_security_enabled () && klass->exception_type == MONO_EXCEPTION_SECURITY_INHERITANCEDEMAND) { return NULL; } @@ -4284,8 +4275,6 @@ ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *asse gchar *absolute; gchar *dirname; - MONO_ARCH_SAVE_REGS; - if (g_path_is_absolute (mass->image->name)) { absolute = g_strdup (mass->image->name); dirname = g_path_get_dirname (absolute); @@ -4331,8 +4320,6 @@ ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAs { MonoAssembly *mass = assembly->assembly; - MONO_ARCH_SAVE_REGS; - return mass->in_gac; } @@ -4343,8 +4330,6 @@ ves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoAssembly *res; MonoImageOpenStatus status; - MONO_ARCH_SAVE_REGS; - name = mono_string_to_utf8 (mname); res = mono_assembly_load_with_partial_name (name, &status); @@ -4361,8 +4346,6 @@ ves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assem MonoDomain *domain = mono_object_domain (assembly); MonoString *res; - MONO_ARCH_SAVE_REGS; - res = mono_string_new (domain, mono_image_get_filename (assembly->assembly->image)); return res; @@ -4371,8 +4354,6 @@ ves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assem ICALL_EXPORT MonoBoolean ves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly) { - MONO_ARCH_SAVE_REGS; - return assembly->assembly->ref_only; } @@ -4381,21 +4362,22 @@ ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflection { MonoDomain *domain = mono_object_domain (assembly); - MONO_ARCH_SAVE_REGS; - return mono_string_new (domain, assembly->assembly->image->version); } ICALL_EXPORT MonoReflectionMethod* ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly) { + MonoError error; + MonoMethod *method; guint32 token = mono_image_get_entry_point (assembly->assembly->image); - MONO_ARCH_SAVE_REGS; - if (!token) return NULL; - return mono_method_get_object (mono_object_domain (assembly), mono_get_method (assembly->assembly->image, token, NULL), NULL); + method = mono_get_method_checked (assembly->assembly->image, token, NULL, NULL, &error); + mono_error_raise_exception (&error); + + return mono_method_get_object (mono_object_domain (assembly), method, NULL); } ICALL_EXPORT MonoReflectionModule* @@ -4412,8 +4394,6 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAss int i; const char *val; - MONO_ARCH_SAVE_REGS; - for (i = 0; i < table->rows; ++i) { val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME)); mono_array_setref (result, i, mono_string_new (mono_object_domain (assembly), val)); @@ -4462,8 +4442,6 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse MonoImage *image = assembly->assembly->image; MonoTableInfo *t; - MONO_ARCH_SAVE_REGS; - if (!System_Reflection_AssemblyName) System_Reflection_AssemblyName = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "AssemblyName"); @@ -4562,8 +4540,6 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflection const char *val; MonoImage *module; - MONO_ARCH_SAVE_REGS; - for (i = 0; i < table->rows; ++i) { mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE); val = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]); @@ -4605,8 +4581,6 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflec const char *val; char *n; - MONO_ARCH_SAVE_REGS; - n = mono_string_to_utf8 (name); for (i = 0; i < table->rows; ++i) { mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE); @@ -4642,7 +4616,8 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflec char *msg = g_strdup_printf ("Assembly %d referenced from assembly %s not found ", i - 1, assembly->assembly->image->name); MonoException *ex = mono_get_exception_file_not_found2 (msg, NULL); g_free (msg); - mono_raise_exception (ex); + mono_set_pending_exception (ex); + return FALSE; } MONO_OBJECT_SETREF (info, assembly, mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1])); @@ -4669,8 +4644,6 @@ ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *a const char *val; char *n; - MONO_ARCH_SAVE_REGS; - /* check hash if needed */ if (name) { n = mono_string_to_utf8 (name); @@ -4756,7 +4729,8 @@ ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly MonoImage *m = mono_image_load_file_for_image (image, i + 1); if (!m) { MonoString *fname = mono_string_new (mono_domain_get (), mono_metadata_string_heap (image, cols [MONO_FILE_NAME])); - mono_raise_exception (mono_get_exception_file_not_found2 (NULL, fname)); + mono_set_pending_exception (mono_get_exception_file_not_found2 (NULL, fname)); + return NULL; } mono_array_setref (res, j, mono_module_get_object (domain, m)); } @@ -4782,6 +4756,8 @@ mono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass) { int offset = -1, i; if (method->is_inflated && ((MonoMethodInflated*)method)->context.method_inst) { + MonoError error; + MonoMethod *result; MonoMethodInflated *inflated = (MonoMethodInflated*)method; //method is inflated, we should inflate it on the other class MonoGenericContext ctx; @@ -4791,7 +4767,9 @@ mono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass) ctx.class_inst = klass->generic_class->context.class_inst; else if (klass->generic_container) ctx.class_inst = klass->generic_container->context.class_inst; - return mono_class_inflate_generic_method_full (inflated->declaring, klass, &ctx); + result = mono_class_inflate_generic_method_full_checked (inflated->declaring, klass, &ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + return result; } mono_class_setup_methods (method->klass); @@ -4845,8 +4823,6 @@ ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void) { MonoMethod *dest = NULL; - MONO_ARCH_SAVE_REGS; - mono_stack_walk_no_il (get_executing, &dest); g_assert (dest); return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly); @@ -4858,8 +4834,6 @@ ves_icall_System_Reflection_Assembly_GetEntryAssembly (void) { MonoDomain* domain = mono_domain_get (); - MONO_ARCH_SAVE_REGS; - if (!domain->entry_assembly) return NULL; @@ -4872,8 +4846,6 @@ ves_icall_System_Reflection_Assembly_GetCallingAssembly (void) MonoMethod *m; MonoMethod *dest; - MONO_ARCH_SAVE_REGS; - dest = NULL; mono_stack_walk_no_il (get_executing, &dest); m = dest; @@ -4932,8 +4904,6 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a gchar *codebase; MonoBoolean assembly_ref = 0; - MONO_ARCH_SAVE_REGS; - MONO_OBJECT_SETREF (aname, name, mono_string_new (domain, name->name)); aname->major = name->major; aname->minor = name->minor; @@ -5042,8 +5012,6 @@ ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, gchar *absolute; MonoAssembly *mass = assembly->assembly; - MONO_ARCH_SAVE_REGS; - if (g_path_is_absolute (mass->image->name)) { fill_reflection_assembly_name (mono_object_domain (assembly), aname, &mass->aname, mass->image->name, TRUE, @@ -5067,9 +5035,7 @@ ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, gboolean res; MonoImage *image; MonoAssemblyName name; - char *dirname - - MONO_ARCH_SAVE_REGS; + char *dirname; filename = mono_string_to_utf8 (fname); @@ -5087,14 +5053,16 @@ ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, exc = mono_get_exception_bad_image_format2 (NULL, fname); else exc = mono_get_exception_file_not_found2 (NULL, fname); - mono_raise_exception (exc); + mono_set_pending_exception (exc); + return; } res = mono_assembly_fill_assembly_name (image, &name); if (!res) { mono_image_close (image); g_free (filename); - mono_raise_exception (mono_get_exception_argument ("assemblyFile", "The file does not contain a manifest")); + mono_set_pending_exception (mono_get_exception_argument ("assemblyFile", "The file does not contain a manifest")); + return; } fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename, @@ -5133,6 +5101,21 @@ ves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssembly *as return result; } +static gboolean +mono_module_type_is_visible (MonoTableInfo *tdef, MonoImage *image, int type) +{ + guint32 attrs, visibility; + do { + attrs = mono_metadata_decode_row_col (tdef, type - 1, MONO_TYPEDEF_FLAGS); + visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK; + if (visibility != TYPE_ATTRIBUTE_PUBLIC && visibility != TYPE_ATTRIBUTE_NESTED_PUBLIC) + return FALSE; + + } while ((type = mono_metadata_token_index (mono_metadata_nested_in_typedef (image, type)))); + + return TRUE; +} + static MonoArray* mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **exceptions, MonoBoolean exportedOnly) { @@ -5140,15 +5123,12 @@ mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **excepti MonoClass *klass; MonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF]; int i, count; - guint32 attrs, visibility; /* we start the count from 1 because we skip the special type */ if (exportedOnly) { count = 0; for (i = 1; i < tdef->rows; ++i) { - attrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS); - visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK; - if (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC) + if (mono_module_type_is_visible (tdef, image, i + 1)) count++; } } else { @@ -5158,9 +5138,7 @@ mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **excepti *exceptions = mono_array_new (domain, mono_defaults.exception_class, count); count = 0; for (i = 1; i < tdef->rows; ++i) { - attrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS); - visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK; - if (!exportedOnly || (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)) { + if (!exportedOnly || mono_module_type_is_visible (tdef, image, i + 1)) { MonoError error; klass = mono_class_get_checked (image, (i + 1) | MONO_TOKEN_TYPE_DEF, &error); g_assert (!mono_loader_get_last_error ()); /* Plug any leaks */ @@ -5189,8 +5167,6 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, GList *list = NULL; int i, len, ex_count; - MONO_ARCH_SAVE_REGS; - domain = mono_object_domain (assembly); g_assert (!assembly_is_dynamic (assembly->assembly)); @@ -5280,7 +5256,8 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, exc = mono_get_exception_reflection_type_load (res, exl); mono_loader_clear_error (); - mono_raise_exception (exc); + mono_set_pending_exception (exc); + return NULL; } return res; @@ -5320,8 +5297,6 @@ ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module) MonoDomain *domain = mono_object_domain (module); MonoClass *klass; - MONO_ARCH_SAVE_REGS; - g_assert (module->image); if (image_is_dynamic (module->image) && ((MonoDynamicImage*)(module->image))->initial_image) @@ -5345,8 +5320,6 @@ ves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModule *module { MonoDomain *domain = mono_object_domain (module); - MONO_ARCH_SAVE_REGS; - g_assert (module->image); return mono_string_new (domain, module->image->guid); } @@ -5388,16 +5361,16 @@ ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *modul MonoArray *exceptions; int i; - MONO_ARCH_SAVE_REGS; - if (!module->image) return mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0); else { MonoArray *res = mono_module_get_types (mono_object_domain (module), module->image, &exceptions, FALSE); for (i = 0; i < mono_array_length (exceptions); ++i) { MonoException *ex = mono_array_get (exceptions, MonoException *, i); - if (ex) - mono_raise_exception (ex); + if (ex) { + mono_set_pending_exception (ex); + return NULL; + } } return res; } @@ -5485,19 +5458,20 @@ ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 t } ICALL_EXPORT MonoMethod* -ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error) +ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *resolve_error) { + MonoError error; int table = mono_metadata_token_table (token); int index = mono_metadata_token_index (token); MonoGenericContext context; MonoMethod *method; - *error = ResolveTokenError_Other; + *resolve_error = ResolveTokenError_Other; /* Validate token */ if ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) && (table != MONO_TABLE_MEMBERREF)) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } @@ -5506,7 +5480,7 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 return mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); if ((table == MONO_TABLE_MEMBERREF) && !(mono_memberref_is_method (image, token))) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } @@ -5515,19 +5489,17 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 } if ((index <= 0) || (index > image->tables [table].rows)) { - *error = ResolveTokenError_OutOfRange; + *resolve_error = ResolveTokenError_OutOfRange; return NULL; } if ((table == MONO_TABLE_MEMBERREF) && (!mono_memberref_is_method (image, token))) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } init_generic_context_from_args (&context, type_args, method_args); - method = mono_get_method_full (image, token, NULL, &context); - - if (mono_loader_get_last_error ()) - mono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ())); + method = mono_get_method_checked (image, token, NULL, &context, &error); + mono_error_raise_exception (&error); return method; } @@ -5559,19 +5531,20 @@ ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 } ICALL_EXPORT MonoClassField* -ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error) +ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *resolve_error) { + MonoError error; MonoClass *klass; int table = mono_metadata_token_table (token); int index = mono_metadata_token_index (token); MonoGenericContext context; MonoClassField *field; - *error = ResolveTokenError_Other; + *resolve_error = ResolveTokenError_Other; /* Validate token */ if ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } @@ -5580,7 +5553,7 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 return mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); if (mono_memberref_is_method (image, token)) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } @@ -5589,19 +5562,17 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 } if ((index <= 0) || (index > image->tables [table].rows)) { - *error = ResolveTokenError_OutOfRange; + *resolve_error = ResolveTokenError_OutOfRange; return NULL; } if ((table == MONO_TABLE_MEMBERREF) && (mono_memberref_is_method (image, token))) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } init_generic_context_from_args (&context, type_args, method_args); - field = mono_field_from_token (image, token, &klass, &context); - - if (mono_loader_get_last_error ()) - mono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ())); + field = mono_field_from_token_checked (image, token, &klass, &context, &error); + mono_error_raise_exception (&error); return field; } @@ -5703,8 +5674,6 @@ ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, Mon char *str = mono_string_to_utf8 (smodifiers); char *p; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (tb->type.type); p = str; /* logic taken from mono_reflection_parse_type(): keep in sync */ @@ -5761,8 +5730,6 @@ ves_icall_Type_IsArrayImpl (MonoReflectionType *t) MonoType *type; MonoBoolean res; - MONO_ARCH_SAVE_REGS; - type = t->type; res = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY); @@ -5788,8 +5755,6 @@ ves_icall_Type_make_array_type (MonoReflectionType *type, int rank) { MonoClass *klass, *aklass; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (type->type); check_for_invalid_type (klass); @@ -5806,8 +5771,6 @@ ves_icall_Type_make_byref_type (MonoReflectionType *type) { MonoClass *klass; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (type->type); mono_class_init_or_throw (klass); check_for_invalid_type (klass); @@ -5838,8 +5801,6 @@ ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, Mon gpointer func; MonoMethod *method = info->method; - MONO_ARCH_SAVE_REGS; - mono_class_init_or_throw (delegate_class); mono_assert (delegate_class->parent == mono_defaults.multicastdelegate_class); @@ -5965,10 +5926,8 @@ ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray gmtoff_st = gmtoff_ds = transitioned = 0; - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (data); - MONO_CHECK_ARG_NULL (names); + MONO_CHECK_ARG_NULL (data, 0); + MONO_CHECK_ARG_NULL (names, 0); mono_gc_wbarrier_generic_store (data, (MonoObject*) mono_array_new (domain, mono_defaults.int64_class, 4)); mono_gc_wbarrier_generic_store (names, (MonoObject*) mono_array_new (domain, mono_defaults.string_class, 2)); @@ -6080,8 +6039,8 @@ ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray if (tz_id == TIME_ZONE_ID_INVALID) return 0; - MONO_CHECK_ARG_NULL (data); - MONO_CHECK_ARG_NULL (names); + MONO_CHECK_ARG_NULL (data, 0); + MONO_CHECK_ARG_NULL (names, 0); mono_gc_wbarrier_generic_store (data, mono_array_new (domain, mono_defaults.int64_class, 4)); mono_gc_wbarrier_generic_store (names, mono_array_new (domain, mono_defaults.string_class, 2)); @@ -6176,24 +6135,18 @@ mono_array_get_byte_length (MonoArray *array) ICALL_EXPORT gint32 ves_icall_System_Buffer_ByteLengthInternal (MonoArray *array) { - MONO_ARCH_SAVE_REGS; - return mono_array_get_byte_length (array); } ICALL_EXPORT gint8 ves_icall_System_Buffer_GetByteInternal (MonoArray *array, gint32 idx) { - MONO_ARCH_SAVE_REGS; - return mono_array_get (array, gint8, idx); } ICALL_EXPORT void ves_icall_System_Buffer_SetByteInternal (MonoArray *array, gint32 idx, gint8 value) { - MONO_ARCH_SAVE_REGS; - mono_array_set (array, gint8, idx, value); } @@ -6202,11 +6155,9 @@ ves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, Mo { guint8 *src_buf, *dest_buf; - MONO_ARCH_SAVE_REGS; - /* This is called directly from the class libraries without going through the managed wrapper */ - MONO_CHECK_ARG_NULL (src); - MONO_CHECK_ARG_NULL (dest); + MONO_CHECK_ARG_NULL (src, FALSE); + MONO_CHECK_ARG_NULL (dest, FALSE); /* watch out for integer overflow */ if ((src_offset > mono_array_get_byte_length (src) - count) || (dest_offset > mono_array_get_byte_length (dest) - count)) @@ -6234,8 +6185,6 @@ ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this, MonoString * MonoType *type; MonoClass *klass; - MONO_ARCH_SAVE_REGS; - res = mono_object_new (domain, mono_defaults.transparent_proxy_class); tp = (MonoTransparentProxy*) res; @@ -6262,8 +6211,6 @@ ves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp) MonoString* ves_icall_System_Environment_get_UserName (void) { - MONO_ARCH_SAVE_REGS; - /* using glib is more portable */ return mono_string_new (mono_domain_get (), g_get_user_name ()); } @@ -6326,8 +6273,6 @@ ves_icall_System_Environment_get_Platform (void) ICALL_EXPORT MonoString * ves_icall_System_Environment_get_NewLine (void) { - MONO_ARCH_SAVE_REGS; - #if defined (HOST_WIN32) return mono_string_new (mono_domain_get (), "\r\n"); #else @@ -6341,8 +6286,6 @@ ves_icall_System_Environment_GetEnvironmentVariable (MonoString *name) const gchar *value; gchar *utf8_name; - MONO_ARCH_SAVE_REGS; - if (name == NULL) return NULL; @@ -6362,7 +6305,7 @@ ves_icall_System_Environment_GetEnvironmentVariable (MonoString *name) */ #ifndef _MSC_VER #ifndef __MINGW32_VERSION -#if defined(__APPLE__) && !defined (__arm__) +#if defined(__APPLE__) && !defined (__arm__) && !defined (__aarch64__) /* Apple defines this in crt_externs.h but doesn't provide that header for * arm-apple-darwin9. We'll manually define the symbol on Apple as it does * in fact exist on all implementations (so far) @@ -6434,8 +6377,6 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void) gchar **e, **parts; int n; - MONO_ARCH_SAVE_REGS; - n = 0; for (e = environ; *e != 0; ++ e) ++ n; @@ -6478,8 +6419,6 @@ ves_icall_System_Environment_InternalSetEnvironmentVariable (MonoString *name, M MonoError error; #endif - MONO_ARCH_SAVE_REGS; - #ifdef HOST_WIN32 utf16_name = mono_string_to_utf16 (name); if ((value == NULL) || (mono_string_length (value) == 0) || (mono_string_chars (value)[0] == 0)) { @@ -6518,8 +6457,6 @@ ves_icall_System_Environment_InternalSetEnvironmentVariable (MonoString *name, M ICALL_EXPORT void ves_icall_System_Environment_Exit (int result) { - MONO_ARCH_SAVE_REGS; - mono_environment_exitcode_set (result); /* FIXME: There are some cleanup hangs that should be worked out, but @@ -6580,9 +6517,7 @@ ves_icall_System_Environment_GetLogicalDrives (void) MonoDomain *domain = mono_domain_get (); gint len; - MONO_ARCH_SAVE_REGS; - - buf [0] = '\0'; + buf [0] = '\0'; ptr = buf; while (size > initial_size) { @@ -6635,8 +6570,6 @@ ves_icall_System_IO_DriveInfo_GetDriveFormat (MonoString *path) ICALL_EXPORT MonoString * ves_icall_System_Environment_InternalGetHome (void) { - MONO_ARCH_SAVE_REGS; - return mono_string_new (mono_domain_get (), g_get_home_dir ()); } @@ -6668,7 +6601,7 @@ static const char *encodings [] = { * returns the code page as a string */ ICALL_EXPORT MonoString* -ves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page) +ves_icall_System_Text_EncodingHelper_InternalCodePage (gint32 *int_code_page) { const char *cset; const char *p; @@ -6679,7 +6612,6 @@ ves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page) int i; *int_code_page = -1; - MONO_ARCH_SAVE_REGS; g_get_charset (&cset); c = codepage = strdup (cset); @@ -6742,8 +6674,6 @@ ves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this, MonoReflectionMethod *method, MonoArray *out_args) { - MONO_ARCH_SAVE_REGS; - mono_message_init (mono_object_domain (this), this, method, out_args); } @@ -6751,8 +6681,6 @@ ves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this, ICALL_EXPORT MonoBoolean ves_icall_IsTransparentProxy (MonoObject *proxy) { - MONO_ARCH_SAVE_REGS; - if (!proxy) return 0; @@ -6771,8 +6699,8 @@ ves_icall_Remoting_RemotingServices_GetVirtualMethod ( MonoMethod **vtable; MonoMethod *res = NULL; - MONO_CHECK_ARG_NULL (rtype); - MONO_CHECK_ARG_NULL (rmethod); + MONO_CHECK_ARG_NULL (rtype, NULL); + MONO_CHECK_ARG_NULL (rmethod, NULL); method = rmethod->method; klass = mono_class_from_mono_type (rtype->type); @@ -6820,8 +6748,6 @@ ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (Mo MonoClass *klass; MonoVTable* vtable; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (type->type); vtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE); @@ -6844,14 +6770,14 @@ ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClas MonoClass *klass; MonoDomain *domain; - MONO_ARCH_SAVE_REGS; - domain = mono_object_domain (type); klass = mono_class_from_mono_type (type->type); mono_class_init_or_throw (klass); - if (MONO_CLASS_IS_INTERFACE (klass) || (klass->flags & TYPE_ATTRIBUTE_ABSTRACT)) - mono_raise_exception (mono_get_exception_argument ("type", "Type cannot be instantiated")); + if (MONO_CLASS_IS_INTERFACE (klass) || (klass->flags & TYPE_ATTRIBUTE_ABSTRACT)) { + mono_set_pending_exception (mono_get_exception_argument ("type", "Type cannot be instantiated")); + return NULL; + } if (klass->rank >= 1) { g_assert (klass->rank == 1); @@ -6865,8 +6791,6 @@ ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClas ICALL_EXPORT MonoString * ves_icall_System_IO_get_temp_path (void) { - MONO_ARCH_SAVE_REGS; - return mono_string_new (mono_domain_get (), g_get_tmp_dir ()); } @@ -6881,8 +6805,6 @@ ves_icall_System_IO_DriveInfo_GetDiskFreeSpace (MonoString *path_name, guint64 * ULARGE_INTEGER wapi_total_number_of_bytes; ULARGE_INTEGER wapi_total_number_of_free_bytes; - MONO_ARCH_SAVE_REGS; - *error = ERROR_SUCCESS; result = GetDiskFreeSpaceEx (mono_string_chars (path_name), &wapi_free_bytes_avail, &wapi_total_number_of_bytes, &wapi_total_number_of_free_bytes); @@ -6904,8 +6826,6 @@ ves_icall_System_IO_DriveInfo_GetDiskFreeSpace (MonoString *path_name, guint64 * ICALL_EXPORT guint32 ves_icall_System_IO_DriveInfo_GetDriveType (MonoString *root_path_name) { - MONO_ARCH_SAVE_REGS; - return GetDriveType (mono_string_chars (root_path_name)); } #endif @@ -6913,8 +6833,6 @@ ves_icall_System_IO_DriveInfo_GetDriveType (MonoString *root_path_name) ICALL_EXPORT gpointer ves_icall_RuntimeMethod_GetFunctionPointer (MonoMethod *method) { - MONO_ARCH_SAVE_REGS; - return mono_compile_method (method); } @@ -6924,8 +6842,6 @@ ves_icall_System_Configuration_DefaultConfig_get_machine_config_path (void) MonoString *mcpath; gchar *path; - MONO_ARCH_SAVE_REGS; - path = g_build_path (G_DIR_SEPARATOR_S, mono_get_config_dir (), "mono", mono_get_runtime_info ()->framework_version, "machine.config", NULL); #if defined (HOST_WIN32) @@ -6953,8 +6869,6 @@ get_bundled_app_config (void) gsize len; gchar *module; - MONO_ARCH_SAVE_REGS; - domain = mono_domain_get (); file = domain->setup->configuration_file; if (!file) @@ -6987,8 +6901,6 @@ get_bundled_machine_config (void) { const gchar *machine_config; - MONO_ARCH_SAVE_REGS; - machine_config = mono_get_machine_config (); if (!machine_config) @@ -7003,8 +6915,6 @@ ves_icall_System_Web_Util_ICalls_get_machine_install_dir (void) MonoString *ipath; gchar *path; - MONO_ARCH_SAVE_REGS; - path = g_path_get_dirname (mono_get_config_dir ()); #if defined (HOST_WIN32) @@ -7028,8 +6938,6 @@ ves_icall_get_resources_ptr (MonoReflectionAssembly *assembly, gpointer *result, MonoPEResourceDataEntry *entry; MonoImage *image; - MONO_ARCH_SAVE_REGS; - if (!assembly || !result || !size) return FALSE; @@ -7089,8 +6997,6 @@ ves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type) MonoClass *klass; MonoDomain *domain; - MONO_ARCH_SAVE_REGS; - domain = mono_object_domain (type); klass = mono_class_from_mono_type (type->type); mono_class_init_or_throw (klass); @@ -7110,8 +7016,6 @@ ves_icall_MonoMethod_get_base_method (MonoReflectionMethod *m, gboolean definiti MonoMethod *result = NULL; int slot; - MONO_ARCH_SAVE_REGS; - if (method->klass == NULL) return m; @@ -7180,8 +7084,6 @@ ves_icall_MonoMethod_get_name (MonoReflectionMethod *m) ICALL_EXPORT void mono_ArgIterator_Setup (MonoArgIterator *iter, char* argsp, char* start) { - MONO_ARCH_SAVE_REGS; - iter->sig = *(MonoMethodSignature**)argsp; g_assert (iter->sig->sentinelpos <= iter->sig->param_count); @@ -7205,7 +7107,6 @@ mono_ArgIterator_IntGetNextArg (MonoArgIterator *iter) guint32 i, arg_size; gint32 align; MonoTypedRef res; - MONO_ARCH_SAVE_REGS; i = iter->sig->sentinelpos + iter->next_arg; @@ -7245,7 +7146,6 @@ mono_ArgIterator_IntGetNextArgT (MonoArgIterator *iter, MonoType *type) guint32 i, arg_size; gint32 align; MonoTypedRef res; - MONO_ARCH_SAVE_REGS; i = iter->sig->sentinelpos + iter->next_arg; @@ -7279,7 +7179,6 @@ ICALL_EXPORT MonoType* mono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter) { gint i; - MONO_ARCH_SAVE_REGS; i = iter->sig->sentinelpos + iter->next_arg; @@ -7291,8 +7190,6 @@ mono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter) ICALL_EXPORT MonoObject* mono_TypedReference_ToObject (MonoTypedRef tref) { - MONO_ARCH_SAVE_REGS; - if (MONO_TYPE_IS_REFERENCE (tref.type)) { MonoObject** objp = tref.value; return *objp; @@ -7304,8 +7201,6 @@ mono_TypedReference_ToObject (MonoTypedRef tref) ICALL_EXPORT MonoObject* mono_TypedReference_ToObjectInternal (MonoType *type, gpointer value, MonoClass *klass) { - MONO_ARCH_SAVE_REGS; - if (MONO_TYPE_IS_REFERENCE (type)) { MonoObject** objp = value; return *objp; @@ -7331,7 +7226,6 @@ prelink_method (MonoMethod *method) ICALL_EXPORT void ves_icall_System_Runtime_InteropServices_Marshal_Prelink (MonoReflectionMethod *method) { - MONO_ARCH_SAVE_REGS; prelink_method (method->method); } @@ -7341,7 +7235,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType MonoClass *klass = mono_class_from_mono_type (type->type); MonoMethod* m; gpointer iter = NULL; - MONO_ARCH_SAVE_REGS; mono_class_init_or_throw (klass); @@ -7366,44 +7259,14 @@ ves_icall_System_NumberFormatter_GetFormatterTables (guint64 const **mantissas, *decHexDigits = Formatter_DecHexDigits; } +/* These parameters are "readonly" in corlib/System/Globalization/TextInfo.cs */ ICALL_EXPORT void -get_category_data (int version, - guint8 const **category_data, - guint16 const **category_astral_index) -{ - *category_astral_index = NULL; - -#ifndef DISABLE_NET_4_0 - if (version == 4) { - *category_data = CategoryData_v4; -#ifndef DISABLE_ASTRAL - *category_astral_index = CategoryData_v4_astral_index; -#endif - return; - } -#endif - - *category_data = CategoryData_v2; -#ifndef DISABLE_ASTRAL - *category_astral_index = CategoryData_v2_astral_index; -#endif -} - -/* These parameters are "readonly" in corlib/System/Char.cs */ -ICALL_EXPORT void -ves_icall_System_Char_GetDataTablePointers (int category_data_version, - guint8 const **category_data, - guint16 const **category_astral_index, - guint8 const **numeric_data, - gdouble const **numeric_data_values, +ves_icall_System_Globalization_TextInfo_GetDataTablePointersLite ( guint16 const **to_lower_data_low, guint16 const **to_lower_data_high, guint16 const **to_upper_data_low, guint16 const **to_upper_data_high) { - get_category_data (category_data_version, category_data, category_astral_index); - *numeric_data = NumericData; - *numeric_data_values = NumericDataValues; *to_lower_data_low = ToLowerDataLow; *to_lower_data_high = ToLowerDataHigh; *to_upper_data_low = ToUpperDataLow; @@ -7465,7 +7328,8 @@ param_info_get_type_modifiers (MonoReflectionParameter *param, MonoBoolean optio MonoException *ex = mono_get_exception_not_supported (msg); g_free (type_name); g_free (msg); - mono_raise_exception (ex); + mono_set_pending_exception (ex); + return NULL; } image = method->klass->image; @@ -7539,8 +7403,10 @@ property_info_get_default_value (MonoReflectionProperty *property) mono_class_init (prop->parent); - if (!(prop->attrs & PROPERTY_ATTRIBUTE_HAS_DEFAULT)) - mono_raise_exception (mono_get_exception_invalid_operation (NULL)); + if (!(prop->attrs & PROPERTY_ATTRIBUTE_HAS_DEFAULT)) { + mono_set_pending_exception (mono_get_exception_invalid_operation (NULL)); + return NULL; + } def_value = mono_class_get_property_default_value (prop, &def_type); @@ -7582,9 +7448,7 @@ custom_attrs_get_by_type (MonoObject *obj, MonoReflectionType *attr_type) mono_error_raise_exception (&error); if (mono_loader_get_last_error ()) { - mono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ())); - g_assert_not_reached (); - /* Not reached */ + mono_set_pending_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ())); return NULL; } else { return res; @@ -7622,131 +7486,6 @@ ves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage (guint32 code) return message; } -const static guchar -dbase64 [] = { - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 62, 128, 128, 128, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 0, 128, 128, - 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128, - 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 -}; - -static MonoArray * -base64_to_byte_array (gunichar2 *start, gint ilength, MonoBoolean allowWhitespaceOnly) -{ - gint ignored; - gint i; - gunichar2 c; - gunichar2 last, prev_last, prev2_last; - gint olength; - MonoArray *result; - guchar *res_ptr; - gint a [4], b [4]; - MonoException *exc; - - int havePadding = 0; - ignored = 0; - last = prev_last = 0, prev2_last = 0; - for (i = 0; i < ilength; i++) { - c = start [i]; - if (c >= sizeof (dbase64)) { - exc = mono_exception_from_name_msg (mono_get_corlib (), - "System", "FormatException", - "Invalid character found."); - mono_raise_exception (exc); - } else if (isspace (c)) { - ignored++; - } else if (havePadding && c != '=') { - exc = mono_exception_from_name_msg (mono_get_corlib (), - "System", "FormatException", - "Invalid character found."); - mono_raise_exception (exc); - } else { - if (c == '=') havePadding = 1; - prev2_last = prev_last; - prev_last = last; - last = c; - } - } - - olength = ilength - ignored; - - if (allowWhitespaceOnly && olength == 0) { - return mono_array_new (mono_domain_get (), mono_defaults.byte_class, 0); - } - - if ((olength & 3) != 0 || olength <= 0) { - exc = mono_exception_from_name_msg (mono_get_corlib (), "System", - "FormatException", "Invalid length."); - mono_raise_exception (exc); - } - - if (prev2_last == '=') { - exc = mono_exception_from_name_msg (mono_get_corlib (), "System", "FormatException", "Invalid format."); - mono_raise_exception (exc); - } - - olength = (olength * 3) / 4; - if (last == '=') - olength--; - - if (prev_last == '=') - olength--; - - result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, olength); - res_ptr = mono_array_addr (result, guchar, 0); - for (i = 0; i < ilength; ) { - int k; - - for (k = 0; k < 4 && i < ilength;) { - c = start [i++]; - if (isspace (c)) - continue; - - a [k] = (guchar) c; - if (((b [k] = dbase64 [c]) & 0x80) != 0) { - exc = mono_exception_from_name_msg (mono_get_corlib (), - "System", "FormatException", - "Invalid character found."); - mono_raise_exception (exc); - } - k++; - } - - *res_ptr++ = (b [0] << 2) | (b [1] >> 4); - if (a [2] != '=') - *res_ptr++ = (b [1] << 4) | (b [2] >> 2); - if (a [3] != '=') - *res_ptr++ = (b [2] << 6) | b [3]; - - while (i < ilength && isspace (start [i])) - i++; - } - - return result; -} - -ICALL_EXPORT MonoArray * -InternalFromBase64String (MonoString *str, MonoBoolean allowWhitespaceOnly) -{ - MONO_ARCH_SAVE_REGS; - - return base64_to_byte_array (mono_string_chars (str), - mono_string_length (str), allowWhitespaceOnly); -} - -ICALL_EXPORT MonoArray * -InternalFromBase64CharArray (MonoArray *input, gint offset, gint length) -{ - MONO_ARCH_SAVE_REGS; - - return base64_to_byte_array (mono_array_addr (input, gunichar2, offset), - length, FALSE); -} - #ifndef DISABLE_ICALL_TABLES #define ICALL_TYPE(id,name,first) @@ -8154,7 +7893,7 @@ mono_lookup_internal_call (MonoMethod *method) g_warning ("cant resolve internal call to \"%s\" (tested without signature also)", mname); g_print ("\nYour mono runtime and class libraries are out of sync.\n"); g_print ("The out of sync library is: %s\n", method->klass->image->name); - g_print ("\nWhen you update one from svn you need to update, compile and install\nthe other too.\n"); + g_print ("\nWhen you update one from git you need to update, compile and install\nthe other too.\n"); g_print ("Do not report this as a bug unless you're sure you have updated correctly:\nyou probably have a broken mono install.\n"); g_print ("If you see other errors or faults after this message they are probably related\n"); g_print ("and you need to fix your mono install first.\n"); @@ -8405,8 +8144,12 @@ mono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper) mono_icall_unlock (); } +/* + * If NO_RAISE is set, that means the icall is not calling mono_raise_exception () directly or indirectly. The JIT might be able to call these + * icalls without wrappers in some cases. + */ MonoJitICallInfo * -mono_register_jit_icall_full (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save, const char *c_symbol) +mono_register_jit_icall_full (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save, gboolean no_raise, const char *c_symbol) { MonoJitICallInfo *info; @@ -8431,6 +8174,7 @@ mono_register_jit_icall_full (gconstpointer func, const char *name, MonoMethodSi info->func = func; info->sig = sig; info->c_symbol = c_symbol; + info->no_raise = no_raise; if (is_save) { info->wrapper = func; @@ -8448,6 +8192,6 @@ mono_register_jit_icall_full (gconstpointer func, const char *name, MonoMethodSi MonoJitICallInfo * mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save) { - return mono_register_jit_icall_full (func, name, sig, is_save, NULL); + return mono_register_jit_icall_full (func, name, sig, is_save, FALSE, NULL); } diff --git a/mta-mono/vendor/mono/metadata/image.c b/mta-mono/vendor/mono/metadata/image.c index d5c05be..d62b703 100644 --- a/mta-mono/vendor/mono/metadata/image.c +++ b/mta-mono/vendor/mono/metadata/image.c @@ -1618,6 +1618,10 @@ mono_image_close_except_pools (MonoImage *image) } free_hash (image->native_wrapper_cache); + free_hash (image->native_wrapper_aot_cache); + free_hash (image->native_wrapper_check_cache); + free_hash (image->native_wrapper_aot_check_cache); + free_hash (image->native_func_wrapper_cache); free_hash (image->managed_wrapper_cache); free_hash (image->delegate_begin_invoke_cache); free_hash (image->delegate_end_invoke_cache); @@ -1998,21 +2002,27 @@ mono_image_load_file_for_image (MonoImage *image, int fileidx) if (fileidx < 1 || fileidx > t->rows) return NULL; - mono_loader_lock (); + mono_image_lock (image); if (image->files && image->files [fileidx - 1]) { - mono_loader_unlock (); + mono_image_unlock (image); return image->files [fileidx - 1]; } - if (!image->files) - image->files = g_new0 (MonoImage*, t->rows); - fname_id = mono_metadata_decode_row_col (t, fileidx - 1, MONO_FILE_NAME); fname = mono_metadata_string_heap (image, fname_id); base_dir = g_path_get_dirname (image->name); name = g_build_filename (base_dir, fname, NULL); res = mono_image_open (name, NULL); - if (res) { + if (!res) + goto done; + + mono_image_lock (image); + if (image->files && image->files [fileidx - 1]) { + MonoImage *old = res; + res = image->files [fileidx - 1]; + mono_loader_unlock (); + mono_image_close (old); + } else { int i; /* g_print ("loaded file %s from %s (%p)\n", name, image->name, image->assembly); */ res->assembly = image->assembly; @@ -2021,13 +2031,18 @@ mono_image_load_file_for_image (MonoImage *image, int fileidx) res->modules [i]->assembly = image->assembly; } + if (!image->files) + image->files = g_new0 (MonoImage*, t->rows); image->files [fileidx - 1] = res; + mono_loader_unlock (); + /* vtable fixup can't happen with the image lock held */ #ifdef HOST_WIN32 if (res->is_module_handle) mono_image_fixup_vtable (res); #endif } - mono_loader_unlock (); + +done: g_free (name); g_free (base_dir); return res; diff --git a/mta-mono/vendor/mono/metadata/loader.c b/mta-mono/vendor/mono/metadata/loader.c index ea521d5..233efef 100644 --- a/mta-mono/vendor/mono/metadata/loader.c +++ b/mta-mono/vendor/mono/metadata/loader.c @@ -55,7 +55,7 @@ MonoDefaults mono_defaults; * See domain-internals.h for locking policy in combination with the * domain lock. */ -static mono_mutex_t loader_mutex; +static mono_mutex_t loader_mutex, global_loader_data_mutex; static gboolean loader_lock_inited; /* Statistics */ @@ -77,6 +77,19 @@ MonoNativeTlsKey loader_lock_nest_id; static void dllmap_cleanup (void); + +static void +global_loader_data_lock (void) +{ + mono_locks_acquire (&global_loader_data_mutex, LoaderGlobalDataLock); +} + +static void +global_loader_data_unlock (void) +{ + mono_locks_release (&global_loader_data_mutex, LoaderGlobalDataLock); +} + void mono_loader_init () { @@ -84,11 +97,13 @@ mono_loader_init () if (!inited) { mono_mutex_init_recursive (&loader_mutex); + mono_mutex_init_recursive (&global_loader_data_mutex); loader_lock_inited = TRUE; mono_native_tls_alloc (&loader_error_thread_id, NULL); mono_native_tls_alloc (&loader_lock_nest_id, NULL); + mono_counters_init (); mono_counters_register ("Inflated signatures size", MONO_COUNTER_GENERICS | MONO_COUNTER_INT, &inflated_signatures_size); mono_counters_register ("Memberref signature cache size", @@ -111,6 +126,7 @@ mono_loader_cleanup (void) mono_native_tls_free (loader_lock_nest_id); mono_mutex_destroy (&loader_mutex); + mono_mutex_destroy (&global_loader_data_mutex); loader_lock_inited = FALSE; } @@ -425,9 +441,9 @@ cache_memberref_sig (MonoImage *image, guint32 sig_idx, gpointer sig) static MonoClassField* field_from_memberref (MonoImage *image, guint32 token, MonoClass **retklass, - MonoGenericContext *context) + MonoGenericContext *context, MonoError *error) { - MonoClass *klass; + MonoClass *klass = NULL; MonoClassField *field; MonoTableInfo *tables = image->tables; MonoType *sig_type; @@ -436,7 +452,8 @@ field_from_memberref (MonoImage *image, guint32 token, MonoClass **retklass, const char *fname; const char *ptr; guint32 idx = mono_metadata_token_index (token); - MonoError error; + + mono_error_init (error); mono_metadata_decode_row (&tables [MONO_TABLE_MEMBERREF], idx-1, cols, MONO_MEMBERREF_SIZE); nindex = cols [MONO_MEMBERREF_CLASS] >> MONO_MEMBERREF_PARENT_BITS; @@ -445,60 +462,39 @@ field_from_memberref (MonoImage *image, guint32 token, MonoClass **retklass, fname = mono_metadata_string_heap (image, cols [MONO_MEMBERREF_NAME]); if (!mono_verifier_verify_memberref_field_signature (image, cols [MONO_MEMBERREF_SIGNATURE], NULL)) { - mono_loader_set_error_bad_image (g_strdup_printf ("Bad field signature class token 0x%08x field name %s token 0x%08x on image %s", class, fname, token, image->name)); + mono_error_set_bad_image (error, image, "Bad field '%s' signature 0x%08x", class, token); return NULL; } switch (class) { case MONO_MEMBERREF_PARENT_TYPEDEF: class_table = MONO_TOKEN_TYPE_DEF; - klass = mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | nindex, &error); - if (!mono_error_ok (&error)) { - /*FIXME don't swallow the error message*/ - mono_error_cleanup (&error); - } - + klass = mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | nindex, error); break; case MONO_MEMBERREF_PARENT_TYPEREF: class_table = MONO_TOKEN_TYPE_REF; - klass = mono_class_from_typeref_checked (image, MONO_TOKEN_TYPE_REF | nindex, &error); - if (!mono_error_ok (&error)) { - /*FIXME don't swallow the error message*/ - mono_error_cleanup (&error); - } - + klass = mono_class_from_typeref_checked (image, MONO_TOKEN_TYPE_REF | nindex, error); break; case MONO_MEMBERREF_PARENT_TYPESPEC: class_table = MONO_TOKEN_TYPE_SPEC; - klass = mono_class_get_and_inflate_typespec_checked (image, MONO_TOKEN_TYPE_SPEC | nindex, context, &error); - if (!mono_error_ok (&error)) { - /*FIXME don't swallow the error message*/ - mono_error_cleanup (&error); - } + klass = mono_class_get_and_inflate_typespec_checked (image, MONO_TOKEN_TYPE_SPEC | nindex, context, error); break; default: - /*FIXME this must set a loader error!*/ - g_warning ("field load from %x", class); - return NULL; + mono_error_set_bad_image (error, image, "Bad field field '%s' signature 0x%08x", class, token); } - if (!klass) { - char *name = mono_class_name_from_token (image, class_table | nindex); - g_warning ("Missing field %s in class %s (type token %d)", fname, name, class_table | nindex); - mono_loader_set_error_type_load (name, image->assembly_name); - g_free (name); + if (!klass) return NULL; - } ptr = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]); mono_metadata_decode_blob_size (ptr, &ptr); /* we may want to check the signature here... */ if (*ptr++ != 0x6) { - g_warning ("Bad field signature class token %08x field name %s token %08x", class, fname, token); - mono_loader_set_error_field_load (klass, fname); + mono_error_set_field_load (error, klass, fname, "Bad field signature class token %08x field name %s token %08x", class, fname, token); return NULL; } + /* FIXME: This needs a cache, especially for generic instances, since * mono_metadata_parse_type () allocates everything from a mempool. */ @@ -506,7 +502,7 @@ field_from_memberref (MonoImage *image, guint32 token, MonoClass **retklass, if (!sig_type) { sig_type = mono_metadata_parse_type (image, MONO_PARSE_TYPE, 0, ptr, &ptr); if (sig_type == NULL) { - mono_loader_set_error_field_load (klass, fname); + mono_error_set_field_load (error, klass, fname, "Could not parse field '%s' signature %08x", fname, token); return NULL; } sig_type = cache_memberref_sig (image, cols [MONO_MEMBERREF_SIGNATURE], sig_type); @@ -517,21 +513,40 @@ field_from_memberref (MonoImage *image, guint32 token, MonoClass **retklass, *retklass = klass; field = mono_class_get_field_from_name_full (klass, fname, sig_type); - if (!field) - mono_loader_set_error_field_load (klass, fname); + if (!field) { + g_assert (!mono_loader_get_last_error ()); + mono_error_set_field_load (error, klass, fname, "Could not find field '%s'", fname); + } return field; } +/* + * mono_field_from_token: + * @deprecated use the _checked variant +*/ MonoClassField* -mono_field_from_token (MonoImage *image, guint32 token, MonoClass **retklass, - MonoGenericContext *context) +mono_field_from_token (MonoImage *image, guint32 token, MonoClass **retklass, MonoGenericContext *context) { MonoError error; + MonoClassField *res = mono_field_from_token_checked (image, token, retklass, context, &error); + g_assert (!mono_loader_get_last_error ()); + if (!mono_error_ok (&error)) { + mono_loader_set_error_from_mono_error (&error); + mono_error_cleanup (&error); + } + return res; +} + +MonoClassField* +mono_field_from_token_checked (MonoImage *image, guint32 token, MonoClass **retklass, MonoGenericContext *context, MonoError *error) +{ MonoClass *k; guint32 type; MonoClassField *field; + mono_error_init (error); + if (image_is_dynamic (image)) { MonoClassField *result; MonoClass *handle_class; @@ -540,7 +555,7 @@ mono_field_from_token (MonoImage *image, guint32 token, MonoClass **retklass, result = mono_lookup_dynamic_token_class (image, token, TRUE, &handle_class, context); // This checks the memberref type as well if (!result || handle_class != mono_defaults.fieldhandle_class) { - mono_loader_set_error_bad_image (g_strdup_printf ("Bad field token 0x%08x on image %s.", token, image->name)); + mono_error_set_bad_image (error, image, "Bad field token 0x%08x", token); return NULL; } *retklass = result->parent; @@ -552,27 +567,35 @@ mono_field_from_token (MonoImage *image, guint32 token, MonoClass **retklass, return field; } - if (mono_metadata_token_table (token) == MONO_TABLE_MEMBERREF) - field = field_from_memberref (image, token, retklass, context); - else { + if (mono_metadata_token_table (token) == MONO_TABLE_MEMBERREF) { + field = field_from_memberref (image, token, retklass, context, error); + g_assert (!mono_loader_get_last_error ()); + } else { type = mono_metadata_typedef_from_field (image, mono_metadata_token_index (token)); - if (!type) - return NULL; - k = mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | type, &error); - if (!k) { - mono_loader_set_error_from_mono_error (&error); - mono_error_cleanup (&error); /*FIXME don't swallow the error message*/ + if (!type) { + mono_error_set_bad_image (error, image, "Invalid field token 0x%08x", token); return NULL; } + k = mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | type, error); + if (!k) + return NULL; + mono_class_init (k); if (retklass) *retklass = k; field = mono_class_get_field (k, token); + if (!field) { + if (mono_loader_get_last_error ()) + mono_error_set_from_loader_error (error); + else + mono_error_set_bad_image (error, image, "Could not resolve field token 0x%08x", token); + } } if (field && field->parent && !field->parent->generic_class && !field->parent->generic_container) mono_conc_hashtable_insert (image->field_cache, GUINT_TO_POINTER (token), field); + g_assert (!mono_loader_get_last_error ()); return field; } @@ -603,11 +626,12 @@ mono_metadata_signature_vararg_match (MonoMethodSignature *sig1, MonoMethodSigna static MonoMethod * find_method_in_class (MonoClass *klass, const char *name, const char *qname, const char *fqname, - MonoMethodSignature *sig, MonoClass *from_class) + MonoMethodSignature *sig, MonoClass *from_class, MonoError *error) { int i; /* Search directly in the metadata to avoid calling setup_methods () */ + mono_error_init (error); /* FIXME: !from_class->generic_class condition causes test failures. */ if (klass->type_token && !image_is_dynamic (klass->image) && !klass->methods && !klass->rank && klass == from_class && !from_class->generic_class) { @@ -626,23 +650,30 @@ find_method_in_class (MonoClass *klass, const char *name, const char *qname, con (name && !strcmp (m_name, name)))) continue; - method = mono_get_method (klass->image, MONO_TOKEN_METHOD_DEF | (klass->method.first + i + 1), klass); + method = mono_get_method_checked (klass->image, MONO_TOKEN_METHOD_DEF | (klass->method.first + i + 1), klass, NULL, error); + if (!mono_error_ok (error)) //bail out if we hit a loader error + return NULL; if (method) { - other_sig = mono_method_signature (method); + other_sig = mono_method_signature_checked (method, error); + if (!mono_error_ok (error)) //bail out if we hit a loader error + return NULL; if (other_sig && (sig->call_convention != MONO_CALL_VARARG) && mono_metadata_signature_equal (sig, other_sig)) return method; } } } - mono_class_setup_methods (klass); + mono_class_setup_methods (klass); /* FIXME don't swallow the error here. */ /* We can't fail lookup of methods otherwise the runtime will fail with MissingMethodException instead of TypeLoadException. See mono/tests/generic-type-load-exception.2.il FIXME we should better report this error to the caller */ - if (!klass->methods) + if (!klass->methods || klass->exception_type) { + mono_error_set_type_load_class (error, klass, "Could not find method due to a type load error"); //FIXME get the error from the class + return NULL; + } for (i = 0; i < klass->method.count; ++i) { MonoMethod *m = klass->methods [i]; MonoMethodSignature *msig; @@ -655,7 +686,10 @@ find_method_in_class (MonoClass *klass, const char *name, const char *qname, con (qname && !strcmp (m->name, qname)) || (name && !strcmp (m->name, name)))) continue; - msig = mono_method_signature (m); + msig = mono_method_signature_checked (m, error); + if (!mono_error_ok (error)) //bail out if we hit a loader error + return NULL; + if (!msig) continue; @@ -674,13 +708,15 @@ find_method_in_class (MonoClass *klass, const char *name, const char *qname, con } static MonoMethod * -find_method (MonoClass *in_class, MonoClass *ic, const char* name, MonoMethodSignature *sig, MonoClass *from_class) +find_method (MonoClass *in_class, MonoClass *ic, const char* name, MonoMethodSignature *sig, MonoClass *from_class, MonoError *error) { int i; char *qname, *fqname, *class_name; gboolean is_interface; MonoMethod *result = NULL; + MonoClass *initial_class = in_class; + mono_error_init (error); is_interface = MONO_CLASS_IS_INTERFACE (in_class); if (ic) { @@ -696,8 +732,8 @@ find_method (MonoClass *in_class, MonoClass *ic, const char* name, MonoMethodSig while (in_class) { g_assert (from_class); - result = find_method_in_class (in_class, name, qname, fqname, sig, from_class); - if (result) + result = find_method_in_class (in_class, name, qname, fqname, sig, from_class, error); + if (result || !mono_error_ok (error)) goto out; if (name [0] == '.' && (!strcmp (name, ".ctor") || !strcmp (name, ".cctor"))) @@ -725,11 +761,11 @@ find_method (MonoClass *in_class, MonoClass *ic, const char* name, MonoMethodSig else ic_fqname = NULL; - result = find_method_in_class (in_ic, ic ? name : NULL, ic_qname, ic_fqname, sig, from_ic); + result = find_method_in_class (in_ic, ic ? name : NULL, ic_qname, ic_fqname, sig, from_ic, error); g_free (ic_class_name); g_free (ic_fqname); g_free (ic_qname); - if (result) + if (result || !mono_error_ok (error)) goto out; } @@ -739,8 +775,15 @@ find_method (MonoClass *in_class, MonoClass *ic, const char* name, MonoMethodSig g_assert (!in_class == !from_class); if (is_interface) - result = find_method_in_class (mono_defaults.object_class, name, qname, fqname, sig, mono_defaults.object_class); + result = find_method_in_class (mono_defaults.object_class, name, qname, fqname, sig, mono_defaults.object_class, error); + //we did not find the method + if (!result && mono_error_ok (error)) { + char *desc = mono_signature_get_desc (sig, FALSE); + mono_error_set_method_load (error, initial_class, name, "Could not find method with signature %s", desc); + g_free (desc); + } + out: g_free (class_name); g_free (fqname); @@ -846,6 +889,22 @@ inflate_generic_header (MonoMethodHeader *header, MonoGenericContext *context) */ MonoMethodSignature* mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 token, MonoGenericContext *context) +{ + MonoError error; + MonoMethodSignature *res = mono_method_get_signature_checked (method, image, token, context, &error); + + g_assert (!mono_loader_get_last_error ()); + + if (!res) { + g_assert (!mono_error_ok (&error)); + mono_loader_set_error_from_mono_error (&error); + mono_error_cleanup (&error); /* FIXME Don't swallow the error */ + } + return res; +} + +MonoMethodSignature* +mono_method_get_signature_checked (MonoMethod *method, MonoImage *image, guint32 token, MonoGenericContext *context, MonoError *error) { int table = mono_metadata_token_table (token); int idx = mono_metadata_token_index (token); @@ -854,23 +913,27 @@ mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 to MonoMethodSignature *sig; const char *ptr; + mono_error_init (error); + /* !table is for wrappers: we should really assign their own token to them */ if (!table || table == MONO_TABLE_METHOD) - return mono_method_signature (method); + return mono_method_signature_checked (method, error); if (table == MONO_TABLE_METHODSPEC) { /* the verifier (do_invoke_method) will turn the NULL into a verifier error */ if ((method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) || !method->is_inflated) return NULL; - return mono_method_signature (method); + return mono_method_signature_checked (method, error); } if (method->klass->generic_class) - return mono_method_signature (method); + return mono_method_signature_checked (method, error); if (image_is_dynamic (image)) { - sig = mono_reflection_lookup_signature (image, method, token); + sig = mono_reflection_lookup_signature (image, method, token, error); + if (!sig) + return NULL; } else { mono_metadata_decode_row (&image->tables [MONO_TABLE_MEMBERREF], idx-1, cols, MONO_MEMBERREF_SIZE); sig_idx = cols [MONO_MEMBERREF_SIGNATURE]; @@ -881,15 +944,18 @@ mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 to guint32 class = cols [MONO_MEMBERREF_CLASS] & MONO_MEMBERREF_PARENT_MASK; const char *fname = mono_metadata_string_heap (image, cols [MONO_MEMBERREF_NAME]); - mono_loader_set_error_bad_image (g_strdup_printf ("Bad method signature class token 0x%08x field name %s token 0x%08x on image %s", class, fname, token, image->name)); + //FIXME include the verification error + mono_error_set_bad_image (error, image, "Bad method signature class token 0x%08x field name %s token 0x%08x", class, fname, token); return NULL; } ptr = mono_metadata_blob_heap (image, sig_idx); mono_metadata_decode_blob_size (ptr, &ptr); - sig = mono_metadata_parse_method_signature (image, 0, ptr, NULL); + + sig = mono_metadata_parse_method_signature_full (image, NULL, 0, ptr, NULL, error); if (!sig) return NULL; + sig = cache_memberref_sig (image, sig_idx, sig); } /* FIXME: we probably should verify signature compat in the dynamic case too*/ @@ -897,22 +963,18 @@ mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 to guint32 class = cols [MONO_MEMBERREF_CLASS] & MONO_MEMBERREF_PARENT_MASK; const char *fname = mono_metadata_string_heap (image, cols [MONO_MEMBERREF_NAME]); - mono_loader_set_error_bad_image (g_strdup_printf ("Incompatible method signature class token 0x%08x field name %s token 0x%08x on image %s", class, fname, token, image->name)); + mono_error_set_bad_image (error, image, "Incompatible method signature class token 0x%08x field name %s token 0x%08x", class, fname, token); return NULL; } } if (context) { - MonoError error; MonoMethodSignature *cached; /* This signature is not owned by a MonoMethod, so need to cache */ - sig = inflate_generic_signature_checked (image, sig, context, &error); - if (!mono_error_ok (&error)) {/*XXX bubble up this and kill one use of loader errors */ - mono_loader_set_error_bad_image (g_strdup_printf ("Could not inflate signature %s", mono_error_get_message (&error))); - mono_error_cleanup (&error); + sig = inflate_generic_signature_checked (image, sig, context, error); + if (!mono_error_ok (error)) return NULL; - } cached = mono_metadata_get_inflated_signature (sig, context); if (cached != sig) @@ -922,13 +984,24 @@ mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 to sig = cached; } + g_assert (mono_error_ok (error)); return sig; } MonoMethodSignature* mono_method_get_signature (MonoMethod *method, MonoImage *image, guint32 token) { - return mono_method_get_signature_full (method, image, token, NULL); + MonoError error; + MonoMethodSignature *res = mono_method_get_signature_checked (method, image, token, NULL, &error); + + g_assert (!mono_loader_get_last_error ()); + + if (!res) { + g_assert (!mono_error_ok (&error)); + mono_loader_set_error_from_mono_error (&error); + mono_error_cleanup (&error); /* FIXME Don't swallow the error */ + } + return res; } /* this is only for the typespec array methods */ @@ -949,7 +1022,7 @@ mono_method_search_in_array_class (MonoClass *klass, const char *name, MonoMetho static MonoMethod * method_from_memberref (MonoImage *image, guint32 idx, MonoGenericContext *typespec_context, - gboolean *used_context) + gboolean *used_context, MonoError *error) { MonoClass *klass = NULL; MonoMethod *method = NULL; @@ -959,7 +1032,8 @@ method_from_memberref (MonoImage *image, guint32 idx, MonoGenericContext *typesp const char *mname; MonoMethodSignature *sig; const char *ptr; - MonoError error; + + mono_error_init (error); mono_metadata_decode_row (&tables [MONO_TABLE_MEMBERREF], idx-1, cols, 3); nindex = cols [MONO_MEMBERREF_CLASS] >> MONO_MEMBERREF_PARENT_BITS; @@ -979,52 +1053,42 @@ method_from_memberref (MonoImage *image, guint32 idx, MonoGenericContext *typesp switch (class) { case MONO_MEMBERREF_PARENT_TYPEREF: - klass = mono_class_from_typeref_checked (image, MONO_TOKEN_TYPE_REF | nindex, &error); - if (!klass) { - mono_loader_set_error_from_mono_error (&error); - mono_error_cleanup (&error); /* FIXME Don't swallow the error */ - return NULL; - } + klass = mono_class_from_typeref_checked (image, MONO_TOKEN_TYPE_REF | nindex, error); + if (!klass) + goto fail; break; case MONO_MEMBERREF_PARENT_TYPESPEC: /* * Parse the TYPESPEC in the parent's context. */ - klass = mono_class_get_and_inflate_typespec_checked (image, MONO_TOKEN_TYPE_SPEC | nindex, typespec_context, &error); - if (!klass) { - mono_loader_set_error_from_mono_error (&error); - mono_error_cleanup (&error); /*FIXME don't swallow the error message*/ - return NULL; - } + klass = mono_class_get_and_inflate_typespec_checked (image, MONO_TOKEN_TYPE_SPEC | nindex, typespec_context, error); + if (!klass) + goto fail; break; case MONO_MEMBERREF_PARENT_TYPEDEF: - klass = mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | nindex, &error); - if (!klass) { - mono_loader_set_error_from_mono_error (&error); - mono_error_cleanup (&error); /*FIXME don't swallow the error message*/ - return NULL; - } + klass = mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | nindex, error); + if (!klass) + goto fail; break; - case MONO_MEMBERREF_PARENT_METHODDEF: - return mono_get_method (image, MONO_TOKEN_METHOD_DEF | nindex, NULL); - - default: - { - /* This message leaks */ - char *message = g_strdup_printf ("Memberref parent unknown: class: %d, index %d", class, nindex); - mono_loader_set_error_method_load ("", message); - return NULL; - } - + case MONO_MEMBERREF_PARENT_METHODDEF: { + method = mono_get_method_checked (image, MONO_TOKEN_METHOD_DEF | nindex, NULL, NULL, error); + if (!method) + goto fail; + return method; } + default: + mono_error_set_bad_image (error, image, "Memberref parent unknown: class: %d, index %d", class, nindex); + goto fail; + } + g_assert (klass); mono_class_init (klass); sig_idx = cols [MONO_MEMBERREF_SIGNATURE]; if (!mono_verifier_verify_memberref_method_signature (image, sig_idx, NULL)) { - mono_loader_set_error_method_load (klass->name, mname); - return NULL; + mono_error_set_method_load (error, klass, mname, "Verifier rejected method signature"); + goto fail; } ptr = mono_metadata_blob_heap (image, sig_idx); @@ -1032,9 +1096,9 @@ method_from_memberref (MonoImage *image, guint32 idx, MonoGenericContext *typesp sig = find_cached_memberref_sig (image, sig_idx); if (!sig) { - sig = mono_metadata_parse_method_signature (image, 0, ptr, NULL); + sig = mono_metadata_parse_method_signature_full (image, NULL, 0, ptr, NULL, error); if (sig == NULL) - return NULL; + goto fail; sig = cache_memberref_sig (image, sig_idx, sig); } @@ -1042,7 +1106,7 @@ method_from_memberref (MonoImage *image, guint32 idx, MonoGenericContext *typesp switch (class) { case MONO_MEMBERREF_PARENT_TYPEREF: case MONO_MEMBERREF_PARENT_TYPEDEF: - method = find_method (klass, NULL, mname, sig, klass); + method = find_method (klass, NULL, mname, sig, klass, error); break; case MONO_MEMBERREF_PARENT_TYPESPEC: { @@ -1052,7 +1116,7 @@ method_from_memberref (MonoImage *image, guint32 idx, MonoGenericContext *typesp if (type->type != MONO_TYPE_ARRAY && type->type != MONO_TYPE_SZARRAY) { MonoClass *in_class = klass->generic_class ? klass->generic_class->container_class : klass; - method = find_method (in_class, NULL, mname, sig, klass); + method = find_method (in_class, NULL, mname, sig, klass, error); break; } @@ -1061,13 +1125,12 @@ method_from_memberref (MonoImage *image, guint32 idx, MonoGenericContext *typesp break; } default: - g_error ("Memberref parent unknown: class: %d, index %d", class, nindex); - g_assert_not_reached (); + mono_error_set_bad_image (error, image,"Memberref parent unknown: class: %d, index %d", class, nindex); + goto fail; } - if (!method) { + if (!method && mono_error_ok (error)) { char *msig = mono_signature_get_desc (sig, FALSE); - char * class_name = mono_type_get_name (&klass->byval_arg); GString *s = g_string_new (mname); if (sig->generic_param_count) g_string_append_printf (s, "<[%d]>", sig->generic_param_count); @@ -1075,21 +1138,26 @@ method_from_memberref (MonoImage *image, guint32 idx, MonoGenericContext *typesp g_free (msig); msig = g_string_free (s, FALSE); - g_warning ( - "Missing method %s::%s in assembly %s, referenced in assembly %s", - class_name, msig, klass->image->name, image->name); - mono_loader_set_error_method_load (class_name, mname); + if (mono_loader_get_last_error ()) /* FIXME find_method and mono_method_search_in_array_class can leak a loader error */ + mono_error_set_from_loader_error (error); + else + mono_error_set_method_load (error, klass, mname, "Could not find method %s", msig); + g_free (msig); - g_free (class_name); } + g_assert (!mono_loader_get_last_error ()); return method; + +fail: + g_assert (!mono_loader_get_last_error ()); + g_assert (!mono_error_ok (error)); + return NULL; } static MonoMethod * -method_from_methodspec (MonoImage *image, MonoGenericContext *context, guint32 idx) +method_from_methodspec (MonoImage *image, MonoGenericContext *context, guint32 idx, MonoError *error) { - MonoError error; MonoMethod *method; MonoClass *klass; MonoTableInfo *tables = image->tables; @@ -1099,12 +1167,16 @@ method_from_methodspec (MonoImage *image, MonoGenericContext *context, guint32 i guint32 cols [MONO_METHODSPEC_SIZE]; guint32 token, nindex, param_count; + mono_error_init (error); + mono_metadata_decode_row (&tables [MONO_TABLE_METHODSPEC], idx - 1, cols, MONO_METHODSPEC_SIZE); token = cols [MONO_METHODSPEC_METHOD]; nindex = token >> MONO_METHODDEFORREF_BITS; - if (!mono_verifier_verify_methodspec_signature (image, cols [MONO_METHODSPEC_SIGNATURE], NULL)) + if (!mono_verifier_verify_methodspec_signature (image, cols [MONO_METHODSPEC_SIGNATURE], NULL)) { + mono_error_set_bad_image (error, image, "Bad method signals signature 0x%08x", idx); return NULL; + } ptr = mono_metadata_blob_heap (image, cols [MONO_METHODSPEC_SIGNATURE]); @@ -1113,21 +1185,25 @@ method_from_methodspec (MonoImage *image, MonoGenericContext *context, guint32 i param_count = mono_metadata_decode_value (ptr, &ptr); inst = mono_metadata_parse_generic_inst (image, NULL, param_count, ptr, &ptr); - if (!inst) + if (!inst) { + g_assert (!mono_loader_get_last_error ()); + mono_error_set_bad_image (error, image, "Cannot parse generic instance for methodspec 0x%08x", idx); return NULL; - - if (context && inst->is_open) { - inst = mono_metadata_inflate_generic_inst (inst, context, &error); - if (!mono_error_ok (&error)) { - mono_error_cleanup (&error); /*FIXME don't swallow error message.*/ - return NULL; - } } - if ((token & MONO_METHODDEFORREF_MASK) == MONO_METHODDEFORREF_METHODDEF) - method = mono_get_method_full (image, MONO_TOKEN_METHOD_DEF | nindex, NULL, context); - else - method = method_from_memberref (image, nindex, context, NULL); + if (context && inst->is_open) { + inst = mono_metadata_inflate_generic_inst (inst, context, error); + if (!mono_error_ok (error)) + return NULL; + } + + if ((token & MONO_METHODDEFORREF_MASK) == MONO_METHODDEFORREF_METHODDEF) { + method = mono_get_method_checked (image, MONO_TOKEN_METHOD_DEF | nindex, NULL, context, error); + if (!method) + return NULL; + } else { + method = method_from_memberref (image, nindex, context, NULL, error); + } if (!method) return NULL; @@ -1142,7 +1218,9 @@ method_from_methodspec (MonoImage *image, MonoGenericContext *context, guint32 i new_context.class_inst = klass->generic_class ? klass->generic_class->context.class_inst : NULL; new_context.method_inst = inst; - return mono_class_inflate_generic_method_full (method, klass, &new_context); + method = mono_class_inflate_generic_method_full_checked (method, klass, &new_context, error); + g_assert (!mono_loader_get_last_error ()); + return method; } struct _MonoDllMap { @@ -1164,7 +1242,7 @@ mono_dllmap_lookup_list (MonoDllMap *dll_map, const char *dll, const char* func, if (!dll_map) return 0; - mono_loader_lock (); + global_loader_data_lock (); /* * we use the first entry we find that matches, since entries from @@ -1191,7 +1269,7 @@ mono_dllmap_lookup_list (MonoDllMap *dll_map, const char *dll, const char* func, } } - mono_loader_unlock (); + global_loader_data_unlock (); return found; } @@ -1250,10 +1328,10 @@ mono_dllmap_insert (MonoImage *assembly, const char *dll, const char *func, cons entry->func = func? g_strdup (func): NULL; entry->target_func = tfunc? g_strdup (tfunc): NULL; - mono_loader_lock (); + global_loader_data_lock (); entry->next = global_dll_map; global_dll_map = entry; - mono_loader_unlock (); + global_loader_data_unlock (); } else { entry = mono_image_alloc0 (assembly, sizeof (MonoDllMap)); entry->dll = dll? mono_image_strdup (assembly, dll): NULL; @@ -1299,18 +1377,18 @@ cached_module_load (const char *name, int flags, char **err) if (err) *err = NULL; - mono_loader_lock (); + global_loader_data_lock (); if (!global_module_map) global_module_map = g_hash_table_new (g_str_hash, g_str_equal); res = g_hash_table_lookup (global_module_map, name); if (res) { - mono_loader_unlock (); + global_loader_data_unlock (); return res; } res = mono_dl_open (name, flags, err); if (res) g_hash_table_insert (global_module_map, g_strdup (name), res); - mono_loader_unlock (); + global_loader_data_unlock (); return res; } @@ -1657,12 +1735,16 @@ mono_lookup_pinvoke_call (MonoMethod *method, const char **exc_class, const char "Probing '%s'.", mangled_name2); error_msg = mono_dl_symbol (module, mangled_name2, &piinfo->addr); - g_free (error_msg); - error_msg = NULL; if (piinfo->addr) mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_DLLIMPORT, "Found as '%s'.", mangled_name2); + else + mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_DLLIMPORT, + "Could not find '%s' due to '%s'.", mangled_name2, error_msg); + + g_free (error_msg); + error_msg = NULL; if (mangled_name != mangled_name2) g_free (mangled_name2); @@ -1689,9 +1771,8 @@ mono_lookup_pinvoke_call (MonoMethod *method, const char **exc_class, const char */ static MonoMethod * mono_get_method_from_token (MonoImage *image, guint32 token, MonoClass *klass, - MonoGenericContext *context, gboolean *used_context) + MonoGenericContext *context, gboolean *used_context, MonoError *error) { - MonoError error; MonoMethod *result; int table = mono_metadata_token_table (token); int idx = mono_metadata_token_index (token); @@ -1701,13 +1782,17 @@ mono_get_method_from_token (MonoImage *image, guint32 token, MonoClass *klass, int size; guint32 cols [MONO_TYPEDEF_SIZE]; + mono_error_init (error); + if (image_is_dynamic (image)) { MonoClass *handle_class; result = mono_lookup_dynamic_token_class (image, token, TRUE, &handle_class, context); + g_assert (!mono_loader_get_last_error ()); + // This checks the memberref type as well if (result && handle_class != mono_defaults.methodhandle_class) { - mono_loader_set_error_bad_image (g_strdup_printf ("Bad method token 0x%08x on image %s.", token, image->name)); + mono_error_set_bad_image (error, image, "Bad method token 0x%08x on dynamic image", token); return NULL; } return result; @@ -1716,33 +1801,31 @@ mono_get_method_from_token (MonoImage *image, guint32 token, MonoClass *klass, if (table != MONO_TABLE_METHOD) { if (table == MONO_TABLE_METHODSPEC) { if (used_context) *used_context = TRUE; - return method_from_methodspec (image, context, idx); + return method_from_methodspec (image, context, idx, error); } if (table != MONO_TABLE_MEMBERREF) { - g_warning ("got wrong token: 0x%08x\n", token); - mono_loader_set_error_bad_image (g_strdup_printf ("Bad method token 0x%08x on image %s.", token, image->name)); + mono_error_set_bad_image (error, image, "Bad method token 0x%08x.", token); return NULL; } - return method_from_memberref (image, idx, context, used_context); + return method_from_memberref (image, idx, context, used_context, error); } if (used_context) *used_context = FALSE; if (idx > image->tables [MONO_TABLE_METHOD].rows) { - mono_loader_set_error_bad_image (g_strdup_printf ("Bad method token 0x%08x on image %s.", token, image->name)); + mono_error_set_bad_image (error, image, "Bad method token 0x%08x (out of bounds).", token); return NULL; } if (!klass) { guint32 type = mono_metadata_typedef_from_method (image, token); - if (!type) - return NULL; - klass = mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | type, &error); - if (klass == NULL) { - mono_loader_set_error_from_mono_error (&error); - mono_error_cleanup (&error); /*FIXME don't swallow the error message*/ + if (!type) { + mono_error_set_bad_image (error, image, "Bad method token 0x%08x (could not find corresponding typedef).", token); return NULL; } + klass = mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | type, error); + if (klass == NULL) + return NULL; } mono_metadata_decode_row (&image->tables [MONO_TABLE_METHOD], idx - 1, cols, 6); @@ -1774,18 +1857,16 @@ mono_get_method_from_token (MonoImage *image, guint32 token, MonoClass *klass, * load_generic_params does a binary search so only call it if the method * is generic. */ - if (*sig & 0x10) + if (*sig & 0x10) { generic_container = mono_metadata_load_generic_params (image, token, container); + g_assert (!mono_loader_get_last_error ()); /* FIXME don't swallow this error. */ + } if (generic_container) { - MonoError error; result->is_generic = TRUE; generic_container->owner.method = result; /*FIXME put this before the image alloc*/ - if (!mono_metadata_load_generic_param_constraints_checked (image, token, generic_container, &error)) { - mono_loader_set_error_from_mono_error (&error); - mono_error_cleanup (&error); /*FIXME don't swallow the error message*/ + if (!mono_metadata_load_generic_param_constraints_checked (image, token, generic_container, error)) return NULL; - } container = generic_container; } @@ -1812,6 +1893,7 @@ mono_get_method_from_token (MonoImage *image, guint32 token, MonoClass *klass, if (generic_container) mono_method_set_generic_container (result, generic_container); + g_assert (!mono_loader_get_last_error ()); return result; } @@ -1824,12 +1906,27 @@ mono_get_method (MonoImage *image, guint32 token, MonoClass *klass) MonoMethod * mono_get_method_full (MonoImage *image, guint32 token, MonoClass *klass, MonoGenericContext *context) +{ + MonoError error; + MonoMethod *result = mono_get_method_checked (image, token, klass, context, &error); + g_assert (!mono_loader_get_last_error ()); + if (!mono_error_ok (&error)) { + mono_loader_set_error_from_mono_error (&error); + mono_error_cleanup (&error); + } + return result; +} + +MonoMethod * +mono_get_method_checked (MonoImage *image, guint32 token, MonoClass *klass, MonoGenericContext *context, MonoError *error) { MonoMethod *result = NULL; gboolean used_context = FALSE; /* We do everything inside the lock to prevent creation races */ + mono_error_init (error); + mono_image_lock (image); if (mono_metadata_token_table (token) == MONO_TABLE_METHOD) { @@ -1847,7 +1944,7 @@ mono_get_method_full (MonoImage *image, guint32 token, MonoClass *klass, return result; - result = mono_get_method_from_token (image, token, klass, context, &used_context); + result = mono_get_method_from_token (image, token, klass, context, &used_context, error); if (!result) return NULL; @@ -1877,22 +1974,26 @@ mono_get_method_full (MonoImage *image, guint32 token, MonoClass *klass, } static MonoMethod * -get_method_constrained (MonoImage *image, MonoMethod *method, MonoClass *constrained_class, MonoGenericContext *context) +get_method_constrained (MonoImage *image, MonoMethod *method, MonoClass *constrained_class, MonoGenericContext *context, MonoError *error) { MonoMethod *result; MonoClass *ic = NULL; MonoGenericContext *method_context = NULL; MonoMethodSignature *sig, *original_sig; + mono_error_init (error); + mono_class_init (constrained_class); - original_sig = sig = mono_method_signature (method); + original_sig = sig = mono_method_signature_checked (method, error); if (sig == NULL) { return NULL; } if (method->is_inflated && sig->generic_param_count) { MonoMethodInflated *imethod = (MonoMethodInflated *) method; - sig = mono_method_signature (imethod->declaring); /*We assume that if the inflated method signature is valid, the declaring method is too*/ + sig = mono_method_signature_checked (imethod->declaring, error); /*We assume that if the inflated method signature is valid, the declaring method is too*/ + if (!sig) + return NULL; method_context = mono_method_get_context (method); original_sig = sig; @@ -1902,47 +2003,42 @@ get_method_constrained (MonoImage *image, MonoMethod *method, MonoClass *constra * any type argument which a concrete type. See #325283. */ if (method_context->class_inst) { - MonoError error; MonoGenericContext ctx; ctx.method_inst = NULL; ctx.class_inst = method_context->class_inst; /*Fixme, property propagate this error*/ - sig = inflate_generic_signature_checked (method->klass->image, sig, &ctx, &error); - if (!mono_error_ok (&error)) { - mono_error_cleanup (&error); + sig = inflate_generic_signature_checked (method->klass->image, sig, &ctx, error); + if (!sig) return NULL; - } } } if ((constrained_class != method->klass) && (MONO_CLASS_IS_INTERFACE (method->klass))) ic = method->klass; - result = find_method (constrained_class, ic, method->name, sig, constrained_class); + result = find_method (constrained_class, ic, method->name, sig, constrained_class, error); if (sig != original_sig) mono_metadata_free_inflated_signature (sig); - if (!result) { - char *m = mono_method_full_name (method, 1); - g_warning ("Missing method %s.%s.%s in assembly %s method %s", method->klass->name_space, - method->klass->name, method->name, image->name, m); - g_free (m); + if (!result) return NULL; - } - if (method_context) - result = mono_class_inflate_generic_method (result, method_context); + if (method_context) { + result = mono_class_inflate_generic_method_checked (result, method_context, error); + if (!result) + return NULL; + } return result; } MonoMethod * mono_get_method_constrained_with_method (MonoImage *image, MonoMethod *method, MonoClass *constrained_class, - MonoGenericContext *context) + MonoGenericContext *context, MonoError *error) { g_assert (method); - return get_method_constrained (image, method, constrained_class, context); + return get_method_constrained (image, method, constrained_class, context, error); } /** @@ -1958,15 +2054,27 @@ MonoMethod * mono_get_method_constrained (MonoImage *image, guint32 token, MonoClass *constrained_class, MonoGenericContext *context, MonoMethod **cil_method) { - MonoMethod *result; + MonoError error; + MonoMethod *result = mono_get_method_constrained_checked (image, token, constrained_class, context, cil_method, &error); - *cil_method = mono_get_method_from_token (image, token, NULL, context, NULL); + g_assert (!mono_loader_get_last_error ()); + if (!mono_error_ok (&error)) { + mono_loader_set_error_from_mono_error (&error); + mono_error_cleanup (&error); + } + return result; +} + +MonoMethod * +mono_get_method_constrained_checked (MonoImage *image, guint32 token, MonoClass *constrained_class, MonoGenericContext *context, MonoMethod **cil_method, MonoError *error) +{ + mono_error_init (error); + + *cil_method = mono_get_method_from_token (image, token, NULL, context, NULL, error); if (!*cil_method) return NULL; - result = get_method_constrained (image, *cil_method, constrained_class, context); - - return result; + return get_method_constrained (image, *cil_method, constrained_class, context, error); } void @@ -2492,11 +2600,9 @@ mono_method_signature_checked (MonoMethod *m, MonoError *error) size = mono_metadata_decode_blob_size (sig, &sig_body); - signature = mono_metadata_parse_method_signature_full (img, container, idx, sig_body, NULL); - if (!signature) { - mono_error_set_from_loader_error (error); + signature = mono_metadata_parse_method_signature_full (img, container, idx, sig_body, NULL, error); + if (!signature) return NULL; - } if (can_cache_signature) { mono_image_lock (img); diff --git a/mta-mono/vendor/mono/metadata/locales.c b/mta-mono/vendor/mono/metadata/locales.c index 7fffad9..a2152bb 100644 --- a/mta-mono/vendor/mono/metadata/locales.c +++ b/mta-mono/vendor/mono/metadata/locales.c @@ -157,52 +157,72 @@ create_names_array_idx_dynamic (const guint16 *names, int ml) return ret; } -void -ves_icall_System_Globalization_CultureInfo_construct_datetime_format (MonoCultureInfo *this) +MonoBoolean +ves_icall_System_Globalization_CalendarData_fill_calendar_data (MonoCalendarData *this, MonoString *name, gint32 calendar_index) { MonoDomain *domain; - MonoDateTimeFormatInfo *datetime; const DateTimeFormatEntry *dfe; + const CultureInfoNameEntry *ne; + const CultureInfoEntry *ci; + char *n; - MONO_ARCH_SAVE_REGS; + n = mono_string_to_utf8 (name); + ne = mono_binary_search (n, culture_name_entries, NUM_CULTURE_ENTRIES, + sizeof (CultureInfoNameEntry), culture_name_locator); + g_free (n); + if (ne == NULL) { + return FALSE; + } - g_assert (this->datetime_index >= 0); - - datetime = this->datetime_format; - dfe = &datetime_format_entries [this->datetime_index]; + ci = &culture_entries [ne->culture_entry_index]; + dfe = &datetime_format_entries [ci->datetime_format_index]; domain = mono_domain_get (); - datetime->readOnly = this->is_read_only; - MONO_OBJECT_SETREF (datetime, AbbreviatedDayNames, create_names_array_idx (dfe->abbreviated_day_names, - NUM_DAYS)); - MONO_OBJECT_SETREF (datetime, AbbreviatedMonthNames, create_names_array_idx (dfe->abbreviated_month_names, - NUM_MONTHS)); - MONO_OBJECT_SETREF (datetime, AMDesignator, mono_string_new (domain, idx2string (dfe->am_designator))); - datetime->CalendarWeekRule = dfe->calendar_week_rule; - MONO_OBJECT_SETREF (datetime, DateSeparator, mono_string_new (domain, idx2string (dfe->date_separator))); - MONO_OBJECT_SETREF (datetime, DayNames, create_names_array_idx (dfe->day_names, NUM_DAYS)); - MONO_OBJECT_SETREF (datetime, ShortestDayNames, create_names_array_idx (dfe->shortest_day_names, NUM_DAYS)); - datetime->FirstDayOfWeek = dfe->first_day_of_week; - MONO_OBJECT_SETREF (datetime, LongDatePattern, mono_string_new (domain, idx2string (dfe->long_date_pattern))); - MONO_OBJECT_SETREF (datetime, LongTimePattern, mono_string_new (domain, idx2string (dfe->long_time_pattern))); - MONO_OBJECT_SETREF (datetime, MonthDayPattern, mono_string_new (domain, idx2string (dfe->month_day_pattern))); - MONO_OBJECT_SETREF (datetime, MonthNames, create_names_array_idx (dfe->month_names, NUM_MONTHS)); - MONO_OBJECT_SETREF (datetime, PMDesignator, mono_string_new (domain, idx2string (dfe->pm_designator))); - MONO_OBJECT_SETREF (datetime, ShortDatePattern, mono_string_new (domain, idx2string (dfe->short_date_pattern))); - MONO_OBJECT_SETREF (datetime, ShortTimePattern, mono_string_new (domain, idx2string (dfe->short_time_pattern))); - MONO_OBJECT_SETREF (datetime, TimeSeparator, mono_string_new (domain, idx2string (dfe->time_separator))); - MONO_OBJECT_SETREF (datetime, YearMonthPattern, mono_string_new (domain, idx2string (dfe->year_month_pattern))); - MONO_OBJECT_SETREF (datetime, ShortDatePatterns, create_names_array_idx_dynamic (dfe->short_date_patterns, + MONO_OBJECT_SETREF (this, NativeName, mono_string_new (domain, idx2string (ci->nativename))); + MONO_OBJECT_SETREF (this, ShortDatePatterns, create_names_array_idx_dynamic (dfe->short_date_patterns, NUM_SHORT_DATE_PATTERNS)); - MONO_OBJECT_SETREF (datetime, LongDatePatterns, create_names_array_idx_dynamic (dfe->long_date_patterns, + MONO_OBJECT_SETREF (this, YearMonthPatterns, create_names_array_idx_dynamic (dfe->year_month_patterns, + NUM_YEAR_MONTH_PATTERNS)); + + MONO_OBJECT_SETREF (this, LongDatePatterns, create_names_array_idx_dynamic (dfe->long_date_patterns, NUM_LONG_DATE_PATTERNS)); - MONO_OBJECT_SETREF (datetime, ShortTimePatterns, create_names_array_idx_dynamic (dfe->short_time_patterns, - NUM_SHORT_TIME_PATTERNS)); - MONO_OBJECT_SETREF (datetime, LongTimePatterns, create_names_array_idx_dynamic (dfe->long_time_patterns, + MONO_OBJECT_SETREF (this, MonthDayPattern, mono_string_new (domain, idx2string (dfe->month_day_pattern))); + + MONO_OBJECT_SETREF (this, DayNames, create_names_array_idx (dfe->day_names, NUM_DAYS)); + MONO_OBJECT_SETREF (this, AbbreviatedDayNames, create_names_array_idx (dfe->abbreviated_day_names, + NUM_DAYS)); + MONO_OBJECT_SETREF (this, SuperShortDayNames, create_names_array_idx (dfe->shortest_day_names, NUM_DAYS)); + MONO_OBJECT_SETREF (this, MonthNames, create_names_array_idx (dfe->month_names, NUM_MONTHS)); + MONO_OBJECT_SETREF (this, AbbreviatedMonthNames, create_names_array_idx (dfe->abbreviated_month_names, + NUM_MONTHS)); + MONO_OBJECT_SETREF (this, GenitiveMonthNames, create_names_array_idx (dfe->month_genitive_names, NUM_MONTHS)); + MONO_OBJECT_SETREF (this, GenitiveAbbreviatedMonthNames, create_names_array_idx (dfe->abbreviated_month_genitive_names, NUM_MONTHS)); + + return TRUE; +} + +void +ves_icall_System_Globalization_CultureData_fill_culture_data (MonoCultureData *this, gint32 datetime_index) +{ + MonoDomain *domain; + const DateTimeFormatEntry *dfe; + + g_assert (datetime_index >= 0); + + dfe = &datetime_format_entries [datetime_index]; + + domain = mono_domain_get (); + + MONO_OBJECT_SETREF (this, AMDesignator, mono_string_new (domain, idx2string (dfe->am_designator))); + MONO_OBJECT_SETREF (this, PMDesignator, mono_string_new (domain, idx2string (dfe->pm_designator))); + MONO_OBJECT_SETREF (this, TimeSeparator, mono_string_new (domain, idx2string (dfe->time_separator))); + MONO_OBJECT_SETREF (this, LongTimePatterns, create_names_array_idx_dynamic (dfe->long_time_patterns, NUM_LONG_TIME_PATTERNS)); - MONO_OBJECT_SETREF (datetime, GenitiveMonthNames, create_names_array_idx (dfe->month_genitive_names, NUM_MONTHS)); - MONO_OBJECT_SETREF (datetime, GenitiveAbbreviatedMonthNames, create_names_array_idx (dfe->abbreviated_month_genitive_names, NUM_MONTHS)); + MONO_OBJECT_SETREF (this, ShortTimePatterns, create_names_array_idx_dynamic (dfe->short_time_patterns, + NUM_SHORT_TIME_PATTERNS)); + this->FirstDayOfWeek = dfe->first_day_of_week; + this->CalendarWeekRule = dfe->calendar_week_rule; } void @@ -212,8 +232,6 @@ ves_icall_System_Globalization_CultureInfo_construct_number_format (MonoCultureI MonoNumberFormatInfo *number; const NumberFormatEntry *nfe; - MONO_ARCH_SAVE_REGS; - g_assert (this->number_format != 0); if (this->number_index < 0) return; @@ -322,8 +340,6 @@ region_info_entry_from_lcid (int lcid) const RegionInfoEntry *entry; const CultureInfoEntry *ne; - MONO_ARCH_SAVE_REGS; - ne = mono_binary_search (&lcid, culture_entries, NUM_CULTURE_ENTRIES, sizeof (CultureInfoEntry), culture_lcid_locator); if (ne == NULL) @@ -473,8 +489,6 @@ ves_icall_System_Globalization_CultureInfo_get_current_locale_name (void) MonoString* ret; MonoDomain *domain; - MONO_ARCH_SAVE_REGS; - locale = get_current_locale_name (); if (locale == NULL) return NULL; @@ -492,8 +506,6 @@ ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid ( { const CultureInfoEntry *ci; - MONO_ARCH_SAVE_REGS; - ci = culture_info_entry_from_lcid (lcid); if(ci == NULL) return FALSE; @@ -508,8 +520,6 @@ ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name ( const CultureInfoNameEntry *ne; char *n; - MONO_ARCH_SAVE_REGS; - n = mono_string_to_utf8 (name); ne = mono_binary_search (n, culture_name_entries, NUM_CULTURE_ENTRIES, sizeof (CultureInfoNameEntry), culture_name_locator); @@ -531,8 +541,6 @@ ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_specif gchar *locale; gboolean ret; - MONO_ARCH_SAVE_REGS; - locale = mono_string_to_utf8 (name); ret = construct_culture_from_specific_name (ci, locale); g_free (locale); @@ -546,8 +554,6 @@ ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_lcid (M { const RegionInfoEntry *ri; - MONO_ARCH_SAVE_REGS; - ri = region_info_entry_from_lcid (lcid); if(ri == NULL) return FALSE; @@ -562,8 +568,6 @@ ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name (M const RegionInfoNameEntry *ne; char *n; - MONO_ARCH_SAVE_REGS; - n = mono_string_to_utf8 (name); ne = mono_binary_search (n, region_name_entries, NUM_REGION_ENTRIES, sizeof (RegionInfoNameEntry), region_name_locator); @@ -590,8 +594,6 @@ ves_icall_System_Globalization_CultureInfo_internal_get_cultures (MonoBoolean ne gint i, len; gboolean is_neutral; - MONO_ARCH_SAVE_REGS; - domain = mono_domain_get (); len = 0; @@ -641,8 +643,6 @@ void ves_icall_System_Globalization_CompareInfo_construct_compareinfo (MonoCompa int ves_icall_System_Globalization_CompareInfo_internal_compare (MonoCompareInfo *this, MonoString *str1, gint32 off1, gint32 len1, MonoString *str2, gint32 off2, gint32 len2, gint32 options) { - MONO_ARCH_SAVE_REGS; - /* Do a normal ascii string compare, as we only know the * invariant locale if we dont have ICU */ @@ -660,8 +660,6 @@ void ves_icall_System_Globalization_CompareInfo_assign_sortkey (MonoCompareInfo MonoArray *arr; gint32 keylen, i; - MONO_ARCH_SAVE_REGS; - keylen=mono_string_length (source); arr=mono_array_new (mono_domain_get (), mono_get_byte_class (), @@ -675,31 +673,23 @@ void ves_icall_System_Globalization_CompareInfo_assign_sortkey (MonoCompareInfo int ves_icall_System_Globalization_CompareInfo_internal_index (MonoCompareInfo *this, MonoString *source, gint32 sindex, gint32 count, MonoString *value, gint32 options, MonoBoolean first) { - MONO_ARCH_SAVE_REGS; - return(string_invariant_indexof (source, sindex, count, value, first)); } int ves_icall_System_Globalization_CompareInfo_internal_index_char (MonoCompareInfo *this, MonoString *source, gint32 sindex, gint32 count, gunichar2 value, gint32 options, MonoBoolean first) { - MONO_ARCH_SAVE_REGS; - return(string_invariant_indexof_char (source, sindex, count, value, first)); } int ves_icall_System_Threading_Thread_current_lcid (void) { - MONO_ARCH_SAVE_REGS; - /* Invariant */ return(0x007F); } MonoString *ves_icall_System_String_InternalReplace_Str_Comp (MonoString *this, MonoString *old, MonoString *new, MonoCompareInfo *comp) { - MONO_ARCH_SAVE_REGS; - /* Do a normal ascii string compare and replace, as we only * know the invariant locale if we dont have ICU */ @@ -944,7 +934,8 @@ void load_normalization_resource (guint8 **argProps, guint8 **argCombiningClass) { #ifdef DISABLE_NORMALIZATION - mono_raise_exception (mono_get_exception_not_supported ("This runtime has been compiled without string normalization support.")); + mono_set_pending_exception (mono_get_exception_not_supported ("This runtime has been compiled without string normalization support.")); + return; #else *argProps = (guint8*)props; *argMappedChars = (guint8*) mappedChars; diff --git a/mta-mono/vendor/mono/metadata/locales.h b/mta-mono/vendor/mono/metadata/locales.h index 26919ea..f87439d 100644 --- a/mta-mono/vendor/mono/metadata/locales.h +++ b/mta-mono/vendor/mono/metadata/locales.h @@ -26,12 +26,13 @@ typedef enum { CompareOptions_Ordinal=0x40000000 } MonoCompareOptions; +extern MonoBoolean ves_icall_System_Globalization_CalendarData_fill_calendar_data (MonoCalendarData *this_obj, MonoString *name, gint32 calendar_index) MONO_INTERNAL; +extern void ves_icall_System_Globalization_CultureData_fill_culture_data (MonoCultureData *this_obj, gint32 datetime_index) MONO_INTERNAL; extern void ves_icall_System_Globalization_CultureInfo_construct_internal_locale (MonoCultureInfo *this_obj, MonoString *locale) MONO_INTERNAL; extern MonoString* ves_icall_System_Globalization_CultureInfo_get_current_locale_name (void) MONO_INTERNAL; extern MonoBoolean ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid (MonoCultureInfo *this_obj, gint lcid) MONO_INTERNAL; extern MonoBoolean ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name (MonoCultureInfo *this_obj, MonoString *name) MONO_INTERNAL; extern MonoArray *ves_icall_System_Globalization_CultureInfo_internal_get_cultures (MonoBoolean neutral, MonoBoolean specific, MonoBoolean installed) MONO_INTERNAL; -extern void ves_icall_System_Globalization_CultureInfo_construct_datetime_format (MonoCultureInfo *this_obj) MONO_INTERNAL; extern void ves_icall_System_Globalization_CultureInfo_construct_number_format (MonoCultureInfo *this_obj) MONO_INTERNAL; extern void ves_icall_System_Globalization_CompareInfo_construct_compareinfo (MonoCompareInfo *comp, MonoString *locale) MONO_INTERNAL; extern int ves_icall_System_Globalization_CompareInfo_internal_compare (MonoCompareInfo *this_obj, MonoString *str1, gint32 off1, gint32 len1, MonoString *str2, gint32 off2, gint32 len2, gint32 options) MONO_INTERNAL; diff --git a/mta-mono/vendor/mono/metadata/lock-tracer.h b/mta-mono/vendor/mono/metadata/lock-tracer.h index 4069e97..4844edb 100644 --- a/mta-mono/vendor/mono/metadata/lock-tracer.h +++ b/mta-mono/vendor/mono/metadata/lock-tracer.h @@ -17,7 +17,9 @@ typedef enum { DomainJitCodeHashLock, IcallLock, AssemblyBindingLock, - MarshalLock + MarshalLock, + ClassesLock, + LoaderGlobalDataLock } RuntimeLocks; #ifdef LOCK_TRACER diff --git a/mta-mono/vendor/mono/metadata/marshal.c b/mta-mono/vendor/mono/metadata/marshal.c index 0c8fe33..0b3265d 100644 --- a/mta-mono/vendor/mono/metadata/marshal.c +++ b/mta-mono/vendor/mono/metadata/marshal.c @@ -36,6 +36,7 @@ #include "mono/metadata/attrdefs.h" #include "mono/metadata/gc-internal.h" #include "mono/metadata/cominterop.h" +#include "mono/metadata/remoting.h" #include "mono/metadata/reflection-internals.h" #include "mono/utils/mono-counters.h" #include "mono/utils/mono-tls.h" @@ -49,28 +50,12 @@ #define OPDEF(a,b,c,d,e,f,g,h,i,j) \ a = i, -typedef enum { - MONO_MARSHAL_NONE, /* No marshalling needed */ - MONO_MARSHAL_COPY, /* Can be copied by value to the new domain */ - MONO_MARSHAL_COPY_OUT, /* out parameter that needs to be copied back to the original instance */ - MONO_MARSHAL_SERIALIZE /* Value needs to be serialized into the new domain */ -} MonoXDomainMarshalType; - enum { #include "mono/cil/opcode.def" LAST = 0xff }; #undef OPDEF -struct _MonoRemotingMethods { - MonoMethod *invoke; - MonoMethod *invoke_with_check; - MonoMethod *xdomain_invoke; - MonoMethod *xdomain_dispatch; -}; - -typedef struct _MonoRemotingMethods MonoRemotingMethods; - /* * This mutex protects the various marshalling related caches in MonoImage * and a few other data structures static to this file. @@ -143,27 +128,6 @@ mono_delegate_begin_invoke (MonoDelegate *delegate, gpointer *params); static MonoObject * mono_delegate_end_invoke (MonoDelegate *delegate, gpointer *params); -static void -mono_marshal_xdomain_copy_out_value (MonoObject *src, MonoObject *dst); - -static gint32 -mono_marshal_set_domain_by_id (gint32 id, MonoBoolean push); - -static gboolean -mono_marshal_check_domain_image (gint32 domain_id, MonoImage *image); - -#ifndef DISABLE_REMOTING -static MonoObject * -mono_remoting_wrapper (MonoMethod *method, gpointer *params); - -MONO_API void -mono_upgrade_remote_class_wrapper (MonoReflectionType *rtype, MonoTransparentProxy *tproxy); - -#endif - -static MonoReflectionType * -type_from_handle (MonoType *handle); - static void mono_marshal_set_last_error_windows (int error); @@ -274,22 +238,14 @@ mono_marshal_init (void) register_icall (mono_struct_delete_old, "mono_struct_delete_old", "void ptr ptr", FALSE); register_icall (mono_delegate_begin_invoke, "mono_delegate_begin_invoke", "object object ptr", FALSE); register_icall (mono_delegate_end_invoke, "mono_delegate_end_invoke", "object object ptr", FALSE); - register_icall (mono_marshal_xdomain_copy_value, "mono_marshal_xdomain_copy_value", "object object", FALSE); - register_icall (mono_marshal_xdomain_copy_out_value, "mono_marshal_xdomain_copy_out_value", "void object object", FALSE); - register_icall (mono_marshal_set_domain_by_id, "mono_marshal_set_domain_by_id", "int32 int32 int32", FALSE); - register_icall (mono_marshal_check_domain_image, "mono_marshal_check_domain_image", "int32 int32 ptr", FALSE); register_icall (mono_compile_method, "mono_compile_method", "ptr ptr", FALSE); register_icall (mono_context_get, "mono_context_get", "object", FALSE); register_icall (mono_context_set, "mono_context_set", "void object", FALSE); - register_icall (type_from_handle, "type_from_handle", "object ptr", FALSE); register_icall (mono_gc_wbarrier_generic_nostore, "wb_generic", "void ptr", FALSE); register_icall (mono_gchandle_get_target, "mono_gchandle_get_target", "object int32", TRUE); -#ifndef DISABLE_REMOTING - register_icall (mono_remoting_wrapper, "mono_remoting_wrapper", "object ptr ptr", FALSE); - register_icall (mono_upgrade_remote_class_wrapper, "mono_upgrade_remote_class_wrapper", "void object object", FALSE); -#endif mono_cominterop_init (); + mono_remoting_init (); } } @@ -304,42 +260,17 @@ mono_marshal_cleanup (void) marshal_mutex_initialized = FALSE; } -#ifndef DISABLE_REMOTING -static MonoClass *byte_array_class; -static MonoMethod *method_rs_serialize, *method_rs_deserialize, *method_exc_fixexc, *method_rs_appdomain_target; -static MonoMethod *method_set_call_context, *method_needs_context_sink, *method_rs_serialize_exc; - -static void -mono_remoting_marshal_init (void) +void +mono_marshal_lock_internal (void) { - MonoClass *klass; - - static gboolean module_initialized = FALSE; - - if (!module_initialized) { - klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.Remoting", "RemotingServices"); - method_rs_serialize = mono_class_get_method_from_name (klass, "SerializeCallData", -1); - method_rs_deserialize = mono_class_get_method_from_name (klass, "DeserializeCallData", -1); - method_rs_serialize_exc = mono_class_get_method_from_name (klass, "SerializeExceptionData", -1); - - klass = mono_defaults.real_proxy_class; - method_rs_appdomain_target = mono_class_get_method_from_name (klass, "GetAppDomainTarget", -1); - - klass = mono_defaults.exception_class; - method_exc_fixexc = mono_class_get_method_from_name (klass, "FixRemotingException", -1); - - byte_array_class = mono_array_class_get (mono_defaults.byte_class, 1); - - klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.Remoting.Messaging", "CallContext"); - method_set_call_context = mono_class_get_method_from_name (klass, "SetCurrentCallContext", -1); - - klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.Remoting.Contexts", "Context"); - method_needs_context_sink = mono_class_get_method_from_name (klass, "get_NeedsContextSink", -1); - - module_initialized = TRUE; - } + mono_marshal_lock (); +} + +void +mono_marshal_unlock_internal (void) +{ + mono_marshal_unlock (); } -#endif gpointer mono_delegate_to_ftnptr (MonoDelegate *delegate) @@ -700,7 +631,7 @@ mono_free_lparray (MonoArray *array, gpointer* nativeArray) switch (klass->element_class->byval_arg.type) { case MONO_TYPE_CLASS: for(i = 0; i < array->max_length; ++i) - mono_marshal_free_ccw(nativeArray[i]); + mono_marshal_free_ccw (mono_array_get (array, MonoObject*, i)); free(nativeArray); break; } @@ -1082,57 +1013,6 @@ mono_string_new_len_wrapper (const char *text, guint length) } #ifndef DISABLE_JIT -#ifndef DISABLE_REMOTING -static int -mono_mb_emit_proxy_check (MonoMethodBuilder *mb, int branch_code) -{ - int pos; - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoObject, vtable)); - mono_mb_emit_byte (mb, CEE_LDIND_I); - mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoVTable, klass)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_LDIND_I); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_CLASSCONST); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_defaults.transparent_proxy_class)); - pos = mono_mb_emit_branch (mb, branch_code); - return pos; -} - -static int -mono_mb_emit_xdomain_check (MonoMethodBuilder *mb, int branch_code) -{ - int pos; - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp)); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, target_domain_id)); - mono_mb_emit_byte (mb, CEE_LDIND_I4); - mono_mb_emit_icon (mb, -1); - pos = mono_mb_emit_branch (mb, branch_code); - return pos; -} - -static int -mono_mb_emit_contextbound_check (MonoMethodBuilder *mb, int branch_code) -{ - static int offset = -1; - static guint8 mask; - - if (offset < 0) - mono_marshal_find_bitfield_offset (MonoClass, contextbound, &offset, &mask); - - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, remote_class)); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRemoteClass, proxy_class)); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_ldflda (mb, offset); - mono_mb_emit_byte (mb, CEE_LDIND_U1); - mono_mb_emit_icon (mb, mask); - mono_mb_emit_byte (mb, CEE_AND); - mono_mb_emit_icon (mb, 0); - return mono_mb_emit_branch (mb, branch_code); -} -#endif /* DISABLE_REMOTING */ /* * mono_mb_emit_exception_marshal_directive: @@ -2130,7 +2010,7 @@ emit_struct_free (MonoMethodBuilder *mb, MonoClass *klass, int struct_var) static void emit_thread_interrupt_checkpoint_call (MonoMethodBuilder *mb, gpointer checkpoint_func) { - int pos_noabort; + int pos_noabort, pos_noex; mono_mb_emit_ptr (mb, (gpointer) mono_thread_interruption_request_flag ()); mono_mb_emit_byte (mb, CEE_LDIND_U4); @@ -2140,6 +2020,12 @@ emit_thread_interrupt_checkpoint_call (MonoMethodBuilder *mb, gpointer checkpoin mono_mb_emit_byte (mb, CEE_MONO_NOT_TAKEN); mono_mb_emit_icall (mb, checkpoint_func); + /* Throw the exception returned by the checkpoint function, if any */ + mono_mb_emit_byte (mb, CEE_DUP); + pos_noex = mono_mb_emit_branch (mb, CEE_BRFALSE); + mono_mb_emit_byte (mb, CEE_THROW); + mono_mb_patch_branch (mb, pos_noex); + mono_mb_emit_byte (mb, CEE_POP); mono_mb_patch_branch (mb, pos_noabort); } @@ -2156,7 +2042,7 @@ emit_thread_interrupt_checkpoint (MonoMethodBuilder *mb) static void emit_thread_force_interrupt_checkpoint (MonoMethodBuilder *mb) { - emit_thread_interrupt_checkpoint_call (mb, mono_thread_force_interruption_checkpoint); + emit_thread_interrupt_checkpoint_call (mb, mono_thread_force_interruption_checkpoint_noraise); } void @@ -2165,6 +2051,12 @@ mono_marshal_emit_thread_interrupt_checkpoint (MonoMethodBuilder *mb) emit_thread_interrupt_checkpoint (mb); } +void +mono_marshal_emit_thread_force_interrupt_checkpoint (MonoMethodBuilder *mb) +{ + emit_thread_force_interrupt_checkpoint (mb); +} + #endif /* DISABLE_JIT */ static MonoAsyncResult * @@ -2229,7 +2121,7 @@ mono_delegate_begin_invoke (MonoDelegate *delegate, gpointer *params) #ifndef DISABLE_JIT -static int +int mono_mb_emit_save_args (MonoMethodBuilder *mb, MonoMethodSignature *sig, gboolean save_this) { int i, params_var, tmp_var; @@ -2475,22 +2367,6 @@ get_cache (GHashTable **var, GHashFunc hash_func, GCompareFunc equal_func) return *var; } -static GHashTable* -get_cache_full (GHashTable **var, GHashFunc hash_func, GCompareFunc equal_func, GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func) -{ - if (!(*var)) { - mono_marshal_lock (); - if (!(*var)) { - GHashTable *cache = - g_hash_table_new_full (hash_func, equal_func, key_destroy_func, value_destroy_func); - mono_memory_barrier (); - *var = cache; - } - mono_marshal_unlock (); - } - return *var; -} - GHashTable* mono_marshal_get_cache (GHashTable **var, GHashFunc hash_func, GCompareFunc equal_func) { @@ -2513,7 +2389,7 @@ mono_marshal_find_in_cache (GHashTable *cache, gpointer key) * * Create a MonoMethod from MB, set INFO as wrapper info. */ -static MonoMethod* +MonoMethod* mono_mb_create (MonoMethodBuilder *mb, MonoMethodSignature *sig, int max_stack, WrapperInfo *info) { @@ -2526,7 +2402,7 @@ mono_mb_create (MonoMethodBuilder *mb, MonoMethodSignature *sig, } /* Create the method from the builder and place it in the cache */ -static MonoMethod* +MonoMethod* mono_mb_create_and_cache_full (GHashTable *cache, gpointer key, MonoMethodBuilder *mb, MonoMethodSignature *sig, int max_stack, WrapperInfo *info, gboolean *out_found) @@ -2571,78 +2447,6 @@ mono_mb_create_and_cache (GHashTable *cache, gpointer key, return mono_mb_create_and_cache_full (cache, key, mb, sig, max_stack, NULL, NULL); } -static inline MonoMethod* -mono_marshal_remoting_find_in_cache (MonoMethod *method, int wrapper_type) -{ - MonoMethod *res = NULL; - MonoRemotingMethods *wrps; - - mono_marshal_lock (); - if (method->klass->image->remoting_invoke_cache) - wrps = g_hash_table_lookup (method->klass->image->remoting_invoke_cache, method); - else - wrps = NULL; - - if (wrps) { - switch (wrapper_type) { - case MONO_WRAPPER_REMOTING_INVOKE: res = wrps->invoke; break; - case MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK: res = wrps->invoke_with_check; break; - case MONO_WRAPPER_XDOMAIN_INVOKE: res = wrps->xdomain_invoke; break; - case MONO_WRAPPER_XDOMAIN_DISPATCH: res = wrps->xdomain_dispatch; break; - } - } - - /* it is important to do the unlock after the load from wrps, since in - * mono_remoting_mb_create_and_cache () we drop the marshal lock to be able - * to take the loader lock and some other thread may set the fields. - */ - mono_marshal_unlock (); - return res; -} - -/* Create the method from the builder and place it in the cache */ -static inline MonoMethod* -mono_remoting_mb_create_and_cache (MonoMethod *key, MonoMethodBuilder *mb, - MonoMethodSignature *sig, int max_stack) -{ - MonoMethod **res = NULL; - MonoRemotingMethods *wrps; - GHashTable *cache = get_cache_full (&key->klass->image->remoting_invoke_cache, mono_aligned_addr_hash, NULL, NULL, g_free); - - mono_marshal_lock (); - wrps = g_hash_table_lookup (cache, key); - if (!wrps) { - wrps = g_new0 (MonoRemotingMethods, 1); - g_hash_table_insert (cache, key, wrps); - } - - switch (mb->method->wrapper_type) { - case MONO_WRAPPER_REMOTING_INVOKE: res = &wrps->invoke; break; - case MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK: res = &wrps->invoke_with_check; break; - case MONO_WRAPPER_XDOMAIN_INVOKE: res = &wrps->xdomain_invoke; break; - case MONO_WRAPPER_XDOMAIN_DISPATCH: res = &wrps->xdomain_dispatch; break; - default: g_assert_not_reached (); break; - } - mono_marshal_unlock (); - - if (*res == NULL) { - MonoMethod *newm; - newm = mono_mb_create_method (mb, sig, max_stack); - - mono_marshal_lock (); - if (!*res) { - *res = newm; - mono_marshal_set_wrapper_info (*res, key); - mono_marshal_unlock (); - } else { - mono_marshal_unlock (); - mono_free_method (newm); - } - } - - return *res; -} - MonoMethod * mono_marshal_method_from_wrapper (MonoMethod *wrapper) { @@ -2662,14 +2466,18 @@ mono_marshal_method_from_wrapper (MonoMethod *wrapper) res = mono_marshal_get_wrapper_info (wrapper); if (res == NULL) return wrapper; - if (wrapper->is_inflated) + if (wrapper->is_inflated) { + MonoError error; + MonoMethod *result; /* * A method cannot be inflated and a wrapper at the same time, so the wrapper info * contains an uninflated method. */ - return mono_class_inflate_generic_method (res, mono_method_get_context (wrapper)); - else - return res; + result = mono_class_inflate_generic_method_checked (res, mono_method_get_context (wrapper), &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + return result; + } + return res; case MONO_WRAPPER_MANAGED_TO_NATIVE: info = mono_marshal_get_wrapper_info (wrapper); if (info && (info->subtype == WRAPPER_SUBTYPE_NONE || info->subtype == WRAPPER_SUBTYPE_NATIVE_FUNC_AOT || info->subtype == WRAPPER_SUBTYPE_PINVOKE)) @@ -2721,7 +2529,7 @@ mono_marshal_set_wrapper_info (MonoMethod *method, gpointer data) datav [1] = data; } -static WrapperInfo* +WrapperInfo* mono_wrapper_info_create (MonoMethodBuilder *mb, WrapperSubtype subtype) { WrapperInfo *info; @@ -2802,7 +2610,9 @@ check_generic_wrapper_cache (GHashTable *cache, MonoMethod *orig_method, gpointe */ def = mono_marshal_find_in_cache (cache, def_key); if (def) { - inst = mono_class_inflate_generic_method (def, ctx); + MonoError error; + inst = mono_class_inflate_generic_method_checked (def, ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ /* Cache it */ mono_memory_barrier (); mono_marshal_lock (); @@ -2820,12 +2630,14 @@ check_generic_wrapper_cache (GHashTable *cache, MonoMethod *orig_method, gpointe static MonoMethod* cache_generic_wrapper (GHashTable *cache, MonoMethod *orig_method, MonoMethod *def, MonoGenericContext *ctx, gpointer key) { + MonoError error; MonoMethod *inst, *res; /* * We use the same cache for the generic definition and the instances. */ - inst = mono_class_inflate_generic_method (def, ctx); + inst = mono_class_inflate_generic_method_checked (def, ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ mono_memory_barrier (); mono_marshal_lock (); res = g_hash_table_lookup (cache, key); @@ -2840,6 +2652,7 @@ cache_generic_wrapper (GHashTable *cache, MonoMethod *orig_method, MonoMethod *d static MonoMethod* check_generic_delegate_wrapper_cache (GHashTable *cache, MonoMethod *orig_method, MonoMethod *def_method, MonoGenericContext *ctx) { + MonoError error; MonoMethod *res; MonoMethod *inst, *def; @@ -2855,7 +2668,9 @@ check_generic_delegate_wrapper_cache (GHashTable *cache, MonoMethod *orig_method */ def = mono_marshal_find_in_cache (cache, def_method->klass); if (def) { - inst = mono_class_inflate_generic_method (def, ctx); + inst = mono_class_inflate_generic_method_checked (def, ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + /* Cache it */ mono_memory_barrier (); mono_marshal_lock (); @@ -2873,12 +2688,15 @@ check_generic_delegate_wrapper_cache (GHashTable *cache, MonoMethod *orig_method static MonoMethod* cache_generic_delegate_wrapper (GHashTable *cache, MonoMethod *orig_method, MonoMethod *def, MonoGenericContext *ctx) { + MonoError error; MonoMethod *inst, *res; /* * We use the same cache for the generic definition and the instances. */ - inst = mono_class_inflate_generic_method (def, ctx); + inst = mono_class_inflate_generic_method_checked (def, ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + mono_memory_barrier (); mono_marshal_lock (); res = g_hash_table_lookup (cache, orig_method->klass); @@ -3037,7 +2855,7 @@ mono_delegate_end_invoke (MonoDelegate *delegate, gpointer *params) #ifndef DISABLE_JIT -static void +void mono_mb_emit_restore_result (MonoMethodBuilder *mb, MonoType *return_type) { MonoType *t = mono_type_get_underlying_type (return_type); @@ -3178,1064 +2996,37 @@ mono_marshal_get_delegate_end_invoke (MonoMethod *method) return res; } -#ifndef DISABLE_REMOTING - -static MonoObject * -mono_remoting_wrapper (MonoMethod *method, gpointer *params) -{ - MonoMethodMessage *msg; - MonoTransparentProxy *this; - MonoObject *res, *exc; - MonoArray *out_args; - - this = *((MonoTransparentProxy **)params [0]); - - g_assert (this); - g_assert (((MonoObject *)this)->vtable->klass == mono_defaults.transparent_proxy_class); - - /* skip the this pointer */ - params++; - - if (mono_class_is_contextbound (this->remote_class->proxy_class) && this->rp->context == (MonoObject *) mono_context_get ()) - { - int i; - MonoMethodSignature *sig = mono_method_signature (method); - int count = sig->param_count; - gpointer* mparams = (gpointer*) alloca(count*sizeof(gpointer)); - - for (i=0; iparams [i]); - if (class->valuetype) { - if (sig->params [i]->byref) { - mparams[i] = *((gpointer *)params [i]); - } else { - /* runtime_invoke expects a boxed instance */ - if (mono_class_is_nullable (mono_class_from_mono_type (sig->params [i]))) - mparams[i] = mono_nullable_box (params [i], class); - else - mparams[i] = params [i]; - } - } else { - mparams[i] = *((gpointer**)params [i]); - } - } - - return mono_runtime_invoke (method, method->klass->valuetype? mono_object_unbox ((MonoObject*)this): this, mparams, NULL); - } - - msg = mono_method_call_message_new (method, params, NULL, NULL, NULL); - - res = mono_remoting_invoke ((MonoObject *)this->rp, msg, &exc, &out_args); - - if (exc) - mono_raise_exception ((MonoException *)exc); - - mono_method_return_message_restore (method, params, out_args); - - return res; -} - -MonoMethod * -mono_marshal_get_remoting_invoke (MonoMethod *method) -{ - MonoMethodSignature *sig; - MonoMethodBuilder *mb; - MonoMethod *res; - int params_var; - - g_assert (method); - - if (method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE || method->wrapper_type == MONO_WRAPPER_XDOMAIN_INVOKE) - return method; - - /* this seems to be the best plase to put this, as all remoting invokes seem to get filtered through here */ -#ifndef DISABLE_COM - if (mono_class_is_com_object (method->klass) || method->klass == mono_class_get_com_object_class ()) { - MonoVTable *vtable = mono_class_vtable (mono_domain_get (), method->klass); - g_assert (vtable); /*FIXME do proper error handling*/ - - if (!mono_vtable_is_remote (vtable)) { - return mono_cominterop_get_invoke (method); - } - } -#endif - - sig = mono_signature_no_pinvoke (method); - - /* we cant remote methods without this pointer */ - if (!sig->hasthis) - return method; - - if ((res = mono_marshal_remoting_find_in_cache (method, MONO_WRAPPER_REMOTING_INVOKE))) - return res; - - mb = mono_mb_new (method->klass, method->name, MONO_WRAPPER_REMOTING_INVOKE); - -#ifndef DISABLE_JIT - mb->method->save_lmf = 1; - - params_var = mono_mb_emit_save_args (mb, sig, TRUE); - - mono_mb_emit_ptr (mb, method); - mono_mb_emit_ldloc (mb, params_var); - mono_mb_emit_icall (mb, mono_remoting_wrapper); - emit_thread_interrupt_checkpoint (mb); - - if (sig->ret->type == MONO_TYPE_VOID) { - mono_mb_emit_byte (mb, CEE_POP); - mono_mb_emit_byte (mb, CEE_RET); - } else { - mono_mb_emit_restore_result (mb, sig->ret); - } -#endif - - res = mono_remoting_mb_create_and_cache (method, mb, sig, sig->param_count + 16); - mono_mb_free (mb); - - return res; -} - -#endif /* DISABLE_REMOTING */ - - -/* mono_get_xdomain_marshal_type() - * Returns the kind of marshalling that a type needs for cross domain calls. - */ -static MonoXDomainMarshalType -mono_get_xdomain_marshal_type (MonoType *t) -{ - switch (t->type) { - case MONO_TYPE_VOID: - g_assert_not_reached (); - break; - case MONO_TYPE_U1: - case MONO_TYPE_I1: - case MONO_TYPE_BOOLEAN: - case MONO_TYPE_U2: - case MONO_TYPE_I2: - case MONO_TYPE_CHAR: - case MONO_TYPE_U4: - case MONO_TYPE_I4: - case MONO_TYPE_I8: - case MONO_TYPE_U8: - case MONO_TYPE_R4: - case MONO_TYPE_R8: - return MONO_MARSHAL_NONE; - case MONO_TYPE_STRING: - return MONO_MARSHAL_COPY; - case MONO_TYPE_ARRAY: - case MONO_TYPE_SZARRAY: { - MonoClass *elem_class = mono_class_from_mono_type (t)->element_class; - if (mono_get_xdomain_marshal_type (&(elem_class->byval_arg)) != MONO_MARSHAL_SERIALIZE) - return MONO_MARSHAL_COPY; - break; - } - } - - return MONO_MARSHAL_SERIALIZE; -} - - -/* mono_marshal_xdomain_copy_value - * Makes a copy of "val" suitable for the current domain. - */ -MonoObject * -mono_marshal_xdomain_copy_value (MonoObject *val) -{ - MonoDomain *domain; - if (val == NULL) return NULL; - - domain = mono_domain_get (); - - switch (mono_object_class (val)->byval_arg.type) { - case MONO_TYPE_VOID: - g_assert_not_reached (); - break; - case MONO_TYPE_U1: - case MONO_TYPE_I1: - case MONO_TYPE_BOOLEAN: - case MONO_TYPE_U2: - case MONO_TYPE_I2: - case MONO_TYPE_CHAR: - case MONO_TYPE_U4: - case MONO_TYPE_I4: - case MONO_TYPE_I8: - case MONO_TYPE_U8: - case MONO_TYPE_R4: - case MONO_TYPE_R8: { - return mono_value_box (domain, mono_object_class (val), ((char*)val) + sizeof(MonoObject)); - } - case MONO_TYPE_STRING: { - MonoString *str = (MonoString *) val; - return (MonoObject *) mono_string_new_utf16 (domain, mono_string_chars (str), mono_string_length (str)); - } - case MONO_TYPE_ARRAY: - case MONO_TYPE_SZARRAY: { - MonoArray *acopy; - MonoXDomainMarshalType mt = mono_get_xdomain_marshal_type (&(mono_object_class (val)->element_class->byval_arg)); - if (mt == MONO_MARSHAL_SERIALIZE) return NULL; - acopy = mono_array_clone_in_domain (domain, (MonoArray *) val); - if (mt == MONO_MARSHAL_COPY) { - int i, len = mono_array_length (acopy); - for (i = 0; i < len; i++) { - MonoObject *item = mono_array_get (acopy, gpointer, i); - mono_array_setref (acopy, i, mono_marshal_xdomain_copy_value (item)); - } - } - return (MonoObject *) acopy; - } - } - - if (mono_object_class (val) == mono_defaults.stringbuilder_class) { - MonoStringBuilder *oldsb = (MonoStringBuilder *) val; - MonoStringBuilder *newsb = (MonoStringBuilder *) mono_object_new (domain, mono_defaults.stringbuilder_class); - MONO_OBJECT_SETREF (newsb, str, mono_string_new_utf16 (domain, mono_string_chars (oldsb->str), mono_string_length (oldsb->str))); - newsb->length = oldsb->length; - newsb->max_capacity = (gint32)0x7fffffff; - return (MonoObject *) newsb; - } - return NULL; -} - -/* mono_marshal_xdomain_copy_out_value() - * Copies the contents of the src instance into the dst instance. src and dst - * must have the same type, and if they are arrays, the same size. - */ -static void -mono_marshal_xdomain_copy_out_value (MonoObject *src, MonoObject *dst) -{ - if (src == NULL || dst == NULL) return; - - g_assert (mono_object_class (src) == mono_object_class (dst)); - - switch (mono_object_class (src)->byval_arg.type) { - case MONO_TYPE_ARRAY: - case MONO_TYPE_SZARRAY: { - int mt = mono_get_xdomain_marshal_type (&(mono_object_class (src)->element_class->byval_arg)); - if (mt == MONO_MARSHAL_SERIALIZE) return; - if (mt == MONO_MARSHAL_COPY) { - int i, len = mono_array_length ((MonoArray *)dst); - for (i = 0; i < len; i++) { - MonoObject *item = mono_array_get ((MonoArray *)src, gpointer, i); - mono_array_setref ((MonoArray *)dst, i, mono_marshal_xdomain_copy_value (item)); - } - } else { - mono_array_full_copy ((MonoArray *)src, (MonoArray *)dst); - } - return; - } - } - - if (mono_object_class (src) == mono_defaults.stringbuilder_class) { - MonoStringBuilder *src_sb = (MonoStringBuilder *) src; - MonoStringBuilder *dst_sb = (MonoStringBuilder *) dst; - - MONO_OBJECT_SETREF (dst_sb, str, mono_string_new_utf16 (mono_object_domain (dst), mono_string_chars (src_sb->str), mono_string_length (src_sb->str))); - dst_sb->cached_str = NULL; - dst_sb->length = src_sb->length; - } -} - - -#if !(defined (DISABLE_JIT) || defined (DISABLE_REMOTING)) - -static void -mono_marshal_emit_xdomain_copy_value (MonoMethodBuilder *mb, MonoClass *pclass) -{ - mono_mb_emit_icall (mb, mono_marshal_xdomain_copy_value); - mono_mb_emit_op (mb, CEE_CASTCLASS, pclass); -} - -static void -mono_marshal_emit_xdomain_copy_out_value (MonoMethodBuilder *mb, MonoClass *pclass) -{ - mono_mb_emit_icall (mb, mono_marshal_xdomain_copy_out_value); -} -#endif - -#ifndef DISABLE_REMOTING -/* mono_marshal_supports_fast_xdomain() - * Returns TRUE if the method can use the fast xdomain wrapper. - */ -static gboolean -mono_marshal_supports_fast_xdomain (MonoMethod *method) -{ - return !mono_class_is_contextbound (method->klass) && - !((method->flags & METHOD_ATTRIBUTE_SPECIAL_NAME) && (strcmp (".ctor", method->name) == 0)); -} -#endif - -static gint32 -mono_marshal_set_domain_by_id (gint32 id, MonoBoolean push) -{ - MonoDomain *current_domain = mono_domain_get (); - MonoDomain *domain = mono_domain_get_by_id (id); - - if (!domain || !mono_domain_set (domain, FALSE)) - mono_raise_exception (mono_get_exception_appdomain_unloaded ()); - - if (push) - mono_thread_push_appdomain_ref (domain); - else - mono_thread_pop_appdomain_ref (); - - return current_domain->domain_id; -} - -#if !(defined (DISABLE_JIT) || defined (DISABLE_REMOTING)) -static void -mono_marshal_emit_switch_domain (MonoMethodBuilder *mb) -{ - mono_mb_emit_icall (mb, mono_marshal_set_domain_by_id); -} - -/* mono_marshal_emit_load_domain_method () - * Loads into the stack a pointer to the code of the provided method for - * the current domain. - */ -static void -mono_marshal_emit_load_domain_method (MonoMethodBuilder *mb, MonoMethod *method) -{ - /* We need a pointer to the method for the running domain (not the domain - * that compiles the method). - */ - mono_mb_emit_ptr (mb, method); - mono_mb_emit_icall (mb, mono_compile_method); -} -#endif - -/* mono_marshal_check_domain_image () - * Returns TRUE if the image is loaded in the specified - * application domain. - */ -static gboolean -mono_marshal_check_domain_image (gint32 domain_id, MonoImage *image) -{ - MonoAssembly* ass; - GSList *tmp; - - MonoDomain *domain = mono_domain_get_by_id (domain_id); - if (!domain) - return FALSE; - - mono_domain_assemblies_lock (domain); - for (tmp = domain->domain_assemblies; tmp; tmp = tmp->next) { - ass = tmp->data; - if (ass->image == image) - break; - } - mono_domain_assemblies_unlock (domain); - - return tmp != NULL; -} - -#ifndef DISABLE_REMOTING - -/* mono_marshal_get_xappdomain_dispatch () - * Generates a method that dispatches a method call from another domain into - * the current domain. - */ -static MonoMethod * -mono_marshal_get_xappdomain_dispatch (MonoMethod *method, int *marshal_types, int complex_count, int complex_out_count, int ret_marshal_type) -{ - MonoMethodSignature *sig, *csig; - MonoMethodBuilder *mb; - MonoMethod *res; - int i, j, param_index, copy_locals_base; - MonoClass *ret_class = NULL; - int loc_array=0, loc_return=0, loc_serialized_exc=0; - MonoExceptionClause *main_clause; - int pos, pos_leave; - gboolean copy_return; - - if ((res = mono_marshal_remoting_find_in_cache (method, MONO_WRAPPER_XDOMAIN_DISPATCH))) - return res; - - sig = mono_method_signature (method); - copy_return = (sig->ret->type != MONO_TYPE_VOID && ret_marshal_type != MONO_MARSHAL_SERIALIZE); - - j = 0; - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 3 + sig->param_count - complex_count); - csig->params [j++] = &mono_defaults.object_class->byval_arg; - csig->params [j++] = &byte_array_class->this_arg; - csig->params [j++] = &byte_array_class->this_arg; - for (i = 0; i < sig->param_count; i++) { - if (marshal_types [i] != MONO_MARSHAL_SERIALIZE) - csig->params [j++] = sig->params [i]; - } - if (copy_return) - csig->ret = sig->ret; - else - csig->ret = &mono_defaults.void_class->byval_arg; - csig->pinvoke = 1; - csig->hasthis = FALSE; - - mb = mono_mb_new (method->klass, method->name, MONO_WRAPPER_XDOMAIN_DISPATCH); - mb->method->save_lmf = 1; - -#ifndef DISABLE_JIT - /* Locals */ - - loc_serialized_exc = mono_mb_add_local (mb, &byte_array_class->byval_arg); - if (complex_count > 0) - loc_array = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg); - if (sig->ret->type != MONO_TYPE_VOID) { - loc_return = mono_mb_add_local (mb, sig->ret); - ret_class = mono_class_from_mono_type (sig->ret); - } - - /* try */ - - main_clause = mono_image_alloc0 (method->klass->image, sizeof (MonoExceptionClause)); - main_clause->try_offset = mono_mb_get_label (mb); - - /* Clean the call context */ - - mono_mb_emit_byte (mb, CEE_LDNULL); - mono_mb_emit_managed_call (mb, method_set_call_context, NULL); - mono_mb_emit_byte (mb, CEE_POP); - - /* Deserialize call data */ - - mono_mb_emit_ldarg (mb, 1); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_byte (mb, CEE_DUP); - pos = mono_mb_emit_short_branch (mb, CEE_BRFALSE_S); - - mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); - mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); - - if (complex_count > 0) - mono_mb_emit_stloc (mb, loc_array); - else - mono_mb_emit_byte (mb, CEE_POP); - - mono_mb_patch_short_branch (mb, pos); - - /* Get the target object */ - - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_managed_call (mb, method_rs_appdomain_target, NULL); - - /* Load the arguments */ - - copy_locals_base = mb->locals; - param_index = 3; // Index of the first non-serialized parameter of this wrapper - j = 0; - for (i = 0; i < sig->param_count; i++) { - MonoType *pt = sig->params [i]; - MonoClass *pclass = mono_class_from_mono_type (pt); - switch (marshal_types [i]) { - case MONO_MARSHAL_SERIALIZE: { - /* take the value from the serialized array */ - mono_mb_emit_ldloc (mb, loc_array); - mono_mb_emit_icon (mb, j++); - if (pt->byref) { - if (pclass->valuetype) { - mono_mb_emit_byte (mb, CEE_LDELEM_REF); - mono_mb_emit_op (mb, CEE_UNBOX, pclass); - } else { - mono_mb_emit_op (mb, CEE_LDELEMA, pclass); - } - } else { - if (pclass->valuetype) { - mono_mb_emit_byte (mb, CEE_LDELEM_REF); - mono_mb_emit_op (mb, CEE_UNBOX, pclass); - mono_mb_emit_op (mb, CEE_LDOBJ, pclass); - } else { - mono_mb_emit_byte (mb, CEE_LDELEM_REF); - if (pclass != mono_defaults.object_class) { - mono_mb_emit_op (mb, CEE_CASTCLASS, pclass); - } - } - } - break; - } - case MONO_MARSHAL_COPY_OUT: { - /* Keep a local copy of the value since we need to copy it back after the call */ - int copy_local = mono_mb_add_local (mb, &(pclass->byval_arg)); - mono_mb_emit_ldarg (mb, param_index++); - mono_marshal_emit_xdomain_copy_value (mb, pclass); - mono_mb_emit_byte (mb, CEE_DUP); - mono_mb_emit_stloc (mb, copy_local); - break; - } - case MONO_MARSHAL_COPY: { - mono_mb_emit_ldarg (mb, param_index); - if (pt->byref) { - mono_mb_emit_byte (mb, CEE_DUP); - mono_mb_emit_byte (mb, CEE_DUP); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_marshal_emit_xdomain_copy_value (mb, pclass); - mono_mb_emit_byte (mb, CEE_STIND_REF); - } else { - mono_marshal_emit_xdomain_copy_value (mb, pclass); - } - param_index++; - break; - } - case MONO_MARSHAL_NONE: - mono_mb_emit_ldarg (mb, param_index++); - break; - } - } - - /* Make the call to the real object */ - - emit_thread_force_interrupt_checkpoint (mb); - - mono_mb_emit_op (mb, CEE_CALLVIRT, method); - - if (sig->ret->type != MONO_TYPE_VOID) - mono_mb_emit_stloc (mb, loc_return); - - /* copy back MONO_MARSHAL_COPY_OUT parameters */ - - j = 0; - param_index = 3; - for (i = 0; i < sig->param_count; i++) { - if (marshal_types [i] == MONO_MARSHAL_SERIALIZE) continue; - if (marshal_types [i] == MONO_MARSHAL_COPY_OUT) { - mono_mb_emit_ldloc (mb, copy_locals_base + (j++)); - mono_mb_emit_ldarg (mb, param_index); - mono_marshal_emit_xdomain_copy_out_value (mb, mono_class_from_mono_type (sig->params [i])); - } - param_index++; - } - - /* Serialize the return values */ - - if (complex_out_count > 0) { - /* Reset parameters in the array that don't need to be serialized back */ - j = 0; - for (i = 0; i < sig->param_count; i++) { - if (marshal_types[i] != MONO_MARSHAL_SERIALIZE) continue; - if (!sig->params [i]->byref) { - mono_mb_emit_ldloc (mb, loc_array); - mono_mb_emit_icon (mb, j); - mono_mb_emit_byte (mb, CEE_LDNULL); - mono_mb_emit_byte (mb, CEE_STELEM_REF); - } - j++; - } - - /* Add the return value to the array */ - - if (ret_marshal_type == MONO_MARSHAL_SERIALIZE) { - mono_mb_emit_ldloc (mb, loc_array); - mono_mb_emit_icon (mb, complex_count); /* The array has an additional slot to hold the ret value */ - mono_mb_emit_ldloc (mb, loc_return); - - g_assert (ret_class); /*FIXME properly fail here*/ - if (ret_class->valuetype) { - mono_mb_emit_op (mb, CEE_BOX, ret_class); - } - mono_mb_emit_byte (mb, CEE_STELEM_REF); - } - - /* Serialize */ - - mono_mb_emit_ldarg (mb, 1); - mono_mb_emit_ldloc (mb, loc_array); - mono_mb_emit_managed_call (mb, method_rs_serialize, NULL); - mono_mb_emit_byte (mb, CEE_STIND_REF); - } else if (ret_marshal_type == MONO_MARSHAL_SERIALIZE) { - mono_mb_emit_ldarg (mb, 1); - mono_mb_emit_ldloc (mb, loc_return); - if (ret_class->valuetype) { - mono_mb_emit_op (mb, CEE_BOX, ret_class); - } - mono_mb_emit_managed_call (mb, method_rs_serialize, NULL); - mono_mb_emit_byte (mb, CEE_STIND_REF); - } else { - mono_mb_emit_ldarg (mb, 1); - mono_mb_emit_byte (mb, CEE_LDNULL); - mono_mb_emit_managed_call (mb, method_rs_serialize, NULL); - mono_mb_emit_byte (mb, CEE_STIND_REF); - } - - mono_mb_emit_ldarg (mb, 2); - mono_mb_emit_byte (mb, CEE_LDNULL); - mono_mb_emit_byte (mb, CEE_STIND_REF); - pos_leave = mono_mb_emit_branch (mb, CEE_LEAVE); - - /* Main exception catch */ - main_clause->flags = MONO_EXCEPTION_CLAUSE_NONE; - main_clause->try_len = mono_mb_get_pos (mb) - main_clause->try_offset; - main_clause->data.catch_class = mono_defaults.object_class; - - /* handler code */ - main_clause->handler_offset = mono_mb_get_label (mb); - mono_mb_emit_managed_call (mb, method_rs_serialize_exc, NULL); - mono_mb_emit_stloc (mb, loc_serialized_exc); - mono_mb_emit_ldarg (mb, 2); - mono_mb_emit_ldloc (mb, loc_serialized_exc); - mono_mb_emit_byte (mb, CEE_STIND_REF); - mono_mb_emit_branch (mb, CEE_LEAVE); - main_clause->handler_len = mono_mb_get_pos (mb) - main_clause->handler_offset; - /* end catch */ - - mono_mb_patch_branch (mb, pos_leave); - - if (copy_return) - mono_mb_emit_ldloc (mb, loc_return); - - mono_mb_emit_byte (mb, CEE_RET); - - mono_mb_set_clauses (mb, 1, main_clause); -#endif - - res = mono_remoting_mb_create_and_cache (method, mb, csig, csig->param_count + 16); - mono_mb_free (mb); - - return res; -} - -/* mono_marshal_get_xappdomain_invoke () - * Generates a fast remoting wrapper for cross app domain calls. - */ -MonoMethod * -mono_marshal_get_xappdomain_invoke (MonoMethod *method) -{ - MonoMethodSignature *sig; - MonoMethodBuilder *mb; - MonoMethod *res; - int i, j, complex_count, complex_out_count, copy_locals_base; - int *marshal_types; - MonoClass *ret_class = NULL; - MonoMethod *xdomain_method; - int ret_marshal_type = MONO_MARSHAL_NONE; - int loc_array=0, loc_serialized_data=-1, loc_real_proxy; - int loc_old_domainid, loc_domainid, loc_return=0, loc_serialized_exc=0, loc_context; - int pos, pos_dispatch, pos_noex; - gboolean copy_return = FALSE; - - g_assert (method); - - if (method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE || method->wrapper_type == MONO_WRAPPER_XDOMAIN_INVOKE) - return method; - - /* we cant remote methods without this pointer */ - if (!mono_method_signature (method)->hasthis) - return method; - - if (!mono_marshal_supports_fast_xdomain (method)) - return mono_marshal_get_remoting_invoke (method); - - mono_remoting_marshal_init (); - - if ((res = mono_marshal_remoting_find_in_cache (method, MONO_WRAPPER_XDOMAIN_INVOKE))) - return res; - - sig = mono_signature_no_pinvoke (method); - - mb = mono_mb_new (method->klass, method->name, MONO_WRAPPER_XDOMAIN_INVOKE); - mb->method->save_lmf = 1; - - /* Count the number of parameters that need to be serialized */ - - marshal_types = alloca (sizeof (int) * sig->param_count); - complex_count = complex_out_count = 0; - for (i = 0; i < sig->param_count; i++) { - MonoType *ptype = sig->params[i]; - int mt = mono_get_xdomain_marshal_type (ptype); - - /* If the [Out] attribute is applied to a parameter that can be internally copied, - * the copy will be made by reusing the original object instance - */ - if ((ptype->attrs & PARAM_ATTRIBUTE_OUT) != 0 && mt == MONO_MARSHAL_COPY && !ptype->byref) - mt = MONO_MARSHAL_COPY_OUT; - else if (mt == MONO_MARSHAL_SERIALIZE) { - complex_count++; - if (ptype->byref) complex_out_count++; - } - marshal_types [i] = mt; - } - - if (sig->ret->type != MONO_TYPE_VOID) { - ret_marshal_type = mono_get_xdomain_marshal_type (sig->ret); - ret_class = mono_class_from_mono_type (sig->ret); - copy_return = ret_marshal_type != MONO_MARSHAL_SERIALIZE; - } - - /* Locals */ - -#ifndef DISABLE_JIT - if (complex_count > 0) - loc_array = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg); - loc_serialized_data = mono_mb_add_local (mb, &byte_array_class->byval_arg); - loc_real_proxy = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg); - if (copy_return) - loc_return = mono_mb_add_local (mb, sig->ret); - loc_old_domainid = mono_mb_add_local (mb, &mono_defaults.int32_class->byval_arg); - loc_domainid = mono_mb_add_local (mb, &mono_defaults.int32_class->byval_arg); - loc_serialized_exc = mono_mb_add_local (mb, &byte_array_class->byval_arg); - loc_context = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg); - - /* Save thread domain data */ - - mono_mb_emit_icall (mb, mono_context_get); - mono_mb_emit_byte (mb, CEE_DUP); - mono_mb_emit_stloc (mb, loc_context); - - /* If the thread is not running in the default context, it needs to go - * through the whole remoting sink, since the context is going to change - */ - mono_mb_emit_managed_call (mb, method_needs_context_sink, NULL); - pos = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); - - /* Another case in which the fast path can't be used: when the target domain - * has a different image for the same assembly. - */ - - /* Get the target domain id */ - - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp)); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_byte (mb, CEE_DUP); - mono_mb_emit_stloc (mb, loc_real_proxy); - - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, target_domain_id)); - mono_mb_emit_byte (mb, CEE_LDIND_I4); - mono_mb_emit_stloc (mb, loc_domainid); - - /* Check if the target domain has the same image for the required assembly */ - - mono_mb_emit_ldloc (mb, loc_domainid); - mono_mb_emit_ptr (mb, method->klass->image); - mono_mb_emit_icall (mb, mono_marshal_check_domain_image); - pos_dispatch = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); - - /* Use the whole remoting sink to dispatch this message */ - - mono_mb_patch_short_branch (mb, pos); - - mono_mb_emit_ldarg (mb, 0); - for (i = 0; i < sig->param_count; i++) - mono_mb_emit_ldarg (mb, i + 1); - - mono_mb_emit_managed_call (mb, mono_marshal_get_remoting_invoke (method), NULL); - mono_mb_emit_byte (mb, CEE_RET); - mono_mb_patch_short_branch (mb, pos_dispatch); - - /* Create the array that will hold the parameters to be serialized */ - - if (complex_count > 0) { - mono_mb_emit_icon (mb, (ret_marshal_type == MONO_MARSHAL_SERIALIZE && complex_out_count > 0) ? complex_count + 1 : complex_count); /* +1 for the return type */ - mono_mb_emit_op (mb, CEE_NEWARR, mono_defaults.object_class); - - j = 0; - for (i = 0; i < sig->param_count; i++) { - MonoClass *pclass; - if (marshal_types [i] != MONO_MARSHAL_SERIALIZE) continue; - pclass = mono_class_from_mono_type (sig->params[i]); - mono_mb_emit_byte (mb, CEE_DUP); - mono_mb_emit_icon (mb, j); - mono_mb_emit_ldarg (mb, i + 1); /* 0=this */ - if (sig->params[i]->byref) { - if (pclass->valuetype) - mono_mb_emit_op (mb, CEE_LDOBJ, pclass); - else - mono_mb_emit_byte (mb, CEE_LDIND_REF); - } - if (pclass->valuetype) - mono_mb_emit_op (mb, CEE_BOX, pclass); - mono_mb_emit_byte (mb, CEE_STELEM_REF); - j++; - } - mono_mb_emit_stloc (mb, loc_array); - - /* Serialize parameters */ - - mono_mb_emit_ldloc (mb, loc_array); - mono_mb_emit_managed_call (mb, method_rs_serialize, NULL); - mono_mb_emit_stloc (mb, loc_serialized_data); - } else { - mono_mb_emit_byte (mb, CEE_LDNULL); - mono_mb_emit_managed_call (mb, method_rs_serialize, NULL); - mono_mb_emit_stloc (mb, loc_serialized_data); - } - - /* switch domain */ - - mono_mb_emit_ldloc (mb, loc_domainid); - mono_mb_emit_byte (mb, CEE_LDC_I4_1); - mono_marshal_emit_switch_domain (mb); - mono_mb_emit_stloc (mb, loc_old_domainid); - - /* Load the arguments */ - - mono_mb_emit_ldloc (mb, loc_real_proxy); - mono_mb_emit_ldloc_addr (mb, loc_serialized_data); - mono_mb_emit_ldloc_addr (mb, loc_serialized_exc); - - copy_locals_base = mb->locals; - for (i = 0; i < sig->param_count; i++) { - switch (marshal_types [i]) { - case MONO_MARSHAL_SERIALIZE: - continue; - case MONO_MARSHAL_COPY: { - mono_mb_emit_ldarg (mb, i+1); - if (sig->params [i]->byref) { - /* make a local copy of the byref parameter. The real parameter - * will be updated after the xdomain call - */ - MonoClass *pclass = mono_class_from_mono_type (sig->params [i]); - int copy_local = mono_mb_add_local (mb, &(pclass->byval_arg)); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_stloc (mb, copy_local); - mono_mb_emit_ldloc_addr (mb, copy_local); - } - break; - } - case MONO_MARSHAL_COPY_OUT: - case MONO_MARSHAL_NONE: - mono_mb_emit_ldarg (mb, i+1); - break; - } - } - - /* Make the call to the invoke wrapper in the target domain */ - - xdomain_method = mono_marshal_get_xappdomain_dispatch (method, marshal_types, complex_count, complex_out_count, ret_marshal_type); - mono_marshal_emit_load_domain_method (mb, xdomain_method); - mono_mb_emit_calli (mb, mono_method_signature (xdomain_method)); - - if (copy_return) - mono_mb_emit_stloc (mb, loc_return); - - /* Switch domain */ - - mono_mb_emit_ldloc (mb, loc_old_domainid); - mono_mb_emit_byte (mb, CEE_LDC_I4_0); - mono_marshal_emit_switch_domain (mb); - mono_mb_emit_byte (mb, CEE_POP); - - /* Restore thread domain data */ - - mono_mb_emit_ldloc (mb, loc_context); - mono_mb_emit_icall (mb, mono_context_set); - - /* if (loc_serialized_exc != null) ... */ - - mono_mb_emit_ldloc (mb, loc_serialized_exc); - pos_noex = mono_mb_emit_short_branch (mb, CEE_BRFALSE_S); - - mono_mb_emit_ldloc (mb, loc_serialized_exc); - mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); - mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); - mono_mb_emit_op (mb, CEE_CASTCLASS, mono_defaults.exception_class); - mono_mb_emit_managed_call (mb, method_exc_fixexc, NULL); - mono_mb_emit_byte (mb, CEE_THROW); - mono_mb_patch_short_branch (mb, pos_noex); - - /* copy back non-serialized output parameters */ - - j = 0; - for (i = 0; i < sig->param_count; i++) { - if (!sig->params [i]->byref || marshal_types [i] != MONO_MARSHAL_COPY) continue; - mono_mb_emit_ldarg (mb, i + 1); - mono_mb_emit_ldloc (mb, copy_locals_base + (j++)); - mono_marshal_emit_xdomain_copy_value (mb, mono_class_from_mono_type (sig->params [i])); - mono_mb_emit_byte (mb, CEE_STIND_REF); - } - - /* Deserialize out parameters */ - - if (complex_out_count > 0) { - mono_mb_emit_ldloc (mb, loc_serialized_data); - mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); - mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); - mono_mb_emit_stloc (mb, loc_array); - - /* Copy back output parameters and return type */ - - j = 0; - for (i = 0; i < sig->param_count; i++) { - if (marshal_types [i] != MONO_MARSHAL_SERIALIZE) continue; - if (sig->params[i]->byref) { - MonoClass *pclass = mono_class_from_mono_type (sig->params [i]); - mono_mb_emit_ldarg (mb, i + 1); - mono_mb_emit_ldloc (mb, loc_array); - mono_mb_emit_icon (mb, j); - mono_mb_emit_byte (mb, CEE_LDELEM_REF); - if (pclass->valuetype) { - mono_mb_emit_op (mb, CEE_UNBOX, pclass); - mono_mb_emit_op (mb, CEE_LDOBJ, pclass); - mono_mb_emit_op (mb, CEE_STOBJ, pclass); - } else { - if (pclass != mono_defaults.object_class) - mono_mb_emit_op (mb, CEE_CASTCLASS, pclass); - mono_mb_emit_byte (mb, CEE_STIND_REF); - } - } - j++; - } - - if (ret_marshal_type == MONO_MARSHAL_SERIALIZE) { - mono_mb_emit_ldloc (mb, loc_array); - mono_mb_emit_icon (mb, complex_count); - mono_mb_emit_byte (mb, CEE_LDELEM_REF); - if (ret_class->valuetype) { - mono_mb_emit_op (mb, CEE_UNBOX, ret_class); - mono_mb_emit_op (mb, CEE_LDOBJ, ret_class); - } - } - } else if (ret_marshal_type == MONO_MARSHAL_SERIALIZE) { - mono_mb_emit_ldloc (mb, loc_serialized_data); - mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); - mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); - if (ret_class->valuetype) { - mono_mb_emit_op (mb, CEE_UNBOX, ret_class); - mono_mb_emit_op (mb, CEE_LDOBJ, ret_class); - } else if (ret_class != mono_defaults.object_class) { - mono_mb_emit_op (mb, CEE_CASTCLASS, ret_class); - } - } else { - mono_mb_emit_ldloc (mb, loc_serialized_data); - mono_mb_emit_byte (mb, CEE_DUP); - pos = mono_mb_emit_short_branch (mb, CEE_BRFALSE_S); - mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); - - mono_mb_patch_short_branch (mb, pos); - mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); - mono_mb_emit_byte (mb, CEE_POP); - } - - if (copy_return) { - mono_mb_emit_ldloc (mb, loc_return); - if (ret_marshal_type == MONO_MARSHAL_COPY) - mono_marshal_emit_xdomain_copy_value (mb, ret_class); - } - - mono_mb_emit_byte (mb, CEE_RET); -#endif /* DISABLE_JIT */ - - res = mono_remoting_mb_create_and_cache (method, mb, sig, sig->param_count + 16); - mono_mb_free (mb); - - return res; -} - -MonoMethod * -mono_marshal_get_remoting_invoke_for_target (MonoMethod *method, MonoRemotingTarget target_type) -{ - if (target_type == MONO_REMOTING_TARGET_APPDOMAIN) { - return mono_marshal_get_xappdomain_invoke (method); - } else if (target_type == MONO_REMOTING_TARGET_COMINTEROP) { -#ifndef DISABLE_COM - return mono_cominterop_get_invoke (method); -#else - g_assert_not_reached (); -#endif - } else { - return mono_marshal_get_remoting_invoke (method); - } - /* Not erached */ - return NULL; -} - -G_GNUC_UNUSED static gpointer -mono_marshal_load_remoting_wrapper (MonoRealProxy *rp, MonoMethod *method) -{ - if (rp->target_domain_id != -1) - return mono_compile_method (mono_marshal_get_xappdomain_invoke (method)); - else - return mono_compile_method (mono_marshal_get_remoting_invoke (method)); -} - -MonoMethod * -mono_marshal_get_remoting_invoke_with_check (MonoMethod *method) -{ - MonoMethodSignature *sig; - MonoMethodBuilder *mb; - MonoMethod *res, *native; - int i, pos, pos_rem; - - g_assert (method); - - if (method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK) - return method; - - /* we cant remote methods without this pointer */ - g_assert (mono_method_signature (method)->hasthis); - - if ((res = mono_marshal_remoting_find_in_cache (method, MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK))) - return res; - - sig = mono_signature_no_pinvoke (method); - - mb = mono_mb_new (method->klass, method->name, MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK); - -#ifndef DISABLE_JIT - for (i = 0; i <= sig->param_count; i++) - mono_mb_emit_ldarg (mb, i); - - mono_mb_emit_ldarg (mb, 0); - pos = mono_mb_emit_proxy_check (mb, CEE_BNE_UN); - - if (mono_marshal_supports_fast_xdomain (method)) { - mono_mb_emit_ldarg (mb, 0); - pos_rem = mono_mb_emit_xdomain_check (mb, CEE_BEQ); - - /* wrapper for cross app domain calls */ - native = mono_marshal_get_xappdomain_invoke (method); - mono_mb_emit_managed_call (mb, native, mono_method_signature (native)); - mono_mb_emit_byte (mb, CEE_RET); - - mono_mb_patch_branch (mb, pos_rem); - } - /* wrapper for normal remote calls */ - native = mono_marshal_get_remoting_invoke (method); - mono_mb_emit_managed_call (mb, native, mono_method_signature (native)); - mono_mb_emit_byte (mb, CEE_RET); - - /* not a proxy */ - mono_mb_patch_branch (mb, pos); - mono_mb_emit_managed_call (mb, method, mono_method_signature (method)); - mono_mb_emit_byte (mb, CEE_RET); -#endif - - res = mono_remoting_mb_create_and_cache (method, mb, sig, sig->param_count + 16); - mono_mb_free (mb); - - return res; -} - -#endif /* DISABLE_REMOTING */ - typedef struct { MonoMethodSignature *sig; - MonoMethod *method; -} SignatureMethodPair; + gpointer pointer; +} SignaturePointerPair; static guint -signature_method_pair_hash (gconstpointer data) +signature_pointer_pair_hash (gconstpointer data) { - SignatureMethodPair *pair = (SignatureMethodPair*)data; + SignaturePointerPair *pair = (SignaturePointerPair*)data; - return mono_signature_hash (pair->sig) ^ mono_aligned_addr_hash (pair->method); + return mono_signature_hash (pair->sig) ^ mono_aligned_addr_hash (pair->pointer); } static gboolean -signature_method_pair_equal (SignatureMethodPair *pair1, SignatureMethodPair *pair2) +signature_pointer_pair_equal (gconstpointer data1, gconstpointer data2) { - return mono_metadata_signature_equal (pair1->sig, pair2->sig) && (pair1->method == pair2->method); + SignaturePointerPair *pair1 = (SignaturePointerPair*) data1, *pair2 = (SignaturePointerPair*) data2; + return mono_metadata_signature_equal (pair1->sig, pair2->sig) && (pair1->pointer == pair2->pointer); } static gboolean -signature_method_pair_matches_method (gpointer key, gpointer value, gpointer user_data) +signature_pointer_pair_matches_pointer (gpointer key, gpointer value, gpointer user_data) { - SignatureMethodPair *pair = (SignatureMethodPair*)key; - MonoMethod *method = (MonoMethod*)user_data; + SignaturePointerPair *pair = (SignaturePointerPair*)key; - return pair->method == method; + return pair->pointer == user_data; } static void -free_signature_method_pair (SignatureMethodPair *pair) +free_signature_pointer_pair (SignaturePointerPair *pair) { g_free (pair); } @@ -4249,8 +3040,8 @@ mono_marshal_get_delegate_invoke_internal (MonoMethod *method, gboolean callvirt MonoMethod *res; GHashTable *cache; gpointer cache_key = NULL; - SignatureMethodPair key; - SignatureMethodPair *new_key; + SignaturePointerPair key; + SignaturePointerPair *new_key; int local_prev, local_target; int pos0; char *name; @@ -4339,10 +3130,10 @@ mono_marshal_get_delegate_invoke_internal (MonoMethod *method, gboolean callvirt /* We need to cache the signature+method pair */ mono_marshal_lock (); if (!*cache_ptr) - *cache_ptr = g_hash_table_new_full (signature_method_pair_hash, (GEqualFunc)signature_method_pair_equal, (GDestroyNotify)free_signature_method_pair, NULL); + *cache_ptr = g_hash_table_new_full (signature_pointer_pair_hash, (GEqualFunc)signature_pointer_pair_equal, (GDestroyNotify)free_signature_pointer_pair, NULL); cache = *cache_ptr; key.sig = invoke_sig; - key.method = target_method; + key.pointer = target_method; res = g_hash_table_lookup (cache, &key); mono_marshal_unlock (); if (res) @@ -4410,10 +3201,13 @@ mono_marshal_get_delegate_invoke_internal (MonoMethod *method, gboolean callvirt mono_mb_emit_ldloc (mb, local_prev); for (i = 0; i < sig->param_count; i++) mono_mb_emit_ldarg (mb, i + 1); - if (ctx) - mono_mb_emit_op (mb, CEE_CALLVIRT, mono_class_inflate_generic_method (method, &container->context)); - else + if (ctx) { + MonoError error; + mono_mb_emit_op (mb, CEE_CALLVIRT, mono_class_inflate_generic_method_checked (method, &container->context, &error)); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + } else { mono_mb_emit_op (mb, CEE_CALLVIRT, method); + } if (sig->ret->type != MONO_TYPE_VOID) mono_mb_emit_byte (mb, CEE_POP); @@ -4490,7 +3284,7 @@ mono_marshal_get_delegate_invoke_internal (MonoMethod *method, gboolean callvirt def = mono_mb_create_and_cache (cache, cache_key, mb, sig, sig->param_count + 16); res = cache_generic_delegate_wrapper (cache, orig_method, def, ctx); } else if (callvirt) { - new_key = g_new0 (SignatureMethodPair, 1); + new_key = g_new0 (SignaturePointerPair, 1); *new_key = key; info = mono_wrapper_info_create (mb, subtype); @@ -5311,580 +4105,6 @@ mono_mb_emit_auto_layout_exception (MonoMethodBuilder *mb, MonoClass *klass) } #endif -#ifndef DISABLE_REMOTING -/* - * mono_marshal_get_ldfld_remote_wrapper: - * @klass: The return type - * - * This method generates a wrapper for calling mono_load_remote_field_new. - * The return type is ignored for now, as mono_load_remote_field_new () always - * returns an object. In the future, to optimize some codepaths, we might - * call a different function that takes a pointer to a valuetype, instead. - */ -MonoMethod * -mono_marshal_get_ldfld_remote_wrapper (MonoClass *klass) -{ - MonoMethodSignature *sig, *csig; - MonoMethodBuilder *mb; - MonoMethod *res; - static MonoMethod* cached = NULL; - - mono_marshal_lock (); - if (cached) { - mono_marshal_unlock (); - return cached; - } - mono_marshal_unlock (); - - mb = mono_mb_new_no_dup_name (mono_defaults.object_class, "__mono_load_remote_field_new_wrapper", MONO_WRAPPER_LDFLD_REMOTE); - - mb->method->save_lmf = 1; - - sig = mono_metadata_signature_alloc (mono_defaults.corlib, 3); - sig->params [0] = &mono_defaults.object_class->byval_arg; - sig->params [1] = &mono_defaults.int_class->byval_arg; - sig->params [2] = &mono_defaults.int_class->byval_arg; - sig->ret = &mono_defaults.object_class->byval_arg; - -#ifndef DISABLE_JIT - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_ldarg (mb, 1); - mono_mb_emit_ldarg (mb, 2); - - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 3); - csig->params [0] = &mono_defaults.object_class->byval_arg; - csig->params [1] = &mono_defaults.int_class->byval_arg; - csig->params [2] = &mono_defaults.int_class->byval_arg; - csig->ret = &mono_defaults.object_class->byval_arg; - csig->pinvoke = 1; - - mono_mb_emit_native_call (mb, csig, mono_load_remote_field_new); - emit_thread_interrupt_checkpoint (mb); - - mono_mb_emit_byte (mb, CEE_RET); -#endif - - mono_marshal_lock (); - res = cached; - mono_marshal_unlock (); - if (!res) { - MonoMethod *newm; - newm = mono_mb_create (mb, sig, 4, NULL); - mono_marshal_lock (); - res = cached; - if (!res) { - res = newm; - cached = res; - mono_marshal_unlock (); - } else { - mono_marshal_unlock (); - mono_free_method (newm); - } - } - mono_mb_free (mb); - - return res; -} - -/* - * mono_marshal_get_ldfld_wrapper: - * @type: the type of the field - * - * This method generates a function which can be use to load a field with type - * @type from an object. The generated function has the following signature: - * <@type> ldfld_wrapper (MonoObject *this, MonoClass *class, MonoClassField *field, int offset) - */ -MonoMethod * -mono_marshal_get_ldfld_wrapper (MonoType *type) -{ - MonoMethodSignature *sig; - MonoMethodBuilder *mb; - MonoMethod *res; - MonoClass *klass; - GHashTable *cache; - WrapperInfo *info; - char *name; - int t, pos0, pos1 = 0; - - type = mono_type_get_underlying_type (type); - - t = type->type; - - if (!type->byref) { - if (type->type == MONO_TYPE_SZARRAY) { - klass = mono_defaults.array_class; - } else if (type->type == MONO_TYPE_VALUETYPE) { - klass = type->data.klass; - } else if (t == MONO_TYPE_OBJECT || t == MONO_TYPE_CLASS || t == MONO_TYPE_STRING) { - klass = mono_defaults.object_class; - } else if (t == MONO_TYPE_PTR || t == MONO_TYPE_FNPTR) { - klass = mono_defaults.int_class; - } else if (t == MONO_TYPE_GENERICINST) { - if (mono_type_generic_inst_is_valuetype (type)) - klass = mono_class_from_mono_type (type); - else - klass = mono_defaults.object_class; - } else { - klass = mono_class_from_mono_type (type); - } - } else { - klass = mono_defaults.int_class; - } - - cache = get_cache (&klass->image->ldfld_wrapper_cache, mono_aligned_addr_hash, NULL); - if ((res = mono_marshal_find_in_cache (cache, klass))) - return res; - - /* we add the %p pointer value of klass because class names are not unique */ - name = g_strdup_printf ("__ldfld_wrapper_%p_%s.%s", klass, klass->name_space, klass->name); - mb = mono_mb_new (mono_defaults.object_class, name, MONO_WRAPPER_LDFLD); - g_free (name); - - sig = mono_metadata_signature_alloc (mono_defaults.corlib, 4); - sig->params [0] = &mono_defaults.object_class->byval_arg; - sig->params [1] = &mono_defaults.int_class->byval_arg; - sig->params [2] = &mono_defaults.int_class->byval_arg; - sig->params [3] = &mono_defaults.int_class->byval_arg; - sig->ret = &klass->byval_arg; - -#ifndef DISABLE_JIT - mono_mb_emit_ldarg (mb, 0); - pos0 = mono_mb_emit_proxy_check (mb, CEE_BNE_UN); - - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_ldarg (mb, 1); - mono_mb_emit_ldarg (mb, 2); - - mono_mb_emit_managed_call (mb, mono_marshal_get_ldfld_remote_wrapper (klass), NULL); - - /* - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 3); - csig->params [0] = &mono_defaults.object_class->byval_arg; - csig->params [1] = &mono_defaults.int_class->byval_arg; - csig->params [2] = &mono_defaults.int_class->byval_arg; - csig->ret = &klass->this_arg; - csig->pinvoke = 1; - - mono_mb_emit_native_call (mb, csig, mono_load_remote_field_new); - emit_thread_interrupt_checkpoint (mb); - */ - - if (klass->valuetype) { - mono_mb_emit_op (mb, CEE_UNBOX, klass); - pos1 = mono_mb_emit_branch (mb, CEE_BR); - } else { - mono_mb_emit_byte (mb, CEE_RET); - } - - - mono_mb_patch_branch (mb, pos0); - - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); - mono_mb_emit_ldarg (mb, 3); - mono_mb_emit_byte (mb, CEE_ADD); - - if (klass->valuetype) - mono_mb_patch_branch (mb, pos1); - - switch (t) { - case MONO_TYPE_I1: - case MONO_TYPE_U1: - case MONO_TYPE_BOOLEAN: - case MONO_TYPE_CHAR: - case MONO_TYPE_I2: - case MONO_TYPE_U2: - case MONO_TYPE_I4: - case MONO_TYPE_U4: - case MONO_TYPE_I8: - case MONO_TYPE_U8: - case MONO_TYPE_R4: - case MONO_TYPE_R8: - case MONO_TYPE_ARRAY: - case MONO_TYPE_SZARRAY: - case MONO_TYPE_OBJECT: - case MONO_TYPE_CLASS: - case MONO_TYPE_STRING: - case MONO_TYPE_I: - case MONO_TYPE_U: - case MONO_TYPE_PTR: - case MONO_TYPE_FNPTR: - mono_mb_emit_byte (mb, mono_type_to_ldind (type)); - break; - case MONO_TYPE_VALUETYPE: - g_assert (!klass->enumtype); - mono_mb_emit_op (mb, CEE_LDOBJ, klass); - break; - case MONO_TYPE_GENERICINST: - if (mono_type_generic_inst_is_valuetype (type)) { - mono_mb_emit_op (mb, CEE_LDOBJ, klass); - } else { - mono_mb_emit_byte (mb, CEE_LDIND_REF); - } - break; - case MONO_TYPE_VAR: - case MONO_TYPE_MVAR: - mono_mb_emit_op (mb, CEE_LDOBJ, klass); - break; - default: - g_warning ("type %x not implemented", type->type); - g_assert_not_reached (); - } - - mono_mb_emit_byte (mb, CEE_RET); -#endif /* DISABLE_JIT */ - - info = mono_wrapper_info_create (mb, WRAPPER_SUBTYPE_NONE); - info->d.proxy.klass = klass; - res = mono_mb_create_and_cache_full (cache, klass, - mb, sig, sig->param_count + 16, info, NULL); - mono_mb_free (mb); - - return res; -} - -/* - * mono_marshal_get_ldflda_wrapper: - * @type: the type of the field - * - * This method generates a function which can be used to load a field address - * from an object. The generated function has the following signature: - * gpointer ldflda_wrapper (MonoObject *this, MonoClass *class, MonoClassField *field, int offset); - */ -MonoMethod * -mono_marshal_get_ldflda_wrapper (MonoType *type) -{ - MonoMethodSignature *sig; - MonoMethodBuilder *mb; - MonoMethod *res; - MonoClass *klass; - GHashTable *cache; - WrapperInfo *info; - char *name; - int t, pos0, pos1, pos2, pos3; - - type = mono_type_get_underlying_type (type); - t = type->type; - - if (!type->byref) { - if (type->type == MONO_TYPE_SZARRAY) { - klass = mono_defaults.array_class; - } else if (type->type == MONO_TYPE_VALUETYPE) { - klass = type->data.klass; - } else if (t == MONO_TYPE_OBJECT || t == MONO_TYPE_CLASS || t == MONO_TYPE_STRING || - t == MONO_TYPE_CLASS) { - klass = mono_defaults.object_class; - } else if (t == MONO_TYPE_PTR || t == MONO_TYPE_FNPTR) { - klass = mono_defaults.int_class; - } else if (t == MONO_TYPE_GENERICINST) { - if (mono_type_generic_inst_is_valuetype (type)) - klass = mono_class_from_mono_type (type); - else - klass = mono_defaults.object_class; - } else { - klass = mono_class_from_mono_type (type); - } - } else { - klass = mono_defaults.int_class; - } - - cache = get_cache (&klass->image->ldflda_wrapper_cache, mono_aligned_addr_hash, NULL); - if ((res = mono_marshal_find_in_cache (cache, klass))) - return res; - - /* we add the %p pointer value of klass because class names are not unique */ - name = g_strdup_printf ("__ldflda_wrapper_%p_%s.%s", klass, klass->name_space, klass->name); - mb = mono_mb_new (mono_defaults.object_class, name, MONO_WRAPPER_LDFLDA); - g_free (name); - - sig = mono_metadata_signature_alloc (mono_defaults.corlib, 4); - sig->params [0] = &mono_defaults.object_class->byval_arg; - sig->params [1] = &mono_defaults.int_class->byval_arg; - sig->params [2] = &mono_defaults.int_class->byval_arg; - sig->params [3] = &mono_defaults.int_class->byval_arg; - sig->ret = &mono_defaults.int_class->byval_arg; - -#ifndef DISABLE_JIT - /* if typeof (this) != transparent_proxy goto pos0 */ - mono_mb_emit_ldarg (mb, 0); - pos0 = mono_mb_emit_proxy_check (mb, CEE_BNE_UN); - - /* if same_appdomain goto pos1 */ - mono_mb_emit_ldarg (mb, 0); - pos1 = mono_mb_emit_xdomain_check (mb, CEE_BEQ); - - mono_mb_emit_exception_full (mb, "System", "InvalidOperationException", "Attempt to load field address from object in another appdomain."); - - /* same app domain */ - mono_mb_patch_branch (mb, pos1); - - /* if typeof (this) != contextbound goto pos2 */ - mono_mb_emit_ldarg (mb, 0); - pos2 = mono_mb_emit_contextbound_check (mb, CEE_BEQ); - - /* if this->rp->context == mono_context_get goto pos3 */ - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp)); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, context)); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_icall (mb, mono_context_get); - pos3 = mono_mb_emit_branch (mb, CEE_BEQ); - - mono_mb_emit_exception_full (mb, "System", "InvalidOperationException", "Attempt to load field address from object in another context."); - - mono_mb_patch_branch (mb, pos2); - mono_mb_patch_branch (mb, pos3); - - /* return the address of the field from this->rp->unwrapped_server */ - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp)); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, unwrapped_server)); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); - mono_mb_emit_ldarg (mb, 3); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_RET); - - /* not a proxy: return the address of the field directly */ - mono_mb_patch_branch (mb, pos0); - - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); - mono_mb_emit_ldarg (mb, 3); - mono_mb_emit_byte (mb, CEE_ADD); - - mono_mb_emit_byte (mb, CEE_RET); -#endif - - info = mono_wrapper_info_create (mb, WRAPPER_SUBTYPE_NONE); - info->d.proxy.klass = klass; - res = mono_mb_create_and_cache_full (cache, klass, - mb, sig, sig->param_count + 16, - info, NULL); - mono_mb_free (mb); - - return res; -} - -/* - * mono_marshal_get_stfld_remote_wrapper: - * klass: The type of the field - * - * This function generates a wrapper for calling mono_store_remote_field_new - * with the appropriate signature. - * Similarly to mono_marshal_get_ldfld_remote_wrapper () this doesn't depend on the - * klass argument anymore. - */ -MonoMethod * -mono_marshal_get_stfld_remote_wrapper (MonoClass *klass) -{ - MonoMethodSignature *sig, *csig; - MonoMethodBuilder *mb; - MonoMethod *res; - static MonoMethod *cached = NULL; - - mono_marshal_lock (); - if (cached) { - mono_marshal_unlock (); - return cached; - } - mono_marshal_unlock (); - - mb = mono_mb_new_no_dup_name (mono_defaults.object_class, "__mono_store_remote_field_new_wrapper", MONO_WRAPPER_STFLD_REMOTE); - - mb->method->save_lmf = 1; - - sig = mono_metadata_signature_alloc (mono_defaults.corlib, 4); - sig->params [0] = &mono_defaults.object_class->byval_arg; - sig->params [1] = &mono_defaults.int_class->byval_arg; - sig->params [2] = &mono_defaults.int_class->byval_arg; - sig->params [3] = &mono_defaults.object_class->byval_arg; - sig->ret = &mono_defaults.void_class->byval_arg; - -#ifndef DISABLE_JIT - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_ldarg (mb, 1); - mono_mb_emit_ldarg (mb, 2); - mono_mb_emit_ldarg (mb, 3); - - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 4); - csig->params [0] = &mono_defaults.object_class->byval_arg; - csig->params [1] = &mono_defaults.int_class->byval_arg; - csig->params [2] = &mono_defaults.int_class->byval_arg; - csig->params [3] = &mono_defaults.object_class->byval_arg; - csig->ret = &mono_defaults.void_class->byval_arg; - csig->pinvoke = 1; - - mono_mb_emit_native_call (mb, csig, mono_store_remote_field_new); - emit_thread_interrupt_checkpoint (mb); - - mono_mb_emit_byte (mb, CEE_RET); -#endif - - mono_marshal_lock (); - res = cached; - mono_marshal_unlock (); - if (!res) { - MonoMethod *newm; - newm = mono_mb_create (mb, sig, 6, NULL); - mono_marshal_lock (); - res = cached; - if (!res) { - res = newm; - cached = res; - mono_marshal_unlock (); - } else { - mono_marshal_unlock (); - mono_free_method (newm); - } - } - mono_mb_free (mb); - - return res; -} - -/* - * mono_marshal_get_stfld_wrapper: - * @type: the type of the field - * - * This method generates a function which can be use to store a field with type - * @type. The generated function has the following signature: - * void stfld_wrapper (MonoObject *this, MonoClass *class, MonoClassField *field, int offset, <@type> val) - */ -MonoMethod * -mono_marshal_get_stfld_wrapper (MonoType *type) -{ - MonoMethodSignature *sig; - MonoMethodBuilder *mb; - MonoMethod *res; - MonoClass *klass; - GHashTable *cache; - WrapperInfo *info; - char *name; - int t, pos; - - type = mono_type_get_underlying_type (type); - t = type->type; - - if (!type->byref) { - if (type->type == MONO_TYPE_SZARRAY) { - klass = mono_defaults.array_class; - } else if (type->type == MONO_TYPE_VALUETYPE) { - klass = type->data.klass; - } else if (t == MONO_TYPE_OBJECT || t == MONO_TYPE_CLASS || t == MONO_TYPE_STRING) { - klass = mono_defaults.object_class; - } else if (t == MONO_TYPE_PTR || t == MONO_TYPE_FNPTR) { - klass = mono_defaults.int_class; - } else if (t == MONO_TYPE_GENERICINST) { - if (mono_type_generic_inst_is_valuetype (type)) - klass = mono_class_from_mono_type (type); - else - klass = mono_defaults.object_class; - } else { - klass = mono_class_from_mono_type (type); - } - } else { - klass = mono_defaults.int_class; - } - - cache = get_cache (&klass->image->stfld_wrapper_cache, mono_aligned_addr_hash, NULL); - if ((res = mono_marshal_find_in_cache (cache, klass))) - return res; - - /* we add the %p pointer value of klass because class names are not unique */ - name = g_strdup_printf ("__stfld_wrapper_%p_%s.%s", klass, klass->name_space, klass->name); - mb = mono_mb_new (mono_defaults.object_class, name, MONO_WRAPPER_STFLD); - g_free (name); - - sig = mono_metadata_signature_alloc (mono_defaults.corlib, 5); - sig->params [0] = &mono_defaults.object_class->byval_arg; - sig->params [1] = &mono_defaults.int_class->byval_arg; - sig->params [2] = &mono_defaults.int_class->byval_arg; - sig->params [3] = &mono_defaults.int_class->byval_arg; - sig->params [4] = &klass->byval_arg; - sig->ret = &mono_defaults.void_class->byval_arg; - -#ifndef DISABLE_JIT - mono_mb_emit_ldarg (mb, 0); - pos = mono_mb_emit_proxy_check (mb, CEE_BNE_UN); - - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_ldarg (mb, 1); - mono_mb_emit_ldarg (mb, 2); - mono_mb_emit_ldarg (mb, 4); - if (klass->valuetype) - mono_mb_emit_op (mb, CEE_BOX, klass); - - mono_mb_emit_managed_call (mb, mono_marshal_get_stfld_remote_wrapper (klass), NULL); - - mono_mb_emit_byte (mb, CEE_RET); - - mono_mb_patch_branch (mb, pos); - - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); - mono_mb_emit_ldarg (mb, 3); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_ldarg (mb, 4); - - switch (t) { - case MONO_TYPE_I1: - case MONO_TYPE_U1: - case MONO_TYPE_BOOLEAN: - case MONO_TYPE_CHAR: - case MONO_TYPE_I2: - case MONO_TYPE_U2: - case MONO_TYPE_I4: - case MONO_TYPE_U4: - case MONO_TYPE_I8: - case MONO_TYPE_U8: - case MONO_TYPE_R4: - case MONO_TYPE_R8: - case MONO_TYPE_ARRAY: - case MONO_TYPE_SZARRAY: - case MONO_TYPE_OBJECT: - case MONO_TYPE_CLASS: - case MONO_TYPE_STRING: - case MONO_TYPE_I: - case MONO_TYPE_U: - case MONO_TYPE_PTR: - case MONO_TYPE_FNPTR: - mono_mb_emit_byte (mb, mono_type_to_stind (type)); - break; - case MONO_TYPE_VALUETYPE: - g_assert (!klass->enumtype); - mono_mb_emit_op (mb, CEE_STOBJ, klass); - break; - case MONO_TYPE_GENERICINST: - case MONO_TYPE_VAR: - case MONO_TYPE_MVAR: - mono_mb_emit_op (mb, CEE_STOBJ, klass); - break; - default: - g_warning ("type %x not implemented", type->type); - g_assert_not_reached (); - } - - mono_mb_emit_byte (mb, CEE_RET); -#endif - - info = mono_wrapper_info_create (mb, WRAPPER_SUBTYPE_NONE); - info->d.proxy.klass = klass; - res = mono_mb_create_and_cache_full (cache, klass, - mb, sig, sig->param_count + 16, - info, NULL); - mono_mb_free (mb); - - return res; -} -#endif /* DISABLE_REMOTING */ - /* * generates IL code for the icall wrapper (the generated method * calls the unmanaged code in func) @@ -5962,20 +4182,23 @@ emit_marshal_custom (EmitMarshalContext *m, int argnum, MonoType *t, int pos2; if (!ICustomMarshaler) { - ICustomMarshaler = mono_class_from_name (mono_defaults.corlib, "System.Runtime.InteropServices", "ICustomMarshaler"); - if (!ICustomMarshaler) { + MonoClass *klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.InteropServices", "ICustomMarshaler"); + if (!klass) { exception_msg = g_strdup ("Current profile doesn't support ICustomMarshaler"); goto handle_exception; } - cleanup_native = mono_class_get_method_from_name (ICustomMarshaler, "CleanUpNativeData", 1); + cleanup_native = mono_class_get_method_from_name (klass, "CleanUpNativeData", 1); g_assert (cleanup_native); - cleanup_managed = mono_class_get_method_from_name (ICustomMarshaler, "CleanUpManagedData", 1); + cleanup_managed = mono_class_get_method_from_name (klass, "CleanUpManagedData", 1); g_assert (cleanup_managed); - marshal_managed_to_native = mono_class_get_method_from_name (ICustomMarshaler, "MarshalManagedToNative", 1); + marshal_managed_to_native = mono_class_get_method_from_name (klass, "MarshalManagedToNative", 1); g_assert (marshal_managed_to_native); - marshal_native_to_managed = mono_class_get_method_from_name (ICustomMarshaler, "MarshalNativeToManaged", 1); + marshal_native_to_managed = mono_class_get_method_from_name (klass, "MarshalNativeToManaged", 1); g_assert (marshal_native_to_managed); + + mono_memory_barrier (); + ICustomMarshaler = klass; } if (spec->data.custom_data.image) @@ -8947,14 +7170,24 @@ mono_marshal_get_native_wrapper (MonoMethod *method, gboolean check_exceptions, g_assert (method != NULL); g_assert (mono_method_signature (method)->pinvoke); - if (aot) - cache = get_cache (&method->klass->image->native_wrapper_aot_cache, mono_aligned_addr_hash, NULL); - else - cache = get_cache (&method->klass->image->native_wrapper_cache, mono_aligned_addr_hash, NULL); + if (aot) { + if (check_exceptions) + cache = get_cache (&method->klass->image->native_wrapper_aot_check_cache, mono_aligned_addr_hash, NULL); + else + cache = get_cache (&method->klass->image->native_wrapper_aot_cache, mono_aligned_addr_hash, NULL); + } else { + if (check_exceptions) + cache = get_cache (&method->klass->image->native_wrapper_check_cache, mono_aligned_addr_hash, NULL); + else + cache = get_cache (&method->klass->image->native_wrapper_cache, mono_aligned_addr_hash, NULL); + } if ((res = mono_marshal_find_in_cache (cache, method))) return res; if (MONO_CLASS_IS_IMPORT (method->klass)) { + /* The COM code is not AOT compatible, it calls mono_custom_attrs_get_attr_checked () */ + if (aot) + return method; #ifndef DISABLE_COM return mono_cominterop_get_native_wrapper (method); #else @@ -9151,13 +7384,18 @@ mono_marshal_get_native_func_wrapper (MonoImage *image, MonoMethodSignature *sig { MonoMethodSignature *csig; + SignaturePointerPair key, *new_key; MonoMethodBuilder *mb; MonoMethod *res; GHashTable *cache; + gboolean found; char *name; - cache = get_cache (&image->native_wrapper_cache, mono_aligned_addr_hash, NULL); - if ((res = mono_marshal_find_in_cache (cache, func))) + key.sig = sig; + key.pointer = func; + + cache = get_cache (&image->native_func_wrapper_cache, signature_pointer_pair_hash, signature_pointer_pair_equal); + if ((res = mono_marshal_find_in_cache (cache, &key))) return res; name = g_strdup_printf ("wrapper_native_%p", func); @@ -9170,8 +7408,15 @@ mono_marshal_get_native_func_wrapper (MonoImage *image, MonoMethodSignature *sig csig = signature_dup (image, sig); csig->pinvoke = 0; - res = mono_mb_create_and_cache (cache, func, - mb, csig, csig->param_count + 16); + + new_key = g_new (SignaturePointerPair,1); + new_key->sig = csig; + new_key->pointer = func; + + res = mono_mb_create_and_cache_full (cache, new_key, mb, csig, csig->param_count + 16, NULL, &found); + if (found) + g_free (new_key); + mono_mb_free (mb); mono_marshal_set_wrapper_info (res, NULL); @@ -9757,18 +8002,6 @@ mono_marshal_get_vtfixup_ftnptr (MonoImage *image, guint32 token, guint16 type) return mono_compile_method (method); } -static MonoReflectionType * -type_from_handle (MonoType *handle) -{ - MonoDomain *domain = mono_domain_get (); - MonoClass *klass = mono_class_from_mono_type (handle); - - MONO_ARCH_SAVE_REGS; - - mono_class_init (klass); - return mono_type_get_object (domain, handle); -} - /* * This does the equivalent of mono_object_castclass_with_cache. * The wrapper info for the wrapper is a WrapperInfo structure. @@ -9908,7 +8141,7 @@ mono_marshal_get_isinst_with_cache (void) mono_mb_emit_ldloc (mb, 1); mono_mb_emit_byte (mb, CEE_LDC_I4); mono_mb_emit_i4 (mb, ~0x1); - mono_mb_emit_byte (mb, CEE_CONV_U); + mono_mb_emit_byte (mb, CEE_CONV_I); mono_mb_emit_byte (mb, CEE_AND); mono_mb_emit_ldloc (mb, 0); /*if ((cached_vtable & ~0x1)== obj_vtable)*/ @@ -10174,100 +8407,6 @@ mono_marshal_get_castclass (MonoClass *klass) return res; } -#ifndef DISABLE_REMOTING -MonoMethod * -mono_marshal_get_proxy_cancast (MonoClass *klass) -{ - static MonoMethodSignature *isint_sig = NULL; - GHashTable *cache; - MonoMethod *res; - WrapperInfo *info; - int pos_failed, pos_end; - char *name, *klass_name; - MonoMethod *can_cast_to; - MonoMethodDesc *desc; - MonoMethodBuilder *mb; - - cache = get_cache (&klass->image->proxy_isinst_cache, mono_aligned_addr_hash, NULL); - if ((res = mono_marshal_find_in_cache (cache, klass))) - return res; - - if (!isint_sig) { - isint_sig = mono_metadata_signature_alloc (mono_defaults.corlib, 1); - isint_sig->params [0] = &mono_defaults.object_class->byval_arg; - isint_sig->ret = &mono_defaults.object_class->byval_arg; - isint_sig->pinvoke = 0; - } - - klass_name = mono_type_full_name (&klass->byval_arg); - name = g_strdup_printf ("__proxy_isinst_wrapper_%s", klass_name); - mb = mono_mb_new (mono_defaults.object_class, name, MONO_WRAPPER_PROXY_ISINST); - g_free (klass_name); - g_free (name); - - mb->method->save_lmf = 1; - -#ifndef DISABLE_JIT - /* get the real proxy from the transparent proxy*/ - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp)); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - - /* get the reflection type from the type handle */ - mono_mb_emit_ptr (mb, &klass->byval_arg); - mono_mb_emit_icall (mb, type_from_handle); - - mono_mb_emit_ldarg (mb, 0); - - /* make the call to CanCastTo (type, ob) */ - desc = mono_method_desc_new ("IRemotingTypeInfo:CanCastTo", FALSE); - can_cast_to = mono_method_desc_search_in_class (desc, mono_defaults.iremotingtypeinfo_class); - g_assert (can_cast_to); - mono_method_desc_free (desc); - mono_mb_emit_op (mb, CEE_CALLVIRT, can_cast_to); - - pos_failed = mono_mb_emit_branch (mb, CEE_BRFALSE); - - /* Upgrade the proxy vtable by calling: mono_upgrade_remote_class_wrapper (type, ob)*/ - mono_mb_emit_ptr (mb, &klass->byval_arg); - mono_mb_emit_icall (mb, type_from_handle); - mono_mb_emit_ldarg (mb, 0); - - mono_mb_emit_icall (mb, mono_upgrade_remote_class_wrapper); - emit_thread_interrupt_checkpoint (mb); - - mono_mb_emit_ldarg (mb, 0); - pos_end = mono_mb_emit_branch (mb, CEE_BR); - - /* fail */ - - mono_mb_patch_branch (mb, pos_failed); - mono_mb_emit_byte (mb, CEE_LDNULL); - - /* the end */ - - mono_mb_patch_branch (mb, pos_end); - mono_mb_emit_byte (mb, CEE_RET); -#endif - - info = mono_wrapper_info_create (mb, WRAPPER_SUBTYPE_NONE); - info->d.proxy.klass = klass; - res = mono_mb_create_and_cache_full (cache, klass, mb, isint_sig, isint_sig->param_count + 16, info, NULL); - mono_mb_free (mb); - - return res; -} - -void -mono_upgrade_remote_class_wrapper (MonoReflectionType *rtype, MonoTransparentProxy *tproxy) -{ - MonoClass *klass; - MonoDomain *domain = ((MonoObject*)tproxy)->vtable->domain; - klass = mono_class_from_mono_type (rtype->type); - mono_upgrade_remote_class (domain, (MonoObject*)tproxy, klass); -} -#endif /*DISABLE_REMOTING */ - /** * mono_marshal_get_struct_to_ptr: * @klass: @@ -10450,8 +8589,11 @@ mono_marshal_get_synchronized_inner_wrapper (MonoMethod *method) info->d.synchronized_inner.method = method; res = mono_mb_create (mb, sig, 0, info); mono_mb_free (mb); - if (ctx) - res = mono_class_inflate_generic_method (res, ctx); + if (ctx) { + MonoError error; + res = mono_class_inflate_generic_method_checked (res, ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + } return res; } @@ -10592,10 +8734,13 @@ mono_marshal_get_synchronized_wrapper (MonoMethod *method) for (i = 0; i < sig->param_count; i++) mono_mb_emit_ldarg (mb, i + (sig->hasthis == TRUE)); - if (ctx) - mono_mb_emit_managed_call (mb, mono_class_inflate_generic_method (method, &container->context), NULL); - else + if (ctx) { + MonoError error; + mono_mb_emit_managed_call (mb, mono_class_inflate_generic_method_checked (method, &container->context, &error), NULL); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + } else { mono_mb_emit_managed_call (mb, method, NULL); + } if (!MONO_TYPE_IS_VOID (sig->ret)) mono_mb_emit_stloc (mb, ret_local); @@ -11412,10 +9557,11 @@ static int elem_addr_cache_next = 0; * @rank: rank of the array type * @elem_size: size in bytes of an element of an array. * - * Returns a MonoMethd that implements the code to get the address + * Returns a MonoMethod that implements the code to get the address * of an element in a multi-dimenasional array of @rank dimensions. * The returned method takes an array as the first argument and then * @rank indexes for the @rank dimensions. + * If ELEM_SIZE is 0, read the array size from the array object. */ MonoMethod* mono_marshal_get_array_address (int rank, int elem_size) @@ -11424,6 +9570,7 @@ mono_marshal_get_array_address (int rank, int elem_size) MonoMethodBuilder *mb; MonoMethodSignature *sig; WrapperInfo *info; + char *name; int i, bounds, ind, realidx; int branch_pos, *branch_positions; int cached; @@ -11451,7 +9598,9 @@ mono_marshal_get_array_address (int rank, int elem_size) sig->params [i + 1] = &mono_defaults.int32_class->byval_arg; } - mb = mono_mb_new (mono_defaults.object_class, "ElementAddr", MONO_WRAPPER_MANAGED_TO_MANAGED); + name = g_strdup_printf ("ElementAddr_%d", elem_size); + mb = mono_mb_new (mono_defaults.object_class, name, MONO_WRAPPER_MANAGED_TO_MANAGED); + g_free (name); #ifndef DISABLE_JIT bounds = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); @@ -11519,8 +9668,24 @@ mono_marshal_get_array_address (int rank, int elem_size) mono_mb_emit_ldarg (mb, 0); mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoArray, vector)); mono_mb_emit_ldloc (mb, ind); - mono_mb_emit_icon (mb, elem_size); - mono_mb_emit_byte (mb, CEE_MUL); + if (elem_size) { + mono_mb_emit_icon (mb, elem_size); + } else { + /* Load arr->vtable->klass->sizes.element_class */ + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_byte (mb, CEE_CONV_I); + mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoObject, vtable)); + mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_byte (mb, CEE_LDIND_I); + mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoVTable, klass)); + mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_byte (mb, CEE_LDIND_I); + /* sizes is an union, so this reads sizes.element_size */ + mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoClass, sizes)); + mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_byte (mb, CEE_LDIND_I4); + } + mono_mb_emit_byte (mb, CEE_MUL); mono_mb_emit_byte (mb, CEE_ADD); mono_mb_emit_byte (mb, CEE_RET); @@ -11617,10 +9782,13 @@ mono_marshal_get_array_accessor_wrapper (MonoMethod *method) for (i = 0; i < sig->param_count; i++) mono_mb_emit_ldarg (mb, i + (sig->hasthis == TRUE)); - if (ctx) - mono_mb_emit_managed_call (mb, mono_class_inflate_generic_method (method, &container->context), NULL); - else + if (ctx) { + MonoError error; + mono_mb_emit_managed_call (mb, mono_class_inflate_generic_method_checked (method, &container->context, &error), NULL); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + } else { mono_mb_emit_managed_call (mb, method, NULL); + } mono_mb_emit_byte (mb, CEE_RET); #endif @@ -11729,19 +9897,25 @@ ves_icall_System_Runtime_InteropServices_Marshal_copy_to_unmanaged (MonoArray *s int element_size; void *source_addr; - MONO_ARCH_SAVE_REGS; + MONO_CHECK_ARG_NULL (src,); + MONO_CHECK_ARG_NULL (dest,); - MONO_CHECK_ARG_NULL (src); - MONO_CHECK_ARG_NULL (dest); - - if (src->obj.vtable->klass->rank != 1) - mono_raise_exception (mono_get_exception_argument ("array", "array is multi-dimensional")); - if (start_index < 0) - mono_raise_exception (mono_get_exception_argument ("startIndex", "Must be >= 0")); - if (length < 0) - mono_raise_exception (mono_get_exception_argument ("length", "Must be >= 0")); - if (start_index + length > mono_array_length (src)) - mono_raise_exception (mono_get_exception_argument ("length", "start_index + length > array length")); + if (src->obj.vtable->klass->rank != 1) { + mono_set_pending_exception (mono_get_exception_argument ("array", "array is multi-dimensional")); + return; + } + if (start_index < 0) { + mono_set_pending_exception (mono_get_exception_argument ("startIndex", "Must be >= 0")); + return; + } + if (length < 0) { + mono_set_pending_exception (mono_get_exception_argument ("length", "Must be >= 0")); + return; + } + if (start_index + length > mono_array_length (src)) { + mono_set_pending_exception (mono_get_exception_argument ("length", "start_index + length > array length")); + return; + } element_size = mono_array_element_size (src->obj.vtable->klass); @@ -11758,20 +9932,25 @@ ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged (gpointer s int element_size; void *dest_addr; - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (src); - MONO_CHECK_ARG_NULL (dest); - - if (dest->obj.vtable->klass->rank != 1) - mono_raise_exception (mono_get_exception_argument ("array", "array is multi-dimensional")); - if (start_index < 0) - mono_raise_exception (mono_get_exception_argument ("startIndex", "Must be >= 0")); - if (length < 0) - mono_raise_exception (mono_get_exception_argument ("length", "Must be >= 0")); - if (start_index + length > mono_array_length (dest)) - mono_raise_exception (mono_get_exception_argument ("length", "start_index + length > array length")); + MONO_CHECK_ARG_NULL (src,); + MONO_CHECK_ARG_NULL (dest,); + if (dest->obj.vtable->klass->rank != 1) { + mono_set_pending_exception (mono_get_exception_argument ("array", "array is multi-dimensional")); + return; + } + if (start_index < 0) { + mono_set_pending_exception (mono_get_exception_argument ("startIndex", "Must be >= 0")); + return; + } + if (length < 0) { + mono_set_pending_exception (mono_get_exception_argument ("length", "Must be >= 0")); + return; + } + if (start_index + length > mono_array_length (dest)) { + mono_set_pending_exception (mono_get_exception_argument ("length", "start_index + length > array length")); + return; + } element_size = mono_array_element_size (dest->obj.vtable->klass); /* no references should be involved */ @@ -11783,8 +9962,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged (gpointer s MonoString * ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi (char *ptr) { - MONO_ARCH_SAVE_REGS; - if (ptr == NULL) return NULL; else @@ -11794,11 +9971,8 @@ ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi (char *ptr) MonoString * ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi_len (char *ptr, gint32 len) { - MONO_ARCH_SAVE_REGS; - if (ptr == NULL) { - mono_raise_exception (mono_get_exception_argument_null ("ptr")); - g_assert_not_reached (); + mono_set_pending_exception (mono_get_exception_argument_null ("ptr")); return NULL; } else { return mono_string_new_len (mono_domain_get (), ptr, len); @@ -11812,8 +9986,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni (guint16 *ptr) int len = 0; guint16 *t = ptr; - MONO_ARCH_SAVE_REGS; - if (ptr == NULL) return NULL; @@ -11828,11 +10000,8 @@ ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni_len (guint16 *pt { MonoDomain *domain = mono_domain_get (); - MONO_ARCH_SAVE_REGS; - if (ptr == NULL) { - mono_raise_exception (mono_get_exception_argument_null ("ptr")); - g_assert_not_reached (); + mono_set_pending_exception (mono_get_exception_argument_null ("ptr")); return NULL; } else { return mono_string_new_utf16 (domain, ptr, len); @@ -11842,8 +10011,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni_len (guint16 *pt guint32 ves_icall_System_Runtime_InteropServices_Marshal_GetLastWin32Error (void) { - MONO_ARCH_SAVE_REGS; - return (GPOINTER_TO_INT (mono_native_tls_get_value (last_error_tls_id))); } @@ -11854,14 +10021,14 @@ ves_icall_System_Runtime_InteropServices_Marshal_SizeOf (MonoReflectionType *rty MonoType *type; guint32 layout; - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (rtype); + MONO_CHECK_ARG_NULL (rtype, 0); type = rtype->type; klass = mono_class_from_mono_type (type); - if (!mono_class_init (klass)) - mono_raise_exception (mono_class_get_exception_for_failure (klass)); + if (!mono_class_init (klass)) { + mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); + return 0; + } layout = (klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK); @@ -11874,10 +10041,10 @@ ves_icall_System_Runtime_InteropServices_Marshal_SizeOf (MonoReflectionType *rty msg = g_strdup_printf ("Type %s cannot be marshaled as an unmanaged structure.", klass->name); exc = mono_get_exception_argument ("t", msg); g_free (msg); - mono_raise_exception (exc); + mono_set_pending_exception (exc); + return 0; } - return mono_class_native_size (klass, NULL); } @@ -11887,10 +10054,8 @@ ves_icall_System_Runtime_InteropServices_Marshal_StructureToPtr (MonoObject *obj MonoMethod *method; gpointer pa [3]; - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (obj); - MONO_CHECK_ARG_NULL (dst); + MONO_CHECK_ARG_NULL (obj,); + MONO_CHECK_ARG_NULL (dst,); method = mono_marshal_get_struct_to_ptr (obj->vtable->klass); @@ -11920,10 +10085,8 @@ ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure (gpointer src, M { MonoType *t; - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (src); - MONO_CHECK_ARG_NULL (dst); + MONO_CHECK_ARG_NULL (src,); + MONO_CHECK_ARG_NULL (dst,); t = mono_type_get_underlying_type (mono_class_get_type (dst->vtable->klass)); @@ -11935,7 +10098,7 @@ ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure (gpointer src, M exc = mono_get_exception_argument ("dst", tmp); g_free (tmp); - mono_raise_exception (exc); + mono_set_pending_exception (exc); return; } @@ -11949,15 +10112,15 @@ ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure_type (gpointer s MonoDomain *domain = mono_domain_get (); MonoObject *res; - MONO_ARCH_SAVE_REGS; - if (src == NULL) return NULL; - MONO_CHECK_ARG_NULL (type); + MONO_CHECK_ARG_NULL (type, NULL); klass = mono_class_from_mono_type (type->type); - if (!mono_class_init (klass)) - mono_raise_exception (mono_class_get_exception_for_failure (klass)); + if (!mono_class_init (klass)) { + mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); + return NULL; + } res = mono_object_new (domain, klass); @@ -11974,15 +10137,15 @@ ves_icall_System_Runtime_InteropServices_Marshal_OffsetOf (MonoReflectionType *t char *fname; int match_index = -1; - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (type); - MONO_CHECK_ARG_NULL (field_name); + MONO_CHECK_ARG_NULL (type, 0); + MONO_CHECK_ARG_NULL (field_name, 0); fname = mono_string_to_utf8 (field_name); klass = mono_class_from_mono_type (type->type); - if (!mono_class_init (klass)) - mono_raise_exception (mono_class_get_exception_for_failure (klass)); + if (!mono_class_init (klass)) { + mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); + return 0; + } while (klass && match_index == -1) { MonoClassField* field; @@ -12015,7 +10178,8 @@ ves_icall_System_Runtime_InteropServices_Marshal_OffsetOf (MonoReflectionType *t exc = mono_get_exception_argument ("fieldName", tmp); g_free (tmp); - mono_raise_exception ((MonoException*)exc); + mono_set_pending_exception ((MonoException*)exc); + return 0; } info = mono_marshal_load_type_info (klass); @@ -12046,8 +10210,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalAnsi (MonoString gpointer ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalUni (MonoString *string) { - MONO_ARCH_SAVE_REGS; - if (string == NULL) return NULL; else { @@ -12119,14 +10281,14 @@ ves_icall_System_Runtime_InteropServices_Marshal_DestroyStructure (gpointer src, { MonoClass *klass; - MONO_ARCH_SAVE_REGS; - - MONO_CHECK_ARG_NULL (src); - MONO_CHECK_ARG_NULL (type); + MONO_CHECK_ARG_NULL (src,); + MONO_CHECK_ARG_NULL (type,); klass = mono_class_from_mono_type (type->type); - if (!mono_class_init (klass)) - mono_raise_exception (mono_class_get_exception_for_failure (klass)); + if (!mono_class_init (klass)) { + mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); + return; + } mono_struct_delete_old (klass, (char *)src); } @@ -12136,8 +10298,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_AllocHGlobal (int size) { gpointer res; - MONO_ARCH_SAVE_REGS; - if ((gulong)size == 0) /* This returns a valid pointer for size 0 on MS.NET */ size = 4; @@ -12177,8 +10337,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_ReAllocHGlobal (gpointer ptr, i void ves_icall_System_Runtime_InteropServices_Marshal_FreeHGlobal (void *ptr) { - MONO_ARCH_SAVE_REGS; - #ifdef HOST_WIN32 GlobalFree (ptr); #else @@ -12189,11 +10347,12 @@ ves_icall_System_Runtime_InteropServices_Marshal_FreeHGlobal (void *ptr) void* ves_icall_System_Runtime_InteropServices_Marshal_AllocCoTaskMem (int size) { - MONO_ARCH_SAVE_REGS; - #ifdef HOST_WIN32 return CoTaskMemAlloc (size); #else + if ((gulong)size == 0) + /* This returns a valid pointer for size 0 on MS.NET */ + size = 4; return g_try_malloc ((gulong)size); #endif } @@ -12201,8 +10360,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_AllocCoTaskMem (int size) void ves_icall_System_Runtime_InteropServices_Marshal_FreeCoTaskMem (void *ptr) { - MONO_ARCH_SAVE_REGS; - #ifdef HOST_WIN32 CoTaskMemFree (ptr); #else @@ -12213,8 +10370,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_FreeCoTaskMem (void *ptr) gpointer ves_icall_System_Runtime_InteropServices_Marshal_ReAllocCoTaskMem (gpointer ptr, int size) { - MONO_ARCH_SAVE_REGS; - #ifdef HOST_WIN32 return CoTaskMemRealloc (ptr, size); #else @@ -12232,8 +10387,10 @@ MonoDelegate* ves_icall_System_Runtime_InteropServices_Marshal_GetDelegateForFunctionPointerInternal (void *ftn, MonoReflectionType *type) { MonoClass *klass = mono_type_get_class (type->type); - if (!mono_class_init (klass)) - mono_raise_exception (mono_class_get_exception_for_failure (klass)); + if (!mono_class_init (klass)) { + mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); + return NULL; + } return mono_ftnptr_to_delegate (klass, ftn); } @@ -13007,7 +11164,7 @@ mono_marshal_free_dynamic_wrappers (MonoMethod *method) if (image->runtime_invoke_direct_cache) g_hash_table_remove (image->runtime_invoke_direct_cache, method); if (image->delegate_abstract_invoke_cache) - g_hash_table_foreach_remove (image->delegate_abstract_invoke_cache, signature_method_pair_matches_method, method); + g_hash_table_foreach_remove (image->delegate_abstract_invoke_cache, signature_pointer_pair_matches_pointer, method); // FIXME: Need to clear the caches in other images as well if (image->delegate_bound_static_invoke_cache) g_hash_table_remove (image->delegate_bound_static_invoke_cache, mono_method_signature (method)); @@ -13017,9 +11174,9 @@ mono_marshal_free_dynamic_wrappers (MonoMethod *method) } static gboolean -signature_method_pair_matches_signature (gpointer key, gpointer value, gpointer user_data) +signature_pointer_pair_matches_signature (gpointer key, gpointer value, gpointer user_data) { - SignatureMethodPair *pair = (SignatureMethodPair*)key; + SignaturePointerPair *pair = (SignaturePointerPair*)key; MonoMethodSignature *sig = (MonoMethodSignature*)user_data; return mono_metadata_signature_equal (pair->sig, sig); @@ -13063,11 +11220,11 @@ mono_marshal_free_inflated_wrappers (MonoMethod *method) g_hash_table_remove (method->klass->image->runtime_invoke_vtype_cache, sig); /* - * indexed by SignatureMethodPair + * indexed by SignaturePointerPair */ if (sig && method->klass->image->delegate_abstract_invoke_cache) g_hash_table_foreach_remove (method->klass->image->delegate_abstract_invoke_cache, - signature_method_pair_matches_signature, (gpointer)sig); + signature_pointer_pair_matches_signature, (gpointer)sig); /* * indexed by MonoMethod pointers diff --git a/mta-mono/vendor/mono/metadata/marshal.h b/mta-mono/vendor/mono/metadata/marshal.h index 3ba8add..eb10aeb 100644 --- a/mta-mono/vendor/mono/metadata/marshal.h +++ b/mta-mono/vendor/mono/metadata/marshal.h @@ -18,6 +18,7 @@ #include #include #include +#include #define mono_marshal_find_bitfield_offset(type, elem, byte_offset, bitmask) \ do { \ @@ -289,6 +290,9 @@ mono_type_to_stind (MonoType *type) MONO_INTERNAL; MonoMethod * mono_marshal_method_from_wrapper (MonoMethod *wrapper) MONO_INTERNAL; +WrapperInfo* +mono_wrapper_info_create (MonoMethodBuilder *mb, WrapperSubtype subtype) MONO_INTERNAL; + void mono_marshal_set_wrapper_info (MonoMethod *method, gpointer data) MONO_INTERNAL; @@ -392,6 +396,12 @@ mono_marshal_free_dynamic_wrappers (MonoMethod *method) MONO_INTERNAL; void mono_marshal_free_inflated_wrappers (MonoMethod *method) MONO_INTERNAL; +void +mono_marshal_lock_internal (void) MONO_INTERNAL; + +void +mono_marshal_unlock_internal (void) MONO_INTERNAL; + /* marshaling internal calls */ void * @@ -552,7 +562,7 @@ mono_marshal_find_nonzero_bit_offset (guint8 *buf, int len, int *byte_offset, gu MonoMethodSignature* mono_signature_no_pinvoke (MonoMethod *method) MONO_INTERNAL; -/* Called from cominterop.c */ +/* Called from cominterop.c/remoting.c */ void mono_marshal_emit_native_wrapper (MonoImage *image, MonoMethodBuilder *mb, MonoMethodSignature *sig, MonoMethodPInvoke *piinfo, MonoMarshalSpec **mspecs, gpointer func, gboolean aot, gboolean check_exceptions, gboolean func_param) MONO_INTERNAL; @@ -573,46 +583,29 @@ mono_mb_create_and_cache (GHashTable *cache, gpointer key, void mono_marshal_emit_thread_interrupt_checkpoint (MonoMethodBuilder *mb) MONO_INTERNAL; +void +mono_marshal_emit_thread_force_interrupt_checkpoint (MonoMethodBuilder *mb) MONO_INTERNAL; + void mono_marshal_use_aot_wrappers (gboolean use) MONO_INTERNAL; MonoObject * mono_marshal_xdomain_copy_value (MonoObject *val) MONO_INTERNAL; +int +mono_mb_emit_save_args (MonoMethodBuilder *mb, MonoMethodSignature *sig, gboolean save_this) MONO_INTERNAL; -#ifndef DISABLE_REMOTING +void +mono_mb_emit_restore_result (MonoMethodBuilder *mb, MonoType *return_type) MONO_INTERNAL; -MonoMethod * -mono_marshal_get_remoting_invoke (MonoMethod *method) MONO_INTERNAL; +MonoMethod* +mono_mb_create (MonoMethodBuilder *mb, MonoMethodSignature *sig, + int max_stack, WrapperInfo *info) MONO_INTERNAL; -MonoMethod * -mono_marshal_get_xappdomain_invoke (MonoMethod *method) MONO_INTERNAL; - -MonoMethod * -mono_marshal_get_remoting_invoke_for_target (MonoMethod *method, MonoRemotingTarget target_type) MONO_INTERNAL; - -MonoMethod * -mono_marshal_get_remoting_invoke_with_check (MonoMethod *method) MONO_INTERNAL; - -MonoMethod * -mono_marshal_get_stfld_wrapper (MonoType *type) MONO_INTERNAL; - -MonoMethod * -mono_marshal_get_ldfld_wrapper (MonoType *type) MONO_INTERNAL; - -MonoMethod * -mono_marshal_get_ldflda_wrapper (MonoType *type) MONO_INTERNAL; - -MonoMethod * -mono_marshal_get_ldfld_remote_wrapper (MonoClass *klass) MONO_INTERNAL; - -MonoMethod * -mono_marshal_get_stfld_remote_wrapper (MonoClass *klass) MONO_INTERNAL; - -MonoMethod * -mono_marshal_get_proxy_cancast (MonoClass *klass) MONO_INTERNAL; - -#endif +MonoMethod* +mono_mb_create_and_cache_full (GHashTable *cache, gpointer key, + MonoMethodBuilder *mb, MonoMethodSignature *sig, + int max_stack, WrapperInfo *info, gboolean *out_found) MONO_INTERNAL; G_END_DECLS diff --git a/mta-mono/vendor/mono/metadata/mempool.c b/mta-mono/vendor/mono/metadata/mempool.c index dbf3877..f02703a 100644 --- a/mta-mono/vendor/mono/metadata/mempool.c +++ b/mta-mono/vendor/mono/metadata/mempool.c @@ -29,6 +29,8 @@ */ #define MEM_ALIGN 8 +#define ALIGN_SIZE(s) (((s) + MEM_ALIGN - 1) & ~(MEM_ALIGN - 1)) +#define SIZEOF_MEM_POOL (ALIGN_SIZE (sizeof (MonoMemPool))) #if MONO_SMALL_CONFIG #define MONO_MEMPOOL_PAGESIZE 4096 @@ -91,8 +93,8 @@ mono_mempool_new_size (int initial_size) pool = g_malloc (initial_size); pool->next = NULL; - pool->pos = (guint8*)pool + sizeof (MonoMemPool); - pool->end = pool->pos + initial_size - sizeof (MonoMemPool); + pool->pos = (guint8*)pool + SIZEOF_MEM_POOL; + pool->end = pool->pos + initial_size - SIZEOF_MEM_POOL; pool->d.allocated = pool->size = initial_size; total_bytes_allocated += initial_size; return pool; @@ -165,8 +167,8 @@ mono_mempool_empty (MonoMemPool *pool) pool->allocated = 0; #else - pool->pos = (guint8*)pool + sizeof (MonoMemPool); - pool->end = pool->pos + pool->size - sizeof (MonoMemPool); + pool->pos = (guint8*)pool + SIZEOF_MEM_POOL; + pool->end = pool->pos + pool->size - SIZEOF_MEM_POOL; #endif } @@ -239,7 +241,7 @@ static int get_next_size (MonoMemPool *pool, int size) { int target = pool->next? pool->next->size: pool->size; - size += sizeof (MonoMemPool); + size += SIZEOF_MEM_POOL; /* increase the size */ target += target / 2; while (target < size) { @@ -264,8 +266,8 @@ gpointer mono_mempool_alloc (MonoMemPool *pool, guint size) { gpointer rval; - - size = (size + MEM_ALIGN - 1) & ~(MEM_ALIGN - 1); + + size = ALIGN_SIZE (size); #ifdef MALLOC_ALLOCATION { @@ -291,25 +293,25 @@ mono_mempool_alloc (MonoMemPool *pool, guint size) if (G_UNLIKELY (pool->pos >= pool->end)) { pool->pos -= size; if (size >= 4096) { - MonoMemPool *np = g_malloc (sizeof (MonoMemPool) + size); + MonoMemPool *np = g_malloc (SIZEOF_MEM_POOL + size); np->next = pool->next; pool->next = np; - np->pos = (guint8*)np + sizeof (MonoMemPool); - np->size = sizeof (MonoMemPool) + size; - np->end = np->pos + np->size - sizeof (MonoMemPool); - pool->d.allocated += sizeof (MonoMemPool) + size; - total_bytes_allocated += sizeof (MonoMemPool) + size; - return (guint8*)np + sizeof (MonoMemPool); + np->pos = (guint8*)np + SIZEOF_MEM_POOL; + np->size = SIZEOF_MEM_POOL + size; + np->end = np->pos + np->size - SIZEOF_MEM_POOL; + pool->d.allocated += SIZEOF_MEM_POOL + size; + total_bytes_allocated += SIZEOF_MEM_POOL + size; + return (guint8*)np + SIZEOF_MEM_POOL; } else { int new_size = get_next_size (pool, size); MonoMemPool *np = g_malloc (new_size); np->next = pool->next; pool->next = np; - pool->pos = (guint8*)np + sizeof (MonoMemPool); - np->pos = (guint8*)np + sizeof (MonoMemPool); + pool->pos = (guint8*)np + SIZEOF_MEM_POOL; + np->pos = (guint8*)np + SIZEOF_MEM_POOL; np->size = new_size; np->end = np->pos; - pool->end = pool->pos + new_size - sizeof (MonoMemPool); + pool->end = pool->pos + new_size - SIZEOF_MEM_POOL; pool->d.allocated += new_size; total_bytes_allocated += new_size; @@ -335,7 +337,7 @@ mono_mempool_alloc0 (MonoMemPool *pool, guint size) #ifdef MALLOC_ALLOCATION rval = mono_mempool_alloc (pool, size); #else - size = (size + MEM_ALIGN - 1) & ~(MEM_ALIGN - 1); + size = ALIGN_SIZE (size); rval = pool->pos; pool->pos = (guint8*)rval + size; diff --git a/mta-mono/vendor/mono/metadata/metadata-internals.h b/mta-mono/vendor/mono/metadata/metadata-internals.h index c738d53..936afbd 100644 --- a/mta-mono/vendor/mono/metadata/metadata-internals.h +++ b/mta-mono/vendor/mono/metadata/metadata-internals.h @@ -204,7 +204,7 @@ struct _MonoImage { guint32 module_count; gboolean *modules_loaded; - MonoImage **files; + MonoImage **files; /*protected by the image lock*/ gpointer aot_module; @@ -261,14 +261,12 @@ struct _MonoImage { GHashTable *runtime_invoke_vtype_cache; /* - * indexed by SignatureMethodPair + * indexed by SignaturePointerPair */ GHashTable *delegate_abstract_invoke_cache; - - /* - * indexed by SignatureMethodPair - */ GHashTable *delegate_bound_static_invoke_cache; + GHashTable *native_func_wrapper_cache; + /* * indexed by MonoMethod pointers */ @@ -277,6 +275,8 @@ struct _MonoImage { GHashTable *managed_wrapper_cache; GHashTable *native_wrapper_cache; GHashTable *native_wrapper_aot_cache; + GHashTable *native_wrapper_check_cache; + GHashTable *native_wrapper_aot_check_cache; GHashTable *native_func_wrapper_aot_cache; GHashTable *remoting_invoke_cache; GHashTable *synchronized_cache; @@ -647,7 +647,8 @@ mono_metadata_interfaces_from_typedef_full (MonoImage *image, MonoClass ***interfaces, guint *count, gboolean heap_alloc_result, - MonoGenericContext *context) MONO_INTERNAL; + MonoGenericContext *context, + MonoError *error) MONO_INTERNAL; MonoArrayType * mono_metadata_parse_array_full (MonoImage *image, @@ -673,7 +674,8 @@ mono_metadata_parse_method_signature_full (MonoImage *image, MonoGenericContainer *generic_container, int def, const char *ptr, - const char **rptr); + const char **rptr, + MonoError *error); MONO_API MonoMethodHeader * mono_metadata_parse_mh_full (MonoImage *image, @@ -794,9 +796,10 @@ MonoException *mono_get_exception_field_access_msg (const char *msg) MONO_INTERN MonoException *mono_get_exception_method_access_msg (const char *msg) MONO_INTERNAL; -MonoMethod* method_from_method_def_or_ref (MonoImage *m, guint32 tok, MonoGenericContext *context) MONO_INTERNAL; +MonoMethod* method_from_method_def_or_ref (MonoImage *m, guint32 tok, MonoGenericContext *context, MonoError *error) MONO_INTERNAL; -MonoMethod *mono_get_method_constrained_with_method (MonoImage *image, MonoMethod *method, MonoClass *constrained_class, MonoGenericContext *context) MONO_INTERNAL; +MonoMethod *mono_get_method_constrained_with_method (MonoImage *image, MonoMethod *method, MonoClass *constrained_class, MonoGenericContext *context, MonoError *error) MONO_INTERNAL; +MonoMethod *mono_get_method_constrained_checked (MonoImage *image, guint32 token, MonoClass *constrained_class, MonoGenericContext *context, MonoMethod **cil_method, MonoError *error) MONO_INTERNAL; void mono_type_set_alignment (MonoTypeEnum type, int align) MONO_INTERNAL; @@ -804,5 +807,11 @@ MonoAotCacheConfig *mono_get_aot_cache_config (void) MONO_INTERNAL; MonoType * mono_type_create_from_typespec_checked (MonoImage *image, guint32 type_spec, MonoError *error) MONO_INTERNAL; +MonoMethodSignature* +mono_method_get_signature_checked (MonoMethod *method, MonoImage *image, guint32 token, MonoGenericContext *context, MonoError *error) MONO_INTERNAL; + +MonoMethod * +mono_get_method_checked (MonoImage *image, guint32 token, MonoClass *klass, MonoGenericContext *context, MonoError *error) MONO_INTERNAL; + #endif /* __MONO_METADATA_INTERNALS_H__ */ diff --git a/mta-mono/vendor/mono/metadata/metadata-verify.c b/mta-mono/vendor/mono/metadata/metadata-verify.c index e72f97a..af9a114 100644 --- a/mta-mono/vendor/mono/metadata/metadata-verify.c +++ b/mta-mono/vendor/mono/metadata/metadata-verify.c @@ -4296,19 +4296,13 @@ mono_verifier_verify_methodimpl_row (MonoImage *image, guint32 row, MonoError *e mono_metadata_decode_row (table, row, data, MONO_METHODIMPL_SIZE); - body = method_from_method_def_or_ref (image, data [MONO_METHODIMPL_BODY], NULL); - if (!body || mono_loader_get_last_error ()) { - mono_loader_clear_error (); - mono_error_set_bad_image (error, image, "Invalid methodimpl body for row %x", row); + body = method_from_method_def_or_ref (image, data [MONO_METHODIMPL_BODY], NULL, error); + if (!body) return FALSE; - } - declaration = method_from_method_def_or_ref (image, data [MONO_METHODIMPL_DECLARATION], NULL); - if (!declaration || mono_loader_get_last_error ()) { - mono_loader_clear_error (); - mono_error_set_bad_image (error, image, "Invalid methodimpl declaration for row %x", row); + declaration = method_from_method_def_or_ref (image, data [MONO_METHODIMPL_DECLARATION], NULL, error); + if (!declaration) return FALSE; - } /* FIXME mono_class_setup_supertypes (class); diff --git a/mta-mono/vendor/mono/metadata/metadata.c b/mta-mono/vendor/mono/metadata/metadata.c index 6b59802..26d079d 100644 --- a/mta-mono/vendor/mono/metadata/metadata.c +++ b/mta-mono/vendor/mono/metadata/metadata.c @@ -1761,6 +1761,8 @@ mono_metadata_get_param_attrs (MonoImage *m, int def, int param_count) MonoMethodSignature* mono_metadata_parse_signature_full (MonoImage *image, MonoGenericContainer *generic_container, guint32 token) { + MonoError error; + MonoMethodSignature *ret; MonoTableInfo *tables = image->tables; guint32 idx = mono_metadata_token_index (token); guint32 sig; @@ -1776,7 +1778,12 @@ mono_metadata_parse_signature_full (MonoImage *image, MonoGenericContainer *gene ptr = mono_metadata_blob_heap (image, sig); mono_metadata_decode_blob_size (ptr, &ptr); - return mono_metadata_parse_method_signature_full (image, generic_container, 0, ptr, NULL); + ret = mono_metadata_parse_method_signature_full (image, generic_container, 0, ptr, NULL, &error); + if (!ret) { + mono_loader_set_error_from_mono_error (&error); + mono_error_cleanup (&error); /*FIXME don't swallow the error message*/ + } + return ret; } /* @@ -1893,7 +1900,7 @@ mono_metadata_signature_size (MonoMethodSignature *sig) */ MonoMethodSignature * mono_metadata_parse_method_signature_full (MonoImage *m, MonoGenericContainer *container, - int def, const char *ptr, const char **rptr) + int def, const char *ptr, const char **rptr, MonoError *error) { MonoMethodSignature *method; int i, *pattrs = NULL; @@ -1901,6 +1908,8 @@ mono_metadata_parse_method_signature_full (MonoImage *m, MonoGenericContainer *c guint32 gen_param_count = 0; gboolean is_open = FALSE; + mono_error_init (error); + if (*ptr & 0x10) gen_param_count = 1; if (*ptr & 0x20) @@ -1927,6 +1936,10 @@ mono_metadata_parse_method_signature_full (MonoImage *m, MonoGenericContainer *c if (!method->ret) { mono_metadata_free_method_signature (method); g_free (pattrs); + if (mono_loader_get_last_error ()) + mono_error_set_from_loader_error (error); + else + mono_error_set_bad_image (error, m, "Could not parse return type signature"); return NULL; } is_open = mono_class_is_open_constructed_type (method->ret); @@ -1935,12 +1948,14 @@ mono_metadata_parse_method_signature_full (MonoImage *m, MonoGenericContainer *c for (i = 0; i < method->param_count; ++i) { if (*ptr == MONO_TYPE_SENTINEL) { if (method->call_convention != MONO_CALL_VARARG || def) { - g_warning ("found sentinel for methoddef or no vararg method 0x%08x on image %s", def, m->name); + g_assert (!mono_loader_get_last_error ()); + mono_error_set_bad_image (error, m, "Found sentinel for methoddef or no vararg"); g_free (pattrs); return NULL; } if (method->sentinelpos >= 0) { - g_warning ("found sentinel twice in the same signature for method 0x%08x on image %s", def, m->name); + g_assert (!mono_loader_get_last_error ()); + mono_error_set_bad_image (error, m, "Found sentinel twice in the same signature."); g_free (pattrs); return NULL; } @@ -1949,6 +1964,10 @@ mono_metadata_parse_method_signature_full (MonoImage *m, MonoGenericContainer *c } method->params [i] = mono_metadata_parse_type_full (m, container, MONO_PARSE_PARAM, pattrs ? pattrs [i+1] : 0, ptr, &ptr); if (!method->params [i]) { + if (mono_loader_get_last_error ()) + mono_error_set_from_loader_error (error); + else + mono_error_set_bad_image (error, m, "Could not parse type argument %d on method signature", i); mono_metadata_free_method_signature (method); g_free (pattrs); return NULL; @@ -1974,6 +1993,7 @@ mono_metadata_parse_method_signature_full (MonoImage *m, MonoGenericContainer *c * Add signature to a cache and increase ref count... */ + g_assert (!mono_loader_get_last_error ()); return method; } @@ -1994,7 +2014,14 @@ mono_metadata_parse_method_signature_full (MonoImage *m, MonoGenericContainer *c MonoMethodSignature * mono_metadata_parse_method_signature (MonoImage *m, int def, const char *ptr, const char **rptr) { - return mono_metadata_parse_method_signature_full (m, NULL, def, ptr, rptr); + MonoError error; + MonoMethodSignature *ret; + ret = mono_metadata_parse_method_signature_full (m, NULL, def, ptr, rptr, &error); + if (!ret) { + mono_loader_set_error_from_mono_error (&error); + mono_error_cleanup (&error); /*FIXME don't swallow the error message*/ + } + return ret; } /* @@ -2735,9 +2762,6 @@ free_inflated_signature (MonoInflatedMethodSignature *sig) g_free (sig); } -/* - * LOCKING: assumes the loader lock is held. - */ MonoMethodInflated* mono_method_inflated_lookup (MonoMethodInflated* method, gboolean cache) { @@ -2753,19 +2777,15 @@ mono_method_inflated_lookup (MonoMethodInflated* method, gboolean cache) collect_data_free (&data); - if (cache) { - mono_image_set_lock (set); + mono_image_set_lock (set); + res = g_hash_table_lookup (set->gmethod_cache, method); + if (!res && cache) { g_hash_table_insert (set->gmethod_cache, method, method); - mono_image_set_unlock (set); - - return method; - } else { - mono_image_set_lock (set); - res = g_hash_table_lookup (set->gmethod_cache, method); - mono_image_set_unlock (set); - - return res; + res = method; } + + mono_image_set_unlock (set); + return res; } /* @@ -3227,11 +3247,16 @@ do_mono_metadata_parse_type (MonoType *type, MonoImage *m, MonoGenericContainer if (!type->data.type) return FALSE; break; - case MONO_TYPE_FNPTR: - type->data.method = mono_metadata_parse_method_signature_full (m, container, 0, ptr, &ptr); - if (!type->data.method) + case MONO_TYPE_FNPTR: { + MonoError error; + type->data.method = mono_metadata_parse_method_signature_full (m, container, 0, ptr, &ptr, &error); + if (!type->data.method) { + mono_loader_set_error_from_mono_error (&error); + mono_error_cleanup (&error); /*FIXME don't swallow the error message*/ return FALSE; + } break; + } case MONO_TYPE_ARRAY: type->data.array = mono_metadata_parse_array_internal (m, container, transient, ptr, &ptr); if (!type->data.array) @@ -4011,7 +4036,7 @@ mono_metadata_typedef_from_method (MonoImage *meta, guint32 index) * Returns: TRUE on success, FALSE on failure. */ gboolean -mono_metadata_interfaces_from_typedef_full (MonoImage *meta, guint32 index, MonoClass ***interfaces, guint *count, gboolean heap_alloc_result, MonoGenericContext *context) +mono_metadata_interfaces_from_typedef_full (MonoImage *meta, guint32 index, MonoClass ***interfaces, guint *count, gboolean heap_alloc_result, MonoGenericContext *context, MonoError *error) { MonoTableInfo *tdef = &meta->tables [MONO_TABLE_INTERFACEIMPL]; locator_t loc; @@ -4022,6 +4047,8 @@ mono_metadata_interfaces_from_typedef_full (MonoImage *meta, guint32 index, Mono *interfaces = NULL; *count = 0; + mono_error_init (error); + if (!tdef->base) return TRUE; @@ -4057,19 +4084,15 @@ mono_metadata_interfaces_from_typedef_full (MonoImage *meta, guint32 index, Mono pos = start; while (pos < tdef->rows) { - MonoError error; MonoClass *iface; mono_metadata_decode_row (tdef, pos, cols, MONO_INTERFACEIMPL_SIZE); if (cols [MONO_INTERFACEIMPL_CLASS] != loc.idx) break; iface = mono_class_get_and_inflate_typespec_checked ( - meta, mono_metadata_token_from_dor (cols [MONO_INTERFACEIMPL_INTERFACE]), context, &error); - if (iface == NULL) { - mono_loader_set_error_from_mono_error (&error); - mono_error_cleanup (&error); /* FIXME Don't swallow the error */ + meta, mono_metadata_token_from_dor (cols [MONO_INTERFACEIMPL_INTERFACE]), context, error); + if (iface == NULL) return FALSE; - } result [pos - start] = iface; ++pos; } @@ -4095,10 +4118,12 @@ mono_metadata_interfaces_from_typedef_full (MonoImage *meta, guint32 index, Mono MonoClass** mono_metadata_interfaces_from_typedef (MonoImage *meta, guint32 index, guint *count) { - MonoClass **interfaces; + MonoError error; + MonoClass **interfaces = NULL; gboolean rv; - rv = mono_metadata_interfaces_from_typedef_full (meta, index, &interfaces, count, TRUE, NULL); + rv = mono_metadata_interfaces_from_typedef_full (meta, index, &interfaces, count, TRUE, NULL, &error); + g_assert (mono_error_ok (&error)); /* FIXME dont swallow the error */ if (rv) return interfaces; else @@ -5308,10 +5333,8 @@ mono_type_create_from_typespec (MonoImage *image, guint32 type_spec) { MonoError error; MonoType *type = mono_type_create_from_typespec_checked (image, type_spec, &error); - if (!type) { - mono_loader_set_error_from_mono_error (&error); - mono_error_cleanup (&error); /* FIXME don't swallow error*/ - } + if (!type) + g_error ("Could not create typespec %x due to %s", type_spec, mono_error_get_message (&error)); return type; } @@ -5701,18 +5724,25 @@ mono_metadata_get_marshal_info (MonoImage *meta, guint32 idx, gboolean is_field) } MonoMethod* -method_from_method_def_or_ref (MonoImage *m, guint32 tok, MonoGenericContext *context) +method_from_method_def_or_ref (MonoImage *m, guint32 tok, MonoGenericContext *context, MonoError *error) { + MonoMethod *result = NULL; guint32 idx = tok >> MONO_METHODDEFORREF_BITS; + mono_error_init (error); + switch (tok & MONO_METHODDEFORREF_MASK) { case MONO_METHODDEFORREF_METHODDEF: - return mono_get_method_full (m, MONO_TOKEN_METHOD_DEF | idx, NULL, context); + result = mono_get_method_checked (m, MONO_TOKEN_METHOD_DEF | idx, NULL, context, error); + break; case MONO_METHODDEFORREF_METHODREF: - return mono_get_method_full (m, MONO_TOKEN_MEMBER_REF | idx, NULL, context); + result = mono_get_method_checked (m, MONO_TOKEN_MEMBER_REF | idx, NULL, context, error); + break; + default: + mono_error_set_bad_image (error, m, "Invalid MethodDefOfRef token %x", tok); } - g_assert_not_reached (); - return NULL; + + return result; } /* @@ -5773,21 +5803,25 @@ mono_class_get_overrides_full (MonoImage *image, guint32 type_token, MonoMethod MonoMethod *method; if (!mono_verifier_verify_methodimpl_row (image, start + i, &error)) { - mono_error_cleanup (&error); + mono_error_cleanup (&error); /* FIXME don't swallow the error */ ok = FALSE; break; } mono_metadata_decode_row (tdef, start + i, cols, MONO_METHODIMPL_SIZE); method = method_from_method_def_or_ref ( - image, cols [MONO_METHODIMPL_DECLARATION], generic_context); - if (method == NULL) + image, cols [MONO_METHODIMPL_DECLARATION], generic_context, &error); + if (method == NULL) { + mono_error_cleanup (&error); /* FIXME don't swallow the error */ ok = FALSE; + } result [i * 2] = method; method = method_from_method_def_or_ref ( - image, cols [MONO_METHODIMPL_BODY], generic_context); - if (method == NULL) + image, cols [MONO_METHODIMPL_BODY], generic_context, &error); + if (method == NULL) { + mono_error_cleanup (&error); /* FIXME don't swallow the error */ ok = FALSE; + } result [i * 2 + 1] = method; } diff --git a/mta-mono/vendor/mono/metadata/monitor.c b/mta-mono/vendor/mono/metadata/monitor.c index d713709..5cb4400 100644 --- a/mta-mono/vendor/mono/metadata/monitor.c +++ b/mta-mono/vendor/mono/metadata/monitor.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -90,21 +91,49 @@ static MonoThreadsSync *monitor_freelist; static MonitorArray *monitor_allocated; static int array_size = 16; -#ifdef HAVE_KW_THREAD -static __thread gsize tls_pthread_self MONO_TLS_FAST; -#endif +static inline guint32 +mon_status_get_owner (guint32 status) +{ + return status & OWNER_MASK; +} -#ifndef HOST_WIN32 -#ifdef HAVE_KW_THREAD -#define GetCurrentThreadId() tls_pthread_self -#else -/* - * The usual problem: we can't replace GetCurrentThreadId () with a macro because - * it is in a public header. - */ -#define GetCurrentThreadId() ((gsize)pthread_self ()) -#endif -#endif +static inline guint32 +mon_status_set_owner (guint32 status, guint32 owner) +{ + return (status & ENTRY_COUNT_MASK) | owner; +} + +static inline gint32 +mon_status_get_entry_count (guint32 status) +{ + gint32 entry_count = (gint32)((status & ENTRY_COUNT_MASK) >> ENTRY_COUNT_SHIFT); + gint32 zero = (gint32)(((guint32)ENTRY_COUNT_ZERO) >> ENTRY_COUNT_SHIFT); + return entry_count - zero; +} + +static inline guint32 +mon_status_init_entry_count (guint32 status) +{ + return (status & OWNER_MASK) | ENTRY_COUNT_ZERO; +} + +static inline guint32 +mon_status_increment_entry_count (guint32 status) +{ + return status + (1 << ENTRY_COUNT_SHIFT); +} + +static inline guint32 +mon_status_decrement_entry_count (guint32 status) +{ + return status - (1 << ENTRY_COUNT_SHIFT); +} + +static inline gboolean +mon_status_have_waiters (guint32 status) +{ + return status & ENTRY_COUNT_WAITERS; +} void mono_monitor_init (void) @@ -141,19 +170,6 @@ mono_monitor_cleanup (void) */ } -/* - * mono_monitor_init_tls: - * - * Setup TLS variables used by the monitor code for the current thread. - */ -void -mono_monitor_init_tls (void) -{ -#if !defined(HOST_WIN32) && defined(HAVE_KW_THREAD) - tls_pthread_self = (gsize) pthread_self (); -#endif -} - static int monitor_is_on_freelist (MonoThreadsSync *mon) { @@ -194,11 +210,11 @@ mono_locks_dump (gboolean include_untaken) } else { if (!monitor_is_on_freelist (mon->data)) { MonoObject *holder = mono_gc_weak_link_get (&mon->data); - if (mon->owner) { - g_print ("Lock %p in object %p held by thread %p, nest level: %d\n", - mon, holder, (void*)mon->owner, mon->nest); + if (mon_status_get_owner (mon->status)) { + g_print ("Lock %p in object %p held by thread %d, nest level: %d\n", + mon, holder, mon_status_get_owner (mon->status), mon->nest); if (mon->entry_sem) - g_print ("\tWaiting on semaphore %p: %d\n", mon->entry_sem, mon->entry_count); + g_print ("\tWaiting on semaphore %p: %d\n", mon->entry_sem, mon_status_get_entry_count (mon->status)); } else if (include_untaken) { g_print ("Lock %p in object %p untaken\n", mon, holder); } @@ -227,7 +243,6 @@ mon_finalize (MonoThreadsSync *mon) */ g_assert (mon->wait_list == NULL); - mon->entry_count = 0; /* owner and nest are set in mon_new, no need to zero them out */ mon->data = monitor_freelist; @@ -255,12 +270,12 @@ mon_new (gsize id) if (new->wait_list) { /* Orphaned events left by aborted threads */ while (new->wait_list) { - LOCK_DEBUG (g_message (G_GNUC_PRETTY_FUNCTION ": (%d): Closing orphaned event %d", GetCurrentThreadId (), new->wait_list->data)); + LOCK_DEBUG (g_message (G_GNUC_PRETTY_FUNCTION ": (%d): Closing orphaned event %d", mono_thread_info_get_small_id (), new->wait_list->data)); CloseHandle (new->wait_list->data); new->wait_list = g_slist_remove (new->wait_list, new->wait_list->data); } } - mono_gc_weak_link_remove (&new->data, FALSE); + mono_gc_weak_link_remove (&new->data, TRUE); new->data = monitor_freelist; monitor_freelist = new; } @@ -299,7 +314,8 @@ mon_new (gsize id) new = monitor_freelist; monitor_freelist = new->data; - new->owner = id; + new->status = mon_status_set_owner (0, id); + new->status = mon_status_init_entry_count (new->status); new->nest = 1; new->data = NULL; @@ -399,6 +415,23 @@ mono_object_hash (MonoObject* obj) #endif } +static void +mon_decrement_entry_count (MonoThreadsSync *mon) +{ + guint32 old_status, tmp_status, new_status; + + /* Decrement entry count */ + old_status = mon->status; + for (;;) { + new_status = mon_status_decrement_entry_count (old_status); + tmp_status = InterlockedCompareExchange ((gint32*)&mon->status, new_status, old_status); + if (tmp_status == old_status) { + break; + } + old_status = tmp_status; + } +} + /* If allow_interruption==TRUE, the method will be interrumped if abort or suspend * is requested. In this case it returns -1. */ @@ -406,12 +439,14 @@ static inline gint32 mono_monitor_try_enter_internal (MonoObject *obj, guint32 ms, gboolean allow_interruption) { MonoThreadsSync *mon; - gsize id = GetCurrentThreadId (); + gsize id = mono_thread_info_get_small_id (); HANDLE sem; guint32 then = 0, now, delta; guint32 waitms; guint32 ret; + guint32 new_status, old_status, tmp_status; MonoInternalThread *thread; + gboolean interrupted = FALSE; LOCK_DEBUG (g_message("%s: (%d) Trying to lock object %p (%d ms)", __func__, id, obj, ms)); @@ -428,7 +463,7 @@ retry: mono_monitor_allocator_lock (); mon = mon_new (id); if (InterlockedCompareExchangePointer ((gpointer*)&obj->synchronisation, mon, NULL) == NULL) { - mono_gc_weak_link_add (&mon->data, obj, FALSE); + mono_gc_weak_link_add (&mon->data, obj, TRUE); mono_monitor_allocator_unlock (); /* Successfully locked */ return 1; @@ -443,7 +478,7 @@ retry: lw.sync = mon; lw.lock_word |= LOCK_WORD_FAT_HASH; if (InterlockedCompareExchangePointer ((gpointer*)&obj->synchronisation, lw.sync, oldlw) == oldlw) { - mono_gc_weak_link_add (&mon->data, obj, FALSE); + mono_gc_weak_link_add (&mon->data, obj, TRUE); mono_monitor_allocator_unlock (); /* Successfully locked */ return 1; @@ -509,12 +544,15 @@ retry: /* This case differs from Dice's case 3 because we don't * deflate locks or cache unused lock records */ - if (G_LIKELY (mon->owner == 0)) { + old_status = mon->status; + if (G_LIKELY (mon_status_get_owner (old_status) == 0)) { /* Try to install our ID in the owner field, nest - * should have been left at 1 by the previous unlock - * operation - */ - if (G_LIKELY (InterlockedCompareExchangePointer ((gpointer *)&mon->owner, (gpointer)id, 0) == 0)) { + * should have been left at 1 by the previous unlock + * operation + */ + new_status = mon_status_set_owner (old_status, id); + tmp_status = InterlockedCompareExchange ((gint32*)&mon->status, new_status, old_status); + if (G_LIKELY (tmp_status == old_status)) { /* Success */ g_assert (mon->nest == 1); return 1; @@ -525,7 +563,7 @@ retry: } /* If the object is currently locked by this thread... */ - if (mon->owner == id) { + if (mon_status_get_owner (old_status) == id) { mon->nest++; return 1; } @@ -553,12 +591,15 @@ retry_contended: /* This case differs from Dice's case 3 because we don't * deflate locks or cache unused lock records */ - if (G_LIKELY (mon->owner == 0)) { + old_status = mon->status; + if (G_LIKELY (mon_status_get_owner (old_status) == 0)) { /* Try to install our ID in the owner field, nest * should have been left at 1 by the previous unlock * operation */ - if (G_LIKELY (InterlockedCompareExchangePointer ((gpointer *)&mon->owner, (gpointer)id, 0) == 0)) { + new_status = mon_status_set_owner (old_status, id); + tmp_status = InterlockedCompareExchange ((gint32*)&mon->status, new_status, old_status); + if (G_LIKELY (tmp_status == old_status)) { /* Success */ g_assert (mon->nest == 1); mono_profiler_monitor_event (obj, MONO_PROFILER_MONITOR_DONE); @@ -567,7 +608,7 @@ retry_contended: } /* If the object is currently locked by this thread... */ - if (mon->owner == id) { + if (mon_status_get_owner (old_status) == id) { mon->nest++; mono_profiler_monitor_event (obj, MONO_PROFILER_MONITOR_DONE); return 1; @@ -585,30 +626,30 @@ retry_contended: CloseHandle (sem); } } - - /* If we need to time out, record a timestamp and adjust ms, - * because WaitForSingleObject doesn't tell us how long it - * waited for. - * - * Don't block forever here, because theres a chance the owner - * thread released the lock while we were creating the - * semaphore: we would not get the wakeup. Using the event - * handle technique from pulse/wait would involve locking the - * lock struct and therefore slowing down the fast path. + + /* + * We need to register ourselves as waiting if it is the first time we are waiting, + * of if we were signaled and failed to acquire the lock. */ + if (!interrupted) { + old_status = mon->status; + for (;;) { + if (mon_status_get_owner (old_status) == 0) + goto retry_contended; + new_status = mon_status_increment_entry_count (old_status); + tmp_status = InterlockedCompareExchange ((gint32*)&mon->status, new_status, old_status); + if (tmp_status == old_status) { + break; + } + old_status = tmp_status; + } + } + if (ms != INFINITE) { then = mono_msec_ticks (); - if (ms < 100) { - waitms = ms; - } else { - waitms = 100; - } - } else { - waitms = 100; } + waitms = ms; - InterlockedIncrement (&mon->entry_count); - #ifndef DISABLE_PERFCOUNTERS mono_perfcounters->thread_queue_len++; mono_perfcounters->thread_queue_max++; @@ -625,64 +666,61 @@ retry_contended: mono_thread_clr_state (thread, ThreadState_WaitSleepJoin); - InterlockedDecrement (&mon->entry_count); #ifndef DISABLE_PERFCOUNTERS mono_perfcounters->thread_queue_len--; #endif - if (ms != INFINITE) { - now = mono_msec_ticks (); - - if (now < then) { - /* The counter must have wrapped around */ - LOCK_DEBUG (g_message ("%s: wrapped around! now=0x%x then=0x%x", __func__, now, then)); - - now += (0xffffffff - then); - then = 0; + if (ret == WAIT_IO_COMPLETION && !allow_interruption) { + interrupted = TRUE; + /* + * We have to obey a stop/suspend request even if + * allow_interruption is FALSE to avoid hangs at shutdown. + */ + if (!mono_thread_test_state (mono_thread_internal_current (), (ThreadState_StopRequested|ThreadState_SuspendRequested))) { + if (ms != INFINITE) { + now = mono_msec_ticks (); + if (now < then) { + LOCK_DEBUG (g_message ("%s: wrapped around! now=0x%x then=0x%x", __func__, now, then)); - LOCK_DEBUG (g_message ("%s: wrap rejig: now=0x%x then=0x%x delta=0x%x", __func__, now, then, now-then)); - } - - delta = now - then; - if (delta >= ms) { - ms = 0; - } else { - ms -= delta; - } + now += (0xffffffff - then); + then = 0; - if ((ret == WAIT_TIMEOUT || (ret == WAIT_IO_COMPLETION && !allow_interruption)) && ms > 0) { - /* More time left */ - goto retry_contended; - } - } else { - if (ret == WAIT_TIMEOUT || (ret == WAIT_IO_COMPLETION && !allow_interruption)) { - if (ret == WAIT_IO_COMPLETION && (mono_thread_test_state (mono_thread_internal_current (), (ThreadState_StopRequested|ThreadState_SuspendRequested)))) { - /* - * We have to obey a stop/suspend request even if - * allow_interruption is FALSE to avoid hangs at shutdown. - */ - mono_profiler_monitor_event (obj, MONO_PROFILER_MONITOR_FAIL); - return -1; + LOCK_DEBUG (g_message ("%s: wrap rejig: now=0x%x then=0x%x delta=0x%x", __func__, now, then, now-then)); + } + + delta = now - then; + if (delta >= ms) { + ms = 0; + } else { + ms -= delta; + } } - /* Infinite wait, so just try again */ + /* retry from the top */ goto retry_contended; } - } - - if (ret == WAIT_OBJECT_0) { + } else if (ret == WAIT_OBJECT_0) { + interrupted = FALSE; /* retry from the top */ goto retry_contended; + } else if (ret == WAIT_TIMEOUT) { + /* we're done */ } - /* We must have timed out */ - LOCK_DEBUG (g_message ("%s: (%d) timed out waiting, returning FALSE", __func__, id)); + /* Timed out or interrupted */ + mon_decrement_entry_count (mon); mono_profiler_monitor_event (obj, MONO_PROFILER_MONITOR_FAIL); - if (ret == WAIT_IO_COMPLETION) + if (ret == WAIT_IO_COMPLETION) { + LOCK_DEBUG (g_message ("%s: (%d) interrupted waiting, returning -1", __func__, id)); return -1; - else + } else if (ret == WAIT_TIMEOUT) { + LOCK_DEBUG (g_message ("%s: (%d) timed out waiting, returning FALSE", __func__, id)); return 0; + } else { + g_assert_not_reached (); + return 0; + } } gboolean @@ -702,8 +740,9 @@ mono_monitor_exit (MonoObject *obj) { MonoThreadsSync *mon; guint32 nest; + guint32 new_status, old_status, tmp_status; - LOCK_DEBUG (g_message ("%s: (%d) Unlocking %p", __func__, GetCurrentThreadId (), obj)); + LOCK_DEBUG (g_message ("%s: (%d) Unlocking %p", __func__, mono_thread_info_get_small_id (), obj)); if (G_UNLIKELY (!obj)) { mono_raise_exception (mono_get_exception_argument_null ("obj")); @@ -726,31 +765,43 @@ mono_monitor_exit (MonoObject *obj) /* No one ever used Enter. Just ignore the Exit request as MS does */ return; } - if (G_UNLIKELY (mon->owner != GetCurrentThreadId ())) { + + old_status = mon->status; + if (G_UNLIKELY (mon_status_get_owner (old_status) != mono_thread_info_get_small_id ())) { return; } nest = mon->nest - 1; if (nest == 0) { - LOCK_DEBUG (g_message ("%s: (%d) Object %p is now unlocked", __func__, GetCurrentThreadId (), obj)); + /* + * Release lock and do the wakeup stuff. It's possible that + * the last blocking thread gave up waiting just before we + * release the semaphore resulting in a negative entry count + * and a futile wakeup next time there's contention for this + * object. + */ + for (;;) { + gboolean have_waiters = mon_status_have_waiters (old_status); + + new_status = mon_status_set_owner (old_status, 0); + if (have_waiters) + new_status = mon_status_decrement_entry_count (new_status); + tmp_status = InterlockedCompareExchange ((gint32*)&mon->status, new_status, old_status); + if (tmp_status == old_status) { + if (have_waiters) + ReleaseSemaphore (mon->entry_sem, 1, NULL); + break; + } + old_status = tmp_status; + } + LOCK_DEBUG (g_message ("%s: (%d) Object %p is now unlocked", __func__, mono_thread_info_get_small_id (), obj)); /* object is now unlocked, leave nest==1 so we don't * need to set it when the lock is reacquired */ - mon->owner = 0; - /* Do the wakeup stuff. It's possible that the last - * blocking thread gave up waiting just before we - * release the semaphore resulting in a futile wakeup - * next time there's contention for this object, but - * it means we don't have to waste time locking the - * struct. - */ - if (mon->entry_count > 0) { - ReleaseSemaphore (mon->entry_sem, 1, NULL); - } } else { - LOCK_DEBUG (g_message ("%s: (%d) Object %p is now locked %d times", __func__, GetCurrentThreadId (), obj, nest)); + LOCK_DEBUG (g_message ("%s: (%d) Object %p is now locked %d times", __func__, mono_thread_info_get_small_id (), obj, nest)); mon->nest = nest; } } @@ -774,464 +825,23 @@ mono_monitor_get_object_monitor_weak_link (MonoObject *object) return NULL; } -#ifndef DISABLE_JIT - -static void -emit_obj_syncp_check (MonoMethodBuilder *mb, int syncp_loc, int *obj_null_branch, int *true_locktaken_branch, int *syncp_true_false_branch, - int *thin_hash_branch, gboolean branch_on_true) -{ - /* - ldarg 0 obj - brfalse.s obj_null - */ - - mono_mb_emit_byte (mb, CEE_LDARG_0); - *obj_null_branch = mono_mb_emit_short_branch (mb, CEE_BRFALSE_S); - - /* - ldarg.1 - ldind.i1 - brtrue.s true_locktaken - */ - if (true_locktaken_branch) { - mono_mb_emit_byte (mb, CEE_LDARG_1); - mono_mb_emit_byte (mb, CEE_LDIND_I1); - *true_locktaken_branch = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); - } - - /* - ldarg 0 obj - conv.i objp - ldc.i4 MONO_STRUCT_OFFSET(MonoObject, synchronisation) objp off - add &syncp - ldind.i syncp - stloc syncp - ldloc syncp syncp - brtrue/false.s syncp_true_false - */ - - mono_mb_emit_byte (mb, CEE_LDARG_0); - mono_mb_emit_byte (mb, CEE_CONV_I); - mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoObject, synchronisation)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_LDIND_I); - mono_mb_emit_stloc (mb, syncp_loc); - - - if (mono_gc_is_moving ()) { - /*check for a thin hash*/ - mono_mb_emit_ldloc (mb, syncp_loc); - mono_mb_emit_icon (mb, 0x01); - mono_mb_emit_byte (mb, CEE_CONV_I); - mono_mb_emit_byte (mb, CEE_AND); - *thin_hash_branch = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); - - /*clear gc bits*/ - mono_mb_emit_ldloc (mb, syncp_loc); - mono_mb_emit_icon (mb, ~0x3); - mono_mb_emit_byte (mb, CEE_CONV_I); - mono_mb_emit_byte (mb, CEE_AND); - mono_mb_emit_stloc (mb, syncp_loc); - } else { - *thin_hash_branch = 0; - } - - mono_mb_emit_ldloc (mb, syncp_loc); - *syncp_true_false_branch = mono_mb_emit_short_branch (mb, branch_on_true ? CEE_BRTRUE_S : CEE_BRFALSE_S); -} - -#endif - -static MonoMethod* monitor_il_fastpaths[3]; - -gboolean -mono_monitor_is_il_fastpath_wrapper (MonoMethod *method) -{ - int i; - for (i = 0; i < 3; ++i) { - if (monitor_il_fastpaths [i] == method) - return TRUE; - } - return FALSE; -} - -enum { - FASTPATH_ENTER, - FASTPATH_ENTERV4, - FASTPATH_EXIT -}; - - -static MonoMethod* -register_fastpath (MonoMethod *method, int idx) -{ - mono_memory_barrier (); - monitor_il_fastpaths [idx] = method; - return method; -} - -static MonoMethod* -mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method) -{ - MonoMethodBuilder *mb; - MonoMethod *res; - static MonoMethod *compare_exchange_method; - int obj_null_branch, true_locktaken_branch = 0, syncp_null_branch, has_owner_branch, other_owner_branch, tid_branch, thin_hash_branch; - int tid_loc, syncp_loc, owner_loc; - gboolean is_v4 = mono_method_signature (monitor_enter_method)->param_count == 2; - int fast_path_idx = is_v4 ? FASTPATH_ENTERV4 : FASTPATH_ENTER; - WrapperInfo *info; - - /* The !is_v4 version is not used/tested */ - g_assert (is_v4); - - if (monitor_il_fastpaths [fast_path_idx]) - return monitor_il_fastpaths [fast_path_idx]; - - if (!mono_get_runtime_callbacks ()->tls_key_supported (TLS_KEY_THREAD)) - return NULL; - - if (!compare_exchange_method) { - MonoMethodDesc *desc; - MonoClass *class; - - desc = mono_method_desc_new ("Interlocked:CompareExchange(intptr&,intptr,intptr)", FALSE); - class = mono_class_from_name (mono_defaults.corlib, "System.Threading", "Interlocked"); - compare_exchange_method = mono_method_desc_search_in_class (desc, class); - mono_method_desc_free (desc); - - if (!compare_exchange_method) - return NULL; - } - - mb = mono_mb_new (mono_defaults.monitor_class, is_v4 ? "FastMonitorEnterV4" : "FastMonitorEnter", MONO_WRAPPER_UNKNOWN); - - mb->method->slot = -1; - mb->method->flags = METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC | - METHOD_ATTRIBUTE_HIDE_BY_SIG | METHOD_ATTRIBUTE_FINAL; - -#ifndef DISABLE_JIT - tid_loc = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); - syncp_loc = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); - owner_loc = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); - - emit_obj_syncp_check (mb, syncp_loc, &obj_null_branch, is_v4 ? &true_locktaken_branch : NULL, &syncp_null_branch, &thin_hash_branch, FALSE); - - /* - mono. tls thread_tls_offset threadp - ldc.i4 MONO_STRUCT_OFFSET(MonoThread, tid) threadp off - add &tid - ldind.i tid - stloc tid - ldloc syncp syncp - ldc.i4 MONO_STRUCT_OFFSET(MonoThreadsSync, owner) syncp off - add &owner - ldind.i owner - stloc owner - ldloc owner owner - brtrue.s tid - */ - - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_TLS); - mono_mb_emit_i4 (mb, TLS_KEY_THREAD); - mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoInternalThread, tid)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_LDIND_I); - mono_mb_emit_stloc (mb, tid_loc); - mono_mb_emit_ldloc (mb, syncp_loc); - mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, owner)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_LDIND_I); - mono_mb_emit_stloc (mb, owner_loc); - mono_mb_emit_ldloc (mb, owner_loc); - tid_branch = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); - - /* - ldloc syncp syncp - ldc.i4 MONO_STRUCT_OFFSET(MonoThreadsSync, owner) syncp off - add &owner - ldloc tid &owner tid - ldc.i4 0 &owner tid 0 - call System.Threading.Interlocked.CompareExchange oldowner - brtrue.s has_owner - ret - */ - - mono_mb_emit_ldloc (mb, syncp_loc); - mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, owner)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_ldloc (mb, tid_loc); - mono_mb_emit_byte (mb, CEE_LDC_I4_0); - mono_mb_emit_managed_call (mb, compare_exchange_method, NULL); - has_owner_branch = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); - - if (is_v4) { - mono_mb_emit_byte (mb, CEE_LDARG_1); - mono_mb_emit_byte (mb, CEE_LDC_I4_1); - mono_mb_emit_byte (mb, CEE_STIND_I1); - } - mono_mb_emit_byte (mb, CEE_RET); - - /* - tid: - ldloc owner owner - ldloc tid owner tid - brne.s other_owner - ldloc syncp syncp - ldc.i4 MONO_STRUCT_OFFSET(MonoThreadsSync, nest) syncp off - add &nest - dup &nest &nest - ldind.i4 &nest nest - ldc.i4 1 &nest nest 1 - add &nest nest+ - stind.i4 - ret - */ - - mono_mb_patch_short_branch (mb, tid_branch); - mono_mb_emit_ldloc (mb, owner_loc); - mono_mb_emit_ldloc (mb, tid_loc); - other_owner_branch = mono_mb_emit_short_branch (mb, CEE_BNE_UN_S); - mono_mb_emit_ldloc (mb, syncp_loc); - mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, nest)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_DUP); - mono_mb_emit_byte (mb, CEE_LDIND_I4); - mono_mb_emit_byte (mb, CEE_LDC_I4_1); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_STIND_I4); - - if (is_v4) { - mono_mb_emit_byte (mb, CEE_LDARG_1); - mono_mb_emit_byte (mb, CEE_LDC_I4_1); - mono_mb_emit_byte (mb, CEE_STIND_I1); - } - - mono_mb_emit_byte (mb, CEE_RET); - - /* - obj_null, syncp_null, has_owner, other_owner: - ldarg 0 obj - call System.Threading.Monitor.Enter - ret - */ - - if (thin_hash_branch) - mono_mb_patch_short_branch (mb, thin_hash_branch); - mono_mb_patch_short_branch (mb, obj_null_branch); - mono_mb_patch_short_branch (mb, syncp_null_branch); - mono_mb_patch_short_branch (mb, has_owner_branch); - mono_mb_patch_short_branch (mb, other_owner_branch); - if (true_locktaken_branch) - mono_mb_patch_short_branch (mb, true_locktaken_branch); - mono_mb_emit_byte (mb, CEE_LDARG_0); - if (is_v4) - mono_mb_emit_byte (mb, CEE_LDARG_1); - mono_mb_emit_managed_call (mb, monitor_enter_method, NULL); - mono_mb_emit_byte (mb, CEE_RET); -#endif - - res = register_fastpath (mono_mb_create_method (mb, mono_signature_no_pinvoke (monitor_enter_method), 5), fast_path_idx); - - info = mono_image_alloc0 (mono_defaults.corlib, sizeof (WrapperInfo)); - info->subtype = is_v4 ? WRAPPER_SUBTYPE_FAST_MONITOR_ENTER_V4 : WRAPPER_SUBTYPE_FAST_MONITOR_ENTER; - mono_marshal_set_wrapper_info (res, info); - - mono_mb_free (mb); - return res; -} - -static MonoMethod* -mono_monitor_get_fast_exit_method (MonoMethod *monitor_exit_method) -{ - MonoMethodBuilder *mb; - MonoMethod *res; - int obj_null_branch, has_waiting_branch, has_syncp_branch, owned_branch, nested_branch, thin_hash_branch; - int syncp_loc; - WrapperInfo *info; - - if (monitor_il_fastpaths [FASTPATH_EXIT]) - return monitor_il_fastpaths [FASTPATH_EXIT]; - - if (!mono_get_runtime_callbacks ()->tls_key_supported (TLS_KEY_THREAD)) - return NULL; - - mb = mono_mb_new (mono_defaults.monitor_class, "FastMonitorExit", MONO_WRAPPER_UNKNOWN); - - mb->method->slot = -1; - mb->method->flags = METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC | - METHOD_ATTRIBUTE_HIDE_BY_SIG | METHOD_ATTRIBUTE_FINAL; - -#ifndef DISABLE_JIT - syncp_loc = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); - - emit_obj_syncp_check (mb, syncp_loc, &obj_null_branch, NULL, &has_syncp_branch, &thin_hash_branch, TRUE); - - /* - ret - */ - - mono_mb_emit_byte (mb, CEE_RET); - - /* - has_syncp: - ldloc syncp syncp - ldc.i4 MONO_STRUCT_OFFSET(MonoThreadsSync, owner) syncp off - add &owner - ldind.i owner - mono. tls thread_tls_offset owner threadp - ldc.i4 MONO_STRUCT_OFFSET(MonoThread, tid) owner threadp off - add owner &tid - ldind.i owner tid - beq.s owned - */ - - mono_mb_patch_short_branch (mb, has_syncp_branch); - mono_mb_emit_ldloc (mb, syncp_loc); - mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, owner)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_LDIND_I); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_TLS); - mono_mb_emit_i4 (mb, TLS_KEY_THREAD); - mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoInternalThread, tid)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_LDIND_I); - owned_branch = mono_mb_emit_short_branch (mb, CEE_BEQ_S); - - /* - ret - */ - - mono_mb_emit_byte (mb, CEE_RET); - - /* - owned: - ldloc syncp syncp - ldc.i4 MONO_STRUCT_OFFSET(MonoThreadsSync, nest) syncp off - add &nest - dup &nest &nest - ldind.i4 &nest nest - dup &nest nest nest - ldc.i4 1 &nest nest nest 1 - bgt.un.s nested &nest nest - */ - - mono_mb_patch_short_branch (mb, owned_branch); - mono_mb_emit_ldloc (mb, syncp_loc); - mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, nest)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_DUP); - mono_mb_emit_byte (mb, CEE_LDIND_I4); - mono_mb_emit_byte (mb, CEE_DUP); - mono_mb_emit_byte (mb, CEE_LDC_I4_1); - nested_branch = mono_mb_emit_short_branch (mb, CEE_BGT_UN_S); - - /* - pop &nest - pop - ldloc syncp syncp - ldc.i4 MONO_STRUCT_OFFSET(MonoThreadsSync, entry_count) syncp off - add &count - ldind.i4 count - brtrue.s has_waiting - */ - - mono_mb_emit_byte (mb, CEE_POP); - mono_mb_emit_byte (mb, CEE_POP); - mono_mb_emit_ldloc (mb, syncp_loc); - mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, entry_count)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_LDIND_I4); - has_waiting_branch = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); - - /* - ldloc syncp syncp - ldc.i4 MONO_STRUCT_OFFSET(MonoThreadsSync, owner) syncp off - add &owner - ldnull &owner 0 - stind.i - ret - */ - - mono_mb_emit_ldloc (mb, syncp_loc); - mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, owner)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_byte (mb, CEE_LDNULL); - mono_mb_emit_byte (mb, CEE_STIND_I); - mono_mb_emit_byte (mb, CEE_RET); - - /* - nested: - ldc.i4 1 &nest nest 1 - sub &nest nest- - stind.i4 - ret - */ - - mono_mb_patch_short_branch (mb, nested_branch); - mono_mb_emit_byte (mb, CEE_LDC_I4_1); - mono_mb_emit_byte (mb, CEE_SUB); - mono_mb_emit_byte (mb, CEE_STIND_I4); - mono_mb_emit_byte (mb, CEE_RET); - - /* - obj_null, has_waiting: - ldarg 0 obj - call System.Threading.Monitor.Exit - ret - */ - - if (thin_hash_branch) - mono_mb_patch_short_branch (mb, thin_hash_branch); - mono_mb_patch_short_branch (mb, obj_null_branch); - mono_mb_patch_short_branch (mb, has_waiting_branch); - mono_mb_emit_byte (mb, CEE_LDARG_0); - mono_mb_emit_managed_call (mb, monitor_exit_method, NULL); - mono_mb_emit_byte (mb, CEE_RET); -#endif - - res = register_fastpath (mono_mb_create_method (mb, mono_signature_no_pinvoke (monitor_exit_method), 5), FASTPATH_EXIT); - mono_mb_free (mb); - - info = mono_image_alloc0 (mono_defaults.corlib, sizeof (WrapperInfo)); - info->subtype = WRAPPER_SUBTYPE_FAST_MONITOR_EXIT; - mono_marshal_set_wrapper_info (res, info); - - return res; -} - -MonoMethod* -mono_monitor_get_fast_path (MonoMethod *enter_or_exit) -{ - if (strcmp (enter_or_exit->name, "Enter") == 0) - return mono_monitor_get_fast_enter_method (enter_or_exit); - if (strcmp (enter_or_exit->name, "Exit") == 0) - return mono_monitor_get_fast_exit_method (enter_or_exit); - g_assert_not_reached (); - return NULL; -} - /* * mono_monitor_threads_sync_member_offset: - * @owner_offset: returns size and offset of the "owner" member + * @status_offset: returns size and offset of the "status" member * @nest_offset: returns size and offset of the "nest" member - * @entry_count_offset: returns size and offset of the "entry_count" member * - * Returns the offsets and sizes of three members of the + * Returns the offsets and sizes of two members of the * MonoThreadsSync struct. The Monitor ASM fastpaths need this. */ void -mono_monitor_threads_sync_members_offset (int *owner_offset, int *nest_offset, int *entry_count_offset) +mono_monitor_threads_sync_members_offset (int *status_offset, int *nest_offset) { MonoThreadsSync ts; #define ENCODE_OFF_SIZE(o,s) (((o) << 8) | ((s) & 0xff)) - *owner_offset = ENCODE_OFF_SIZE (MONO_STRUCT_OFFSET (MonoThreadsSync, owner), sizeof (ts.owner)); + *status_offset = ENCODE_OFF_SIZE (MONO_STRUCT_OFFSET (MonoThreadsSync, status), sizeof (ts.status)); *nest_offset = ENCODE_OFF_SIZE (MONO_STRUCT_OFFSET (MonoThreadsSync, nest), sizeof (ts.nest)); - *entry_count_offset = ENCODE_OFF_SIZE (MONO_STRUCT_OFFSET (MonoThreadsSync, entry_count), sizeof (ts.entry_count)); } gboolean @@ -1262,12 +872,21 @@ ves_icall_System_Threading_Monitor_Monitor_try_enter_with_atomic_var (MonoObject *lockTaken = res == 1; } +void +mono_monitor_enter_v4 (MonoObject *obj, char *lock_taken) +{ + if (*lock_taken == 1) + mono_raise_exception (mono_get_exception_argument ("lockTaken", "lockTaken is already true")); + + ves_icall_System_Threading_Monitor_Monitor_try_enter_with_atomic_var (obj, INFINITE, lock_taken); +} + gboolean ves_icall_System_Threading_Monitor_Monitor_test_owner (MonoObject *obj) { MonoThreadsSync *mon; - LOCK_DEBUG (g_message ("%s: Testing if %p is owned by thread %d", __func__, obj, GetCurrentThreadId())); + LOCK_DEBUG (g_message ("%s: Testing if %p is owned by thread %d", __func__, obj, mono_thread_info_get_small_id())); mon = obj->synchronisation; #ifdef HAVE_MOVING_COLLECTOR @@ -1284,7 +903,7 @@ ves_icall_System_Threading_Monitor_Monitor_test_owner (MonoObject *obj) return FALSE; } - if(mon->owner==GetCurrentThreadId ()) { + if (mon_status_get_owner (mon->status) == mono_thread_info_get_small_id ()) { return(TRUE); } @@ -1296,7 +915,7 @@ ves_icall_System_Threading_Monitor_Monitor_test_synchronised (MonoObject *obj) { MonoThreadsSync *mon; - LOCK_DEBUG (g_message("%s: (%d) Testing if %p is owned by any thread", __func__, GetCurrentThreadId (), obj)); + LOCK_DEBUG (g_message("%s: (%d) Testing if %p is owned by any thread", __func__, mono_thread_info_get_small_id (), obj)); mon = obj->synchronisation; #ifdef HAVE_MOVING_COLLECTOR @@ -1313,7 +932,7 @@ ves_icall_System_Threading_Monitor_Monitor_test_synchronised (MonoObject *obj) return FALSE; } - if (mon->owner != 0) { + if (mon_status_get_owner (mon->status) != 0) { return TRUE; } @@ -1330,7 +949,7 @@ ves_icall_System_Threading_Monitor_Monitor_pulse (MonoObject *obj) { MonoThreadsSync *mon; - LOCK_DEBUG (g_message ("%s: (%d) Pulsing %p", __func__, GetCurrentThreadId (), obj)); + LOCK_DEBUG (g_message ("%s: (%d) Pulsing %p", __func__, mono_thread_info_get_small_id (), obj)); mon = obj->synchronisation; #ifdef HAVE_MOVING_COLLECTOR @@ -1338,7 +957,7 @@ ves_icall_System_Threading_Monitor_Monitor_pulse (MonoObject *obj) LockWord lw; lw.sync = mon; if (lw.lock_word & LOCK_WORD_THIN_HASH) { - mono_raise_exception (mono_get_exception_synchronization_lock ("Not locked")); + mono_set_pending_exception (mono_get_exception_synchronization_lock ("Not locked")); return; } lw.lock_word &= ~LOCK_WORD_BITS_MASK; @@ -1346,18 +965,18 @@ ves_icall_System_Threading_Monitor_Monitor_pulse (MonoObject *obj) } #endif if (mon == NULL) { - mono_raise_exception (mono_get_exception_synchronization_lock ("Not locked")); + mono_set_pending_exception (mono_get_exception_synchronization_lock ("Not locked")); return; } - if (mon->owner != GetCurrentThreadId ()) { - mono_raise_exception (mono_get_exception_synchronization_lock ("Not locked by this thread")); + if (mon_status_get_owner (mon->status) != mono_thread_info_get_small_id ()) { + mono_set_pending_exception (mono_get_exception_synchronization_lock ("Not locked by this thread")); return; } - LOCK_DEBUG (g_message ("%s: (%d) %d threads waiting", __func__, GetCurrentThreadId (), g_slist_length (mon->wait_list))); + LOCK_DEBUG (g_message ("%s: (%d) %d threads waiting", __func__, mono_thread_info_get_small_id (), g_slist_length (mon->wait_list))); if (mon->wait_list != NULL) { - LOCK_DEBUG (g_message ("%s: (%d) signalling and dequeuing handle %p", __func__, GetCurrentThreadId (), mon->wait_list->data)); + LOCK_DEBUG (g_message ("%s: (%d) signalling and dequeuing handle %p", __func__, mono_thread_info_get_small_id (), mon->wait_list->data)); SetEvent (mon->wait_list->data); mon->wait_list = g_slist_remove (mon->wait_list, mon->wait_list->data); @@ -1369,7 +988,7 @@ ves_icall_System_Threading_Monitor_Monitor_pulse_all (MonoObject *obj) { MonoThreadsSync *mon; - LOCK_DEBUG (g_message("%s: (%d) Pulsing all %p", __func__, GetCurrentThreadId (), obj)); + LOCK_DEBUG (g_message("%s: (%d) Pulsing all %p", __func__, mono_thread_info_get_small_id (), obj)); mon = obj->synchronisation; #ifdef HAVE_MOVING_COLLECTOR @@ -1377,7 +996,7 @@ ves_icall_System_Threading_Monitor_Monitor_pulse_all (MonoObject *obj) LockWord lw; lw.sync = mon; if (lw.lock_word & LOCK_WORD_THIN_HASH) { - mono_raise_exception (mono_get_exception_synchronization_lock ("Not locked")); + mono_set_pending_exception (mono_get_exception_synchronization_lock ("Not locked")); return; } lw.lock_word &= ~LOCK_WORD_BITS_MASK; @@ -1385,18 +1004,18 @@ ves_icall_System_Threading_Monitor_Monitor_pulse_all (MonoObject *obj) } #endif if (mon == NULL) { - mono_raise_exception (mono_get_exception_synchronization_lock ("Not locked")); + mono_set_pending_exception (mono_get_exception_synchronization_lock ("Not locked")); return; } - if (mon->owner != GetCurrentThreadId ()) { - mono_raise_exception (mono_get_exception_synchronization_lock ("Not locked by this thread")); + if (mon_status_get_owner (mon->status) != mono_thread_info_get_small_id ()) { + mono_set_pending_exception (mono_get_exception_synchronization_lock ("Not locked by this thread")); return; } - LOCK_DEBUG (g_message ("%s: (%d) %d threads waiting", __func__, GetCurrentThreadId (), g_slist_length (mon->wait_list))); + LOCK_DEBUG (g_message ("%s: (%d) %d threads waiting", __func__, mono_thread_info_get_small_id (), g_slist_length (mon->wait_list))); while (mon->wait_list != NULL) { - LOCK_DEBUG (g_message ("%s: (%d) signalling and dequeuing handle %p", __func__, GetCurrentThreadId (), mon->wait_list->data)); + LOCK_DEBUG (g_message ("%s: (%d) signalling and dequeuing handle %p", __func__, mono_thread_info_get_small_id (), mon->wait_list->data)); SetEvent (mon->wait_list->data); mon->wait_list = g_slist_remove (mon->wait_list, mon->wait_list->data); @@ -1414,7 +1033,7 @@ ves_icall_System_Threading_Monitor_Monitor_wait (MonoObject *obj, guint32 ms) gint32 regain; MonoInternalThread *thread = mono_thread_internal_current (); - LOCK_DEBUG (g_message ("%s: (%d) Trying to wait for %p with timeout %dms", __func__, GetCurrentThreadId (), obj, ms)); + LOCK_DEBUG (g_message ("%s: (%d) Trying to wait for %p with timeout %dms", __func__, mono_thread_info_get_small_id (), obj, ms)); mon = obj->synchronisation; #ifdef HAVE_MOVING_COLLECTOR @@ -1422,7 +1041,7 @@ ves_icall_System_Threading_Monitor_Monitor_wait (MonoObject *obj, guint32 ms) LockWord lw; lw.sync = mon; if (lw.lock_word & LOCK_WORD_THIN_HASH) { - mono_raise_exception (mono_get_exception_synchronization_lock ("Not locked")); + mono_set_pending_exception (mono_get_exception_synchronization_lock ("Not locked")); return FALSE; } lw.lock_word &= ~LOCK_WORD_BITS_MASK; @@ -1430,11 +1049,11 @@ ves_icall_System_Threading_Monitor_Monitor_wait (MonoObject *obj, guint32 ms) } #endif if (mon == NULL) { - mono_raise_exception (mono_get_exception_synchronization_lock ("Not locked")); + mono_set_pending_exception (mono_get_exception_synchronization_lock ("Not locked")); return FALSE; } - if (mon->owner != GetCurrentThreadId ()) { - mono_raise_exception (mono_get_exception_synchronization_lock ("Not locked by this thread")); + if (mon_status_get_owner (mon->status) != mono_thread_info_get_small_id ()) { + mono_set_pending_exception (mono_get_exception_synchronization_lock ("Not locked by this thread")); return FALSE; } @@ -1443,11 +1062,11 @@ ves_icall_System_Threading_Monitor_Monitor_wait (MonoObject *obj, guint32 ms) event = CreateEvent (NULL, FALSE, FALSE, NULL); if (event == NULL) { - mono_raise_exception (mono_get_exception_synchronization_lock ("Failed to set up wait event")); + mono_set_pending_exception (mono_get_exception_synchronization_lock ("Failed to set up wait event")); return FALSE; } - LOCK_DEBUG (g_message ("%s: (%d) queuing handle %p", __func__, GetCurrentThreadId (), event)); + LOCK_DEBUG (g_message ("%s: (%d) queuing handle %p", __func__, mono_thread_info_get_small_id (), event)); mono_thread_current_check_pending_interrupt (); @@ -1460,7 +1079,7 @@ ves_icall_System_Threading_Monitor_Monitor_wait (MonoObject *obj, guint32 ms) mon->nest = 1; mono_monitor_exit (obj); - LOCK_DEBUG (g_message ("%s: (%d) Unlocked %p lock %p", __func__, GetCurrentThreadId (), obj, mon)); + LOCK_DEBUG (g_message ("%s: (%d) Unlocked %p lock %p", __func__, mono_thread_info_get_small_id (), obj, mon)); /* There's no race between unlocking mon and waiting for the * event, because auto reset events are sticky, and this event @@ -1498,13 +1117,13 @@ ves_icall_System_Threading_Monitor_Monitor_wait (MonoObject *obj, guint32 ms) * SynchronizationLockException */ CloseHandle (event); - mono_raise_exception (mono_get_exception_synchronization_lock ("Failed to regain lock")); + mono_set_pending_exception (mono_get_exception_synchronization_lock ("Failed to regain lock")); return FALSE; } mon->nest = nest; - LOCK_DEBUG (g_message ("%s: (%d) Regained %p lock %p", __func__, GetCurrentThreadId (), obj, mon)); + LOCK_DEBUG (g_message ("%s: (%d) Regained %p lock %p", __func__, mono_thread_info_get_small_id (), obj, mon)); if (ret == WAIT_TIMEOUT) { /* Poll the event again, just in case it was signalled @@ -1524,10 +1143,10 @@ ves_icall_System_Threading_Monitor_Monitor_wait (MonoObject *obj, guint32 ms) */ if (ret == WAIT_OBJECT_0) { - LOCK_DEBUG (g_message ("%s: (%d) Success", __func__, GetCurrentThreadId ())); + LOCK_DEBUG (g_message ("%s: (%d) Success", __func__, mono_thread_info_get_small_id ())); success = TRUE; } else { - LOCK_DEBUG (g_message ("%s: (%d) Wait failed, dequeuing handle %p", __func__, GetCurrentThreadId (), event)); + LOCK_DEBUG (g_message ("%s: (%d) Wait failed, dequeuing handle %p", __func__, mono_thread_info_get_small_id (), event)); /* No pulse, so we have to remove ourself from the * wait queue */ diff --git a/mta-mono/vendor/mono/metadata/monitor.h b/mta-mono/vendor/mono/metadata/monitor.h index a32780d..4d2bcdc 100644 --- a/mta-mono/vendor/mono/metadata/monitor.h +++ b/mta-mono/vendor/mono/metadata/monitor.h @@ -17,14 +17,28 @@ G_BEGIN_DECLS +#define OWNER_MASK 0x0000ffff +#define ENTRY_COUNT_MASK 0xffff0000 +#define ENTRY_COUNT_WAITERS 0x80000000 +#define ENTRY_COUNT_ZERO 0x7fff0000 +#define ENTRY_COUNT_SHIFT 16 + struct _MonoThreadsSync { - gsize owner; /* thread ID */ + /* + * The entry count field can be negative, which would mean that the entry_sem is + * signaled and nobody is waiting to acquire it. This can happen when the thread + * that was waiting is either interrupted or timeouts, and the owner releases + * the lock before the forementioned thread updates the entry count. + * + * The 0 entry_count value is encoded as ENTRY_COUNT_ZERO, positive numbers being + * greater than it and negative numbers smaller than it. + */ + guint32 status; /* entry_count (16) | owner_id (16) */ guint32 nest; #ifdef HAVE_MOVING_COLLECTOR gint32 hash_code; #endif - volatile gint32 entry_count; HANDLE entry_sem; GSList *wait_list; void *data; @@ -38,11 +52,7 @@ void mono_monitor_cleanup (void) MONO_INTERNAL; void** mono_monitor_get_object_monitor_weak_link (MonoObject *object) MONO_INTERNAL; -void mono_monitor_init_tls (void) MONO_INTERNAL; - -MonoMethod* mono_monitor_get_fast_path (MonoMethod *enter_or_exit) MONO_INTERNAL; - -void mono_monitor_threads_sync_members_offset (int *owner_offset, int *nest_offset, int *entry_count_offset) MONO_INTERNAL; +void mono_monitor_threads_sync_members_offset (int *status_offset, int *nest_offset) MONO_INTERNAL; #define MONO_THREADS_SYNC_MEMBER_OFFSET(o) ((o)>>8) #define MONO_THREADS_SYNC_MEMBER_SIZE(o) ((o)&0xff) @@ -54,9 +64,6 @@ extern void ves_icall_System_Threading_Monitor_Monitor_pulse_all(MonoObject *obj extern gboolean ves_icall_System_Threading_Monitor_Monitor_wait(MonoObject *obj, guint32 ms) MONO_INTERNAL; extern void ves_icall_System_Threading_Monitor_Monitor_try_enter_with_atomic_var (MonoObject *obj, guint32 ms, char *lockTaken) MONO_INTERNAL; -gboolean -mono_monitor_is_il_fastpath_wrapper (MonoMethod *method) MONO_INTERNAL; - G_END_DECLS #endif /* _MONO_METADATA_MONITOR_H_ */ diff --git a/mta-mono/vendor/mono/metadata/mono-debug-debugger.h b/mta-mono/vendor/mono/metadata/mono-debug-debugger.h index b8d13b6..c61a504 100644 --- a/mta-mono/vendor/mono/metadata/mono-debug-debugger.h +++ b/mta-mono/vendor/mono/metadata/mono-debug-debugger.h @@ -20,10 +20,4 @@ void mono_debugger_unlock (void) MONO_INTERNAL gchar * mono_debugger_check_runtime_version (const char *filename) MONO_INTERNAL; -MonoDebugMethodAddressList * -mono_debugger_insert_method_breakpoint (MonoMethod *method, guint64 idx) MONO_INTERNAL; - -int -mono_debugger_remove_method_breakpoint (guint64 index) MONO_INTERNAL; - #endif /* __MONO_DEBUG_DEBUGGER_H__ */ diff --git a/mta-mono/vendor/mono/metadata/mono-debug.c b/mta-mono/vendor/mono/metadata/mono-debug.c index 5e5173f..f754535 100644 --- a/mta-mono/vendor/mono/metadata/mono-debug.c +++ b/mta-mono/vendor/mono/metadata/mono-debug.c @@ -19,174 +19,79 @@ #include #include #include +#include #include -#define DATA_TABLE_CHUNK_SIZE (16384-sizeof (MonoDebugDataChunk)) - #define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1)) #if NO_UNALIGNED_ACCESS -#define RETURN_UNALIGNED(type, addr) \ - { \ - type val; \ - memcpy(&val, p + offset, sizeof(val)); \ - return val; \ - } #define WRITE_UNALIGNED(type, addr, val) \ memcpy(addr, &val, sizeof(type)) #define READ_UNALIGNED(type, addr, val) \ memcpy(&val, addr, sizeof(type)) #else -#define RETURN_UNALIGNED(type, addr) \ - return *(type*)(p + offset); #define WRITE_UNALIGNED(type, addr, val) \ (*(type *)(addr) = (val)) #define READ_UNALIGNED(type, addr, val) \ val = (*(type *)(addr)) #endif -typedef enum { - MONO_DEBUG_DATA_ITEM_UNKNOWN = 0, - MONO_DEBUG_DATA_ITEM_CLASS, - MONO_DEBUG_DATA_ITEM_METHOD, - MONO_DEBUG_DATA_ITEM_DELEGATE_TRAMPOLINE -} MonoDebugDataItemType; - -typedef struct _MonoDebugDataChunk MonoDebugDataChunk; - -struct _MonoDebugDataChunk { - guint32 total_size; - guint32 allocated_size; - guint32 current_offset; - guint32 dummy; - MonoDebugDataChunk *next; - guint8 data [MONO_ZERO_LEN_ARRAY]; -}; - +/* This contains per-domain info */ struct _MonoDebugDataTable { - gint32 domain; - gint32 _dummy; /* alignment for next field. */ - MonoDebugDataChunk *first_chunk; - MonoDebugDataChunk *current_chunk; - GHashTable *method_hash; + MonoMemPool *mp; GHashTable *method_address_hash; }; -typedef struct { - const gchar *method_name; - const gchar *obsolete_cil_code; - guint32 wrapper_type; -} MonoDebugWrapperData; - -typedef struct { - guint32 size; - guint32 symfile_id; - guint32 domain_id; - guint32 method_id; - MonoDebugWrapperData *wrapper_data; - MonoMethod *method; - GSList *address_list; -} MonoDebugMethodHeader; - +/* This contains JIT debugging information about a method in serialized format */ struct _MonoDebugMethodAddress { - MonoDebugMethodHeader header; const guint8 *code_start; - const guint8 *wrapper_addr; guint32 code_size; guint8 data [MONO_ZERO_LEN_ARRAY]; }; -struct _MonoDebugClassEntry { - guint32 size; - guint8 data [MONO_ZERO_LEN_ARRAY]; -}; - -typedef struct { - gpointer code; - guint32 size; -} MonoDebugDelegateTrampolineEntry; - -static MonoSymbolTable *mono_symbol_table = NULL; static MonoDebugFormat mono_debug_format = MONO_DEBUG_FORMAT_NONE; -static gint32 mono_debug_debugger_version = 5; static gboolean mono_debug_initialized = FALSE; -static GHashTable *mono_debug_handles = NULL; +/* Maps MonoImage -> MonoMonoDebugHandle */ +static GHashTable *mono_debug_handles; +/* Maps MonoDomain -> MonoDataTable */ +static GHashTable *data_table_hash; -static GHashTable *data_table_hash = NULL; -static int next_symbol_file_id = 0; +static mono_mutex_t debugger_lock_mutex; + +static int initialized = 0; +static gboolean is_attached = FALSE; static MonoDebugHandle *mono_debug_open_image (MonoImage *image, const guint8 *raw_contents, int size); -static MonoDebugHandle *_mono_debug_get_image (MonoImage *image); +static MonoDebugHandle *mono_debug_get_image (MonoImage *image); static void mono_debug_add_assembly (MonoAssembly *assembly, gpointer user_data); -static void mono_debug_add_type (MonoClass *klass); static MonoDebugHandle *open_symfile_from_bundle (MonoImage *image); -void _mono_debug_init_corlib (MonoDomain *domain); - -extern void (*mono_debugger_class_init_func) (MonoClass *klass); - static MonoDebugDataTable * create_data_table (MonoDomain *domain) { MonoDebugDataTable *table; - MonoDebugDataChunk *chunk; table = g_new0 (MonoDebugDataTable, 1); - table->domain = domain ? mono_domain_get_id (domain) : -1; + table->mp = mono_mempool_new (); table->method_address_hash = g_hash_table_new (NULL, NULL); - table->method_hash = g_hash_table_new (NULL, NULL); - chunk = g_malloc0 (sizeof (MonoDebugDataChunk) + DATA_TABLE_CHUNK_SIZE); - chunk->total_size = DATA_TABLE_CHUNK_SIZE; - - table->first_chunk = table->current_chunk = chunk; - - if (domain) { - mono_debug_list_add (&mono_symbol_table->data_tables, table); + if (domain) g_hash_table_insert (data_table_hash, domain, table); - } return table; } -static void -free_header_data (gpointer key, gpointer value, gpointer user_data) -{ - MonoDebugMethodHeader *header = (MonoDebugMethodHeader*)value; - - if (header->wrapper_data) { - g_free ((gpointer)header->wrapper_data->method_name); - g_free (header->wrapper_data); - } - g_slist_free (header->address_list); -} - static void free_data_table (MonoDebugDataTable *table) { - MonoDebugDataChunk *chunk, *next_chunk; - - g_hash_table_foreach (table->method_hash, free_header_data, NULL); - g_hash_table_destroy (table->method_hash); + mono_mempool_destroy (table->mp); g_hash_table_destroy (table->method_address_hash); - table->method_hash = NULL; - table->method_address_hash = NULL; - - chunk = table->first_chunk; - while (chunk) { - next_chunk = chunk->next; - g_free (chunk); - chunk = next_chunk; - } - - table->first_chunk = table->current_chunk = NULL; - mono_debug_list_remove (&mono_symbol_table->data_tables, table); g_free (table); } @@ -209,9 +114,7 @@ free_debug_handle (MonoDebugHandle *handle) if (handle->symfile) mono_debug_close_mono_symbol_file (handle->symfile); /* decrease the refcount added with mono_image_addref () */ - free_data_table (handle->type_table); mono_image_close (handle->image); - g_free (handle->image_file); g_free (handle); } @@ -229,53 +132,24 @@ mono_debug_init (MonoDebugFormat format) if (format == MONO_DEBUG_FORMAT_DEBUGGER) g_error ("The mdb debugger is no longer supported."); - mono_debug_initialized = TRUE; mono_debug_format = format; - /* - * This must be called before mono_debugger_initialize(), because the - * latter registers GC roots. - */ - mono_gc_base_init (); - mono_debugger_initialize (); mono_debugger_lock (); - mono_symbol_table = g_new0 (MonoSymbolTable, 1); - mono_symbol_table->magic = MONO_DEBUGGER_MAGIC; - mono_symbol_table->version = MONO_DEBUGGER_MAJOR_VERSION; - mono_symbol_table->total_size = sizeof (MonoSymbolTable); - mono_debug_handles = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) free_debug_handle); data_table_hash = g_hash_table_new_full ( NULL, NULL, NULL, (GDestroyNotify) free_data_table); - /* FIXME this is a disgusting hack. Kill it */ - mono_debugger_class_init_func = mono_debug_add_type; mono_install_assembly_load_hook (mono_debug_add_assembly, NULL); - mono_symbol_table->global_data_table = create_data_table (NULL); - mono_debugger_unlock (); } -/* - * INTERNAL USE ONLY ! - * FIXME this can have a decent name and exist in an internal header - */ -void -_mono_debug_init_corlib (MonoDomain *domain) -{ - if (!mono_debug_initialized) - return; - - mono_symbol_table->corlib = mono_debug_open_image (mono_defaults.corlib, NULL, 0); -} - void mono_debug_open_image_from_memory (MonoImage *image, const guint8 *raw_contents, int size) { @@ -296,14 +170,6 @@ mono_debug_cleanup (void) g_hash_table_destroy (data_table_hash); data_table_hash = NULL; } - - if (mono_symbol_table) { - if (mono_symbol_table->global_data_table) - free_data_table (mono_symbol_table->global_data_table); - - g_free (mono_symbol_table); - mono_symbol_table = NULL; - } } void @@ -348,7 +214,7 @@ mono_debug_domain_unload (MonoDomain *domain) * LOCKING: Assumes the debug lock is held. */ static MonoDebugHandle * -_mono_debug_get_image (MonoImage *image) +mono_debug_get_image (MonoImage *image) { return g_hash_table_lookup (mono_debug_handles, image); } @@ -363,13 +229,12 @@ mono_debug_close_image (MonoImage *image) mono_debugger_lock (); - handle = _mono_debug_get_image (image); + handle = mono_debug_get_image (image); if (!handle) { mono_debugger_unlock (); return; } - mono_debug_list_remove (&mono_symbol_table->symbol_files, handle); g_hash_table_remove (mono_debug_handles, image); mono_debugger_unlock (); @@ -385,26 +250,20 @@ mono_debug_open_image (MonoImage *image, const guint8 *raw_contents, int size) mono_debugger_lock (); - handle = _mono_debug_get_image (image); + handle = mono_debug_get_image (image); if (handle != NULL) { mono_debugger_unlock (); return handle; } handle = g_new0 (MonoDebugHandle, 1); - handle->index = ++next_symbol_file_id; handle->image = image; mono_image_addref (image); - handle->image_file = g_strdup (mono_image_get_filename (image)); - - handle->type_table = create_data_table (NULL); handle->symfile = mono_debug_open_mono_symbols ( handle, raw_contents, size, FALSE); - mono_debug_list_add (&mono_symbol_table->symbol_files, handle); - g_hash_table_insert (mono_debug_handles, image, handle); mono_debugger_unlock (); @@ -426,51 +285,6 @@ mono_debug_add_assembly (MonoAssembly *assembly, gpointer user_data) mono_debugger_unlock (); } -static guint8 * -allocate_data_item (MonoDebugDataTable *table, MonoDebugDataItemType type, guint32 size) -{ - guint32 chunk_size; - guint8 *data; - - size = ALIGN_TO (size, sizeof (gpointer)); - - if (size + 16 < DATA_TABLE_CHUNK_SIZE) - chunk_size = DATA_TABLE_CHUNK_SIZE; - else - chunk_size = size + 16; - - g_assert (table->current_chunk->current_offset == table->current_chunk->allocated_size); - - if (table->current_chunk->allocated_size + size + 8 >= table->current_chunk->total_size) { - MonoDebugDataChunk *new_chunk; - - new_chunk = g_malloc0 (sizeof (MonoDebugDataChunk) + chunk_size); - new_chunk->total_size = chunk_size; - - table->current_chunk->next = new_chunk; - table->current_chunk = new_chunk; - } - - data = &table->current_chunk->data [table->current_chunk->allocated_size]; - table->current_chunk->allocated_size += size + 8; - - * ((guint32 *) data) = size; - data += 4; - * ((guint32 *) data) = type; - data += 4; - return data; -} - -static void -write_data_item (MonoDebugDataTable *table, const guint8 *data) -{ - MonoDebugDataChunk *current_chunk = table->current_chunk; - guint32 size = * ((guint32 *) (data - 8)); - - g_assert (current_chunk->current_offset + size + 8 == current_chunk->allocated_size); - current_chunk->current_offset = current_chunk->allocated_size; -} - struct LookupMethodData { MonoDebugMethodInfo *minfo; @@ -491,7 +305,7 @@ lookup_method_func (gpointer key, gpointer value, gpointer user_data) } static MonoDebugMethodInfo * -_mono_debug_lookup_method (MonoMethod *method) +mono_debug_lookup_method_internal (MonoMethod *method) { struct LookupMethodData data; @@ -517,12 +331,51 @@ mono_debug_lookup_method (MonoMethod *method) { MonoDebugMethodInfo *minfo; + if (mono_debug_format == MONO_DEBUG_FORMAT_NONE) + return NULL; + mono_debugger_lock (); - minfo = _mono_debug_lookup_method (method); + minfo = mono_debug_lookup_method_internal (method); mono_debugger_unlock (); return minfo; } +typedef struct +{ + gboolean found; + MonoImage *image; +} LookupImageData; + +static void +lookup_image_func (gpointer key, gpointer value, gpointer user_data) +{ + MonoDebugHandle *handle = (MonoDebugHandle *) value; + LookupImageData *data = (LookupImageData *) user_data; + + if (data->found) + return; + + if (handle->image == data->image && handle->symfile) + data->found = TRUE; +} + +gboolean +mono_debug_image_has_debug_info (MonoImage *image) +{ + LookupImageData data; + + if (!mono_debug_handles) + return FALSE; + + memset (&data, 0, sizeof (data)); + data.image = image; + + mono_debugger_lock (); + g_hash_table_foreach (mono_debug_handles, lookup_image_func, &data); + mono_debugger_unlock (); + return data.found; +} + static inline void write_leb128 (guint32 value, guint8 *ptr, guint8 **rptr) { @@ -572,31 +425,20 @@ write_variable (MonoDebugVarInfo *var, guint8 *ptr, guint8 **rptr) MonoDebugMethodAddress * mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDomain *domain) { - MonoMethod *declaring; MonoDebugDataTable *table; - MonoDebugMethodHeader *header; MonoDebugMethodAddress *address; MonoDebugMethodInfo *minfo; MonoDebugHandle *handle; guint8 buffer [BUFSIZ]; guint8 *ptr, *oldptr; guint32 i, size, total_size, max_size; - gboolean is_wrapper = FALSE; mono_debugger_lock (); table = lookup_data_table (domain); - handle = _mono_debug_get_image (method->klass->image); - minfo = _mono_debug_lookup_method (method); - - if (!minfo || (method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) || - (method->iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME) || - (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) || - (method->flags & METHOD_ATTRIBUTE_ABSTRACT) || - (method->wrapper_type != MONO_WRAPPER_NONE)) { - is_wrapper = TRUE; - } + handle = mono_debug_get_image (method->klass->image); + minfo = mono_debug_lookup_method_internal (method); max_size = (5 * 5) + 1 + (10 * jit->num_line_numbers) + (25 + sizeof (gpointer)) * (1 + jit->num_params + jit->num_locals); @@ -642,16 +484,9 @@ mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDoma if (method_is_dynamic (method)) { address = g_malloc0 (total_size); } else { - address = (MonoDebugMethodAddress *) allocate_data_item ( - table, MONO_DEBUG_DATA_ITEM_METHOD, total_size); + address = mono_mempool_alloc (table->mp, total_size); } - address->header.size = total_size; - address->header.symfile_id = handle ? handle->index : 0; - address->header.domain_id = mono_domain_get_id (domain); - address->header.method_id = is_wrapper ? 0 : minfo->index; - address->header.method = method; - address->code_start = jit->code_start; address->code_size = jit->code_size; @@ -659,32 +494,8 @@ mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDoma if (max_size > BUFSIZ) g_free (oldptr); - declaring = method->is_inflated ? ((MonoMethodInflated *) method)->declaring : method; - header = g_hash_table_lookup (table->method_hash, declaring); - - if (!header) { - header = &address->header; - g_hash_table_insert (table->method_hash, declaring, header); - - if (is_wrapper) { - MonoDebugWrapperData *wrapper; - - header->wrapper_data = wrapper = g_new0 (MonoDebugWrapperData, 1); - - wrapper->wrapper_type = method->wrapper_type; - wrapper->method_name = mono_method_full_name (declaring, TRUE); - wrapper->obsolete_cil_code = ""; - } - } else { - address->header.wrapper_data = header->wrapper_data; - header->address_list = g_slist_prepend (header->address_list, address); - } - g_hash_table_insert (table->method_address_hash, method, address); - if (!method_is_dynamic (method)) - write_data_item (table, (guint8 *) address); - mono_debugger_unlock (); return address; } @@ -692,9 +503,7 @@ mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDoma void mono_debug_remove_method (MonoMethod *method, MonoDomain *domain) { - MonoMethod *declaring; MonoDebugDataTable *table; - MonoDebugMethodHeader *header; MonoDebugMethodAddress *address; if (!mono_debug_initialized) @@ -706,19 +515,9 @@ mono_debug_remove_method (MonoMethod *method, MonoDomain *domain) table = lookup_data_table (domain); - declaring = method->is_inflated ? ((MonoMethodInflated *) method)->declaring : method; - g_hash_table_remove (table->method_hash, declaring); - address = g_hash_table_lookup (table->method_address_hash, method); - if (address) { - header = &address->header; - - if (header->wrapper_data) { - g_free ((char*)header->wrapper_data->method_name); - g_free (header->wrapper_data); - } + if (address) g_free (address); - } g_hash_table_remove (table->method_address_hash, method); @@ -728,22 +527,6 @@ mono_debug_remove_method (MonoMethod *method, MonoDomain *domain) void mono_debug_add_delegate_trampoline (gpointer code, int size) { - MonoDebugDelegateTrampolineEntry *entry; - - if (!mono_debug_initialized) - return; - - mono_debugger_lock (); - - entry = (MonoDebugDelegateTrampolineEntry *) allocate_data_item ( - mono_symbol_table->global_data_table, MONO_DEBUG_DATA_ITEM_DELEGATE_TRAMPOLINE, - sizeof (MonoDebugDelegateTrampolineEntry)); - entry->code = code; - entry->size = size; - - write_data_item (mono_symbol_table->global_data_table, (guint8 *) entry); - - mono_debugger_unlock (); } static inline guint32 @@ -825,7 +608,6 @@ mono_debug_read_method (MonoDebugMethodAddress *address) jit = g_new0 (MonoDebugMethodJitInfo, 1); jit->code_start = address->code_start; jit->code_size = address->code_size; - jit->wrapper_addr = address->wrapper_addr; ptr = (guint8 *) &address->data; @@ -866,63 +648,6 @@ mono_debug_read_method (MonoDebugMethodAddress *address) return jit; } -static void -mono_debug_add_type (MonoClass *klass) -{ - MonoDebugHandle *handle; - MonoDebugClassEntry *entry; - guint8 buffer [BUFSIZ]; - guint8 *ptr, *oldptr; - guint32 size, total_size, max_size; - int base_offset = 0; - - if (klass->generic_class || klass->rank || - (klass->byval_arg.type == MONO_TYPE_VAR) || (klass->byval_arg.type == MONO_TYPE_MVAR)) - return; - - mono_debugger_lock (); - - handle = _mono_debug_get_image (klass->image); - if (!handle) { - mono_debugger_unlock (); - return; - } - - max_size = 12 + sizeof (gpointer); - if (max_size > BUFSIZ) - ptr = oldptr = g_malloc (max_size); - else - ptr = oldptr = buffer; - - if (klass->valuetype) - base_offset = - (int)(sizeof (MonoObject)); - - write_leb128 (klass->type_token, ptr, &ptr); - write_leb128 (klass->instance_size + base_offset, ptr, &ptr); - WRITE_UNALIGNED (gpointer, ptr, klass); - ptr += sizeof (gpointer); - - size = ptr - oldptr; - g_assert (size < max_size); - total_size = size + sizeof (MonoDebugClassEntry); - - g_assert (total_size + 9 < DATA_TABLE_CHUNK_SIZE); - - entry = (MonoDebugClassEntry *) allocate_data_item ( - handle->type_table, MONO_DEBUG_DATA_ITEM_CLASS, total_size); - - entry->size = total_size; - - memcpy (&entry->data, oldptr, size); - - write_data_item (handle->type_table, (guint8 *) entry); - - if (max_size > BUFSIZ) - g_free (oldptr); - - mono_debugger_unlock (); -} - static MonoDebugMethodJitInfo * find_method (MonoMethod *method, MonoDomain *domain) { @@ -952,71 +677,11 @@ mono_debug_find_method (MonoMethod *method, MonoDomain *domain) return res; } -struct LookupMethodAddressData -{ - MonoMethod *method; - MonoDebugMethodHeader *result; -}; - -static void -lookup_method_address_func (gpointer key, gpointer value, gpointer user_data) -{ - MonoDebugDataTable *table = (MonoDebugDataTable *) value; - struct LookupMethodAddressData *data = (struct LookupMethodAddressData *) user_data; - MonoDebugMethodHeader *header; - - header = g_hash_table_lookup (table->method_hash, data->method); - if (header) - data->result = header; -} - MonoDebugMethodAddressList * mono_debug_lookup_method_addresses (MonoMethod *method) { - MonoDebugMethodAddressList *info; - MonoDebugMethodHeader *header = NULL; - struct LookupMethodAddressData data; - MonoMethod *declaring; - int count, size; - GSList *list; - guint8 *ptr; - - g_assert ((mono_debug_debugger_version == 4) || (mono_debug_debugger_version == 5)); - - mono_debugger_lock (); - - declaring = method->is_inflated ? ((MonoMethodInflated *) method)->declaring : method; - - data.method = declaring; - data.result = NULL; - - g_hash_table_foreach (data_table_hash, lookup_method_address_func, &data); - header = data.result; - - if (!header) { - mono_debugger_unlock (); - return NULL; - } - - count = g_slist_length (header->address_list) + 1; - size = sizeof (MonoDebugMethodAddressList) + count * sizeof (gpointer); - - info = g_malloc0 (size); - info->size = size; - info->count = count; - - ptr = info->data; - - WRITE_UNALIGNED (gpointer, ptr, header); - ptr += sizeof (gpointer); - - for (list = header->address_list; list; list = list->next) { - WRITE_UNALIGNED (gpointer, ptr, list->data); - ptr += sizeof (gpointer); - } - - mono_debugger_unlock (); - return info; + g_assert_not_reached (); + return NULL; } static gint32 @@ -1085,7 +750,7 @@ mono_debug_lookup_source_location (MonoMethod *method, guint32 address, MonoDoma return NULL; mono_debugger_lock (); - minfo = _mono_debug_lookup_method (method); + minfo = mono_debug_lookup_method_internal (method); if (!minfo || !minfo->handle || !minfo->handle->symfile || !mono_debug_symfile_is_loaded (minfo->handle->symfile)) { mono_debugger_unlock (); return NULL; @@ -1118,7 +783,7 @@ mono_debug_lookup_locals (MonoMethod *method) return NULL; mono_debugger_lock (); - minfo = _mono_debug_lookup_method (method); + minfo = mono_debug_lookup_method_internal (method); if (!minfo || !minfo->handle || !minfo->handle->symfile || !mono_debug_symfile_is_loaded (minfo->handle->symfile)) { mono_debugger_unlock (); return NULL; @@ -1191,39 +856,6 @@ mono_debug_print_stack_frame (MonoMethod *method, guint32 native_offset, MonoDom return res; } -void -mono_debug_list_add (MonoDebugList **list, gconstpointer data) -{ - MonoDebugList *element, **ptr; - - element = g_new0 (MonoDebugList, 1); - element->data = data; - - for (ptr = list; *ptr; ptr = &(*ptr)->next) - ; - - *ptr = element; -} - -void -mono_debug_list_remove (MonoDebugList **list, gconstpointer data) -{ - MonoDebugList **ptr; - MonoDebugList *next; - - for (ptr = list; *ptr; ptr = &(*ptr)->next) { - if ((*ptr)->data != data) - continue; - - next = (*ptr)->next; - g_free ((*ptr)); - *ptr = next; - break; - } -} - -static gboolean is_attached = FALSE; - void mono_set_is_debugger_attached (gboolean attached) { @@ -1279,6 +911,27 @@ open_symfile_from_bundle (MonoImage *image) return NULL; } +void +mono_debugger_lock (void) +{ + g_assert (initialized); + mono_mutex_lock (&debugger_lock_mutex); +} + +void +mono_debugger_unlock (void) +{ + g_assert (initialized); + mono_mutex_unlock (&debugger_lock_mutex); +} + +void +mono_debugger_initialize () +{ + mono_mutex_init_recursive (&debugger_lock_mutex); + initialized = 1; +} + /** * mono_debug_enabled: * diff --git a/mta-mono/vendor/mono/metadata/mono-debug.h b/mta-mono/vendor/mono/metadata/mono-debug.h index 2106a6f..839ae2c 100644 --- a/mta-mono/vendor/mono/metadata/mono-debug.h +++ b/mta-mono/vendor/mono/metadata/mono-debug.h @@ -149,9 +149,6 @@ struct _MonoDebugVarInfo { #define MONO_DEBUGGER_MINOR_VERSION 6 #define MONO_DEBUGGER_MAGIC 0x7aff65af4253d427ULL -MONO_API void mono_debug_list_add (MonoDebugList **list, const void* data); -MONO_API void mono_debug_list_remove (MonoDebugList **list, const void* data); - MONO_API void mono_debug_init (MonoDebugFormat format); MONO_API void mono_debug_open_image_from_memory (MonoImage *image, const mono_byte *raw_contents, int size); MONO_API void mono_debug_cleanup (void); diff --git a/mta-mono/vendor/mono/metadata/mono-perfcounters-def.h b/mta-mono/vendor/mono/metadata/mono-perfcounters-def.h index e9510d5..91b4fc6 100644 --- a/mta-mono/vendor/mono/metadata/mono-perfcounters-def.h +++ b/mta-mono/vendor/mono/metadata/mono-perfcounters-def.h @@ -28,6 +28,7 @@ PERFCTR_COUNTER(PROC_PBYTES, "Private Bytes", "", NumberOfItems64, unused) PERFCTR_CAT(MONO_MEM, "Mono Memory", "", SingleInstance, Mono, MEM_NUM_OBJECTS) PERFCTR_COUNTER(MEM_NUM_OBJECTS, "Allocated Objects", "", NumberOfItems64, unused) PERFCTR_COUNTER(MEM_PHYS_TOTAL, "Total Physical Memory", "Physical memory installed in the machine, in bytes", NumberOfItems64, unused) +PERFCTR_COUNTER(MEM_PHYS_AVAILABLE, "Available Physical Memory", "Physical memory available in the machine, in bytes", NumberOfItems64, unused) PERFCTR_CAT(ASPNET, "ASP.NET", "", MultiInstance, Mono, ASPNET_REQ_Q) PERFCTR_COUNTER(ASPNET_REQ_Q, "Requests Queued", "", NumberOfItems64, aspnet_requests_queued) diff --git a/mta-mono/vendor/mono/metadata/mono-perfcounters.c b/mta-mono/vendor/mono/metadata/mono-perfcounters.c index f28839f..dc23333 100644 --- a/mta-mono/vendor/mono/metadata/mono-perfcounters.c +++ b/mta-mono/vendor/mono/metadata/mono-perfcounters.c @@ -25,6 +25,11 @@ #ifdef HAVE_SYS_TIME_H #include #endif +#if defined (__APPLE__) +#include +#include +#include +#endif #if defined (__NetBSD__) || defined (__APPLE__) #include #endif @@ -224,6 +229,9 @@ typedef struct { int num_instances; /* variable length data follows */ char name [1]; + // string name + // string help + // SharedCounter counters_info [num_counters] } SharedCategory; typedef struct { @@ -231,6 +239,7 @@ typedef struct { unsigned int category_offset; /* variable length data follows */ char instance_name [1]; + // string name } SharedInstance; typedef struct { @@ -238,6 +247,8 @@ typedef struct { guint8 seq_num; /* variable length data follows */ char name [1]; + // string name + // string help } SharedCounter; typedef struct { @@ -449,6 +460,76 @@ mono_determine_physical_ram_size (void) #endif } +static guint64 +mono_determine_physical_ram_available_size (void) +{ +#if defined (TARGET_WIN32) + MEMORYSTATUSEX memstat; + + memstat.dwLength = sizeof (memstat); + GlobalMemoryStatusEx (&memstat); + return (guint64)memstat.ullAvailPhys; + +#elif defined (__NetBSD__) + struct vmtotal vm_total; + guint64 page_size; + int mib [2]; + size_t len; + + + mib = { + CTL_VM, +#if defined (VM_METER) + VM_METER +#else + VM_TOTAL +#endif + }; + len = sizeof (vm_total); + sysctl (mib, 2, &vm_total, &len, NULL, 0); + + mib = { + CTL_HW, + HW_PAGESIZE + }; + len = sizeof (page_size); + sysctl (mib, 2, &page_size, &len, NULL, 0 + + return ((guint64) value.t_free * page_size) / 1024; +#elif defined (__APPLE__) + mach_msg_type_number_t count = HOST_VM_INFO_COUNT; + vm_statistics_data_t vmstat; + if (KERN_SUCCESS != host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmstat, &count)) { + g_warning ("Mono was unable to retrieve memory usage!"); + return 0; + } + + return (guint64) vmstat.free_count; + +#elif defined (HAVE_SYSCONF) + guint64 page_size = 0, num_pages = 0; + + /* sysconf works on most *NIX operating systems, if your system doesn't have it or if it + * reports invalid values, please add your OS specific code below. */ +#ifdef _SC_PAGESIZE + page_size = (guint64)sysconf (_SC_PAGESIZE); +#endif + +#ifdef _SC_AVPHYS_PAGES + num_pages = (guint64)sysconf (_SC_AVPHYS_PAGES); +#endif + + if (!page_size || !num_pages) { + g_warning ("Your operating system's sysconf (3) function doesn't correctly report physical memory size!"); + return 0; + } + + return page_size * num_pages; +#else + return 0; +#endif +} + void mono_perfcounters_init (void) { @@ -478,9 +559,10 @@ perfctr_type_compress (int type) return 2; } -static unsigned char* -shared_data_find_room (int size) +static SharedHeader* +shared_data_reserve_room (int size, int ftype) { + SharedHeader* header; unsigned char *p = (unsigned char *)shared_area + shared_area->data_start; unsigned char *end = (unsigned char *)shared_area + shared_area->size; @@ -490,7 +572,7 @@ shared_data_find_room (int size) unsigned short *next; if (*p == FTYPE_END) { if (size < (end - p)) - return p; + goto res; return NULL; } if (p + 4 > end) @@ -499,12 +581,20 @@ shared_data_find_room (int size) if (*p == FTYPE_DELETED) { /* we reuse only if it's the same size */ if (*next == size) { - return p; + goto res; } } p += *next; } return NULL; + +res: + header = (SharedHeader*)p; + header->ftype = ftype; + header->extra = 0; /* data_offset could overflow here, so we leave this field unused */ + header->size = size; + + return header; } typedef gboolean (*SharedFunc) (SharedHeader *header, void *data); @@ -610,7 +700,8 @@ find_custom_counter (SharedCategory* cat, MonoString *name) SharedCounter *counter = (SharedCounter*)p; if (mono_string_compare_ascii (name, counter->name) == 0) return counter; - p += 1 + strlen (p + 1) + 1; /* skip counter type and name */ + p += 2; /* skip counter type */ + p += strlen (p) + 1; /* skip counter name */ p += strlen (p) + 1; /* skip counter help */ } return NULL; @@ -619,7 +710,7 @@ find_custom_counter (SharedCategory* cat, MonoString *name) typedef struct { unsigned int cat_offset; SharedCategory* cat; - MonoString *instance; + char *name; SharedInstance* result; GSList *list; } InstanceSearch; @@ -631,8 +722,8 @@ instance_search (SharedHeader *header, void *data) if (header->ftype == FTYPE_INSTANCE) { SharedInstance *ins = (SharedInstance*)header; if (search->cat_offset == ins->category_offset) { - if (search->instance) { - if (mono_string_compare_ascii (search->instance, ins->instance_name) == 0) { + if (search->name) { + if (strcmp (search->name, ins->instance_name) == 0) { search->result = ins; return FALSE; } @@ -645,12 +736,12 @@ instance_search (SharedHeader *header, void *data) } static SharedInstance* -find_custom_instance (SharedCategory* cat, MonoString *instance) +find_custom_instance (SharedCategory* cat, char *name) { InstanceSearch search; search.cat_offset = (char*)cat - (char*)shared_area; search.cat = cat; - search.instance = instance; + search.name = name; search.list = NULL; search.result = NULL; foreach_shared_item (instance_search, &search); @@ -663,7 +754,7 @@ get_custom_instances_list (SharedCategory* cat) InstanceSearch search; search.cat_offset = (char*)cat - (char*)shared_area; search.cat = cat; - search.instance = NULL; + search.name = NULL; search.list = NULL; search.result = NULL; foreach_shared_item (instance_search, &search); @@ -896,11 +987,14 @@ mono_mem_counter (ImplVtable *vtable, MonoBoolean only_value, MonoCounterSample sample->counterType = predef_counters [predef_categories [CATEGORY_MONO_MEM].first_counter + id].type; switch (id) { case COUNTER_MEM_NUM_OBJECTS: - sample->rawValue = mono_stats.new_object_count; + sample->rawValue = 0; return TRUE; case COUNTER_MEM_PHYS_TOTAL: sample->rawValue = mono_determine_physical_ram_size ();; return TRUE; + case COUNTER_MEM_PHYS_AVAILABLE: + sample->rawValue = mono_determine_physical_ram_available_size ();; + return TRUE; } return FALSE; } @@ -1140,41 +1234,33 @@ custom_writable_update (ImplVtable *vtable, MonoBoolean do_incr, gint64 value) } static SharedInstance* -custom_get_instance (SharedCategory *cat, SharedCounter *scounter, MonoString* instance) +custom_get_instance (SharedCategory *cat, SharedCounter *scounter, char* name) { SharedInstance* inst; - unsigned char *ptr; char *p; int size, data_offset; - char *name; - inst = find_custom_instance (cat, instance); + inst = find_custom_instance (cat, name); if (inst) return inst; - name = mono_string_to_utf8 (instance); size = sizeof (SharedInstance) + strlen (name); size += 7; size &= ~7; data_offset = size; size += (sizeof (guint64) * cat->num_counters); perfctr_lock (); - ptr = shared_data_find_room (size); - if (!ptr) { + inst = (SharedInstance*) shared_data_reserve_room (size, FTYPE_INSTANCE); + if (!inst) { perfctr_unlock (); g_free (name); return NULL; } - inst = (SharedInstance*)ptr; - inst->header.extra = 0; /* data_offset could overflow here, so we leave this field unused */ - inst->header.size = size; inst->category_offset = (char*)cat - (char*)shared_area; cat->num_instances++; /* now copy the variable data */ p = inst->instance_name; strcpy (p, name); p += strlen (name) + 1; - inst->header.ftype = FTYPE_INSTANCE; perfctr_unlock (); - g_free (name); return inst; } @@ -1193,24 +1279,33 @@ custom_vtable (SharedCounter *scounter, SharedInstance* inst, char *data) return (ImplVtable*)vtable; } +static gpointer +custom_get_value_address (SharedCounter *scounter, SharedInstance* sinst) +{ + int offset = sizeof (SharedInstance) + strlen (sinst->instance_name); + offset += 7; + offset &= ~7; + offset += scounter->seq_num * sizeof (guint64); + return (char*)sinst + offset; +} + static void* custom_get_impl (SharedCategory *cat, MonoString* counter, MonoString* instance, int *type) { SharedCounter *scounter; SharedInstance* inst; - int size; + char *name; scounter = find_custom_counter (cat, counter); if (!scounter) return NULL; *type = simple_type_to_type [scounter->type]; - inst = custom_get_instance (cat, scounter, instance); + name = mono_string_to_utf8 (counter); + inst = custom_get_instance (cat, scounter, name); + g_free (name); if (!inst) return NULL; - size = sizeof (SharedInstance) + strlen (inst->instance_name); - size += 7; - size &= ~7; - return custom_vtable (scounter, inst, (char*)inst + size + scounter->seq_num * sizeof (guint64)); + return custom_vtable (scounter, inst, custom_get_value_address (scounter, inst)); } static const CategoryDesc* @@ -1383,7 +1478,6 @@ mono_perfcounter_create (MonoString *category, MonoString *help, int type, MonoA char *name = NULL; char *chelp = NULL; char **counter_info = NULL; - unsigned char *ptr; char *p; SharedCategory *cat; @@ -1419,14 +1513,11 @@ mono_perfcounter_create (MonoString *category, MonoString *help, int type, MonoA if (size > 65535) goto failure; perfctr_lock (); - ptr = shared_data_find_room (size); - if (!ptr) { + cat = (SharedCategory*) shared_data_reserve_room (size, FTYPE_CATEGORY); + if (!cat) { perfctr_unlock (); goto failure; } - cat = (SharedCategory*)ptr; - cat->header.extra = type; - cat->header.size = size; cat->num_counters = num_counters; cat->counters_data_size = counters_data_size; /* now copy the vaiable data */ @@ -1445,7 +1536,6 @@ mono_perfcounter_create (MonoString *category, MonoString *help, int type, MonoA strcpy (p, counter_info [i * 2 + 1]); p += strlen (counter_info [i * 2 + 1]) + 1; } - cat->header.ftype = FTYPE_CATEGORY; perfctr_unlock (); result = TRUE; @@ -1466,6 +1556,8 @@ int mono_perfcounter_instance_exists (MonoString *instance, MonoString *category, MonoString *machine) { const CategoryDesc *cdesc; + SharedInstance *sinst; + char *name; /* no support for counters on other machines */ /*FIXME: machine appears to be wrong if (mono_string_compare_ascii (machine, ".")) @@ -1476,7 +1568,10 @@ mono_perfcounter_instance_exists (MonoString *instance, MonoString *category, Mo scat = find_custom_category (category); if (!scat) return FALSE; - if (find_custom_instance (scat, instance)) + name = mono_string_to_utf8 (instance); + sinst = find_custom_instance (scat, name); + g_free (name); + if (sinst) return TRUE; } else { /* FIXME: search instance */ @@ -1539,7 +1634,8 @@ mono_perfcounter_counter_names (MonoString *category, MonoString *machine) res = mono_array_new (domain, mono_get_string_class (), scat->num_counters); for (i = 0; i < scat->num_counters; ++i) { mono_array_setref (res, i, mono_string_new (domain, p + 1)); - p += 1 + strlen (p + 1) + 1; /* skip counter type and name */ + p += 2; /* skip counter type */ + p += strlen (p) + 1; /* skip counter name */ p += strlen (p) + 1; /* skip counter help */ } perfctr_unlock (); @@ -1691,6 +1787,65 @@ mono_perfcounter_instance_names (MonoString *category, MonoString *machine) return mono_array_new (mono_domain_get (), mono_get_string_class (), 0); } } + +typedef struct { + PerfCounterEnumCallback cb; + void *data; +} PerfCounterForeachData; + +static gboolean +mono_perfcounter_foreach_shared_item (SharedHeader *header, gpointer data) +{ + int i; + char *p, *name, *help; + unsigned char type; + int seq_num; + void *addr; + SharedCategory *cat; + SharedCounter *counter; + SharedInstance *inst; + PerfCounterForeachData *foreach_data = data; + + if (header->ftype == FTYPE_CATEGORY) { + cat = (SharedCategory*)header; + + p = cat->name; + p += strlen (p) + 1; /* skip category name */ + p += strlen (p) + 1; /* skip category help */ + + for (i = 0; i < cat->num_counters; ++i) { + counter = (SharedCounter*) p; + type = (unsigned char)*p++; + seq_num = (int)*p++; + name = p; + p += strlen (p) + 1; + help = p; + p += strlen (p) + 1; + + inst = custom_get_instance (cat, counter, name); + if (!inst) + return FALSE; + addr = custom_get_value_address (counter, inst); + if (!foreach_data->cb (cat->name, name, type, addr ? *(gint64*)addr : 0, foreach_data->data)) + return FALSE; + } + } + + return TRUE; +} + +void +mono_perfcounter_foreach (PerfCounterEnumCallback cb, gpointer data) +{ + PerfCounterForeachData foreach_data = { cb, data }; + + perfctr_lock (); + + foreach_shared_item (mono_perfcounter_foreach_shared_item, &foreach_data); + + perfctr_unlock (); +} + #else void* mono_perfcounter_get_impl (MonoString* category, MonoString* counter, MonoString* instance, MonoString* machine, int *type, MonoBoolean *custom) diff --git a/mta-mono/vendor/mono/metadata/mono-perfcounters.h b/mta-mono/vendor/mono/metadata/mono-perfcounters.h index 3cf5e8f..c9f3fc2 100644 --- a/mta-mono/vendor/mono/metadata/mono-perfcounters.h +++ b/mta-mono/vendor/mono/metadata/mono-perfcounters.h @@ -2,8 +2,8 @@ #define __MONO_PERFCOUNTERS_H__ #include -#include -#include +#include +#include typedef struct _MonoCounterSample MonoCounterSample; @@ -25,6 +25,8 @@ MonoArray* mono_perfcounter_category_names (MonoString *machine) MONO_INTERNAL MonoArray* mono_perfcounter_counter_names (MonoString *category, MonoString *machine) MONO_INTERNAL; MonoArray* mono_perfcounter_instance_names (MonoString *category, MonoString *machine) MONO_INTERNAL; +typedef gboolean (*PerfCounterEnumCallback) (char *category_name, char *name, unsigned char type, gint64 value, gpointer user_data); +MONO_API void mono_perfcounter_foreach (PerfCounterEnumCallback cb, gpointer user_data); #endif /* __MONO_PERFCOUNTERS_H__ */ diff --git a/mta-mono/vendor/mono/metadata/mono-route.c b/mta-mono/vendor/mono/metadata/mono-route.c new file mode 100644 index 0000000..4b5ca58 --- /dev/null +++ b/mta-mono/vendor/mono/metadata/mono-route.c @@ -0,0 +1,124 @@ +/* + * mono-route.c: Read the network routing tables using sysctl(3) calls + * Required for Unix-like systems that don't have Linux's /proc/net/route + * + * Author: + * Ben Woods (woodsb02@gmail.com) + */ + +#if defined(PLATFORM_MACOSX) || defined(PLATFORM_BSD) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern MonoBoolean ves_icall_System_Net_NetworkInformation_MacOsIPInterfaceProperties_ParseRouteInfo_internal(MonoString *iface, MonoArray **gw_addr_list) +{ + size_t needed; + in_addr_t in; + int mib[6]; + int num_gws=0, gwnum=0; + unsigned int ifindex = 0; + char *buf, *next, *lim, *ifacename; + struct rt_msghdr *rtm; + + MonoDomain *domain = mono_domain_get (); + + ifacename = mono_string_to_utf8(iface); + if ((ifindex = if_nametoindex(ifacename)) == 0) + return FALSE; + g_free(ifacename); + + // MIB array defining data to read from sysctl + mib[0] = CTL_NET; // Networking + mib[1] = PF_ROUTE; // Routing messages + mib[2] = 0; // Protocol number (always zero) + mib[3] = AF_INET; // Address family (IPv4) + mib[4] = NET_RT_DUMP; // Dump routing table + mib[5] = 0; // + + // First sysctl call with oldp set to NULL to determine size of available data + if (sysctl(mib, G_N_ELEMENTS(mib), NULL, &needed, NULL, 0) < 0) + return FALSE; + + // Allocate suffcient memory for available data based on the previous sysctl call + if ((buf = malloc(needed)) == NULL) + return FALSE; + + // Second sysctl call to retrieve data into appropriately sized buffer + if (sysctl(mib, G_N_ELEMENTS(mib), buf, &needed, NULL, 0) < 0) + return FALSE; + + lim = buf + needed; + for (next = buf; next < lim; next += rtm->rtm_msglen) { + rtm = (struct rt_msghdr *)next; + if (rtm->rtm_version != RTM_VERSION) + continue; + if (rtm->rtm_index != ifindex) + continue; + if((in = gateway_from_rtm(rtm)) == 0) + continue; + num_gws++; + } + + *gw_addr_list = mono_array_new(domain, mono_get_string_class (), num_gws); + + for (next = buf; next < lim; next += rtm->rtm_msglen) { + rtm = (struct rt_msghdr *)next; + if (rtm->rtm_version != RTM_VERSION) + continue; + if (rtm->rtm_index != ifindex) + continue; + if ((in = gateway_from_rtm(rtm)) == 0) + continue; + + MonoString *addr_string; + char addr [16], *ptr; + int len; + + ptr = (char *) ∈ + len = snprintf(addr, sizeof(addr), "%u.%u.%u.%u", + (unsigned char) ptr [0], + (unsigned char) ptr [1], + (unsigned char) ptr [2], + (unsigned char) ptr [3]); + + if ((len >= sizeof(addr)) || (len < 0)) + // snprintf output truncated + continue; + + addr_string = mono_string_new (domain, addr); + mono_array_setref (*gw_addr_list, gwnum, addr_string); + gwnum++; + } + free(buf); + return TRUE; +} + +in_addr_t gateway_from_rtm(struct rt_msghdr *rtm) +{ + struct sockaddr *gw; + unsigned int l; + + struct sockaddr *addr = (struct sockaddr *)(rtm + 1); + l = roundup(addr->sa_len, sizeof(long)); \ + gw = (struct sockaddr *)((char *) addr + l); \ + + if (rtm->rtm_addrs & RTA_GATEWAY) { + if(gw->sa_family == AF_INET) { + struct sockaddr_in *sockin = (struct sockaddr_in *)gw; + return(sockin->sin_addr.s_addr); + } + } + + return 0; +} + +#endif /* #if defined(PLATFORM_MACOSX) || defined(PLATFORM_BSD) */ diff --git a/mta-mono/vendor/mono/metadata/mono-route.h b/mta-mono/vendor/mono/metadata/mono-route.h new file mode 100644 index 0000000..8f7cf73 --- /dev/null +++ b/mta-mono/vendor/mono/metadata/mono-route.h @@ -0,0 +1,23 @@ +#ifndef __MONO_ROUTE_H__ +#define __MONO_ROUTE_H__ + +#if defined(PLATFORM_MACOSX) || defined(PLATFORM_BSD) + +#include + +#ifdef HOST_IOS +// The iOS SDK does not provide the net/route.h header but using the Darwin version works fine. +#include "../../support/ios/net/route.h" +#else +#include +#endif + +#include + +in_addr_t gateway_from_rtm (struct rt_msghdr *rtm) MONO_INTERNAL; + +/* Category icalls */ +extern MonoBoolean ves_icall_System_Net_NetworkInformation_MacOsIPInterfaceProperties_ParseRouteInfo_internal (MonoString *iface, MonoArray **gw_addr_list) MONO_INTERNAL; + +#endif /* #if defined(PLATFORM_MACOSX) || defined(PLATFORM_BSD) */ +#endif /* __MONO_ROUTE_H__ */ diff --git a/mta-mono/vendor/mono/metadata/mono-security.c b/mta-mono/vendor/mono/metadata/mono-security.c new file mode 100644 index 0000000..c5024b8 --- /dev/null +++ b/mta-mono/vendor/mono/metadata/mono-security.c @@ -0,0 +1,959 @@ +/* + * security.c: Security internal calls + * + * Author: + * Sebastien Pouliot + * + * Copyright 2004-2009 Novell, Inc (http://www.novell.com) + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HOST_WIN32 + +#include +#include + +#ifndef PROTECTED_DACL_SECURITY_INFORMATION +#define PROTECTED_DACL_SECURITY_INFORMATION 0x80000000L +#endif + +#else + +#include +#ifdef HAVE_GRP_H +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#include +#include +#include +#include + +/* Disclaimers */ + +#if defined(__GNUC__) + +#ifndef HAVE_GETGRGID_R + #warning Non-thread safe getgrgid being used! +#endif +#ifndef HAVE_GETGRNAM_R + #warning Non-thread safe getgrnam being used! +#endif +#ifndef HAVE_GETPWNAM_R + #warning Non-thread safe getpwnam being used! +#endif +#ifndef HAVE_GETPWUID_R + #warning Non-thread safe getpwuid being used! +#endif + +#endif /* defined(__GNUC__) */ + +#endif /* not HOST_WIN32 */ + + +/* internal functions - reuse driven */ + +#ifdef HOST_WIN32 + +/* ask a server to translate a SID into a textual representation */ +static gunichar2* +GetSidName (gunichar2 *server, PSID sid, gint32 *size) +{ + gunichar2 *uniname = NULL; + DWORD cchName = 0; + DWORD cchDomain = 0; + SID_NAME_USE peUse; /* out */ + + LookupAccountSid (server, sid, NULL, &cchName, NULL, + &cchDomain, &peUse); + + if ((cchName > 0) && (cchDomain > 0)) { + gunichar2 *user = g_malloc0 ((cchName + 1) * 2); + gunichar2 *domain = g_malloc0 ((cchDomain + 1) * 2); + + LookupAccountSid (server, sid, user, &cchName, domain, + &cchDomain, &peUse); + + if (cchName > 0) { + if (cchDomain > 0) { + /* domain/machine name included (+ sepearator) */ + *size = cchName + cchDomain + 1; + uniname = g_malloc0 ((*size + 1) * 2); + memcpy (uniname, domain, cchDomain * 2); + *(uniname + cchDomain) = '\\'; + memcpy (uniname + cchDomain + 1, user, cchName * 2); + g_free (user); + } + else { + /* no domain / machine */ + *size = cchName; + uniname = user; + } + } + else { + /* nothing -> return NULL */ + g_free (user); + } + + g_free (domain); + } + + return uniname; +} + + +#else /* not HOST_WIN32 */ + +#define MONO_SYSCONF_DEFAULT_SIZE ((size_t) 1024) + +/* + * Ensure we always get a valid (usable) value from sysconf. + * In case of error, we return the default value. + */ +static size_t mono_sysconf (int name) +{ + size_t size = (size_t) sysconf (name); + /* default value */ + return (size == -1) ? MONO_SYSCONF_DEFAULT_SIZE : size; +} + + +static gchar* +GetTokenName (uid_t uid) +{ + gchar *uname = NULL; + +#ifdef HAVE_GETPWUID_R + struct passwd pwd; + size_t fbufsize; + gchar *fbuf; + gint32 retval; +#endif + struct passwd *p = NULL; + gboolean result; + +#ifdef HAVE_GETPWUID_R +#ifdef _SC_GETPW_R_SIZE_MAX + fbufsize = mono_sysconf (_SC_GETPW_R_SIZE_MAX); +#else + fbufsize = MONO_SYSCONF_DEFAULT_SIZE; +#endif + fbuf = g_malloc0 (fbufsize); + retval = getpwuid_r (uid, &pwd, fbuf, fbufsize, &p); + result = ((retval == 0) && (p == &pwd)); +#else + /* default to non thread-safe but posix compliant function */ + p = getpwuid (uid); + result = (p != NULL); +#endif + + if (result) { + uname = g_strdup (p->pw_name); + } + +#ifdef HAVE_GETPWUID_R + g_free (fbuf); +#endif + + return uname; +} + + +static gboolean +IsMemberInList (uid_t user, struct group *g) +{ + gboolean result = FALSE; + gchar *utf8_username = GetTokenName (user); + + if (!utf8_username) + return FALSE; + + if (g) { + gchar **users = g->gr_mem; + + while (*users) { + gchar *u = *(users); + if (strcmp (utf8_username, u) == 0) { + result = TRUE; + break; + } + users++; + } + } + + g_free (utf8_username); + return result; +} + + +static gboolean +IsDefaultGroup (uid_t user, gid_t group) +{ +#ifdef HAVE_GETPWUID_R + struct passwd pwd; + size_t fbufsize; + gchar *fbuf; + gint32 retval; +#endif + struct passwd *p = NULL; + gboolean result; + +#ifdef HAVE_GETPWUID_R +#ifdef _SC_GETPW_R_SIZE_MAX + fbufsize = mono_sysconf (_SC_GETPW_R_SIZE_MAX); +#else + fbufsize = MONO_SYSCONF_DEFAULT_SIZE; +#endif + + fbuf = g_malloc0 (fbufsize); + retval = getpwuid_r (user, &pwd, fbuf, fbufsize, &p); + result = ((retval == 0) && (p == &pwd)); +#else + /* default to non thread-safe but posix compliant function */ + p = getpwuid (user); + result = (p != NULL); +#endif + + if (result) { + result = (p->pw_gid == group); + } + +#ifdef HAVE_GETPWUID_R + g_free (fbuf); +#endif + + return result; +} + + +static gboolean +IsMemberOf (gid_t user, struct group *g) +{ + if (!g) + return FALSE; + + /* is it the user default group */ + if (IsDefaultGroup (user, g->gr_gid)) + return TRUE; + + /* is the user in the group list */ + return IsMemberInList (user, g); +} + +#endif + + +/* ICALLS */ + + +/* System.Security.Principal.WindowsIdentity */ + + +gpointer +ves_icall_System_Security_Principal_WindowsIdentity_GetCurrentToken (void) +{ + gpointer token = NULL; + +#ifdef HOST_WIN32 + /* Note: This isn't a copy of the Token - we must not close it!!! + * http://www.develop.com/kbrown/book/html/whatis_windowsprincipal.html + */ + + /* thread may be impersonating somebody */ + if (OpenThreadToken (GetCurrentThread (), TOKEN_QUERY, 1, &token) == 0) { + /* if not take the process identity */ + OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &token); + } +#else + token = GINT_TO_POINTER (geteuid ()); +#endif + return token; +} + + +MonoString* +ves_icall_System_Security_Principal_WindowsIdentity_GetTokenName (gpointer token) +{ + MonoString *result = NULL; + gunichar2 *uniname = NULL; + gint32 size = 0; + +#ifdef HOST_WIN32 + GetTokenInformation (token, TokenUser, NULL, size, (PDWORD)&size); + if (size > 0) { + TOKEN_USER *tu = g_malloc0 (size); + if (GetTokenInformation (token, TokenUser, tu, size, (PDWORD)&size)) { + uniname = GetSidName (NULL, tu->User.Sid, &size); + } + g_free (tu); + } +#else + gchar *uname = GetTokenName ((uid_t) GPOINTER_TO_INT (token)); + + if (uname) { + size = strlen (uname); + uniname = g_utf8_to_utf16 (uname, size, NULL, NULL, NULL); + g_free (uname); + } +#endif /* HOST_WIN32 */ + + if (size > 0) { + result = mono_string_new_utf16 (mono_domain_get (), uniname, size); + } + else + result = mono_string_new (mono_domain_get (), ""); + + if (uniname) + g_free (uniname); + + return result; +} + + +gpointer +ves_icall_System_Security_Principal_WindowsIdentity_GetUserToken (MonoString *username) +{ +#ifdef HOST_WIN32 + gpointer token = NULL; + + /* TODO: MS has something like this working in Windows 2003 (client and + * server) but works only for domain accounts (so it's quite limiting). + * http://www.develop.com/kbrown/book/html/howto_logonuser.html + */ + g_warning ("Unsupported on Win32 (anyway requires W2K3 minimum)"); + +#else /* HOST_WIN32*/ + +#ifdef HAVE_GETPWNAM_R + struct passwd pwd; + size_t fbufsize; + gchar *fbuf; + gint32 retval; +#endif + gpointer token = (gpointer) -2; + struct passwd *p; + gchar *utf8_name; + gboolean result; + + utf8_name = mono_unicode_to_external (mono_string_chars (username)); + +#ifdef HAVE_GETPWNAM_R +#ifdef _SC_GETPW_R_SIZE_MAX + fbufsize = mono_sysconf (_SC_GETPW_R_SIZE_MAX); +#else + fbufsize = MONO_SYSCONF_DEFAULT_SIZE; +#endif + + fbuf = g_malloc0 (fbufsize); + retval = getpwnam_r (utf8_name, &pwd, fbuf, fbufsize, &p); + result = ((retval == 0) && (p == &pwd)); +#else + /* default to non thread-safe but posix compliant function */ + p = getpwnam (utf8_name); + result = (p != NULL); +#endif + + if (result) { + token = GINT_TO_POINTER (p->pw_uid); + } + +#ifdef HAVE_GETPWNAM_R + g_free (fbuf); +#endif + g_free (utf8_name); +#endif + return token; +} + + +/* http://www.dotnet247.com/247reference/msgs/39/195403.aspx +// internal static string[] WindowsIdentity._GetRoles (IntPtr token) +*/ +MonoArray* +ves_icall_System_Security_Principal_WindowsIdentity_GetRoles (gpointer token) +{ + MonoArray *array = NULL; + MonoDomain *domain = mono_domain_get (); +#ifdef HOST_WIN32 + gint32 size = 0; + + GetTokenInformation (token, TokenGroups, NULL, size, (PDWORD)&size); + if (size > 0) { + TOKEN_GROUPS *tg = g_malloc0 (size); + if (GetTokenInformation (token, TokenGroups, tg, size, (PDWORD)&size)) { + int i=0; + int num = tg->GroupCount; + + array = mono_array_new (domain, mono_get_string_class (), num); + + for (i=0; i < num; i++) { + gint32 size = 0; + gunichar2 *uniname = GetSidName (NULL, tg->Groups [i].Sid, &size); + + if (uniname) { + MonoString *str = mono_string_new_utf16 (domain, uniname, size); + mono_array_setref (array, i, str); + g_free (uniname); + } + } + } + g_free (tg); + } +#else + /* POSIX-compliant systems should use IsMemberOfGroupId or IsMemberOfGroupName */ + g_warning ("WindowsIdentity._GetRoles should never be called on POSIX"); +#endif + if (!array) { + /* return empty array of string, i.e. string [0] */ + array = mono_array_new (domain, mono_get_string_class (), 0); + } + return array; +} + + +/* System.Security.Principal.WindowsImpersonationContext */ + + +gboolean +ves_icall_System_Security_Principal_WindowsImpersonationContext_CloseToken (gpointer token) +{ + gboolean result = TRUE; + +#ifdef HOST_WIN32 + result = (CloseHandle (token) != 0); +#endif + return result; +} + + +gpointer +ves_icall_System_Security_Principal_WindowsImpersonationContext_DuplicateToken (gpointer token) +{ + gpointer dupe = NULL; + +#ifdef HOST_WIN32 + if (DuplicateToken (token, SecurityImpersonation, &dupe) == 0) { + dupe = NULL; + } +#else + dupe = token; +#endif + return dupe; +} + + +gboolean +ves_icall_System_Security_Principal_WindowsImpersonationContext_SetCurrentToken (gpointer token) +{ + /* Posix version implemented in /mono/mono/io-layer/security.c */ + return (ImpersonateLoggedOnUser (token) != 0); +} + + +gboolean +ves_icall_System_Security_Principal_WindowsImpersonationContext_RevertToSelf (void) +{ + /* Posix version implemented in /mono/mono/io-layer/security.c */ + return (RevertToSelf () != 0); +} + + +/* System.Security.Principal.WindowsPrincipal */ + +gboolean +ves_icall_System_Security_Principal_WindowsPrincipal_IsMemberOfGroupId (gpointer user, gpointer group) +{ + gboolean result = FALSE; + +#ifdef HOST_WIN32 + /* The convertion from an ID to a string is done in managed code for Windows */ + g_warning ("IsMemberOfGroupId should never be called on Win32"); + +#else /* HOST_WIN32 */ + +#ifdef HAVE_GETGRGID_R + struct group grp; + size_t fbufsize; + gchar *fbuf; + gint32 retval; +#endif + struct group *g = NULL; + +#ifdef HAVE_GETGRGID_R +#ifdef _SC_GETGR_R_SIZE_MAX + fbufsize = mono_sysconf (_SC_GETGR_R_SIZE_MAX); +#else + fbufsize = MONO_SYSCONF_DEFAULT_SIZE; +#endif + fbuf = g_malloc0 (fbufsize); + retval = getgrgid_r ((gid_t) GPOINTER_TO_INT (group), &grp, fbuf, fbufsize, &g); + result = ((retval == 0) && (g == &grp)); +#else + /* default to non thread-safe but posix compliant function */ + g = getgrgid ((gid_t) GPOINTER_TO_INT (group)); + result = (g != NULL); +#endif + + if (result) { + result = IsMemberOf ((uid_t) GPOINTER_TO_INT (user), g); + } + +#ifdef HAVE_GETGRGID_R + g_free (fbuf); +#endif + +#endif /* HOST_WIN32 */ + + return result; +} + + +gboolean +ves_icall_System_Security_Principal_WindowsPrincipal_IsMemberOfGroupName (gpointer user, MonoString *group) +{ + gboolean result = FALSE; + +#ifdef HOST_WIN32 + /* Windows version use a cache built using WindowsIdentity._GetRoles */ + g_warning ("IsMemberOfGroupName should never be called on Win32"); + +#else /* HOST_WIN32 */ + gchar *utf8_groupname; + + utf8_groupname = mono_unicode_to_external (mono_string_chars (group)); + if (utf8_groupname) { + struct group *g = NULL; +#ifdef HAVE_GETGRNAM_R + struct group grp; + gchar *fbuf; + gint32 retval; +#ifdef _SC_GETGR_R_SIZE_MAX + size_t fbufsize = mono_sysconf (_SC_GETGR_R_SIZE_MAX); +#else + size_t fbufsize = MONO_SYSCONF_DEFAULT_SIZE; +#endif + fbuf = g_malloc0 (fbufsize); + retval = getgrnam_r (utf8_groupname, &grp, fbuf, fbufsize, &g); + result = ((retval == 0) && (g == &grp)); +#else + /* default to non thread-safe but posix compliant function */ + g = getgrnam (utf8_groupname); + result = (g != NULL); +#endif + + if (result) { + result = IsMemberOf ((uid_t) GPOINTER_TO_INT (user), g); + } + +#ifdef HAVE_GETGRNAM_R + g_free (fbuf); +#endif + g_free (utf8_groupname); + } +#endif /* HOST_WIN32 */ + + return result; +} + + +/* Mono.Security.Cryptography IO related internal calls */ + +#ifdef HOST_WIN32 + +static PSID +GetAdministratorsSid (void) +{ + SID_IDENTIFIER_AUTHORITY admins = SECURITY_NT_AUTHORITY; + PSID pSid = NULL; + if (!AllocateAndInitializeSid (&admins, 2, SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pSid)) + return NULL; + /* Note: this SID must be freed with FreeSid () */ + return pSid; +} + + +static PSID +GetEveryoneSid (void) +{ + SID_IDENTIFIER_AUTHORITY everyone = SECURITY_WORLD_SID_AUTHORITY; + PSID pSid = NULL; + if (!AllocateAndInitializeSid (&everyone, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pSid)) + return NULL; + /* Note: this SID must be freed with FreeSid () */ + return pSid; +} + + +static PSID +GetCurrentUserSid (void) +{ + PSID sid = NULL; + guint32 size = 0; + gpointer token = ves_icall_System_Security_Principal_WindowsIdentity_GetCurrentToken (); + + GetTokenInformation (token, TokenUser, NULL, size, (PDWORD)&size); + if (size > 0) { + TOKEN_USER *tu = g_malloc0 (size); + if (GetTokenInformation (token, TokenUser, tu, size, (PDWORD)&size)) { + DWORD length = GetLengthSid (tu->User.Sid); + sid = (PSID) g_malloc0 (length); + if (!CopySid (length, sid, tu->User.Sid)) { + g_free (sid); + sid = NULL; + } + } + g_free (tu); + } + /* Note: this SID must be freed with g_free () */ + return sid; +} + + +static ACCESS_MASK +GetRightsFromSid (PSID sid, PACL acl) +{ + ACCESS_MASK rights = 0; + TRUSTEE trustee; + + BuildTrusteeWithSidW (&trustee, sid); + if (GetEffectiveRightsFromAcl (acl, &trustee, &rights) != ERROR_SUCCESS) + return 0; + + return rights; +} + + +static gboolean +IsMachineProtected (gunichar2 *path) +{ + gboolean success = FALSE; + PACL pDACL = NULL; + PSID pEveryoneSid = NULL; + + DWORD dwRes = GetNamedSecurityInfoW (path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pDACL, NULL, NULL); + if (dwRes != ERROR_SUCCESS) + return FALSE; + + /* We check that Everyone is still limited to READ-ONLY - + but not if new entries have been added by an Administrator */ + + pEveryoneSid = GetEveryoneSid (); + if (pEveryoneSid) { + ACCESS_MASK rights = GetRightsFromSid (pEveryoneSid, pDACL); + /* http://msdn.microsoft.com/library/en-us/security/security/generic_access_rights.asp?frame=true */ + success = (rights == (READ_CONTROL | SYNCHRONIZE | FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES)); + FreeSid (pEveryoneSid); + } + /* Note: we don't need to check our own access - + we'll know soon enough when reading the file */ + + if (pDACL) + LocalFree (pDACL); + + return success; +} + + +static gboolean +IsUserProtected (gunichar2 *path) +{ + gboolean success = FALSE; + PACL pDACL = NULL; + PSID pEveryoneSid = NULL; + PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL; + + DWORD dwRes = GetNamedSecurityInfoW (path, SE_FILE_OBJECT, + DACL_SECURITY_INFORMATION, NULL, NULL, &pDACL, NULL, &pSecurityDescriptor); + if (dwRes != ERROR_SUCCESS) + return FALSE; + + /* We check that our original entries in the ACL are in place - + but not if new entries have been added by the user */ + + /* Everyone should be denied */ + pEveryoneSid = GetEveryoneSid (); + if (pEveryoneSid) { + ACCESS_MASK rights = GetRightsFromSid (pEveryoneSid, pDACL); + success = (rights == 0); + FreeSid (pEveryoneSid); + } + /* Note: we don't need to check our own access - + we'll know soon enough when reading the file */ + + if (pSecurityDescriptor) + LocalFree (pSecurityDescriptor); + + return success; +} + + +static gboolean +ProtectMachine (gunichar2 *path) +{ + PSID pEveryoneSid = GetEveryoneSid (); + PSID pAdminsSid = GetAdministratorsSid (); + DWORD retval = -1; + + if (pEveryoneSid && pAdminsSid) { + PACL pDACL = NULL; + EXPLICIT_ACCESS ea [2]; + ZeroMemory (&ea, 2 * sizeof (EXPLICIT_ACCESS)); + + /* grant all access to the BUILTIN\Administrators group */ + BuildTrusteeWithSidW (&ea [0].Trustee, pAdminsSid); + ea [0].grfAccessPermissions = GENERIC_ALL; + ea [0].grfAccessMode = SET_ACCESS; + ea [0].grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; + ea [0].Trustee.TrusteeForm = TRUSTEE_IS_SID; + ea [0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; + + /* read-only access everyone */ + BuildTrusteeWithSidW (&ea [1].Trustee, pEveryoneSid); + ea [1].grfAccessPermissions = GENERIC_READ; + ea [1].grfAccessMode = SET_ACCESS; + ea [1].grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; + ea [1].Trustee.TrusteeForm = TRUSTEE_IS_SID; + ea [1].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; + + retval = SetEntriesInAcl (2, ea, NULL, &pDACL); + if (retval == ERROR_SUCCESS) { + /* with PROTECTED_DACL_SECURITY_INFORMATION we */ + /* remove any existing ACL (like inherited ones) */ + retval = SetNamedSecurityInfo (path, SE_FILE_OBJECT, + DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, + NULL, NULL, pDACL, NULL); + } + if (pDACL) + LocalFree (pDACL); + } + + if (pEveryoneSid) + FreeSid (pEveryoneSid); + if (pAdminsSid) + FreeSid (pAdminsSid); + return (retval == ERROR_SUCCESS); +} + + +static gboolean +ProtectUser (gunichar2 *path) +{ + DWORD retval = -1; + + PSID pCurrentSid = GetCurrentUserSid (); + if (pCurrentSid) { + PACL pDACL = NULL; + EXPLICIT_ACCESS ea; + ZeroMemory (&ea, sizeof (EXPLICIT_ACCESS)); + + /* grant exclusive access to the current user */ + BuildTrusteeWithSidW (&ea.Trustee, pCurrentSid); + ea.grfAccessPermissions = GENERIC_ALL; + ea.grfAccessMode = SET_ACCESS; + ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; + ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; + ea.Trustee.TrusteeType = TRUSTEE_IS_USER; + + retval = SetEntriesInAcl (1, &ea, NULL, &pDACL); + if (retval == ERROR_SUCCESS) { + /* with PROTECTED_DACL_SECURITY_INFORMATION we + remove any existing ACL (like inherited ones) */ + retval = SetNamedSecurityInfo (path, SE_FILE_OBJECT, + DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, + NULL, NULL, pDACL, NULL); + } + + if (pDACL) + LocalFree (pDACL); + g_free (pCurrentSid); /* g_malloc0 */ + } + + return (retval == ERROR_SUCCESS); +} + +#else + +static gboolean +IsProtected (MonoString *path, gint32 protection) +{ + gboolean result = FALSE; + gchar *utf8_name = mono_unicode_to_external (mono_string_chars (path)); + if (utf8_name) { + struct stat st; + if (stat (utf8_name, &st) == 0) { + result = (((st.st_mode & 0777) & protection) == 0); + } + g_free (utf8_name); + } + return result; +} + + +static gboolean +Protect (MonoString *path, gint32 file_mode, gint32 add_dir_mode) +{ + gboolean result = FALSE; + gchar *utf8_name = mono_unicode_to_external (mono_string_chars (path)); + if (utf8_name) { + struct stat st; + if (stat (utf8_name, &st) == 0) { + int mode = file_mode; + if (st.st_mode & S_IFDIR) + mode |= add_dir_mode; + result = (chmod (utf8_name, mode) == 0); + } + g_free (utf8_name); + } + return result; +} + +#endif /* not HOST_WIN32 */ + + +MonoBoolean +ves_icall_Mono_Security_Cryptography_KeyPairPersistence_CanSecure (MonoString *root) +{ +#if HOST_WIN32 + gint32 flags; + + /* ACL are nice... unless you have FAT or other uncivilized filesystem */ + if (!GetVolumeInformation (mono_string_chars (root), NULL, 0, NULL, NULL, (LPDWORD)&flags, NULL, 0)) + return FALSE; + return ((flags & FS_PERSISTENT_ACLS) == FS_PERSISTENT_ACLS); +#else + /* we assume some kind of security is applicable outside Windows */ + return TRUE; +#endif +} + + +MonoBoolean +ves_icall_Mono_Security_Cryptography_KeyPairPersistence_IsMachineProtected (MonoString *path) +{ + gboolean ret = FALSE; + + /* no one, but the owner, should have write access to the directory */ +#ifdef HOST_WIN32 + ret = IsMachineProtected (mono_string_chars (path)); +#else + ret = IsProtected (path, (S_IWGRP | S_IWOTH)); +#endif + return ret; +} + + +MonoBoolean +ves_icall_Mono_Security_Cryptography_KeyPairPersistence_IsUserProtected (MonoString *path) +{ + gboolean ret = FALSE; + + /* no one, but the user, should have access to the directory */ +#ifdef HOST_WIN32 + ret = IsUserProtected (mono_string_chars (path)); +#else + ret = IsProtected (path, (S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH)); +#endif + return ret; +} + + +MonoBoolean +ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectMachine (MonoString *path) +{ + gboolean ret = FALSE; + + /* read/write to owner, read to everyone else */ +#ifdef HOST_WIN32 + ret = ProtectMachine (mono_string_chars (path)); +#else + ret = Protect (path, (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH), (S_IXUSR | S_IXGRP | S_IXOTH)); +#endif + return ret; +} + + +MonoBoolean +ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectUser (MonoString *path) +{ + gboolean ret = FALSE; + + /* read/write to user, no access to everyone else */ +#ifdef HOST_WIN32 + ret = ProtectUser (mono_string_chars (path)); +#else + ret = Protect (path, (S_IRUSR | S_IWUSR), S_IXUSR); +#endif + return ret; +} + + +/* + * Returns TRUE if there is "something" where the Authenticode signature is + * normally located. Returns FALSE is data directory is empty. + * + * Note: Neither the structure nor the signature is verified by this function. + */ +MonoBoolean +ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent (MonoReflectionAssembly *refass) +{ + if (refass && refass->assembly && refass->assembly->image) { + return mono_image_has_authenticode_entry (refass->assembly->image); + } + return FALSE; +} + + +/* System.Security.SecureString related internal calls */ + +static MonoImage *system_security_assembly = NULL; + +void +ves_icall_System_Security_SecureString_DecryptInternal (MonoArray *data, MonoObject *scope) +{ + invoke_protected_memory_method (data, scope, FALSE); +} +void +ves_icall_System_Security_SecureString_EncryptInternal (MonoArray* data, MonoObject *scope) +{ + invoke_protected_memory_method (data, scope, TRUE); +} + +void invoke_protected_memory_method (MonoArray *data, MonoObject *scope, gboolean encrypt) +{ + MonoClass *klass; + MonoMethod *method; + void *params [2]; + + if (system_security_assembly == NULL) { + system_security_assembly = mono_image_loaded ("System.Security"); + if (!system_security_assembly) { + MonoAssembly *sa = mono_assembly_open ("System.Security.dll", NULL); + if (!sa) + g_assert_not_reached (); + system_security_assembly = mono_assembly_get_image (sa); + } + } + + klass = mono_class_from_name (system_security_assembly, + "System.Security.Cryptography", "ProtectedMemory"); + method = mono_class_get_method_from_name (klass, encrypt ? "Protect" : "Unprotect", 2); + params [0] = data; + params [1] = scope; /* MemoryProtectionScope.SameProcess */ + mono_runtime_invoke (method, NULL, params, NULL); +} diff --git a/mta-mono/vendor/mono/metadata/null-gc.c b/mta-mono/vendor/mono/metadata/null-gc.c index 397f384..12f69e0 100644 --- a/mta-mono/vendor/mono/metadata/null-gc.c +++ b/mta-mono/vendor/mono/metadata/null-gc.c @@ -13,6 +13,7 @@ #include #include #include +#include #ifdef HAVE_NULL_GC @@ -22,6 +23,8 @@ mono_gc_base_init (void) MonoThreadInfoCallbacks cb; int dummy; + mono_counters_init (); + memset (&cb, 0, sizeof (cb)); /* TODO: This casts away an incompatible pointer type warning in the same manner that boehm-gc does it. This is probably worth investigating @@ -231,8 +234,14 @@ mono_gc_is_critical_method (MonoMethod *method) return FALSE; } +int +mono_gc_get_aligned_size_for_allocator (int size) +{ + return size; +} + MonoMethod* -mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box) +mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box, gboolean known_instance_size) { return NULL; } diff --git a/mta-mono/vendor/mono/metadata/object-internals.h b/mta-mono/vendor/mono/metadata/object-internals.h index b690e78..18f0f2b 100644 --- a/mta-mono/vendor/mono/metadata/object-internals.h +++ b/mta-mono/vendor/mono/metadata/object-internals.h @@ -82,7 +82,8 @@ #define mono_assert_not_reached() g_assert_not_reached() #endif -#define MONO_CHECK_ARG(arg, expr) G_STMT_START{ \ +/* Use this as MONO_CHECK_ARG_NULL (arg,expr,) in functions returning void */ +#define MONO_CHECK_ARG(arg, expr, retval) G_STMT_START{ \ if (G_UNLIKELY (!(expr))) \ { \ MonoException *ex; \ @@ -91,16 +92,19 @@ if (arg) {} /* check if the name exists */ \ ex = mono_get_exception_argument (#arg, msg); \ g_free (msg); \ - mono_raise_exception (ex); \ + mono_set_pending_exception (ex); \ + return retval; \ }; }G_STMT_END -#define MONO_CHECK_ARG_NULL(arg) G_STMT_START{ \ +/* Use this as MONO_CHECK_ARG_NULL (arg,) in functions returning void */ +#define MONO_CHECK_ARG_NULL(arg, retval) G_STMT_START{ \ if (G_UNLIKELY (arg == NULL)) \ { \ MonoException *ex; \ if (arg) {} /* check if the name exists */ \ ex = mono_get_exception_argument_null (#arg); \ - mono_raise_exception (ex); \ + mono_set_pending_exception (ex); \ + return retval; \ }; }G_STMT_END /* 16 == default capacity */ @@ -285,11 +289,6 @@ typedef struct { MonoString *type_name; } MonoTypeLoadException; -typedef struct { - MonoException base; - MonoObject *wrapped_exception; -} MonoRuntimeWrappedException; - typedef struct { MonoObject object; MonoObject *async_state; @@ -380,6 +379,7 @@ typedef struct { MonoObject obj; gint32 il_offset; gint32 native_offset; + gint64 method_address; MonoReflectionMethod *method; MonoString *filename; gint32 line; @@ -531,6 +531,37 @@ typedef struct { gpointer ICU_collator; } MonoCompareInfo; +typedef struct { + MonoObject obj; + MonoString *NativeName; + MonoArray *ShortDatePatterns; + MonoArray *YearMonthPatterns; + MonoArray *LongDatePatterns; + MonoString *MonthDayPattern; + + MonoArray *EraNames; + MonoArray *AbbreviatedEraNames; + MonoArray *AbbreviatedEnglishEraNames; + MonoArray *DayNames; + MonoArray *AbbreviatedDayNames; + MonoArray *SuperShortDayNames; + MonoArray *MonthNames; + MonoArray *AbbreviatedMonthNames; + MonoArray *GenitiveMonthNames; + MonoArray *GenitiveAbbreviatedMonthNames; +} MonoCalendarData; + +typedef struct { + MonoObject obj; + MonoString *AMDesignator; + MonoString *PMDesignator; + MonoString *TimeSeparator; + MonoArray *LongTimePatterns; + MonoArray *ShortTimePatterns; + guint32 FirstDayOfWeek; + guint32 CalendarWeekRule; +} MonoCultureData; + typedef struct { MonoObject obj; MonoBoolean is_read_only; @@ -618,7 +649,7 @@ typedef void (*MonoFreeMethodFunc) (MonoDomain *domain, MonoMethod *meth /* Used to initialize the method pointers inside vtables */ typedef gboolean (*MonoInitVTableFunc) (MonoVTable *vtable); -void mono_set_pending_exception (MonoException *exc) MONO_INTERNAL; +MONO_COLD void mono_set_pending_exception (MonoException *exc) MONO_INTERNAL; /* remoting and async support */ @@ -1415,7 +1446,7 @@ void mono_reflection_create_unmanaged_type (MonoReflectionType *type) MON void mono_reflection_register_with_runtime (MonoReflectionType *type) MONO_INTERNAL; void mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *method, const guchar *data, guint32 len, MonoArray **typed_args, MonoArray **named_args, CattrNamedArg **named_arg_info, MonoError *error) MONO_INTERNAL; -MonoMethodSignature * mono_reflection_lookup_signature (MonoImage *image, MonoMethod *method, guint32 token) MONO_INTERNAL; +MonoMethodSignature * mono_reflection_lookup_signature (MonoImage *image, MonoMethod *method, guint32 token, MonoError *error) MONO_INTERNAL; MonoArray* mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoClass *refclass) MONO_INTERNAL; diff --git a/mta-mono/vendor/mono/metadata/object-offsets.h b/mta-mono/vendor/mono/metadata/object-offsets.h index f50cba1..ec6eb18 100644 --- a/mta-mono/vendor/mono/metadata/object-offsets.h +++ b/mta-mono/vendor/mono/metadata/object-offsets.h @@ -73,6 +73,7 @@ DECL_OFFSET(MonoDelegate, method) DECL_OFFSET(MonoDelegate, method_code) DECL_OFFSET(MonoInternalThread, tid) +DECL_OFFSET(MonoInternalThread, small_id) DECL_OFFSET(MonoInternalThread, static_data) DECL_OFFSET(MonoMulticastDelegate, prev) @@ -110,9 +111,8 @@ DECL_OFFSET(MonoTypedRef, klass) DECL_OFFSET(MonoTypedRef, value) //Internal structs -DECL_OFFSET(MonoThreadsSync, owner) +DECL_OFFSET(MonoThreadsSync, status) DECL_OFFSET(MonoThreadsSync, nest) -DECL_OFFSET(MonoThreadsSync, entry_count) #if defined (HAVE_SGEN_GC) && !defined (HAVE_KW_THREAD) DECL_OFFSET(SgenThreadInfo, tlab_next_addr) @@ -162,18 +162,13 @@ DECL_OFFSET(MonoLMF, ebp) DECL_OFFSET(MonoLMF, eip) #endif -#ifdef TARGET_ARM +#if defined(TARGET_ARM) || defined(TARGET_ARM64) DECL_OFFSET (MonoContext, pc) DECL_OFFSET (MonoContext, regs) DECL_OFFSET (MonoContext, fregs) DECL_OFFSET(MonoLMF, method) DECL_OFFSET(MonoLMF, lmf_addr) -DECL_OFFSET(MonoLMF, sp) -DECL_OFFSET(MonoLMF, fp) -DECL_OFFSET(MonoLMF, ip) -DECL_OFFSET(MonoLMF, iregs) -DECL_OFFSET(MonoLMF, fregs) DECL_OFFSET(SeqPointInfo, bp_addrs) DECL_OFFSET(SeqPointInfo, ss_trigger_page) @@ -182,6 +177,20 @@ DECL_OFFSET(DynCallArgs, res) DECL_OFFSET(DynCallArgs, res2) #endif +#if defined(TARGET_ARM) +DECL_OFFSET(MonoLMF, sp) +DECL_OFFSET(MonoLMF, fp) +DECL_OFFSET(MonoLMF, ip) +DECL_OFFSET(MonoLMF, iregs) +DECL_OFFSET(MonoLMF, fregs) +#elif defined(TARGET_ARM64) +DECL_OFFSET(MonoLMF, pc) +DECL_OFFSET(MonoLMF, gregs) +DECL_OFFSET(DynCallArgs, fpregs) +DECL_OFFSET(DynCallArgs, n_fpargs) +DECL_OFFSET(DynCallArgs, n_fpret) +#endif + #ifdef TARGET_AMD64 DECL_OFFSET(MonoContext, rax) DECL_OFFSET(MonoContext, rcx) diff --git a/mta-mono/vendor/mono/metadata/object.c b/mta-mono/vendor/mono/metadata/object.c index a2aa759..93d3c55 100644 --- a/mta-mono/vendor/mono/metadata/object.c +++ b/mta-mono/vendor/mono/metadata/object.c @@ -15,7 +15,6 @@ #endif #include #include -#include #include #include #include @@ -276,8 +275,6 @@ mono_runtime_class_init_full (MonoVTable *vtable, gboolean raise_exception) MonoClass *klass; gchar *full_name; - MONO_ARCH_SAVE_REGS; - if (vtable->initialized) return NULL; @@ -986,7 +983,7 @@ mono_class_compute_gc_descriptor (MonoClass *class) class->gc_descr = (gpointer)mono_gc_make_descr_for_string (bitmap, 2); } else if (class->rank) { mono_class_compute_gc_descriptor (class->element_class); - if (!class->element_class->valuetype) { + if (MONO_TYPE_IS_REFERENCE (&class->element_class->byval_arg)) { gsize abm = 1; class->gc_descr = mono_gc_make_descr_for_array (class->byval_arg.type == MONO_TYPE_SZARRAY, &abm, 1, sizeof (gpointer)); /*printf ("new array descriptor: 0x%x for %s.%s\n", class->gc_descr, @@ -1851,6 +1848,27 @@ mono_class_try_get_vtable (MonoDomain *domain, MonoClass *class) return NULL; } +static gpointer* +alloc_vtable (MonoDomain *domain, size_t vtable_size, size_t imt_table_bytes) +{ + size_t alloc_offset; + + /* + * We want the pointer to the MonoVTable aligned to 8 bytes because SGen uses three + * address bits. The IMT has an odd number of entries, however, so on 32 bits the + * alignment will be off. In that case we allocate 4 more bytes and skip over them. + */ + if (sizeof (gpointer) == 4 && (imt_table_bytes & 7)) { + g_assert ((imt_table_bytes & 7) == 4); + vtable_size += 4; + alloc_offset = 4; + } else { + alloc_offset = 0; + } + + return (gpointer*) ((char*)mono_domain_alloc0 (domain, vtable_size) + alloc_offset); +} + static MonoVTable * mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class, gboolean raise_on_error) { @@ -1859,7 +1877,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class, gboolean MonoClassField *field; char *t; int i, vtable_slots; - int imt_table_bytes = 0; + size_t imt_table_bytes; int gc_bits; guint32 vtable_size, class_size; guint32 cindex; @@ -1934,26 +1952,26 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class, gboolean vtable_slots++; if (ARCH_USE_IMT) { - vtable_size = MONO_SIZEOF_VTABLE + vtable_slots * sizeof (gpointer); if (class->interface_offsets_count) { imt_table_bytes = sizeof (gpointer) * (MONO_IMT_SIZE); - vtable_size += sizeof (gpointer) * (MONO_IMT_SIZE); mono_stats.imt_number_of_tables++; - mono_stats.imt_tables_size += (sizeof (gpointer) * MONO_IMT_SIZE); + mono_stats.imt_tables_size += imt_table_bytes; + } else { + imt_table_bytes = 0; } } else { - vtable_size = sizeof (gpointer) * (class->max_interface_id + 1) + - MONO_SIZEOF_VTABLE + vtable_slots * sizeof (gpointer); + imt_table_bytes = sizeof (gpointer) * (class->max_interface_id + 1); } + vtable_size = imt_table_bytes + MONO_SIZEOF_VTABLE + vtable_slots * sizeof (gpointer); + mono_stats.used_class_count++; mono_stats.class_vtable_size += vtable_size; - interface_offsets = mono_domain_alloc0 (domain, vtable_size); - if (ARCH_USE_IMT) - vt = (MonoVTable*) ((char*)interface_offsets + imt_table_bytes); - else - vt = (MonoVTable*) (interface_offsets + class->max_interface_id + 1); + interface_offsets = alloc_vtable (domain, vtable_size, imt_table_bytes); + vt = (MonoVTable*) ((char*)interface_offsets + imt_table_bytes); + g_assert (!((gsize)vt & 7)); + vt->klass = class; vt->rank = class->rank; vt->domain = domain; @@ -2220,6 +2238,7 @@ mono_class_proxy_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, Mono gpointer *interface_offsets; uint8_t *bitmap; int bsize; + size_t imt_table_bytes; #ifdef COMPRESSED_INTERFACE_BITMAP int bcsize; @@ -2266,22 +2285,21 @@ mono_class_proxy_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, Mono } if (ARCH_USE_IMT) { + imt_table_bytes = sizeof (gpointer) * MONO_IMT_SIZE; mono_stats.imt_number_of_tables++; - mono_stats.imt_tables_size += (sizeof (gpointer) * MONO_IMT_SIZE); - vtsize = sizeof (gpointer) * (MONO_IMT_SIZE) + - MONO_SIZEOF_VTABLE + class->vtable_size * sizeof (gpointer); + mono_stats.imt_tables_size += imt_table_bytes; } else { - vtsize = sizeof (gpointer) * (max_interface_id + 1) + - MONO_SIZEOF_VTABLE + class->vtable_size * sizeof (gpointer); + imt_table_bytes = sizeof (gpointer) * (max_interface_id + 1); } + vtsize = imt_table_bytes + MONO_SIZEOF_VTABLE + class->vtable_size * sizeof (gpointer); + mono_stats.class_vtable_size += vtsize + extra_interface_vtsize; - interface_offsets = mono_domain_alloc0 (domain, vtsize + extra_interface_vtsize); - if (ARCH_USE_IMT) - pvt = (MonoVTable*) (interface_offsets + MONO_IMT_SIZE); - else - pvt = (MonoVTable*) (interface_offsets + max_interface_id + 1); + interface_offsets = alloc_vtable (domain, vtsize + extra_interface_vtsize, imt_table_bytes); + pvt = (MonoVTable*) ((char*)interface_offsets + imt_table_bytes); + g_assert (!((gsize)pvt & 7)); + memcpy (pvt, vt, MONO_SIZEOF_VTABLE + class->vtable_size * sizeof (gpointer)); pvt->klass = mono_defaults.transparent_proxy_class; @@ -2775,8 +2793,10 @@ mono_object_get_virtual_method (MonoObject *obj, MonoMethod *method) #endif { if (method->is_inflated) { + MonoError error; /* Have to inflate the result */ - res = mono_class_inflate_generic_method (res, &((MonoMethodInflated*)method)->context); + res = mono_class_inflate_generic_method_checked (res, &((MonoMethodInflated*)method)->context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } } @@ -3234,7 +3254,7 @@ mono_field_get_value_object (MonoDomain *domain, MonoClassField *field, MonoObje } /* MONO_TYPE_PTR is passed by value to runtime_invoke () */ - args [0] = *ptr; + args [0] = ptr ? *ptr : NULL; args [1] = mono_type_get_object (mono_domain_get (), type); return mono_runtime_invoke (m, NULL, args, NULL); @@ -4368,7 +4388,6 @@ static inline void * mono_object_allocate (size_t size, MonoVTable *vtable) { MonoObject *o; - mono_stats.new_object_count++; ALLOC_OBJECT (o, vtable, size); return o; @@ -4385,7 +4404,6 @@ static inline void * mono_object_allocate_ptrfree (size_t size, MonoVTable *vtable) { MonoObject *o; - mono_stats.new_object_count++; ALLOC_PTRFREE (o, vtable, size); return o; } @@ -4395,7 +4413,6 @@ mono_object_allocate_spec (size_t size, MonoVTable *vtable) { void *o; ALLOC_TYPED (o, size, vtable); - mono_stats.new_object_count++; return o; } @@ -4416,7 +4433,6 @@ mono_object_new (MonoDomain *domain, MonoClass *klass) { MonoVTable *vtable; - MONO_ARCH_SAVE_REGS; vtable = mono_class_vtable (domain, klass); if (!vtable) return NULL; @@ -4434,7 +4450,6 @@ mono_object_new_pinned (MonoDomain *domain, MonoClass *klass) { MonoVTable *vtable; - MONO_ARCH_SAVE_REGS; vtable = mono_class_vtable (domain, klass); if (!vtable) return NULL; @@ -4458,8 +4473,6 @@ mono_object_new_specific (MonoVTable *vtable) { MonoObject *o; - MONO_ARCH_SAVE_REGS; - /* check for is_com_object for COM Interop */ if (mono_vtable_is_remote (vtable) || mono_class_is_com_object (vtable->klass)) { @@ -4662,8 +4675,6 @@ mono_array_full_copy (MonoArray *src, MonoArray *dest) uintptr_t size; MonoClass *klass = src->obj.vtable->klass; - MONO_ARCH_SAVE_REGS; - g_assert (klass == dest->obj.vtable->klass); size = mono_array_length (src); @@ -4699,8 +4710,6 @@ mono_array_clone_in_domain (MonoDomain *domain, MonoArray *array) uintptr_t *sizes; MonoClass *klass = array->obj.vtable->klass; - MONO_ARCH_SAVE_REGS; - if (array->bounds == NULL) { size = mono_array_length (array); o = mono_array_new_full (domain, klass, &size, NULL); @@ -4879,7 +4888,6 @@ mono_array_new_full (MonoDomain *domain, MonoClass *array_class, uintptr_t *leng else o = mono_gc_alloc_vector (vtable, byte_len, len); array = (MonoArray*)o; - mono_stats.new_object_count++; bounds = array->bounds; #endif @@ -4911,8 +4919,6 @@ mono_array_new (MonoDomain *domain, MonoClass *eclass, uintptr_t n) { MonoClass *ac; - MONO_ARCH_SAVE_REGS; - ac = mono_array_class_get (eclass, 1); g_assert (ac); @@ -4934,8 +4940,6 @@ mono_array_new_specific (MonoVTable *vtable, uintptr_t n) MonoArray *ao; uintptr_t byte_len; - MONO_ARCH_SAVE_REGS; - if (G_UNLIKELY (n > MONO_ARRAY_MAX_INDEX)) { arith_overflow (); return NULL; @@ -4964,7 +4968,6 @@ mono_array_new_specific (MonoVTable *vtable, uintptr_t n) #else o = mono_gc_alloc_vector (vtable, byte_len, n); ao = (MonoArray*)o; - mono_stats.new_object_count++; #endif if (G_UNLIKELY (profile_allocs)) @@ -5041,10 +5044,10 @@ mono_string_new_size (MonoDomain *domain, gint32 len) size_t size; /* check for overflow */ - if (len < 0 || len > ((SIZE_MAX - sizeof (MonoString) - 2) / 2)) + if (len < 0 || len > ((SIZE_MAX - G_STRUCT_OFFSET (MonoString, chars) - 8) / 2)) mono_gc_out_of_memory (-1); - size = (sizeof (MonoString) + ((len + 1) * 2)); + size = (G_STRUCT_OFFSET (MonoString, chars) + (((size_t)len + 1) * 2)); g_assert (size > 0); vtable = mono_class_vtable (domain, mono_defaults.string_class); @@ -5151,8 +5154,6 @@ mono_string_new_wrapper (const char *text) { MonoDomain *domain = mono_domain_get (); - MONO_ARCH_SAVE_REGS; - if (text) return mono_string_new (domain, text); @@ -5528,8 +5529,6 @@ mono_string_intern (MonoString *str) MonoString* mono_ldstr (MonoDomain *domain, MonoImage *image, guint32 idx) { - MONO_ARCH_SAVE_REGS; - if (image->dynamic) { MonoString *str = mono_lookup_dynamic_token (image, MONO_TOKEN_STRING | idx, NULL); return str; diff --git a/mta-mono/vendor/mono/metadata/object.h b/mta-mono/vendor/mono/metadata/object.h index 82e84ec..f760b21 100644 --- a/mta-mono/vendor/mono/metadata/object.h +++ b/mta-mono/vendor/mono/metadata/object.h @@ -196,6 +196,9 @@ mono_monitor_try_enter (MonoObject *obj, uint32_t ms); MONO_API mono_bool mono_monitor_enter (MonoObject *obj); +MONO_API void +mono_monitor_enter_v4 (MonoObject *obj, char *lock_taken); + MONO_API unsigned int mono_object_get_size (MonoObject *o); diff --git a/mta-mono/vendor/mono/metadata/pedump.c b/mta-mono/vendor/mono/metadata/pedump.c index 496c3c7..2615373 100644 --- a/mta-mono/vendor/mono/metadata/pedump.c +++ b/mta-mono/vendor/mono/metadata/pedump.c @@ -27,6 +27,7 @@ #include #include "mono/utils/mono-digest.h" #include +#include #include #include #ifdef HAVE_UNISTD_H @@ -359,11 +360,13 @@ dump_verify_info (MonoImage *image, int flags) for (i = 0; i < m->rows; ++i) { MonoMethod *method; + MonoError error; mono_loader_clear_error (); - method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i+1), NULL); + method = mono_get_method_checked (image, MONO_TOKEN_METHOD_DEF | (i+1), NULL, NULL, &error); if (!method) { - g_print ("Warning: Cannot lookup method with token 0x%08x\n", i + 1); + g_print ("Warning: Cannot lookup method with token 0x%08x due to %s\n", i + 1, mono_error_get_message (&error)); + mono_error_cleanup (&error); continue; } errors = mono_method_verify (method, flags); @@ -473,10 +476,12 @@ verify_image_file (const char *fname) table = &image->tables [MONO_TABLE_TYPEDEF]; for (i = 1; i <= table->rows; ++i) { + MonoError error; guint32 token = i | MONO_TOKEN_TYPE_DEF; - MonoClass *class = mono_class_get (image, token); + MonoClass *class = mono_class_get_checked (image, token, &error); if (!class) { - printf ("Could not load class with token %x\n", token); + printf ("Could not load class with token %x due to %s\n", token, mono_error_get_message (&error)); + mono_error_cleanup (&error); continue; } mono_class_init (class); @@ -653,6 +658,7 @@ main (int argc, char *argv []) #ifndef DISABLE_PERFCOUNTERS mono_perfcounters_init (); #endif + mono_counters_init (); mono_metadata_init (); mono_images_init (); mono_assemblies_init (); diff --git a/mta-mono/vendor/mono/metadata/process.c b/mta-mono/vendor/mono/metadata/process.c index d7cc110..f4d4e30 100644 --- a/mta-mono/vendor/mono/metadata/process.c +++ b/mta-mono/vendor/mono/metadata/process.c @@ -34,8 +34,6 @@ HANDLE ves_icall_System_Diagnostics_Process_GetProcess_internal (guint32 pid) { HANDLE handle; - MONO_ARCH_SAVE_REGS; - /* GetCurrentProcess returns a pseudo-handle, so use * OpenProcess instead */ @@ -52,16 +50,12 @@ HANDLE ves_icall_System_Diagnostics_Process_GetProcess_internal (guint32 pid) guint32 ves_icall_System_Diagnostics_Process_GetPid_internal (void) { - MONO_ARCH_SAVE_REGS; - return mono_process_current_pid (); } void ves_icall_System_Diagnostics_Process_Process_free_internal (MonoObject *this, HANDLE process) { - MONO_ARCH_SAVE_REGS; - #ifdef THREAD_DEBUG g_message ("%s: Closing process %p, handle %p", __func__, this, process); #endif @@ -264,11 +258,11 @@ static void process_get_fileversion (MonoObject *filever, gunichar2 *filename) process_set_field_int (filever, "productbuildpart", HIWORD (ffi->dwProductVersionLS)); process_set_field_int (filever, "productprivatepart", LOWORD (ffi->dwProductVersionLS)); - process_set_field_bool (filever, "isdebug", (ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_DEBUG); - process_set_field_bool (filever, "isprerelease", (ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_PRERELEASE); - process_set_field_bool (filever, "ispatched", (ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_PATCHED); - process_set_field_bool (filever, "isprivatebuild", (ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_PRIVATEBUILD); - process_set_field_bool (filever, "isspecialbuild", (ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_SPECIALBUILD); + process_set_field_bool (filever, "isdebug", ((ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_DEBUG) != 0); + process_set_field_bool (filever, "isprerelease", ((ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_PRERELEASE) != 0); + process_set_field_bool (filever, "ispatched", ((ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_PATCHED) != 0); + process_set_field_bool (filever, "isprivatebuild", ((ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_PRIVATEBUILD) != 0); + process_set_field_bool (filever, "isspecialbuild", ((ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_SPECIALBUILD) != 0); } g_free (query); @@ -356,9 +350,9 @@ static void process_get_fileversion (MonoObject *filever, gunichar2 *filename) } } -static MonoObject* process_add_module (HANDLE process, HMODULE mod, gunichar2 *filename, gunichar2 *modulename) +static MonoObject* process_add_module (HANDLE process, HMODULE mod, gunichar2 *filename, gunichar2 *modulename, MonoClass *proc_class) { - MonoClass *proc_class, *filever_class; + MonoClass *filever_class; MonoObject *item, *filever; MonoDomain *domain=mono_domain_get (); MODULEINFO modinfo; @@ -366,8 +360,6 @@ static MonoObject* process_add_module (HANDLE process, HMODULE mod, gunichar2 *f /* Build a System.Diagnostics.ProcessModule with the data. */ - proc_class=mono_class_from_name (system_assembly, "System.Diagnostics", - "ProcessModule"); item=mono_object_new (domain, proc_class); filever_class=mono_class_from_name (system_assembly, @@ -409,17 +401,19 @@ MonoArray *ves_icall_System_Diagnostics_Process_GetModules_internal (MonoObject DWORD needed; guint32 count = 0; guint32 i, num_added = 0; + MonoClass *proc_class; STASH_SYS_ASS (this); if (EnumProcessModules (process, mods, sizeof(mods), &needed)) { count = needed / sizeof(HMODULE); - temp_arr = mono_array_new (mono_domain_get (), mono_get_object_class (), count); + proc_class = mono_class_from_name (system_assembly, "System.Diagnostics", "ProcessModule"); + temp_arr = mono_array_new (mono_domain_get (), proc_class, count); for (i = 0; i < count; i++) { if (GetModuleBaseName (process, mods[i], modname, MAX_PATH) && GetModuleFileNameEx (process, mods[i], filename, MAX_PATH)) { MonoObject *module = process_add_module (process, mods[i], - filename, modname); + filename, modname, proc_class); mono_array_setref (temp_arr, num_added++, module); } } @@ -429,7 +423,7 @@ MonoArray *ves_icall_System_Diagnostics_Process_GetModules_internal (MonoObject arr = temp_arr; } else { /* shorter version of the array */ - arr = mono_array_new (mono_domain_get (), mono_get_object_class (), num_added); + arr = mono_array_new (mono_domain_get (), proc_class, num_added); for (i = 0; i < num_added; i++) mono_array_setref (arr, i, mono_array_get (temp_arr, MonoObject*, i)); @@ -440,8 +434,6 @@ MonoArray *ves_icall_System_Diagnostics_Process_GetModules_internal (MonoObject void ves_icall_System_Diagnostics_FileVersionInfo_GetVersionInfo_internal (MonoObject *this, MonoString *filename) { - MONO_ARCH_SAVE_REGS; - STASH_SYS_ASS (this); process_get_fileversion (this, mono_string_chars (filename)); @@ -700,8 +692,6 @@ MonoBoolean ves_icall_System_Diagnostics_Process_WaitForExit_internal (MonoObjec { guint32 ret; - MONO_ARCH_SAVE_REGS; - if(ms<0) { /* Wait forever */ ret=WaitForSingleObjectEx (process, INFINITE, TRUE); @@ -719,8 +709,6 @@ MonoBoolean ves_icall_System_Diagnostics_Process_WaitForInputIdle_internal (Mono { guint32 ret; - MONO_ARCH_SAVE_REGS; - if(ms<0) { /* Wait forever */ ret=WaitForInputIdle (process, INFINITE); @@ -742,8 +730,6 @@ gint64 ves_icall_System_Diagnostics_Process_ExitTime_internal (HANDLE process) gboolean ret; FILETIME create_time, exit_time, kernel_time, user_time; - MONO_ARCH_SAVE_REGS; - ret = GetProcessTimes (process, &create_time, &exit_time, &kernel_time, &user_time); if (ret) @@ -757,8 +743,6 @@ gint64 ves_icall_System_Diagnostics_Process_StartTime_internal (HANDLE process) gboolean ret; FILETIME create_time, exit_time, kernel_time, user_time; - MONO_ARCH_SAVE_REGS; - ret = GetProcessTimes (process, &create_time, &exit_time, &kernel_time, &user_time); if (ret) @@ -771,8 +755,6 @@ gint32 ves_icall_System_Diagnostics_Process_ExitCode_internal (HANDLE process) { DWORD code; - MONO_ARCH_SAVE_REGS; - GetExitCodeProcess (process, &code); LOGDEBUG (g_message ("%s: process exit code is %d", __func__, code)); @@ -789,8 +771,6 @@ MonoString *ves_icall_System_Diagnostics_Process_ProcessName_internal (HANDLE pr DWORD needed; guint32 len; - MONO_ARCH_SAVE_REGS; - ok=EnumProcessModules (process, &mod, sizeof(mod), &needed); if(ok==FALSE) { return(NULL); @@ -809,18 +789,19 @@ MonoString *ves_icall_System_Diagnostics_Process_ProcessName_internal (HANDLE pr } /* Returns an array of pids */ -MonoArray *ves_icall_System_Diagnostics_Process_GetProcesses_internal (void) +MonoArray * +ves_icall_System_Diagnostics_Process_GetProcesses_internal (void) { #if !defined(HOST_WIN32) MonoArray *procs; gpointer *pidarray; int i, count; - MONO_ARCH_SAVE_REGS; - pidarray = mono_process_list (&count); - if (!pidarray) - mono_raise_exception (mono_get_exception_not_supported ("This system does not support EnumProcesses")); + if (!pidarray) { + mono_set_pending_exception (mono_get_exception_not_supported ("This system does not support EnumProcesses")); + return NULL; + } procs = mono_array_new (mono_domain_get (), mono_get_int32_class (), count); if (sizeof (guint32) == sizeof (gpointer)) { memcpy (mono_array_addr (procs, guint32, 0), pidarray, count); @@ -848,8 +829,8 @@ MonoArray *ves_icall_System_Diagnostics_Process_GetProcesses_internal (void) g_free (pids); pids = NULL; exc = mono_get_exception_not_supported ("This system does not support EnumProcesses"); - mono_raise_exception (exc); - g_assert_not_reached (); + mono_set_pending_exception (exc); + return NULL; } if (needed < (count * sizeof (guint32))) break; @@ -873,8 +854,6 @@ MonoBoolean ves_icall_System_Diagnostics_Process_GetWorkingSet_internal (HANDLE gboolean ret; SIZE_T ws_min, ws_max; - MONO_ARCH_SAVE_REGS; - ret=GetProcessWorkingSetSize (process, &ws_min, &ws_max); *min=(guint32)ws_min; *max=(guint32)ws_max; @@ -888,8 +867,6 @@ MonoBoolean ves_icall_System_Diagnostics_Process_SetWorkingSet_internal (HANDLE SIZE_T ws_min; SIZE_T ws_max; - MONO_ARCH_SAVE_REGS; - ret=GetProcessWorkingSetSize (process, &ws_min, &ws_max); if(ret==FALSE) { return(FALSE); @@ -909,8 +886,6 @@ MonoBoolean ves_icall_System_Diagnostics_Process_SetWorkingSet_internal (HANDLE MonoBoolean ves_icall_System_Diagnostics_Process_Kill_internal (HANDLE process, gint32 sig) { - MONO_ARCH_SAVE_REGS; - /* sig == 1 -> Kill, sig == 2 -> CloseMainWindow */ return TerminateProcess (process, -sig); @@ -956,8 +931,6 @@ ves_icall_System_Diagnostics_Process_ProcessHandle_duplicate (HANDLE process) { HANDLE ret; - MONO_ARCH_SAVE_REGS; - LOGDEBUG (g_message ("%s: Duplicating process handle %p", __func__, process)); DuplicateHandle (GetCurrentProcess (), process, GetCurrentProcess (), @@ -969,8 +942,6 @@ ves_icall_System_Diagnostics_Process_ProcessHandle_duplicate (HANDLE process) void ves_icall_System_Diagnostics_Process_ProcessHandle_close (HANDLE process) { - MONO_ARCH_SAVE_REGS; - LOGDEBUG (g_message ("%s: Closing process handle %p", __func__, process)); CloseHandle (process); diff --git a/mta-mono/vendor/mono/metadata/profiler-private.h b/mta-mono/vendor/mono/metadata/profiler-private.h index ed8a32f..fe26be4 100644 --- a/mta-mono/vendor/mono/metadata/profiler-private.h +++ b/mta-mono/vendor/mono/metadata/profiler-private.h @@ -73,7 +73,7 @@ void mono_profiler_gc_roots (int num, void **objects, int *root_types, uin void mono_profiler_code_chunk_new (gpointer chunk, int size) MONO_INTERNAL; void mono_profiler_code_chunk_destroy (gpointer chunk) MONO_INTERNAL; -void mono_profiler_code_buffer_new (gpointer buffer, int size, MonoProfilerCodeBufferType type, void *data) MONO_INTERNAL; +void mono_profiler_code_buffer_new (gpointer buffer, int size, MonoProfilerCodeBufferType type, gconstpointer data) MONO_INTERNAL; void mono_profiler_runtime_initialized (void) MONO_INTERNAL; diff --git a/mta-mono/vendor/mono/metadata/profiler.c b/mta-mono/vendor/mono/metadata/profiler.c index dccf093..103e966 100644 --- a/mta-mono/vendor/mono/metadata/profiler.c +++ b/mta-mono/vendor/mono/metadata/profiler.c @@ -936,11 +936,11 @@ mono_profiler_install_iomap (MonoProfileIomapFunc callback) } void -mono_profiler_code_buffer_new (gpointer buffer, int size, MonoProfilerCodeBufferType type, void *data) { +mono_profiler_code_buffer_new (gpointer buffer, int size, MonoProfilerCodeBufferType type, gconstpointer data) { ProfilerDesc *prof; for (prof = prof_list; prof; prof = prof->next) { if (prof->code_buffer_new) - prof->code_buffer_new (prof->profiler, buffer, size, type, data); + prof->code_buffer_new (prof->profiler, buffer, size, type, (void*)data); } } diff --git a/mta-mono/vendor/mono/metadata/profiler.h b/mta-mono/vendor/mono/metadata/profiler.h index 408cac8..d3de247 100644 --- a/mta-mono/vendor/mono/metadata/profiler.h +++ b/mta-mono/vendor/mono/metadata/profiler.h @@ -65,6 +65,14 @@ typedef struct { typedef enum { MONO_PROFILER_CODE_BUFFER_UNKNOWN, MONO_PROFILER_CODE_BUFFER_METHOD, + MONO_PROFILER_CODE_BUFFER_METHOD_TRAMPOLINE, + MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, + MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, + MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, + MONO_PROFILER_CODE_BUFFER_SPECIFIC_TRAMPOLINE, + MONO_PROFILER_CODE_BUFFER_HELPER, + MONO_PROFILER_CODE_BUFFER_MONITOR, + MONO_PROFILER_CODE_BUFFER_DELEGATE_INVOKE, MONO_PROFILER_CODE_BUFFER_LAST } MonoProfilerCodeBufferType; diff --git a/mta-mono/vendor/mono/metadata/rand.c b/mta-mono/vendor/mono/metadata/rand.c index 77d152d..6edc3f2 100644 --- a/mta-mono/vendor/mono/metadata/rand.c +++ b/mta-mono/vendor/mono/metadata/rand.c @@ -26,7 +26,7 @@ #include #include -#if !defined(__native_client__) && !defined(HOST_WIN32) +#if !defined(__native_client__) && !defined(HOST_WIN32) && defined (HAVE_SYS_UN_H) #include #include #include @@ -180,7 +180,7 @@ ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngClose (gpoint CryptReleaseContext ((HCRYPTPROV) handle, 0); } -#elif defined (__native_client__) +#elif defined (__native_client__) || !defined (HAVE_SYS_UN_H) #include diff --git a/mta-mono/vendor/mono/metadata/reflection.c b/mta-mono/vendor/mono/metadata/reflection.c index 6614b01..7a9830c 100644 --- a/mta-mono/vendor/mono/metadata/reflection.c +++ b/mta-mono/vendor/mono/metadata/reflection.c @@ -2866,6 +2866,7 @@ mono_image_get_ctor_on_inst_token (MonoDynamicImage *assembly, MonoReflectionCto static MonoMethod* mono_reflection_method_on_tb_inst_get_handle (MonoReflectionMethodOnTypeBuilderInst *m) { + MonoError error; MonoClass *klass; MonoGenericContext tmp_context; MonoType **type_argv; @@ -2898,7 +2899,8 @@ mono_reflection_method_on_tb_inst_get_handle (MonoReflectionMethodOnTypeBuilderI tmp_context.class_inst = klass->generic_class ? klass->generic_class->context.class_inst : NULL; tmp_context.method_inst = ginst; - inflated = mono_class_inflate_generic_method (method, &tmp_context); + inflated = mono_class_inflate_generic_method_checked (method, &tmp_context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ return inflated; } @@ -4768,8 +4770,6 @@ mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str) char buf [16]; char *b = buf; - MONO_ARCH_SAVE_REGS; - if (!module->dynamic_image) mono_image_module_basic_init (module); @@ -5287,8 +5287,6 @@ mono_image_basic_init (MonoReflectionAssemblyBuilder *assemblyb) MonoDynamicImage *image; MonoDomain *domain = mono_object_domain (assemblyb); - MONO_ARCH_SAVE_REGS; - if (assemblyb->dynamic_assembly) return; @@ -7356,6 +7354,7 @@ _mono_reflection_parse_type (char *name, char **endptr, gboolean is_recursed, g_ptr_array_add (info->type_arguments, subinfo); + while (*p == ' ') p++; if (*p == '[') { p++; fqname = TRUE; @@ -9887,8 +9886,6 @@ mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObj char *buffer, *p; guint32 buflen, i; - MONO_ARCH_SAVE_REGS; - if (strcmp (ctor->vtable->klass->name, "MonoCMethod")) { /* sig is freed later so allocate it in the heap */ sig = ctor_builder_to_signature (NULL, (MonoReflectionCtorBuilder*)ctor); @@ -9966,8 +9963,6 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb) MonoError error; MonoClass *klass, *parent; - MONO_ARCH_SAVE_REGS; - RESOLVE_TYPE (tb->parent); mono_loader_lock (); @@ -10105,8 +10100,6 @@ mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb) MonoClass *klass; int count, i; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (tb->type.type); count = tb->generic_params ? mono_array_length (tb->generic_params) : 0; @@ -10150,8 +10143,6 @@ mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb) { MonoClass *klass; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (tb->type.type); mono_loader_lock (); @@ -10695,6 +10686,7 @@ mono_class_bind_generic_parameters (MonoClass *klass, int type_argc, MonoType ** MonoReflectionMethod* mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, MonoArray *types) { + MonoError error; MonoClass *klass; MonoMethod *method, *inflated; MonoMethodInflated *imethod; @@ -10703,8 +10695,6 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M MonoType **type_argv; int count, i; - MONO_ARCH_SAVE_REGS; - /*FIXME but this no longer should happen*/ if (!strcmp (rmethod->object.vtable->klass->name, "MethodBuilder")) { #ifndef DISABLE_REFLECTION_EMIT @@ -10745,7 +10735,8 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M tmp_context.class_inst = klass->generic_class ? klass->generic_class->context.class_inst : NULL; tmp_context.method_inst = ginst; - inflated = mono_class_inflate_generic_method (method, &tmp_context); + inflated = mono_class_inflate_generic_method_checked (method, &tmp_context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ imethod = (MonoMethodInflated *) inflated; /*FIXME but I think this is no longer necessary*/ @@ -10795,7 +10786,9 @@ inflate_mono_method (MonoClass *klass, MonoMethod *method, MonoObject *obj) g_assert (i < klass->method.count); imethod = (MonoMethodInflated*)klass->methods [i]; } else { - imethod = (MonoMethodInflated *) mono_class_inflate_generic_method_full (method, klass, context); + MonoError error; + imethod = (MonoMethodInflated *) mono_class_inflate_generic_method_full_checked (method, klass, context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } if (method->is_generic && image_is_dynamic (method->klass->image)) { @@ -10855,8 +10848,6 @@ mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, Mono MonoType *gtype; int i; - MONO_ARCH_SAVE_REGS; - gtype = mono_reflection_type_get_handle ((MonoReflectionType*)type); klass = mono_class_from_mono_type (gtype); g_assert (gtype->type == MONO_TYPE_GENERICINST); @@ -10966,8 +10957,10 @@ fix_partial_generic_class (MonoClass *klass) klass->methods = mono_image_alloc (klass->image, sizeof (MonoMethod*) * (klass->method.count + 1)); for (i = 0; i < klass->method.count; i++) { - klass->methods [i] = mono_class_inflate_generic_method_full ( - gklass->methods [i], klass, mono_class_get_context (klass)); + MonoError error; + klass->methods [i] = mono_class_inflate_generic_method_full_checked ( + gklass->methods [i], klass, mono_class_get_context (klass), &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } } @@ -11186,8 +11179,8 @@ typebuilder_setup_fields (MonoClass *klass, MonoError *error) mono_error_init (error); if (tb->class_size) { - if ((tb->packing_size & 0xfffffff0) != 0) { - char *err_msg = g_strdup_printf ("Could not load struct '%s' with packing size %d >= 16", klass->name, tb->packing_size); + if ((tb->packing_size & 0xffffff00) != 0) { + char *err_msg = g_strdup_printf ("Could not load struct '%s' with packing size %d >= 256", klass->name, tb->packing_size); mono_class_set_failure (klass, MONO_EXCEPTION_TYPE_LOAD, err_msg); return; } @@ -11428,8 +11421,6 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb) MonoReflectionType* res; int i, j; - MONO_ARCH_SAVE_REGS; - domain = mono_object_domain (tb); klass = mono_class_from_mono_type (tb->type.type); @@ -11606,8 +11597,6 @@ mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam MonoClass *pklass; MonoError error; - MONO_ARCH_SAVE_REGS; - image = &gparam->tbuilder->module->dynamic_image->image; param = mono_image_new0 (image, MonoGenericParamFull, 1); @@ -11847,16 +11836,18 @@ mono_reflection_is_valid_dynamic_token (MonoDynamicImage *image, guint32 token) } MonoMethodSignature * -mono_reflection_lookup_signature (MonoImage *image, MonoMethod *method, guint32 token) +mono_reflection_lookup_signature (MonoImage *image, MonoMethod *method, guint32 token, MonoError *error) { MonoMethodSignature *sig; g_assert (image_is_dynamic (image)); + mono_error_init (error); + sig = g_hash_table_lookup (((MonoDynamicImage*)image)->vararg_aux_hash, GUINT_TO_POINTER (token)); if (sig) return sig; - return mono_method_signature (method); + return mono_method_signature_checked (method, error); } #ifndef DISABLE_REFLECTION_EMIT @@ -11950,8 +11941,11 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon strcmp (obj->vtable->klass->name, "MonoGenericCMethod") == 0 || strcmp (obj->vtable->klass->name, "MonoGenericMethod") == 0) { result = ((MonoReflectionMethod*)obj)->method; - if (context) - result = mono_class_inflate_generic_method (result, context); + if (context) { + MonoError error; + result = mono_class_inflate_generic_method_checked (result, context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + } *handle_class = mono_defaults.methodhandle_class; g_assert (result); } else if (strcmp (obj->vtable->klass->name, "MethodBuilder") == 0) { @@ -11973,8 +11967,11 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon */ result = mb->mhandle; } - if (context) - result = mono_class_inflate_generic_method (result, context); + if (context) { + MonoError error; + result = mono_class_inflate_generic_method_checked (result, context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + } *handle_class = mono_defaults.methodhandle_class; } else if (strcmp (obj->vtable->klass->name, "ConstructorBuilder") == 0) { MonoReflectionCtorBuilder *cb = (MonoReflectionCtorBuilder*)obj; @@ -11986,8 +11983,11 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon mono_domain_try_type_resolve (mono_domain_get (), NULL, (MonoObject*)tb); result = cb->mhandle; } - if (context) - result = mono_class_inflate_generic_method (result, context); + if (context) { + MonoError error; + result = mono_class_inflate_generic_method_checked (result, context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + } *handle_class = mono_defaults.methodhandle_class; } else if (strcmp (obj->vtable->klass->name, "MonoField") == 0) { MonoClassField *field = ((MonoReflectionField*)obj)->field; @@ -12139,8 +12139,11 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon MonoReflectionMethodOnTypeBuilderInst *m = (MonoReflectionMethodOnTypeBuilderInst*)obj; if (m->method_args) { result = mono_reflection_method_on_tb_inst_get_handle (m); - if (context) - result = mono_class_inflate_generic_method (result, context); + if (context) { + MonoError error; + result = mono_class_inflate_generic_method_checked (result, context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + } } else { MonoType *type = mono_class_inflate_generic_type (mono_reflection_type_get_handle ((MonoReflectionType*)m->inst), context); MonoClass *inflated_klass = mono_class_from_mono_type (type); diff --git a/mta-mono/vendor/mono/metadata/remoting.c b/mta-mono/vendor/mono/metadata/remoting.c new file mode 100644 index 0000000..7b88643 --- /dev/null +++ b/mta-mono/vendor/mono/metadata/remoting.c @@ -0,0 +1,2008 @@ +/* + * remoting.c: Remoting support + * + * Copyright 2002-2003 Ximian, Inc (http://www.ximian.com) + * Copyright 2004-2009 Novell, Inc (http://www.novell.com) + * Copyright 2011-2014 Xamarin, Inc (http://www.xamarin.com) + * + */ + +#include "config.h" + +#include "mono/metadata/remoting.h" +#include "mono/metadata/marshal.h" +#include "mono/metadata/abi-details.h" +#include "mono/metadata/cominterop.h" +#include "mono/metadata/tabledefs.h" +#include "mono/metadata/exception.h" +#include "mono/metadata/debug-helpers.h" + +typedef enum { + MONO_MARSHAL_NONE, /* No marshalling needed */ + MONO_MARSHAL_COPY, /* Can be copied by value to the new domain */ + MONO_MARSHAL_COPY_OUT, /* out parameter that needs to be copied back to the original instance */ + MONO_MARSHAL_SERIALIZE /* Value needs to be serialized into the new domain */ +} MonoXDomainMarshalType; + +#ifndef DISABLE_REMOTING + +#define OPDEF(a,b,c,d,e,f,g,h,i,j) \ + a = i, + +enum { +#include "mono/cil/opcode.def" + LAST = 0xff +}; +#undef OPDEF + +struct _MonoRemotingMethods { + MonoMethod *invoke; + MonoMethod *invoke_with_check; + MonoMethod *xdomain_invoke; + MonoMethod *xdomain_dispatch; +}; + +typedef struct _MonoRemotingMethods MonoRemotingMethods; + +static MonoObject * +mono_remoting_wrapper (MonoMethod *method, gpointer *params); + +static gint32 +mono_marshal_set_domain_by_id (gint32 id, MonoBoolean push); + +static gboolean +mono_marshal_check_domain_image (gint32 domain_id, MonoImage *image); + +MONO_API void +mono_upgrade_remote_class_wrapper (MonoReflectionType *rtype, MonoTransparentProxy *tproxy); + +static MonoXDomainMarshalType +mono_get_xdomain_marshal_type (MonoType *t); + +static void +mono_marshal_xdomain_copy_out_value (MonoObject *src, MonoObject *dst); + +static MonoReflectionType * +type_from_handle (MonoType *handle); + +static mono_mutex_t remoting_mutex; +static gboolean remoting_mutex_inited; + +static MonoClass *byte_array_class; +static MonoMethod *method_rs_serialize, *method_rs_deserialize, *method_exc_fixexc, *method_rs_appdomain_target; +static MonoMethod *method_set_call_context, *method_needs_context_sink, *method_rs_serialize_exc; + +static void +register_icall (gpointer func, const char *name, const char *sigstr, gboolean save) +{ + MonoMethodSignature *sig = mono_create_icall_signature (sigstr); + + mono_register_jit_icall (func, name, sig, save); +} + +static inline void +remoting_lock (void) +{ + g_assert (remoting_mutex_inited); + mono_mutex_lock (&remoting_mutex); +} + +static inline void +remoting_unlock (void) +{ + g_assert (remoting_mutex_inited); + mono_mutex_unlock (&remoting_mutex); +} + +/* + * Return the hash table pointed to by VAR, lazily creating it if neccesary. + */ +static GHashTable* +get_cache (GHashTable **var, GHashFunc hash_func, GCompareFunc equal_func) +{ + if (!(*var)) { + remoting_lock (); + if (!(*var)) { + GHashTable *cache = + g_hash_table_new (hash_func, equal_func); + mono_memory_barrier (); + *var = cache; + } + remoting_unlock (); + } + return *var; +} + +static GHashTable* +get_cache_full (GHashTable **var, GHashFunc hash_func, GCompareFunc equal_func, GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func) +{ + if (!(*var)) { + remoting_lock (); + if (!(*var)) { + GHashTable *cache = + g_hash_table_new_full (hash_func, equal_func, key_destroy_func, value_destroy_func); + mono_memory_barrier (); + *var = cache; + } + remoting_unlock (); + } + return *var; +} + +void +mono_remoting_init (void) +{ + mono_mutex_init (&remoting_mutex); + remoting_mutex_inited = TRUE; +} + +static void +mono_remoting_marshal_init (void) +{ + MonoClass *klass; + + static gboolean module_initialized = FALSE; + static gboolean icalls_registered = FALSE; + + if (module_initialized) + return; + + klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.Remoting", "RemotingServices"); + method_rs_serialize = mono_class_get_method_from_name (klass, "SerializeCallData", -1); + method_rs_deserialize = mono_class_get_method_from_name (klass, "DeserializeCallData", -1); + method_rs_serialize_exc = mono_class_get_method_from_name (klass, "SerializeExceptionData", -1); + + klass = mono_defaults.real_proxy_class; + method_rs_appdomain_target = mono_class_get_method_from_name (klass, "GetAppDomainTarget", -1); + + klass = mono_defaults.exception_class; + method_exc_fixexc = mono_class_get_method_from_name (klass, "FixRemotingException", -1); + + byte_array_class = mono_array_class_get (mono_defaults.byte_class, 1); + + klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.Remoting.Messaging", "CallContext"); + method_set_call_context = mono_class_get_method_from_name (klass, "SetCurrentCallContext", -1); + + klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.Remoting.Contexts", "Context"); + method_needs_context_sink = mono_class_get_method_from_name (klass, "get_NeedsContextSink", -1); + + mono_loader_lock (); + + if (!icalls_registered) { + register_icall (type_from_handle, "type_from_handle", "object ptr", FALSE); + register_icall (mono_marshal_set_domain_by_id, "mono_marshal_set_domain_by_id", "int32 int32 int32", FALSE); + register_icall (mono_marshal_check_domain_image, "mono_marshal_check_domain_image", "int32 int32 ptr", FALSE); + register_icall (mono_marshal_xdomain_copy_value, "mono_marshal_xdomain_copy_value", "object object", FALSE); + register_icall (mono_marshal_xdomain_copy_out_value, "mono_marshal_xdomain_copy_out_value", "void object object", FALSE); + register_icall (mono_remoting_wrapper, "mono_remoting_wrapper", "object ptr ptr", FALSE); + register_icall (mono_upgrade_remote_class_wrapper, "mono_upgrade_remote_class_wrapper", "void object object", FALSE); + } + + icalls_registered = TRUE; + + mono_loader_unlock (); + + module_initialized = TRUE; +} + +static MonoReflectionType * +type_from_handle (MonoType *handle) +{ + MonoDomain *domain = mono_domain_get (); + MonoClass *klass = mono_class_from_mono_type (handle); + + mono_class_init (klass); + return mono_type_get_object (domain, handle); +} + +#ifndef DISABLE_JIT +static int +mono_mb_emit_proxy_check (MonoMethodBuilder *mb, int branch_code) +{ + int pos; + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoObject, vtable)); + mono_mb_emit_byte (mb, CEE_LDIND_I); + mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoVTable, klass)); + mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_byte (mb, CEE_LDIND_I); + mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); + mono_mb_emit_byte (mb, CEE_MONO_CLASSCONST); + mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_defaults.transparent_proxy_class)); + pos = mono_mb_emit_branch (mb, branch_code); + return pos; +} + +static int +mono_mb_emit_xdomain_check (MonoMethodBuilder *mb, int branch_code) +{ + int pos; + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp)); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, target_domain_id)); + mono_mb_emit_byte (mb, CEE_LDIND_I4); + mono_mb_emit_icon (mb, -1); + pos = mono_mb_emit_branch (mb, branch_code); + return pos; +} + +static int +mono_mb_emit_contextbound_check (MonoMethodBuilder *mb, int branch_code) +{ + static int offset = -1; + static guint8 mask; + + if (offset < 0) + mono_marshal_find_bitfield_offset (MonoClass, contextbound, &offset, &mask); + + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, remote_class)); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRemoteClass, proxy_class)); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_mb_emit_ldflda (mb, offset); + mono_mb_emit_byte (mb, CEE_LDIND_U1); + mono_mb_emit_icon (mb, mask); + mono_mb_emit_byte (mb, CEE_AND); + mono_mb_emit_icon (mb, 0); + return mono_mb_emit_branch (mb, branch_code); +} +#endif /* !DISABLE_JIT */ + +static inline MonoMethod* +mono_marshal_remoting_find_in_cache (MonoMethod *method, int wrapper_type) +{ + MonoMethod *res = NULL; + MonoRemotingMethods *wrps; + + mono_marshal_lock_internal (); + if (method->klass->image->remoting_invoke_cache) + wrps = g_hash_table_lookup (method->klass->image->remoting_invoke_cache, method); + else + wrps = NULL; + + if (wrps) { + switch (wrapper_type) { + case MONO_WRAPPER_REMOTING_INVOKE: res = wrps->invoke; break; + case MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK: res = wrps->invoke_with_check; break; + case MONO_WRAPPER_XDOMAIN_INVOKE: res = wrps->xdomain_invoke; break; + case MONO_WRAPPER_XDOMAIN_DISPATCH: res = wrps->xdomain_dispatch; break; + } + } + + /* it is important to do the unlock after the load from wrps, since in + * mono_remoting_mb_create_and_cache () we drop the marshal lock to be able + * to take the loader lock and some other thread may set the fields. + */ + mono_marshal_unlock_internal (); + return res; +} + +/* Create the method from the builder and place it in the cache */ +static inline MonoMethod* +mono_remoting_mb_create_and_cache (MonoMethod *key, MonoMethodBuilder *mb, + MonoMethodSignature *sig, int max_stack) +{ + MonoMethod **res = NULL; + MonoRemotingMethods *wrps; + GHashTable *cache = get_cache_full (&key->klass->image->remoting_invoke_cache, mono_aligned_addr_hash, NULL, NULL, g_free); + + mono_marshal_lock_internal (); + wrps = g_hash_table_lookup (cache, key); + if (!wrps) { + wrps = g_new0 (MonoRemotingMethods, 1); + g_hash_table_insert (cache, key, wrps); + } + + switch (mb->method->wrapper_type) { + case MONO_WRAPPER_REMOTING_INVOKE: res = &wrps->invoke; break; + case MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK: res = &wrps->invoke_with_check; break; + case MONO_WRAPPER_XDOMAIN_INVOKE: res = &wrps->xdomain_invoke; break; + case MONO_WRAPPER_XDOMAIN_DISPATCH: res = &wrps->xdomain_dispatch; break; + default: g_assert_not_reached (); break; + } + mono_marshal_unlock_internal (); + + if (*res == NULL) { + MonoMethod *newm; + newm = mono_mb_create_method (mb, sig, max_stack); + + mono_marshal_lock_internal (); + if (!*res) { + *res = newm; + mono_marshal_set_wrapper_info (*res, key); + mono_marshal_unlock_internal (); + } else { + mono_marshal_unlock_internal (); + mono_free_method (newm); + } + } + + return *res; +} + +static MonoObject * +mono_remoting_wrapper (MonoMethod *method, gpointer *params) +{ + MonoMethodMessage *msg; + MonoTransparentProxy *this; + MonoObject *res, *exc; + MonoArray *out_args; + + this = *((MonoTransparentProxy **)params [0]); + + g_assert (this); + g_assert (((MonoObject *)this)->vtable->klass == mono_defaults.transparent_proxy_class); + + /* skip the this pointer */ + params++; + + if (mono_class_is_contextbound (this->remote_class->proxy_class) && this->rp->context == (MonoObject *) mono_context_get ()) + { + int i; + MonoMethodSignature *sig = mono_method_signature (method); + int count = sig->param_count; + gpointer* mparams = (gpointer*) alloca(count*sizeof(gpointer)); + + for (i=0; iparams [i]); + if (class->valuetype) { + if (sig->params [i]->byref) { + mparams[i] = *((gpointer *)params [i]); + } else { + /* runtime_invoke expects a boxed instance */ + if (mono_class_is_nullable (mono_class_from_mono_type (sig->params [i]))) + mparams[i] = mono_nullable_box (params [i], class); + else + mparams[i] = params [i]; + } + } else { + mparams[i] = *((gpointer**)params [i]); + } + } + + return mono_runtime_invoke (method, method->klass->valuetype? mono_object_unbox ((MonoObject*)this): this, mparams, NULL); + } + + msg = mono_method_call_message_new (method, params, NULL, NULL, NULL); + + res = mono_remoting_invoke ((MonoObject *)this->rp, msg, &exc, &out_args); + + if (exc) + mono_raise_exception ((MonoException *)exc); + + mono_method_return_message_restore (method, params, out_args); + + return res; +} + +MonoMethod * +mono_marshal_get_remoting_invoke (MonoMethod *method) +{ + MonoMethodSignature *sig; + MonoMethodBuilder *mb; + MonoMethod *res; + int params_var; + + g_assert (method); + + if (method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE || method->wrapper_type == MONO_WRAPPER_XDOMAIN_INVOKE) + return method; + + /* this seems to be the best plase to put this, as all remoting invokes seem to get filtered through here */ +#ifndef DISABLE_COM + if (mono_class_is_com_object (method->klass) || method->klass == mono_class_get_com_object_class ()) { + MonoVTable *vtable = mono_class_vtable (mono_domain_get (), method->klass); + g_assert (vtable); /*FIXME do proper error handling*/ + + if (!mono_vtable_is_remote (vtable)) { + return mono_cominterop_get_invoke (method); + } + } +#endif + + sig = mono_signature_no_pinvoke (method); + + /* we cant remote methods without this pointer */ + if (!sig->hasthis) + return method; + + if ((res = mono_marshal_remoting_find_in_cache (method, MONO_WRAPPER_REMOTING_INVOKE))) + return res; + + mono_remoting_marshal_init (); + + mb = mono_mb_new (method->klass, method->name, MONO_WRAPPER_REMOTING_INVOKE); + +#ifndef DISABLE_JIT + mb->method->save_lmf = 1; + + params_var = mono_mb_emit_save_args (mb, sig, TRUE); + + mono_mb_emit_ptr (mb, method); + mono_mb_emit_ldloc (mb, params_var); + mono_mb_emit_icall (mb, mono_remoting_wrapper); + mono_marshal_emit_thread_interrupt_checkpoint (mb); + + if (sig->ret->type == MONO_TYPE_VOID) { + mono_mb_emit_byte (mb, CEE_POP); + mono_mb_emit_byte (mb, CEE_RET); + } else { + mono_mb_emit_restore_result (mb, sig->ret); + } +#endif + + res = mono_remoting_mb_create_and_cache (method, mb, sig, sig->param_count + 16); + mono_mb_free (mb); + + return res; +} + +/* mono_marshal_xdomain_copy_out_value() + * Copies the contents of the src instance into the dst instance. src and dst + * must have the same type, and if they are arrays, the same size. + */ +static void +mono_marshal_xdomain_copy_out_value (MonoObject *src, MonoObject *dst) +{ + if (src == NULL || dst == NULL) return; + + g_assert (mono_object_class (src) == mono_object_class (dst)); + + switch (mono_object_class (src)->byval_arg.type) { + case MONO_TYPE_ARRAY: + case MONO_TYPE_SZARRAY: { + int mt = mono_get_xdomain_marshal_type (&(mono_object_class (src)->element_class->byval_arg)); + if (mt == MONO_MARSHAL_SERIALIZE) return; + if (mt == MONO_MARSHAL_COPY) { + int i, len = mono_array_length ((MonoArray *)dst); + for (i = 0; i < len; i++) { + MonoObject *item = mono_array_get ((MonoArray *)src, gpointer, i); + mono_array_setref ((MonoArray *)dst, i, mono_marshal_xdomain_copy_value (item)); + } + } else { + mono_array_full_copy ((MonoArray *)src, (MonoArray *)dst); + } + return; + } + } + + if (mono_object_class (src) == mono_defaults.stringbuilder_class) { + MonoStringBuilder *src_sb = (MonoStringBuilder *) src; + MonoStringBuilder *dst_sb = (MonoStringBuilder *) dst; + + MONO_OBJECT_SETREF (dst_sb, str, mono_string_new_utf16 (mono_object_domain (dst), mono_string_chars (src_sb->str), mono_string_length (src_sb->str))); + dst_sb->cached_str = NULL; + dst_sb->length = src_sb->length; + } +} + + +#if !defined (DISABLE_JIT) +static void +mono_marshal_emit_xdomain_copy_value (MonoMethodBuilder *mb, MonoClass *pclass) +{ + mono_mb_emit_icall (mb, mono_marshal_xdomain_copy_value); + mono_mb_emit_op (mb, CEE_CASTCLASS, pclass); +} + +static void +mono_marshal_emit_xdomain_copy_out_value (MonoMethodBuilder *mb, MonoClass *pclass) +{ + mono_mb_emit_icall (mb, mono_marshal_xdomain_copy_out_value); +} +#endif + +/* mono_marshal_supports_fast_xdomain() + * Returns TRUE if the method can use the fast xdomain wrapper. + */ +static gboolean +mono_marshal_supports_fast_xdomain (MonoMethod *method) +{ + return !mono_class_is_contextbound (method->klass) && + !((method->flags & METHOD_ATTRIBUTE_SPECIAL_NAME) && (strcmp (".ctor", method->name) == 0)); +} + +static gint32 +mono_marshal_set_domain_by_id (gint32 id, MonoBoolean push) +{ + MonoDomain *current_domain = mono_domain_get (); + MonoDomain *domain = mono_domain_get_by_id (id); + + if (!domain || !mono_domain_set (domain, FALSE)) + mono_raise_exception (mono_get_exception_appdomain_unloaded ()); + + if (push) + mono_thread_push_appdomain_ref (domain); + else + mono_thread_pop_appdomain_ref (); + + return current_domain->domain_id; +} + +#if !defined (DISABLE_JIT) +static void +mono_marshal_emit_switch_domain (MonoMethodBuilder *mb) +{ + mono_mb_emit_icall (mb, mono_marshal_set_domain_by_id); +} + +/* mono_marshal_emit_load_domain_method () + * Loads into the stack a pointer to the code of the provided method for + * the current domain. + */ +static void +mono_marshal_emit_load_domain_method (MonoMethodBuilder *mb, MonoMethod *method) +{ + /* We need a pointer to the method for the running domain (not the domain + * that compiles the method). + */ + mono_mb_emit_ptr (mb, method); + mono_mb_emit_icall (mb, mono_compile_method); +} +#endif + +/* mono_marshal_check_domain_image () + * Returns TRUE if the image is loaded in the specified + * application domain. + */ +static gboolean +mono_marshal_check_domain_image (gint32 domain_id, MonoImage *image) +{ + MonoAssembly* ass; + GSList *tmp; + + MonoDomain *domain = mono_domain_get_by_id (domain_id); + if (!domain) + return FALSE; + + mono_domain_assemblies_lock (domain); + for (tmp = domain->domain_assemblies; tmp; tmp = tmp->next) { + ass = tmp->data; + if (ass->image == image) + break; + } + mono_domain_assemblies_unlock (domain); + + return tmp != NULL; +} + +/* mono_marshal_get_xappdomain_dispatch () + * Generates a method that dispatches a method call from another domain into + * the current domain. + */ +static MonoMethod * +mono_marshal_get_xappdomain_dispatch (MonoMethod *method, int *marshal_types, int complex_count, int complex_out_count, int ret_marshal_type) +{ + MonoMethodSignature *sig, *csig; + MonoMethodBuilder *mb; + MonoMethod *res; + int i, j, param_index, copy_locals_base; + MonoClass *ret_class = NULL; + int loc_array=0, loc_return=0, loc_serialized_exc=0; + MonoExceptionClause *main_clause; + int pos, pos_leave; + gboolean copy_return; + + if ((res = mono_marshal_remoting_find_in_cache (method, MONO_WRAPPER_XDOMAIN_DISPATCH))) + return res; + + sig = mono_method_signature (method); + copy_return = (sig->ret->type != MONO_TYPE_VOID && ret_marshal_type != MONO_MARSHAL_SERIALIZE); + + j = 0; + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 3 + sig->param_count - complex_count); + csig->params [j++] = &mono_defaults.object_class->byval_arg; + csig->params [j++] = &byte_array_class->this_arg; + csig->params [j++] = &byte_array_class->this_arg; + for (i = 0; i < sig->param_count; i++) { + if (marshal_types [i] != MONO_MARSHAL_SERIALIZE) + csig->params [j++] = sig->params [i]; + } + if (copy_return) + csig->ret = sig->ret; + else + csig->ret = &mono_defaults.void_class->byval_arg; + csig->pinvoke = 1; + csig->hasthis = FALSE; + + mb = mono_mb_new (method->klass, method->name, MONO_WRAPPER_XDOMAIN_DISPATCH); + mb->method->save_lmf = 1; + +#ifndef DISABLE_JIT + /* Locals */ + + loc_serialized_exc = mono_mb_add_local (mb, &byte_array_class->byval_arg); + if (complex_count > 0) + loc_array = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg); + if (sig->ret->type != MONO_TYPE_VOID) { + loc_return = mono_mb_add_local (mb, sig->ret); + ret_class = mono_class_from_mono_type (sig->ret); + } + + /* try */ + + main_clause = mono_image_alloc0 (method->klass->image, sizeof (MonoExceptionClause)); + main_clause->try_offset = mono_mb_get_label (mb); + + /* Clean the call context */ + + mono_mb_emit_byte (mb, CEE_LDNULL); + mono_mb_emit_managed_call (mb, method_set_call_context, NULL); + mono_mb_emit_byte (mb, CEE_POP); + + /* Deserialize call data */ + + mono_mb_emit_ldarg (mb, 1); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_mb_emit_byte (mb, CEE_DUP); + pos = mono_mb_emit_short_branch (mb, CEE_BRFALSE_S); + + mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); + mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); + + if (complex_count > 0) + mono_mb_emit_stloc (mb, loc_array); + else + mono_mb_emit_byte (mb, CEE_POP); + + mono_mb_patch_short_branch (mb, pos); + + /* Get the target object */ + + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_managed_call (mb, method_rs_appdomain_target, NULL); + + /* Load the arguments */ + + copy_locals_base = mb->locals; + param_index = 3; // Index of the first non-serialized parameter of this wrapper + j = 0; + for (i = 0; i < sig->param_count; i++) { + MonoType *pt = sig->params [i]; + MonoClass *pclass = mono_class_from_mono_type (pt); + switch (marshal_types [i]) { + case MONO_MARSHAL_SERIALIZE: { + /* take the value from the serialized array */ + mono_mb_emit_ldloc (mb, loc_array); + mono_mb_emit_icon (mb, j++); + if (pt->byref) { + if (pclass->valuetype) { + mono_mb_emit_byte (mb, CEE_LDELEM_REF); + mono_mb_emit_op (mb, CEE_UNBOX, pclass); + } else { + mono_mb_emit_op (mb, CEE_LDELEMA, pclass); + } + } else { + if (pclass->valuetype) { + mono_mb_emit_byte (mb, CEE_LDELEM_REF); + mono_mb_emit_op (mb, CEE_UNBOX, pclass); + mono_mb_emit_op (mb, CEE_LDOBJ, pclass); + } else { + mono_mb_emit_byte (mb, CEE_LDELEM_REF); + if (pclass != mono_defaults.object_class) { + mono_mb_emit_op (mb, CEE_CASTCLASS, pclass); + } + } + } + break; + } + case MONO_MARSHAL_COPY_OUT: { + /* Keep a local copy of the value since we need to copy it back after the call */ + int copy_local = mono_mb_add_local (mb, &(pclass->byval_arg)); + mono_mb_emit_ldarg (mb, param_index++); + mono_marshal_emit_xdomain_copy_value (mb, pclass); + mono_mb_emit_byte (mb, CEE_DUP); + mono_mb_emit_stloc (mb, copy_local); + break; + } + case MONO_MARSHAL_COPY: { + mono_mb_emit_ldarg (mb, param_index); + if (pt->byref) { + mono_mb_emit_byte (mb, CEE_DUP); + mono_mb_emit_byte (mb, CEE_DUP); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_marshal_emit_xdomain_copy_value (mb, pclass); + mono_mb_emit_byte (mb, CEE_STIND_REF); + } else { + mono_marshal_emit_xdomain_copy_value (mb, pclass); + } + param_index++; + break; + } + case MONO_MARSHAL_NONE: + mono_mb_emit_ldarg (mb, param_index++); + break; + } + } + + /* Make the call to the real object */ + + mono_marshal_emit_thread_force_interrupt_checkpoint (mb); + + mono_mb_emit_op (mb, CEE_CALLVIRT, method); + + if (sig->ret->type != MONO_TYPE_VOID) + mono_mb_emit_stloc (mb, loc_return); + + /* copy back MONO_MARSHAL_COPY_OUT parameters */ + + j = 0; + param_index = 3; + for (i = 0; i < sig->param_count; i++) { + if (marshal_types [i] == MONO_MARSHAL_SERIALIZE) continue; + if (marshal_types [i] == MONO_MARSHAL_COPY_OUT) { + mono_mb_emit_ldloc (mb, copy_locals_base + (j++)); + mono_mb_emit_ldarg (mb, param_index); + mono_marshal_emit_xdomain_copy_out_value (mb, mono_class_from_mono_type (sig->params [i])); + } + param_index++; + } + + /* Serialize the return values */ + + if (complex_out_count > 0) { + /* Reset parameters in the array that don't need to be serialized back */ + j = 0; + for (i = 0; i < sig->param_count; i++) { + if (marshal_types[i] != MONO_MARSHAL_SERIALIZE) continue; + if (!sig->params [i]->byref) { + mono_mb_emit_ldloc (mb, loc_array); + mono_mb_emit_icon (mb, j); + mono_mb_emit_byte (mb, CEE_LDNULL); + mono_mb_emit_byte (mb, CEE_STELEM_REF); + } + j++; + } + + /* Add the return value to the array */ + + if (ret_marshal_type == MONO_MARSHAL_SERIALIZE) { + mono_mb_emit_ldloc (mb, loc_array); + mono_mb_emit_icon (mb, complex_count); /* The array has an additional slot to hold the ret value */ + mono_mb_emit_ldloc (mb, loc_return); + + g_assert (ret_class); /*FIXME properly fail here*/ + if (ret_class->valuetype) { + mono_mb_emit_op (mb, CEE_BOX, ret_class); + } + mono_mb_emit_byte (mb, CEE_STELEM_REF); + } + + /* Serialize */ + + mono_mb_emit_ldarg (mb, 1); + mono_mb_emit_ldloc (mb, loc_array); + mono_mb_emit_managed_call (mb, method_rs_serialize, NULL); + mono_mb_emit_byte (mb, CEE_STIND_REF); + } else if (ret_marshal_type == MONO_MARSHAL_SERIALIZE) { + mono_mb_emit_ldarg (mb, 1); + mono_mb_emit_ldloc (mb, loc_return); + if (ret_class->valuetype) { + mono_mb_emit_op (mb, CEE_BOX, ret_class); + } + mono_mb_emit_managed_call (mb, method_rs_serialize, NULL); + mono_mb_emit_byte (mb, CEE_STIND_REF); + } else { + mono_mb_emit_ldarg (mb, 1); + mono_mb_emit_byte (mb, CEE_LDNULL); + mono_mb_emit_managed_call (mb, method_rs_serialize, NULL); + mono_mb_emit_byte (mb, CEE_STIND_REF); + } + + mono_mb_emit_ldarg (mb, 2); + mono_mb_emit_byte (mb, CEE_LDNULL); + mono_mb_emit_byte (mb, CEE_STIND_REF); + pos_leave = mono_mb_emit_branch (mb, CEE_LEAVE); + + /* Main exception catch */ + main_clause->flags = MONO_EXCEPTION_CLAUSE_NONE; + main_clause->try_len = mono_mb_get_pos (mb) - main_clause->try_offset; + main_clause->data.catch_class = mono_defaults.object_class; + + /* handler code */ + main_clause->handler_offset = mono_mb_get_label (mb); + mono_mb_emit_managed_call (mb, method_rs_serialize_exc, NULL); + mono_mb_emit_stloc (mb, loc_serialized_exc); + mono_mb_emit_ldarg (mb, 2); + mono_mb_emit_ldloc (mb, loc_serialized_exc); + mono_mb_emit_byte (mb, CEE_STIND_REF); + mono_mb_emit_branch (mb, CEE_LEAVE); + main_clause->handler_len = mono_mb_get_pos (mb) - main_clause->handler_offset; + /* end catch */ + + mono_mb_patch_branch (mb, pos_leave); + + if (copy_return) + mono_mb_emit_ldloc (mb, loc_return); + + mono_mb_emit_byte (mb, CEE_RET); + + mono_mb_set_clauses (mb, 1, main_clause); +#endif + + res = mono_remoting_mb_create_and_cache (method, mb, csig, csig->param_count + 16); + mono_mb_free (mb); + + return res; +} + +/* mono_marshal_get_xappdomain_invoke () + * Generates a fast remoting wrapper for cross app domain calls. + */ +MonoMethod * +mono_marshal_get_xappdomain_invoke (MonoMethod *method) +{ + MonoMethodSignature *sig; + MonoMethodBuilder *mb; + MonoMethod *res; + int i, j, complex_count, complex_out_count, copy_locals_base; + int *marshal_types; + MonoClass *ret_class = NULL; + MonoMethod *xdomain_method; + int ret_marshal_type = MONO_MARSHAL_NONE; + int loc_array=0, loc_serialized_data=-1, loc_real_proxy; + int loc_old_domainid, loc_domainid, loc_return=0, loc_serialized_exc=0, loc_context; + int pos, pos_dispatch, pos_noex; + gboolean copy_return = FALSE; + + g_assert (method); + + if (method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE || method->wrapper_type == MONO_WRAPPER_XDOMAIN_INVOKE) + return method; + + /* we cant remote methods without this pointer */ + if (!mono_method_signature (method)->hasthis) + return method; + + mono_remoting_marshal_init (); + + if (!mono_marshal_supports_fast_xdomain (method)) + return mono_marshal_get_remoting_invoke (method); + + if ((res = mono_marshal_remoting_find_in_cache (method, MONO_WRAPPER_XDOMAIN_INVOKE))) + return res; + + sig = mono_signature_no_pinvoke (method); + + mb = mono_mb_new (method->klass, method->name, MONO_WRAPPER_XDOMAIN_INVOKE); + mb->method->save_lmf = 1; + + /* Count the number of parameters that need to be serialized */ + + marshal_types = alloca (sizeof (int) * sig->param_count); + complex_count = complex_out_count = 0; + for (i = 0; i < sig->param_count; i++) { + MonoType *ptype = sig->params[i]; + int mt = mono_get_xdomain_marshal_type (ptype); + + /* If the [Out] attribute is applied to a parameter that can be internally copied, + * the copy will be made by reusing the original object instance + */ + if ((ptype->attrs & PARAM_ATTRIBUTE_OUT) != 0 && mt == MONO_MARSHAL_COPY && !ptype->byref) + mt = MONO_MARSHAL_COPY_OUT; + else if (mt == MONO_MARSHAL_SERIALIZE) { + complex_count++; + if (ptype->byref) complex_out_count++; + } + marshal_types [i] = mt; + } + + if (sig->ret->type != MONO_TYPE_VOID) { + ret_marshal_type = mono_get_xdomain_marshal_type (sig->ret); + ret_class = mono_class_from_mono_type (sig->ret); + copy_return = ret_marshal_type != MONO_MARSHAL_SERIALIZE; + } + + /* Locals */ + +#ifndef DISABLE_JIT + if (complex_count > 0) + loc_array = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg); + loc_serialized_data = mono_mb_add_local (mb, &byte_array_class->byval_arg); + loc_real_proxy = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg); + if (copy_return) + loc_return = mono_mb_add_local (mb, sig->ret); + loc_old_domainid = mono_mb_add_local (mb, &mono_defaults.int32_class->byval_arg); + loc_domainid = mono_mb_add_local (mb, &mono_defaults.int32_class->byval_arg); + loc_serialized_exc = mono_mb_add_local (mb, &byte_array_class->byval_arg); + loc_context = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg); + + /* Save thread domain data */ + + mono_mb_emit_icall (mb, mono_context_get); + mono_mb_emit_byte (mb, CEE_DUP); + mono_mb_emit_stloc (mb, loc_context); + + /* If the thread is not running in the default context, it needs to go + * through the whole remoting sink, since the context is going to change + */ + mono_mb_emit_managed_call (mb, method_needs_context_sink, NULL); + pos = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); + + /* Another case in which the fast path can't be used: when the target domain + * has a different image for the same assembly. + */ + + /* Get the target domain id */ + + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp)); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_mb_emit_byte (mb, CEE_DUP); + mono_mb_emit_stloc (mb, loc_real_proxy); + + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, target_domain_id)); + mono_mb_emit_byte (mb, CEE_LDIND_I4); + mono_mb_emit_stloc (mb, loc_domainid); + + /* Check if the target domain has the same image for the required assembly */ + + mono_mb_emit_ldloc (mb, loc_domainid); + mono_mb_emit_ptr (mb, method->klass->image); + mono_mb_emit_icall (mb, mono_marshal_check_domain_image); + pos_dispatch = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); + + /* Use the whole remoting sink to dispatch this message */ + + mono_mb_patch_short_branch (mb, pos); + + mono_mb_emit_ldarg (mb, 0); + for (i = 0; i < sig->param_count; i++) + mono_mb_emit_ldarg (mb, i + 1); + + mono_mb_emit_managed_call (mb, mono_marshal_get_remoting_invoke (method), NULL); + mono_mb_emit_byte (mb, CEE_RET); + mono_mb_patch_short_branch (mb, pos_dispatch); + + /* Create the array that will hold the parameters to be serialized */ + + if (complex_count > 0) { + mono_mb_emit_icon (mb, (ret_marshal_type == MONO_MARSHAL_SERIALIZE && complex_out_count > 0) ? complex_count + 1 : complex_count); /* +1 for the return type */ + mono_mb_emit_op (mb, CEE_NEWARR, mono_defaults.object_class); + + j = 0; + for (i = 0; i < sig->param_count; i++) { + MonoClass *pclass; + if (marshal_types [i] != MONO_MARSHAL_SERIALIZE) continue; + pclass = mono_class_from_mono_type (sig->params[i]); + mono_mb_emit_byte (mb, CEE_DUP); + mono_mb_emit_icon (mb, j); + mono_mb_emit_ldarg (mb, i + 1); /* 0=this */ + if (sig->params[i]->byref) { + if (pclass->valuetype) + mono_mb_emit_op (mb, CEE_LDOBJ, pclass); + else + mono_mb_emit_byte (mb, CEE_LDIND_REF); + } + if (pclass->valuetype) + mono_mb_emit_op (mb, CEE_BOX, pclass); + mono_mb_emit_byte (mb, CEE_STELEM_REF); + j++; + } + mono_mb_emit_stloc (mb, loc_array); + + /* Serialize parameters */ + + mono_mb_emit_ldloc (mb, loc_array); + mono_mb_emit_managed_call (mb, method_rs_serialize, NULL); + mono_mb_emit_stloc (mb, loc_serialized_data); + } else { + mono_mb_emit_byte (mb, CEE_LDNULL); + mono_mb_emit_managed_call (mb, method_rs_serialize, NULL); + mono_mb_emit_stloc (mb, loc_serialized_data); + } + + /* switch domain */ + + mono_mb_emit_ldloc (mb, loc_domainid); + mono_mb_emit_byte (mb, CEE_LDC_I4_1); + mono_marshal_emit_switch_domain (mb); + mono_mb_emit_stloc (mb, loc_old_domainid); + + /* Load the arguments */ + + mono_mb_emit_ldloc (mb, loc_real_proxy); + mono_mb_emit_ldloc_addr (mb, loc_serialized_data); + mono_mb_emit_ldloc_addr (mb, loc_serialized_exc); + + copy_locals_base = mb->locals; + for (i = 0; i < sig->param_count; i++) { + switch (marshal_types [i]) { + case MONO_MARSHAL_SERIALIZE: + continue; + case MONO_MARSHAL_COPY: { + mono_mb_emit_ldarg (mb, i+1); + if (sig->params [i]->byref) { + /* make a local copy of the byref parameter. The real parameter + * will be updated after the xdomain call + */ + MonoClass *pclass = mono_class_from_mono_type (sig->params [i]); + int copy_local = mono_mb_add_local (mb, &(pclass->byval_arg)); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_mb_emit_stloc (mb, copy_local); + mono_mb_emit_ldloc_addr (mb, copy_local); + } + break; + } + case MONO_MARSHAL_COPY_OUT: + case MONO_MARSHAL_NONE: + mono_mb_emit_ldarg (mb, i+1); + break; + } + } + + /* Make the call to the invoke wrapper in the target domain */ + + xdomain_method = mono_marshal_get_xappdomain_dispatch (method, marshal_types, complex_count, complex_out_count, ret_marshal_type); + mono_marshal_emit_load_domain_method (mb, xdomain_method); + mono_mb_emit_calli (mb, mono_method_signature (xdomain_method)); + + if (copy_return) + mono_mb_emit_stloc (mb, loc_return); + + /* Switch domain */ + + mono_mb_emit_ldloc (mb, loc_old_domainid); + mono_mb_emit_byte (mb, CEE_LDC_I4_0); + mono_marshal_emit_switch_domain (mb); + mono_mb_emit_byte (mb, CEE_POP); + + /* Restore thread domain data */ + + mono_mb_emit_ldloc (mb, loc_context); + mono_mb_emit_icall (mb, mono_context_set); + + /* if (loc_serialized_exc != null) ... */ + + mono_mb_emit_ldloc (mb, loc_serialized_exc); + pos_noex = mono_mb_emit_short_branch (mb, CEE_BRFALSE_S); + + mono_mb_emit_ldloc (mb, loc_serialized_exc); + mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); + mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); + mono_mb_emit_op (mb, CEE_CASTCLASS, mono_defaults.exception_class); + mono_mb_emit_managed_call (mb, method_exc_fixexc, NULL); + mono_mb_emit_byte (mb, CEE_THROW); + mono_mb_patch_short_branch (mb, pos_noex); + + /* copy back non-serialized output parameters */ + + j = 0; + for (i = 0; i < sig->param_count; i++) { + if (!sig->params [i]->byref || marshal_types [i] != MONO_MARSHAL_COPY) continue; + mono_mb_emit_ldarg (mb, i + 1); + mono_mb_emit_ldloc (mb, copy_locals_base + (j++)); + mono_marshal_emit_xdomain_copy_value (mb, mono_class_from_mono_type (sig->params [i])); + mono_mb_emit_byte (mb, CEE_STIND_REF); + } + + /* Deserialize out parameters */ + + if (complex_out_count > 0) { + mono_mb_emit_ldloc (mb, loc_serialized_data); + mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); + mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); + mono_mb_emit_stloc (mb, loc_array); + + /* Copy back output parameters and return type */ + + j = 0; + for (i = 0; i < sig->param_count; i++) { + if (marshal_types [i] != MONO_MARSHAL_SERIALIZE) continue; + if (sig->params[i]->byref) { + MonoClass *pclass = mono_class_from_mono_type (sig->params [i]); + mono_mb_emit_ldarg (mb, i + 1); + mono_mb_emit_ldloc (mb, loc_array); + mono_mb_emit_icon (mb, j); + mono_mb_emit_byte (mb, CEE_LDELEM_REF); + if (pclass->valuetype) { + mono_mb_emit_op (mb, CEE_UNBOX, pclass); + mono_mb_emit_op (mb, CEE_LDOBJ, pclass); + mono_mb_emit_op (mb, CEE_STOBJ, pclass); + } else { + if (pclass != mono_defaults.object_class) + mono_mb_emit_op (mb, CEE_CASTCLASS, pclass); + mono_mb_emit_byte (mb, CEE_STIND_REF); + } + } + j++; + } + + if (ret_marshal_type == MONO_MARSHAL_SERIALIZE) { + mono_mb_emit_ldloc (mb, loc_array); + mono_mb_emit_icon (mb, complex_count); + mono_mb_emit_byte (mb, CEE_LDELEM_REF); + if (ret_class->valuetype) { + mono_mb_emit_op (mb, CEE_UNBOX, ret_class); + mono_mb_emit_op (mb, CEE_LDOBJ, ret_class); + } + } + } else if (ret_marshal_type == MONO_MARSHAL_SERIALIZE) { + mono_mb_emit_ldloc (mb, loc_serialized_data); + mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); + mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); + if (ret_class->valuetype) { + mono_mb_emit_op (mb, CEE_UNBOX, ret_class); + mono_mb_emit_op (mb, CEE_LDOBJ, ret_class); + } else if (ret_class != mono_defaults.object_class) { + mono_mb_emit_op (mb, CEE_CASTCLASS, ret_class); + } + } else { + mono_mb_emit_ldloc (mb, loc_serialized_data); + mono_mb_emit_byte (mb, CEE_DUP); + pos = mono_mb_emit_short_branch (mb, CEE_BRFALSE_S); + mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); + + mono_mb_patch_short_branch (mb, pos); + mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); + mono_mb_emit_byte (mb, CEE_POP); + } + + if (copy_return) { + mono_mb_emit_ldloc (mb, loc_return); + if (ret_marshal_type == MONO_MARSHAL_COPY) + mono_marshal_emit_xdomain_copy_value (mb, ret_class); + } + + mono_mb_emit_byte (mb, CEE_RET); +#endif /* DISABLE_JIT */ + + res = mono_remoting_mb_create_and_cache (method, mb, sig, sig->param_count + 16); + mono_mb_free (mb); + + return res; +} + +MonoMethod * +mono_marshal_get_remoting_invoke_for_target (MonoMethod *method, MonoRemotingTarget target_type) +{ + if (target_type == MONO_REMOTING_TARGET_APPDOMAIN) { + return mono_marshal_get_xappdomain_invoke (method); + } else if (target_type == MONO_REMOTING_TARGET_COMINTEROP) { +#ifndef DISABLE_COM + return mono_cominterop_get_invoke (method); +#else + g_assert_not_reached (); +#endif + } else { + return mono_marshal_get_remoting_invoke (method); + } + /* Not erached */ + return NULL; +} + +G_GNUC_UNUSED static gpointer +mono_marshal_load_remoting_wrapper (MonoRealProxy *rp, MonoMethod *method) +{ + if (rp->target_domain_id != -1) + return mono_compile_method (mono_marshal_get_xappdomain_invoke (method)); + else + return mono_compile_method (mono_marshal_get_remoting_invoke (method)); +} + +MonoMethod * +mono_marshal_get_remoting_invoke_with_check (MonoMethod *method) +{ + MonoMethodSignature *sig; + MonoMethodBuilder *mb; + MonoMethod *res, *native; + int i, pos, pos_rem; + + g_assert (method); + + if (method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK) + return method; + + /* we cant remote methods without this pointer */ + g_assert (mono_method_signature (method)->hasthis); + + if ((res = mono_marshal_remoting_find_in_cache (method, MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK))) + return res; + + sig = mono_signature_no_pinvoke (method); + + mb = mono_mb_new (method->klass, method->name, MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK); + +#ifndef DISABLE_JIT + for (i = 0; i <= sig->param_count; i++) + mono_mb_emit_ldarg (mb, i); + + mono_mb_emit_ldarg (mb, 0); + pos = mono_mb_emit_proxy_check (mb, CEE_BNE_UN); + + if (mono_marshal_supports_fast_xdomain (method)) { + mono_mb_emit_ldarg (mb, 0); + pos_rem = mono_mb_emit_xdomain_check (mb, CEE_BEQ); + + /* wrapper for cross app domain calls */ + native = mono_marshal_get_xappdomain_invoke (method); + mono_mb_emit_managed_call (mb, native, mono_method_signature (native)); + mono_mb_emit_byte (mb, CEE_RET); + + mono_mb_patch_branch (mb, pos_rem); + } + /* wrapper for normal remote calls */ + native = mono_marshal_get_remoting_invoke (method); + mono_mb_emit_managed_call (mb, native, mono_method_signature (native)); + mono_mb_emit_byte (mb, CEE_RET); + + /* not a proxy */ + mono_mb_patch_branch (mb, pos); + mono_mb_emit_managed_call (mb, method, mono_method_signature (method)); + mono_mb_emit_byte (mb, CEE_RET); +#endif + + res = mono_remoting_mb_create_and_cache (method, mb, sig, sig->param_count + 16); + mono_mb_free (mb); + + return res; +} + +/* + * mono_marshal_get_ldfld_remote_wrapper: + * @klass: The return type + * + * This method generates a wrapper for calling mono_load_remote_field_new. + * The return type is ignored for now, as mono_load_remote_field_new () always + * returns an object. In the future, to optimize some codepaths, we might + * call a different function that takes a pointer to a valuetype, instead. + */ +MonoMethod * +mono_marshal_get_ldfld_remote_wrapper (MonoClass *klass) +{ + MonoMethodSignature *sig, *csig; + MonoMethodBuilder *mb; + MonoMethod *res; + static MonoMethod* cached = NULL; + + mono_marshal_lock_internal (); + if (cached) { + mono_marshal_unlock_internal (); + return cached; + } + mono_marshal_unlock_internal (); + + mb = mono_mb_new_no_dup_name (mono_defaults.object_class, "__mono_load_remote_field_new_wrapper", MONO_WRAPPER_LDFLD_REMOTE); + + mb->method->save_lmf = 1; + + sig = mono_metadata_signature_alloc (mono_defaults.corlib, 3); + sig->params [0] = &mono_defaults.object_class->byval_arg; + sig->params [1] = &mono_defaults.int_class->byval_arg; + sig->params [2] = &mono_defaults.int_class->byval_arg; + sig->ret = &mono_defaults.object_class->byval_arg; + +#ifndef DISABLE_JIT + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_ldarg (mb, 1); + mono_mb_emit_ldarg (mb, 2); + + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 3); + csig->params [0] = &mono_defaults.object_class->byval_arg; + csig->params [1] = &mono_defaults.int_class->byval_arg; + csig->params [2] = &mono_defaults.int_class->byval_arg; + csig->ret = &mono_defaults.object_class->byval_arg; + csig->pinvoke = 1; + + mono_mb_emit_native_call (mb, csig, mono_load_remote_field_new); + mono_marshal_emit_thread_interrupt_checkpoint (mb); + + mono_mb_emit_byte (mb, CEE_RET); +#endif + + mono_marshal_lock_internal (); + res = cached; + mono_marshal_unlock_internal (); + if (!res) { + MonoMethod *newm; + newm = mono_mb_create (mb, sig, 4, NULL); + mono_marshal_lock_internal (); + res = cached; + if (!res) { + res = newm; + cached = res; + mono_marshal_unlock_internal (); + } else { + mono_marshal_unlock_internal (); + mono_free_method (newm); + } + } + mono_mb_free (mb); + + return res; +} + +/* + * mono_marshal_get_ldfld_wrapper: + * @type: the type of the field + * + * This method generates a function which can be use to load a field with type + * @type from an object. The generated function has the following signature: + * <@type> ldfld_wrapper (MonoObject *this, MonoClass *class, MonoClassField *field, int offset) + */ +MonoMethod * +mono_marshal_get_ldfld_wrapper (MonoType *type) +{ + MonoMethodSignature *sig; + MonoMethodBuilder *mb; + MonoMethod *res; + MonoClass *klass; + GHashTable *cache; + WrapperInfo *info; + char *name; + int t, pos0, pos1 = 0; + + type = mono_type_get_underlying_type (type); + + t = type->type; + + if (!type->byref) { + if (type->type == MONO_TYPE_SZARRAY) { + klass = mono_defaults.array_class; + } else if (type->type == MONO_TYPE_VALUETYPE) { + klass = type->data.klass; + } else if (t == MONO_TYPE_OBJECT || t == MONO_TYPE_CLASS || t == MONO_TYPE_STRING) { + klass = mono_defaults.object_class; + } else if (t == MONO_TYPE_PTR || t == MONO_TYPE_FNPTR) { + klass = mono_defaults.int_class; + } else if (t == MONO_TYPE_GENERICINST) { + if (mono_type_generic_inst_is_valuetype (type)) + klass = mono_class_from_mono_type (type); + else + klass = mono_defaults.object_class; + } else { + klass = mono_class_from_mono_type (type); + } + } else { + klass = mono_defaults.int_class; + } + + cache = get_cache (&klass->image->ldfld_wrapper_cache, mono_aligned_addr_hash, NULL); + if ((res = mono_marshal_find_in_cache (cache, klass))) + return res; + + /* we add the %p pointer value of klass because class names are not unique */ + name = g_strdup_printf ("__ldfld_wrapper_%p_%s.%s", klass, klass->name_space, klass->name); + mb = mono_mb_new (mono_defaults.object_class, name, MONO_WRAPPER_LDFLD); + g_free (name); + + sig = mono_metadata_signature_alloc (mono_defaults.corlib, 4); + sig->params [0] = &mono_defaults.object_class->byval_arg; + sig->params [1] = &mono_defaults.int_class->byval_arg; + sig->params [2] = &mono_defaults.int_class->byval_arg; + sig->params [3] = &mono_defaults.int_class->byval_arg; + sig->ret = &klass->byval_arg; + +#ifndef DISABLE_JIT + mono_mb_emit_ldarg (mb, 0); + pos0 = mono_mb_emit_proxy_check (mb, CEE_BNE_UN); + + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_ldarg (mb, 1); + mono_mb_emit_ldarg (mb, 2); + + mono_mb_emit_managed_call (mb, mono_marshal_get_ldfld_remote_wrapper (klass), NULL); + + /* + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 3); + csig->params [0] = &mono_defaults.object_class->byval_arg; + csig->params [1] = &mono_defaults.int_class->byval_arg; + csig->params [2] = &mono_defaults.int_class->byval_arg; + csig->ret = &klass->this_arg; + csig->pinvoke = 1; + + mono_mb_emit_native_call (mb, csig, mono_load_remote_field_new); + mono_marshal_emit_thread_interrupt_checkpoint (mb); + */ + + if (klass->valuetype) { + mono_mb_emit_op (mb, CEE_UNBOX, klass); + pos1 = mono_mb_emit_branch (mb, CEE_BR); + } else { + mono_mb_emit_byte (mb, CEE_RET); + } + + mono_mb_patch_branch (mb, pos0); + + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); + mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); + mono_mb_emit_ldarg (mb, 3); + mono_mb_emit_byte (mb, CEE_ADD); + + if (klass->valuetype) + mono_mb_patch_branch (mb, pos1); + + switch (t) { + case MONO_TYPE_I1: + case MONO_TYPE_U1: + case MONO_TYPE_BOOLEAN: + case MONO_TYPE_CHAR: + case MONO_TYPE_I2: + case MONO_TYPE_U2: + case MONO_TYPE_I4: + case MONO_TYPE_U4: + case MONO_TYPE_I8: + case MONO_TYPE_U8: + case MONO_TYPE_R4: + case MONO_TYPE_R8: + case MONO_TYPE_ARRAY: + case MONO_TYPE_SZARRAY: + case MONO_TYPE_OBJECT: + case MONO_TYPE_CLASS: + case MONO_TYPE_STRING: + case MONO_TYPE_I: + case MONO_TYPE_U: + case MONO_TYPE_PTR: + case MONO_TYPE_FNPTR: + mono_mb_emit_byte (mb, mono_type_to_ldind (type)); + break; + case MONO_TYPE_VALUETYPE: + g_assert (!klass->enumtype); + mono_mb_emit_op (mb, CEE_LDOBJ, klass); + break; + case MONO_TYPE_GENERICINST: + if (mono_type_generic_inst_is_valuetype (type)) { + mono_mb_emit_op (mb, CEE_LDOBJ, klass); + } else { + mono_mb_emit_byte (mb, CEE_LDIND_REF); + } + break; + case MONO_TYPE_VAR: + case MONO_TYPE_MVAR: + mono_mb_emit_op (mb, CEE_LDOBJ, klass); + break; + default: + g_warning ("type %x not implemented", type->type); + g_assert_not_reached (); + } + + mono_mb_emit_byte (mb, CEE_RET); +#endif /* DISABLE_JIT */ + + info = mono_wrapper_info_create (mb, WRAPPER_SUBTYPE_NONE); + info->d.proxy.klass = klass; + res = mono_mb_create_and_cache_full (cache, klass, + mb, sig, sig->param_count + 16, info, NULL); + mono_mb_free (mb); + + return res; +} + +/* + * mono_marshal_get_ldflda_wrapper: + * @type: the type of the field + * + * This method generates a function which can be used to load a field address + * from an object. The generated function has the following signature: + * gpointer ldflda_wrapper (MonoObject *this, MonoClass *class, MonoClassField *field, int offset); + */ +MonoMethod * +mono_marshal_get_ldflda_wrapper (MonoType *type) +{ + MonoMethodSignature *sig; + MonoMethodBuilder *mb; + MonoMethod *res; + MonoClass *klass; + GHashTable *cache; + WrapperInfo *info; + char *name; + int t, pos0, pos1, pos2, pos3; + + type = mono_type_get_underlying_type (type); + t = type->type; + + if (!type->byref) { + if (type->type == MONO_TYPE_SZARRAY) { + klass = mono_defaults.array_class; + } else if (type->type == MONO_TYPE_VALUETYPE) { + klass = type->data.klass; + } else if (t == MONO_TYPE_OBJECT || t == MONO_TYPE_CLASS || t == MONO_TYPE_STRING || + t == MONO_TYPE_CLASS) { + klass = mono_defaults.object_class; + } else if (t == MONO_TYPE_PTR || t == MONO_TYPE_FNPTR) { + klass = mono_defaults.int_class; + } else if (t == MONO_TYPE_GENERICINST) { + if (mono_type_generic_inst_is_valuetype (type)) + klass = mono_class_from_mono_type (type); + else + klass = mono_defaults.object_class; + } else { + klass = mono_class_from_mono_type (type); + } + } else { + klass = mono_defaults.int_class; + } + + cache = get_cache (&klass->image->ldflda_wrapper_cache, mono_aligned_addr_hash, NULL); + if ((res = mono_marshal_find_in_cache (cache, klass))) + return res; + + /* we add the %p pointer value of klass because class names are not unique */ + name = g_strdup_printf ("__ldflda_wrapper_%p_%s.%s", klass, klass->name_space, klass->name); + mb = mono_mb_new (mono_defaults.object_class, name, MONO_WRAPPER_LDFLDA); + g_free (name); + + sig = mono_metadata_signature_alloc (mono_defaults.corlib, 4); + sig->params [0] = &mono_defaults.object_class->byval_arg; + sig->params [1] = &mono_defaults.int_class->byval_arg; + sig->params [2] = &mono_defaults.int_class->byval_arg; + sig->params [3] = &mono_defaults.int_class->byval_arg; + sig->ret = &mono_defaults.int_class->byval_arg; + +#ifndef DISABLE_JIT + /* if typeof (this) != transparent_proxy goto pos0 */ + mono_mb_emit_ldarg (mb, 0); + pos0 = mono_mb_emit_proxy_check (mb, CEE_BNE_UN); + + /* if same_appdomain goto pos1 */ + mono_mb_emit_ldarg (mb, 0); + pos1 = mono_mb_emit_xdomain_check (mb, CEE_BEQ); + + mono_mb_emit_exception_full (mb, "System", "InvalidOperationException", "Attempt to load field address from object in another appdomain."); + + /* same app domain */ + mono_mb_patch_branch (mb, pos1); + + /* if typeof (this) != contextbound goto pos2 */ + mono_mb_emit_ldarg (mb, 0); + pos2 = mono_mb_emit_contextbound_check (mb, CEE_BEQ); + + /* if this->rp->context == mono_context_get goto pos3 */ + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp)); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, context)); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_mb_emit_icall (mb, mono_context_get); + pos3 = mono_mb_emit_branch (mb, CEE_BEQ); + + mono_mb_emit_exception_full (mb, "System", "InvalidOperationException", "Attempt to load field address from object in another context."); + + mono_mb_patch_branch (mb, pos2); + mono_mb_patch_branch (mb, pos3); + + /* return the address of the field from this->rp->unwrapped_server */ + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp)); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, unwrapped_server)); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); + mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); + mono_mb_emit_ldarg (mb, 3); + mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_byte (mb, CEE_RET); + + /* not a proxy: return the address of the field directly */ + mono_mb_patch_branch (mb, pos0); + + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); + mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); + mono_mb_emit_ldarg (mb, 3); + mono_mb_emit_byte (mb, CEE_ADD); + + mono_mb_emit_byte (mb, CEE_RET); +#endif + + info = mono_wrapper_info_create (mb, WRAPPER_SUBTYPE_NONE); + info->d.proxy.klass = klass; + res = mono_mb_create_and_cache_full (cache, klass, + mb, sig, sig->param_count + 16, + info, NULL); + mono_mb_free (mb); + + return res; +} + +/* + * mono_marshal_get_stfld_remote_wrapper: + * klass: The type of the field + * + * This function generates a wrapper for calling mono_store_remote_field_new + * with the appropriate signature. + * Similarly to mono_marshal_get_ldfld_remote_wrapper () this doesn't depend on the + * klass argument anymore. + */ +MonoMethod * +mono_marshal_get_stfld_remote_wrapper (MonoClass *klass) +{ + MonoMethodSignature *sig, *csig; + MonoMethodBuilder *mb; + MonoMethod *res; + static MonoMethod *cached = NULL; + + mono_marshal_lock_internal (); + if (cached) { + mono_marshal_unlock_internal (); + return cached; + } + mono_marshal_unlock_internal (); + + mb = mono_mb_new_no_dup_name (mono_defaults.object_class, "__mono_store_remote_field_new_wrapper", MONO_WRAPPER_STFLD_REMOTE); + + mb->method->save_lmf = 1; + + sig = mono_metadata_signature_alloc (mono_defaults.corlib, 4); + sig->params [0] = &mono_defaults.object_class->byval_arg; + sig->params [1] = &mono_defaults.int_class->byval_arg; + sig->params [2] = &mono_defaults.int_class->byval_arg; + sig->params [3] = &mono_defaults.object_class->byval_arg; + sig->ret = &mono_defaults.void_class->byval_arg; + +#ifndef DISABLE_JIT + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_ldarg (mb, 1); + mono_mb_emit_ldarg (mb, 2); + mono_mb_emit_ldarg (mb, 3); + + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 4); + csig->params [0] = &mono_defaults.object_class->byval_arg; + csig->params [1] = &mono_defaults.int_class->byval_arg; + csig->params [2] = &mono_defaults.int_class->byval_arg; + csig->params [3] = &mono_defaults.object_class->byval_arg; + csig->ret = &mono_defaults.void_class->byval_arg; + csig->pinvoke = 1; + + mono_mb_emit_native_call (mb, csig, mono_store_remote_field_new); + mono_marshal_emit_thread_interrupt_checkpoint (mb); + + mono_mb_emit_byte (mb, CEE_RET); +#endif + + mono_marshal_lock_internal (); + res = cached; + mono_marshal_unlock_internal (); + if (!res) { + MonoMethod *newm; + newm = mono_mb_create (mb, sig, 6, NULL); + mono_marshal_lock_internal (); + res = cached; + if (!res) { + res = newm; + cached = res; + mono_marshal_unlock_internal (); + } else { + mono_marshal_unlock_internal (); + mono_free_method (newm); + } + } + mono_mb_free (mb); + + return res; +} + +/* + * mono_marshal_get_stfld_wrapper: + * @type: the type of the field + * + * This method generates a function which can be use to store a field with type + * @type. The generated function has the following signature: + * void stfld_wrapper (MonoObject *this, MonoClass *class, MonoClassField *field, int offset, <@type> val) + */ +MonoMethod * +mono_marshal_get_stfld_wrapper (MonoType *type) +{ + MonoMethodSignature *sig; + MonoMethodBuilder *mb; + MonoMethod *res; + MonoClass *klass; + GHashTable *cache; + WrapperInfo *info; + char *name; + int t, pos; + + type = mono_type_get_underlying_type (type); + t = type->type; + + if (!type->byref) { + if (type->type == MONO_TYPE_SZARRAY) { + klass = mono_defaults.array_class; + } else if (type->type == MONO_TYPE_VALUETYPE) { + klass = type->data.klass; + } else if (t == MONO_TYPE_OBJECT || t == MONO_TYPE_CLASS || t == MONO_TYPE_STRING) { + klass = mono_defaults.object_class; + } else if (t == MONO_TYPE_PTR || t == MONO_TYPE_FNPTR) { + klass = mono_defaults.int_class; + } else if (t == MONO_TYPE_GENERICINST) { + if (mono_type_generic_inst_is_valuetype (type)) + klass = mono_class_from_mono_type (type); + else + klass = mono_defaults.object_class; + } else { + klass = mono_class_from_mono_type (type); + } + } else { + klass = mono_defaults.int_class; + } + + cache = get_cache (&klass->image->stfld_wrapper_cache, mono_aligned_addr_hash, NULL); + if ((res = mono_marshal_find_in_cache (cache, klass))) + return res; + + /* we add the %p pointer value of klass because class names are not unique */ + name = g_strdup_printf ("__stfld_wrapper_%p_%s.%s", klass, klass->name_space, klass->name); + mb = mono_mb_new (mono_defaults.object_class, name, MONO_WRAPPER_STFLD); + g_free (name); + + sig = mono_metadata_signature_alloc (mono_defaults.corlib, 5); + sig->params [0] = &mono_defaults.object_class->byval_arg; + sig->params [1] = &mono_defaults.int_class->byval_arg; + sig->params [2] = &mono_defaults.int_class->byval_arg; + sig->params [3] = &mono_defaults.int_class->byval_arg; + sig->params [4] = &klass->byval_arg; + sig->ret = &mono_defaults.void_class->byval_arg; + +#ifndef DISABLE_JIT + mono_mb_emit_ldarg (mb, 0); + pos = mono_mb_emit_proxy_check (mb, CEE_BNE_UN); + + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_ldarg (mb, 1); + mono_mb_emit_ldarg (mb, 2); + mono_mb_emit_ldarg (mb, 4); + if (klass->valuetype) + mono_mb_emit_op (mb, CEE_BOX, klass); + + mono_mb_emit_managed_call (mb, mono_marshal_get_stfld_remote_wrapper (klass), NULL); + + mono_mb_emit_byte (mb, CEE_RET); + + mono_mb_patch_branch (mb, pos); + + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); + mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); + mono_mb_emit_ldarg (mb, 3); + mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_ldarg (mb, 4); + + switch (t) { + case MONO_TYPE_I1: + case MONO_TYPE_U1: + case MONO_TYPE_BOOLEAN: + case MONO_TYPE_CHAR: + case MONO_TYPE_I2: + case MONO_TYPE_U2: + case MONO_TYPE_I4: + case MONO_TYPE_U4: + case MONO_TYPE_I8: + case MONO_TYPE_U8: + case MONO_TYPE_R4: + case MONO_TYPE_R8: + case MONO_TYPE_ARRAY: + case MONO_TYPE_SZARRAY: + case MONO_TYPE_OBJECT: + case MONO_TYPE_CLASS: + case MONO_TYPE_STRING: + case MONO_TYPE_I: + case MONO_TYPE_U: + case MONO_TYPE_PTR: + case MONO_TYPE_FNPTR: + mono_mb_emit_byte (mb, mono_type_to_stind (type)); + break; + case MONO_TYPE_VALUETYPE: + g_assert (!klass->enumtype); + mono_mb_emit_op (mb, CEE_STOBJ, klass); + break; + case MONO_TYPE_GENERICINST: + case MONO_TYPE_VAR: + case MONO_TYPE_MVAR: + mono_mb_emit_op (mb, CEE_STOBJ, klass); + break; + default: + g_warning ("type %x not implemented", type->type); + g_assert_not_reached (); + } + + mono_mb_emit_byte (mb, CEE_RET); +#endif + + info = mono_wrapper_info_create (mb, WRAPPER_SUBTYPE_NONE); + info->d.proxy.klass = klass; + res = mono_mb_create_and_cache_full (cache, klass, + mb, sig, sig->param_count + 16, + info, NULL); + mono_mb_free (mb); + + return res; +} + +MonoMethod * +mono_marshal_get_proxy_cancast (MonoClass *klass) +{ + static MonoMethodSignature *isint_sig = NULL; + GHashTable *cache; + MonoMethod *res; + WrapperInfo *info; + int pos_failed, pos_end; + char *name, *klass_name; + MonoMethod *can_cast_to; + MonoMethodDesc *desc; + MonoMethodBuilder *mb; + + cache = get_cache (&klass->image->proxy_isinst_cache, mono_aligned_addr_hash, NULL); + if ((res = mono_marshal_find_in_cache (cache, klass))) + return res; + + if (!isint_sig) { + isint_sig = mono_metadata_signature_alloc (mono_defaults.corlib, 1); + isint_sig->params [0] = &mono_defaults.object_class->byval_arg; + isint_sig->ret = &mono_defaults.object_class->byval_arg; + isint_sig->pinvoke = 0; + } + + klass_name = mono_type_full_name (&klass->byval_arg); + name = g_strdup_printf ("__proxy_isinst_wrapper_%s", klass_name); + mb = mono_mb_new (mono_defaults.object_class, name, MONO_WRAPPER_PROXY_ISINST); + g_free (klass_name); + g_free (name); + + mb->method->save_lmf = 1; + +#ifndef DISABLE_JIT + /* get the real proxy from the transparent proxy*/ + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp)); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + + /* get the reflection type from the type handle */ + mono_mb_emit_ptr (mb, &klass->byval_arg); + mono_mb_emit_icall (mb, type_from_handle); + + mono_mb_emit_ldarg (mb, 0); + + /* make the call to CanCastTo (type, ob) */ + desc = mono_method_desc_new ("IRemotingTypeInfo:CanCastTo", FALSE); + can_cast_to = mono_method_desc_search_in_class (desc, mono_defaults.iremotingtypeinfo_class); + g_assert (can_cast_to); + mono_method_desc_free (desc); + mono_mb_emit_op (mb, CEE_CALLVIRT, can_cast_to); + + pos_failed = mono_mb_emit_branch (mb, CEE_BRFALSE); + + /* Upgrade the proxy vtable by calling: mono_upgrade_remote_class_wrapper (type, ob)*/ + mono_mb_emit_ptr (mb, &klass->byval_arg); + mono_mb_emit_icall (mb, type_from_handle); + mono_mb_emit_ldarg (mb, 0); + + mono_mb_emit_icall (mb, mono_upgrade_remote_class_wrapper); + mono_marshal_emit_thread_interrupt_checkpoint (mb); + + mono_mb_emit_ldarg (mb, 0); + pos_end = mono_mb_emit_branch (mb, CEE_BR); + + /* fail */ + + mono_mb_patch_branch (mb, pos_failed); + mono_mb_emit_byte (mb, CEE_LDNULL); + + /* the end */ + + mono_mb_patch_branch (mb, pos_end); + mono_mb_emit_byte (mb, CEE_RET); +#endif + + info = mono_wrapper_info_create (mb, WRAPPER_SUBTYPE_NONE); + info->d.proxy.klass = klass; + res = mono_mb_create_and_cache_full (cache, klass, mb, isint_sig, isint_sig->param_count + 16, info, NULL); + mono_mb_free (mb); + + return res; +} + +void +mono_upgrade_remote_class_wrapper (MonoReflectionType *rtype, MonoTransparentProxy *tproxy) +{ + MonoClass *klass; + MonoDomain *domain = ((MonoObject*)tproxy)->vtable->domain; + klass = mono_class_from_mono_type (rtype->type); + mono_upgrade_remote_class (domain, (MonoObject*)tproxy, klass); +} + +#else /* DISABLE_REMOTING */ + +void +mono_remoting_init (void) +{ +} + +#endif /* DISABLE_REMOTING */ + +/* mono_get_xdomain_marshal_type() + * Returns the kind of marshalling that a type needs for cross domain calls. + */ +static MonoXDomainMarshalType +mono_get_xdomain_marshal_type (MonoType *t) +{ + switch (t->type) { + case MONO_TYPE_VOID: + g_assert_not_reached (); + break; + case MONO_TYPE_U1: + case MONO_TYPE_I1: + case MONO_TYPE_BOOLEAN: + case MONO_TYPE_U2: + case MONO_TYPE_I2: + case MONO_TYPE_CHAR: + case MONO_TYPE_U4: + case MONO_TYPE_I4: + case MONO_TYPE_I8: + case MONO_TYPE_U8: + case MONO_TYPE_R4: + case MONO_TYPE_R8: + return MONO_MARSHAL_NONE; + case MONO_TYPE_STRING: + return MONO_MARSHAL_COPY; + case MONO_TYPE_ARRAY: + case MONO_TYPE_SZARRAY: { + MonoClass *elem_class = mono_class_from_mono_type (t)->element_class; + if (mono_get_xdomain_marshal_type (&(elem_class->byval_arg)) != MONO_MARSHAL_SERIALIZE) + return MONO_MARSHAL_COPY; + break; + } + } + + return MONO_MARSHAL_SERIALIZE; +} + +/* mono_marshal_xdomain_copy_value + * Makes a copy of "val" suitable for the current domain. + */ +MonoObject * +mono_marshal_xdomain_copy_value (MonoObject *val) +{ + MonoDomain *domain; + if (val == NULL) return NULL; + + domain = mono_domain_get (); + + switch (mono_object_class (val)->byval_arg.type) { + case MONO_TYPE_VOID: + g_assert_not_reached (); + break; + case MONO_TYPE_U1: + case MONO_TYPE_I1: + case MONO_TYPE_BOOLEAN: + case MONO_TYPE_U2: + case MONO_TYPE_I2: + case MONO_TYPE_CHAR: + case MONO_TYPE_U4: + case MONO_TYPE_I4: + case MONO_TYPE_I8: + case MONO_TYPE_U8: + case MONO_TYPE_R4: + case MONO_TYPE_R8: { + return mono_value_box (domain, mono_object_class (val), ((char*)val) + sizeof(MonoObject)); + } + case MONO_TYPE_STRING: { + MonoString *str = (MonoString *) val; + return (MonoObject *) mono_string_new_utf16 (domain, mono_string_chars (str), mono_string_length (str)); + } + case MONO_TYPE_ARRAY: + case MONO_TYPE_SZARRAY: { + MonoArray *acopy; + MonoXDomainMarshalType mt = mono_get_xdomain_marshal_type (&(mono_object_class (val)->element_class->byval_arg)); + if (mt == MONO_MARSHAL_SERIALIZE) return NULL; + acopy = mono_array_clone_in_domain (domain, (MonoArray *) val); + if (mt == MONO_MARSHAL_COPY) { + int i, len = mono_array_length (acopy); + for (i = 0; i < len; i++) { + MonoObject *item = mono_array_get (acopy, gpointer, i); + mono_array_setref (acopy, i, mono_marshal_xdomain_copy_value (item)); + } + } + return (MonoObject *) acopy; + } + } + + if (mono_object_class (val) == mono_defaults.stringbuilder_class) { + MonoStringBuilder *oldsb = (MonoStringBuilder *) val; + MonoStringBuilder *newsb = (MonoStringBuilder *) mono_object_new (domain, mono_defaults.stringbuilder_class); + MONO_OBJECT_SETREF (newsb, str, mono_string_new_utf16 (domain, mono_string_chars (oldsb->str), mono_string_length (oldsb->str))); + newsb->length = oldsb->length; + newsb->max_capacity = (gint32)0x7fffffff; + return (MonoObject *) newsb; + } + return NULL; +} diff --git a/mta-mono/vendor/mono/metadata/remoting.h b/mta-mono/vendor/mono/metadata/remoting.h new file mode 100644 index 0000000..24f4c80 --- /dev/null +++ b/mta-mono/vendor/mono/metadata/remoting.h @@ -0,0 +1,52 @@ +/* + * remoting.h: Remoting support + * + * (C) 2014 Xamarin, Inc. http://www.xamarin.com + * + */ + +#ifndef __MONO_REMOTING_H__ +#define __MONO_REMOTING_H__ + +#include "config.h" +#include +#include +#include + +void mono_remoting_init (void) MONO_INTERNAL; + +#ifndef DISABLE_REMOTING + +MonoMethod * +mono_marshal_get_remoting_invoke (MonoMethod *method) MONO_INTERNAL; + +MonoMethod * +mono_marshal_get_xappdomain_invoke (MonoMethod *method) MONO_INTERNAL; + +MonoMethod * +mono_marshal_get_remoting_invoke_for_target (MonoMethod *method, MonoRemotingTarget target_type) MONO_INTERNAL; + +MonoMethod * +mono_marshal_get_remoting_invoke_with_check (MonoMethod *method) MONO_INTERNAL; + +MonoMethod * +mono_marshal_get_stfld_wrapper (MonoType *type) MONO_INTERNAL; + +MonoMethod * +mono_marshal_get_ldfld_wrapper (MonoType *type) MONO_INTERNAL; + +MonoMethod * +mono_marshal_get_ldflda_wrapper (MonoType *type) MONO_INTERNAL; + +MonoMethod * +mono_marshal_get_ldfld_remote_wrapper (MonoClass *klass) MONO_INTERNAL; + +MonoMethod * +mono_marshal_get_stfld_remote_wrapper (MonoClass *klass) MONO_INTERNAL; + +MonoMethod * +mono_marshal_get_proxy_cancast (MonoClass *klass) MONO_INTERNAL; + +#endif + +#endif diff --git a/mta-mono/vendor/mono/metadata/runtime.c b/mta-mono/vendor/mono/metadata/runtime.c index 7b14f43..2b8118f 100644 --- a/mta-mono/vendor/mono/metadata/runtime.c +++ b/mta-mono/vendor/mono/metadata/runtime.c @@ -119,8 +119,6 @@ mono_runtime_try_shutdown (void) gboolean mono_runtime_is_critical_method (MonoMethod *method) { - if (mono_monitor_is_il_fastpath_wrapper (method)) - return TRUE; return FALSE; } diff --git a/mta-mono/vendor/mono/metadata/sgen-alloc.c b/mta-mono/vendor/mono/metadata/sgen-alloc.c index 80fc825..45b756c 100644 --- a/mta-mono/vendor/mono/metadata/sgen-alloc.c +++ b/mta-mono/vendor/mono/metadata/sgen-alloc.c @@ -51,7 +51,6 @@ #define ALIGN_UP SGEN_ALIGN_UP #define ALLOC_ALIGN SGEN_ALLOC_ALIGN -#define ALLOC_ALIGN_BITS SGEN_ALLOC_ALIGN_BITS #define MAX_SMALL_OBJ_SIZE SGEN_MAX_SMALL_OBJ_SIZE #define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1)) @@ -68,9 +67,9 @@ enum { static gboolean use_managed_allocator = TRUE; #ifdef HEAVY_STATISTICS -static long long stat_objects_alloced = 0; -static long long stat_bytes_alloced = 0; -static long long stat_bytes_alloced_los = 0; +static guint64 stat_objects_alloced = 0; +static guint64 stat_bytes_alloced = 0; +static guint64 stat_bytes_alloced_los = 0; #endif @@ -94,7 +93,7 @@ static __thread char *tlab_next; static __thread char *tlab_temp_end; static __thread char *tlab_real_end; /* Used by the managed allocator/wbarrier */ -static __thread char **tlab_next_addr; +static __thread char **tlab_next_addr MONO_ATTR_USED; #endif #ifdef HAVE_KW_THREAD @@ -188,8 +187,8 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size) /* FIXME: handle OOM */ void **p; char *new_next; - TLAB_ACCESS_INIT; size_t real_size = size; + TLAB_ACCESS_INIT; CANARIFY_SIZE(size); @@ -291,20 +290,31 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size) available_in_tlab = (int)(TLAB_REAL_END - TLAB_NEXT);//We'll never have tlabs > 2Gb if (size > tlab_size || available_in_tlab > SGEN_MAX_NURSERY_WASTE) { /* Allocate directly from the nursery */ - do { - p = sgen_nursery_alloc (size); - if (!p) { - sgen_ensure_free_space (real_size); - if (degraded_mode) - return alloc_degraded (vtable, size, FALSE); - else - p = sgen_nursery_alloc (size); - } - } while (!p); + p = sgen_nursery_alloc (size); if (!p) { - // no space left - g_assert (0); + /* + * We couldn't allocate from the nursery, so we try + * collecting. Even after the collection, we might + * still not have enough memory to allocate the + * object. The reason will most likely be that we've + * run out of memory, but there is the theoretical + * possibility that other threads might have consumed + * the freed up memory ahead of us. + * + * What we do in this case is allocate degraded, i.e., + * from the major heap. + * + * Ideally we'd like to detect the case of other + * threads allocating ahead of us and loop (if we + * always loop we will loop endlessly in the case of + * OOM). + */ + sgen_ensure_free_space (real_size); + if (!degraded_mode) + p = sgen_nursery_alloc (size); } + if (!p) + return alloc_degraded (vtable, size, FALSE); zero_tlab_if_necessary (p, size); } else { @@ -313,21 +323,15 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size) SGEN_LOG (3, "Retire TLAB: %p-%p [%ld]", TLAB_START, TLAB_REAL_END, (long)(TLAB_REAL_END - TLAB_NEXT - size)); sgen_nursery_retire_region (p, available_in_tlab); - do { - p = sgen_nursery_alloc_range (tlab_size, size, &alloc_size); - if (!p) { - sgen_ensure_free_space (tlab_size); - if (degraded_mode) - return alloc_degraded (vtable, size, FALSE); - else - p = sgen_nursery_alloc_range (tlab_size, size, &alloc_size); - } - } while (!p); - + p = sgen_nursery_alloc_range (tlab_size, size, &alloc_size); if (!p) { - // no space left - g_assert (0); + /* See comment above in similar case. */ + sgen_ensure_free_space (tlab_size); + if (!degraded_mode) + p = sgen_nursery_alloc_range (tlab_size, size, &alloc_size); } + if (!p) + return alloc_degraded (vtable, size, FALSE); /* Allocate a new TLAB from the current nursery fragment */ TLAB_START = (char*)p; @@ -374,8 +378,8 @@ mono_gc_try_alloc_obj_nolock (MonoVTable *vtable, size_t size) { void **p; char *new_next; - TLAB_ACCESS_INIT; size_t real_size = size; + TLAB_ACCESS_INIT; CANARIFY_SIZE(size); @@ -520,7 +524,7 @@ mono_gc_alloc_vector (MonoVTable *vtable, size_t size, uintptr_t max_length) /*This doesn't require fencing since EXIT_CRITICAL_REGION already does it for us*/ arr->max_length = (mono_array_size_t)max_length; EXIT_CRITICAL_REGION; - return arr; + goto done; } EXIT_CRITICAL_REGION; #endif @@ -535,8 +539,11 @@ mono_gc_alloc_vector (MonoVTable *vtable, size_t size, uintptr_t max_length) arr->max_length = (mono_array_size_t)max_length; + UNLOCK_GC; + done: + SGEN_ASSERT (6, SGEN_ALIGN_UP (size) == SGEN_ALIGN_UP (sgen_par_object_get_size (vtable, (MonoObject*)arr)), "Vector has incorrect size."); return arr; } @@ -560,7 +567,7 @@ mono_gc_alloc_array (MonoVTable *vtable, size_t size, uintptr_t max_length, uint bounds = (MonoArrayBounds*)((char*)arr + size - bounds_size); arr->bounds = bounds; EXIT_CRITICAL_REGION; - return arr; + goto done; } EXIT_CRITICAL_REGION; #endif @@ -580,6 +587,8 @@ mono_gc_alloc_array (MonoVTable *vtable, size_t size, uintptr_t max_length, uint UNLOCK_GC; + done: + SGEN_ASSERT (6, SGEN_ALIGN_UP (size) == SGEN_ALIGN_UP (sgen_par_object_get_size (vtable, (MonoObject*)arr)), "Array has incorrect size."); return arr; } @@ -774,7 +783,7 @@ create_allocator (int atype) } if (atype == ATYPE_SMALL) { - num_params = 1; + num_params = 2; name = "AllocSmall"; } else if (atype == ATYPE_NORMAL) { num_params = 1; @@ -804,7 +813,11 @@ create_allocator (int atype) #ifndef DISABLE_JIT size_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); - if (atype == ATYPE_NORMAL || atype == ATYPE_SMALL) { + if (atype == ATYPE_SMALL) { + /* size_var = size_arg */ + mono_mb_emit_ldarg (mb, 1); + mono_mb_emit_stloc (mb, size_var); + } else if (atype == ATYPE_NORMAL) { /* size = vtable->klass->instance_size; */ mono_mb_emit_ldarg (mb, 0); mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoVTable, klass)); @@ -896,7 +909,7 @@ create_allocator (int atype) /* * a string allocator method takes the args: (vtable, len) * - * bytes = sizeof (MonoString) + ((len + 1) * 2) + * bytes = offsetof (MonoString, chars) + ((len + 1) * 2) * * condition: * @@ -904,11 +917,11 @@ create_allocator (int atype) * * therefore: * - * sizeof (MonoString) + ((len + 1) * 2) <= INT32_MAX - (SGEN_ALLOC_ALIGN - 1) - * len <= (INT32_MAX - (SGEN_ALLOC_ALIGN - 1) - sizeof (MonoString)) / 2 - 1 + * offsetof (MonoString, chars) + ((len + 1) * 2) <= INT32_MAX - (SGEN_ALLOC_ALIGN - 1) + * len <= (INT32_MAX - (SGEN_ALLOC_ALIGN - 1) - offsetof (MonoString, chars)) / 2 - 1 */ mono_mb_emit_ldarg (mb, 1); - mono_mb_emit_icon (mb, (INT32_MAX - (SGEN_ALLOC_ALIGN - 1) - sizeof (MonoString)) / 2 - 1); + mono_mb_emit_icon (mb, (INT32_MAX - (SGEN_ALLOC_ALIGN - 1) - MONO_STRUCT_OFFSET (MonoString, chars)) / 2 - 1); pos = mono_mb_emit_short_branch (mb, MONO_CEE_BLE_UN_S); mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); @@ -920,21 +933,23 @@ create_allocator (int atype) mono_mb_emit_icon (mb, 1); mono_mb_emit_byte (mb, MONO_CEE_SHL); //WE manually fold the above + 2 here - mono_mb_emit_icon (mb, sizeof (MonoString) + 2); + mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoString, chars) + 2); mono_mb_emit_byte (mb, CEE_ADD); mono_mb_emit_stloc (mb, size_var); } else { g_assert_not_reached (); } - /* size += ALLOC_ALIGN - 1; */ - mono_mb_emit_ldloc (mb, size_var); - mono_mb_emit_icon (mb, ALLOC_ALIGN - 1); - mono_mb_emit_byte (mb, CEE_ADD); - /* size &= ~(ALLOC_ALIGN - 1); */ - mono_mb_emit_icon (mb, ~(ALLOC_ALIGN - 1)); - mono_mb_emit_byte (mb, CEE_AND); - mono_mb_emit_stloc (mb, size_var); + if (atype != ATYPE_SMALL) { + /* size += ALLOC_ALIGN - 1; */ + mono_mb_emit_ldloc (mb, size_var); + mono_mb_emit_icon (mb, ALLOC_ALIGN - 1); + mono_mb_emit_byte (mb, CEE_ADD); + /* size &= ~(ALLOC_ALIGN - 1); */ + mono_mb_emit_icon (mb, ~(ALLOC_ALIGN - 1)); + mono_mb_emit_byte (mb, CEE_AND); + mono_mb_emit_stloc (mb, size_var); + } /* if (size > MAX_SMALL_OBJ_SIZE) goto slowpath */ if (atype != ATYPE_SMALL) { @@ -1006,8 +1021,9 @@ create_allocator (int atype) mono_mb_emit_byte (mb, CEE_STIND_I); /*The tlab store must be visible before the the vtable store. This could be replaced with a DDS but doing it with IL would be tricky. */ - mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); - mono_mb_emit_op (mb, CEE_MONO_MEMORY_BARRIER, (gpointer)StoreStoreBarrier); + mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); + mono_mb_emit_byte (mb, CEE_MONO_MEMORY_BARRIER); + mono_mb_emit_i4 (mb, MONO_MEMORY_BARRIER_REL); /* *p = vtable; */ mono_mb_emit_ldloc (mb, p_var); @@ -1045,8 +1061,9 @@ create_allocator (int atype) /* We must make sure both vtable and max_length are globaly visible before returning to managed land. */ - mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); - mono_mb_emit_op (mb, CEE_MONO_MEMORY_BARRIER, (gpointer)StoreStoreBarrier); + mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); + mono_mb_emit_byte (mb, CEE_MONO_MEMORY_BARRIER); + mono_mb_emit_i4 (mb, MONO_MEMORY_BARRIER_REL); /* return p */ mono_mb_emit_ldloc (mb, p_var); @@ -1066,13 +1083,22 @@ create_allocator (int atype) } #endif +int +mono_gc_get_aligned_size_for_allocator (int size) +{ + int aligned_size = size; + aligned_size += ALLOC_ALIGN - 1; + aligned_size &= ~(ALLOC_ALIGN - 1); + return aligned_size; +} + /* * Generate an allocator method implementing the fast path of mono_gc_alloc_obj (). * The signature of the called method is: * object allocate (MonoVTable *vtable) */ MonoMethod* -mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box) +mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box, gboolean known_instance_size) { #ifdef MANAGED_ALLOCATION @@ -1091,6 +1117,8 @@ mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box) return NULL; if (klass->instance_size > tlab_size) return NULL; + if (known_instance_size && ALIGN_TO (klass->instance_size, ALLOC_ALIGN) >= MAX_SMALL_OBJ_SIZE) + return NULL; if (klass->has_finalize || mono_class_is_marshalbyref (klass) || (mono_profiler_get_events () & MONO_PROFILE_ALLOCATIONS)) return NULL; @@ -1099,7 +1127,7 @@ mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box) if (klass->byval_arg.type == MONO_TYPE_STRING) return mono_gc_get_managed_allocator_by_type (ATYPE_STRING); /* Generic classes have dynamic field and can go above MAX_SMALL_OBJ_SIZE. */ - if (ALIGN_TO (klass->instance_size, ALLOC_ALIGN) < MAX_SMALL_OBJ_SIZE && !mono_class_is_open_constructed_type (&klass->byval_arg)) + if (known_instance_size) return mono_gc_get_managed_allocator_by_type (ATYPE_SMALL); else return mono_gc_get_managed_allocator_by_type (ATYPE_NORMAL); @@ -1209,9 +1237,9 @@ sgen_has_managed_allocator (void) void sgen_alloc_init_heavy_stats (void) { - mono_counters_register ("# objects allocated", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_objects_alloced); - mono_counters_register ("bytes allocated", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_bytes_alloced); - mono_counters_register ("bytes allocated in LOS", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_bytes_alloced_los); + mono_counters_register ("# objects allocated", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_objects_alloced); + mono_counters_register ("bytes allocated", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_bytes_alloced); + mono_counters_register ("bytes allocated in LOS", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_bytes_alloced_los); } #endif diff --git a/mta-mono/vendor/mono/metadata/sgen-archdep.h b/mta-mono/vendor/mono/metadata/sgen-archdep.h index 420dc96..410ba6a 100644 --- a/mta-mono/vendor/mono/metadata/sgen-archdep.h +++ b/mta-mono/vendor/mono/metadata/sgen-archdep.h @@ -87,6 +87,13 @@ ((a)[__i]) = (gpointer) UCONTEXT_REG_Rn((ctx), __i); \ } while (0) +/* MS_BLOCK_SIZE must be a multiple of the system pagesize, which for some + archs is 64k. */ +#if defined(TARGET_POWERPC64) && _CALL_ELF == 2 +#define ARCH_MIN_MS_BLOCK_SIZE (64*1024) +#define ARCH_MIN_MS_BLOCK_SIZE_SHIFT 16 +#endif + #elif defined(TARGET_ARM) #define REDZONE_SIZE 0 diff --git a/mta-mono/vendor/mono/metadata/sgen-bridge.h b/mta-mono/vendor/mono/metadata/sgen-bridge.h index daa071e..2a658f7 100644 --- a/mta-mono/vendor/mono/metadata/sgen-bridge.h +++ b/mta-mono/vendor/mono/metadata/sgen-bridge.h @@ -61,9 +61,9 @@ typedef struct { void (*cross_references) (int num_sccs, MonoGCBridgeSCC **sccs, int num_xrefs, MonoGCBridgeXRef *xrefs); } MonoGCBridgeCallbacks; -void mono_gc_register_bridge_callbacks (MonoGCBridgeCallbacks *callbacks); +MONO_API void mono_gc_register_bridge_callbacks (MonoGCBridgeCallbacks *callbacks); -void mono_gc_wait_for_bridge_processing (void); +MONO_API void mono_gc_wait_for_bridge_processing (void); MONO_END_DECLS diff --git a/mta-mono/vendor/mono/metadata/sgen-cardtable.c b/mta-mono/vendor/mono/metadata/sgen-cardtable.c index 6dd91e2..f0350a6 100644 --- a/mta-mono/vendor/mono/metadata/sgen-cardtable.c +++ b/mta-mono/vendor/mono/metadata/sgen-cardtable.c @@ -52,23 +52,23 @@ guint8 *sgen_cardtable; static gboolean need_mod_union; #ifdef HEAVY_STATISTICS -long long marked_cards; -long long scanned_cards; -long long scanned_objects; -long long remarked_cards; +guint64 marked_cards; +guint64 scanned_cards; +guint64 scanned_objects; +guint64 remarked_cards; -static long long los_marked_cards; -static long long large_objects; -static long long bloby_objects; -static long long los_array_cards; -static long long los_array_remsets; +static guint64 los_marked_cards; +static guint64 large_objects; +static guint64 bloby_objects; +static guint64 los_array_cards; +static guint64 los_array_remsets; #endif -static long long major_card_scan_time; -static long long los_card_scan_time; +static guint64 major_card_scan_time; +static guint64 los_card_scan_time; -static long long last_major_scan_time; -static long long last_los_scan_time; +static guint64 last_major_scan_time; +static guint64 last_los_scan_time; static void sgen_card_tables_collect_stats (gboolean begin); @@ -113,7 +113,7 @@ sgen_card_table_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr, int for (; dest >= start; --src, --dest) { gpointer value = *src; - *dest = value; + SGEN_UPDATE_REFERENCE_ALLOW_NULL (dest, value); if (need_mod_union || sgen_ptr_in_nursery (value)) sgen_card_table_mark_address ((mword)dest); sgen_dummy_use (value); @@ -122,7 +122,7 @@ sgen_card_table_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr, int gpointer *end = dest + count; for (; dest < end; ++src, ++dest) { gpointer value = *src; - *dest = value; + SGEN_UPDATE_REFERENCE_ALLOW_NULL (dest, value); if (need_mod_union || sgen_ptr_in_nursery (value)) sgen_card_table_mark_address ((mword)dest); sgen_dummy_use (value); @@ -186,10 +186,11 @@ guint8 *sgen_shadow_cardtable; #define SGEN_CARDTABLE_END (sgen_cardtable + CARD_COUNT_IN_BYTES) static gboolean -sgen_card_table_region_begin_scanning (mword start, mword end) +sgen_card_table_region_begin_scanning (mword start, mword size) { + mword end = start + size; /*XXX this can be improved to work on words and have a single loop induction var */ - while (start <= end) { + while (start < end) { if (sgen_card_table_card_begin_scanning (start)) return TRUE; start += CARD_SIZE_IN_BYTES; @@ -753,19 +754,19 @@ sgen_card_table_init (SgenRemeberedSet *remset) #endif #ifdef HEAVY_STATISTICS - mono_counters_register ("marked cards", MONO_COUNTER_GC | MONO_COUNTER_LONG, &marked_cards); - mono_counters_register ("scanned cards", MONO_COUNTER_GC | MONO_COUNTER_LONG, &scanned_cards); - mono_counters_register ("remarked cards", MONO_COUNTER_GC | MONO_COUNTER_LONG, &remarked_cards); + mono_counters_register ("marked cards", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &marked_cards); + mono_counters_register ("scanned cards", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &scanned_cards); + mono_counters_register ("remarked cards", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &remarked_cards); - mono_counters_register ("los marked cards", MONO_COUNTER_GC | MONO_COUNTER_LONG, &los_marked_cards); - mono_counters_register ("los array cards scanned ", MONO_COUNTER_GC | MONO_COUNTER_LONG, &los_array_cards); - mono_counters_register ("los array remsets", MONO_COUNTER_GC | MONO_COUNTER_LONG, &los_array_remsets); - mono_counters_register ("cardtable scanned objects", MONO_COUNTER_GC | MONO_COUNTER_LONG, &scanned_objects); - mono_counters_register ("cardtable large objects", MONO_COUNTER_GC | MONO_COUNTER_LONG, &large_objects); - mono_counters_register ("cardtable bloby objects", MONO_COUNTER_GC | MONO_COUNTER_LONG, &bloby_objects); + mono_counters_register ("los marked cards", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &los_marked_cards); + mono_counters_register ("los array cards scanned ", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &los_array_cards); + mono_counters_register ("los array remsets", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &los_array_remsets); + mono_counters_register ("cardtable scanned objects", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &scanned_objects); + mono_counters_register ("cardtable large objects", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &large_objects); + mono_counters_register ("cardtable bloby objects", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &bloby_objects); #endif - mono_counters_register ("cardtable major scan time", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &major_card_scan_time); - mono_counters_register ("cardtable los scan time", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &los_card_scan_time); + mono_counters_register ("cardtable major scan time", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &major_card_scan_time); + mono_counters_register ("cardtable los scan time", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &los_card_scan_time); remset->wbarrier_set_field = sgen_card_table_wbarrier_set_field; diff --git a/mta-mono/vendor/mono/metadata/sgen-conf.h b/mta-mono/vendor/mono/metadata/sgen-conf.h index babee94..b74830f 100644 --- a/mta-mono/vendor/mono/metadata/sgen-conf.h +++ b/mta-mono/vendor/mono/metadata/sgen-conf.h @@ -28,10 +28,8 @@ #if SIZEOF_VOID_P == 4 typedef guint32 mword; -#define MWORD_MAX_VALUE ((uint32_t) 0xffffffff) #else typedef guint64 mword; -#define MWORD_MAX_VALUE (G_MAXUINT64) #endif @@ -84,6 +82,15 @@ typedef guint64 mword; */ //#define SGEN_CHECK_GRAY_OBJECT_SECTIONS +/* + * Enable this to check every reference update for null references and whether the update is + * made in a worker thread. In only a few cases do we potentially update references by + * writing nulls, so we assert in all the cases where it's not allowed. The concurrent + * collector's worker thread is not allowed to update references at all, so we also assert + * that we're not in the worker thread. + */ +//#define SGEN_CHECK_UPDATE_REFERENCE + /* * Define this and use the "xdomain-checks" MONO_GC_DEBUG option to * have cross-domain checks in the write barrier. @@ -144,12 +151,9 @@ typedef guint64 mword; #define SGEN_SCAN_START_SIZE (4096*2) /* - * Objects bigger then this go into the large object space. This size - * has a few constraints. It must fit into the major heap, which in - * the case of the copying collector means that it must fit into a - * pinned chunk. It must also play well with the GC descriptors, some - * of which (DESC_TYPE_RUN_LENGTH, DESC_TYPE_SMALL_BITMAP) encode the - * object size. + * Objects bigger then this go into the large object space. This size has a few + * constraints. At least two of them must fit into a major heap block. It must also play + * well with the run length GC descriptor, which encodes the object size. */ #define SGEN_MAX_SMALL_OBJ_SIZE 8000 diff --git a/mta-mono/vendor/mono/metadata/sgen-copy-object.h b/mta-mono/vendor/mono/metadata/sgen-copy-object.h index 21331c1..c5589f6 100644 --- a/mta-mono/vendor/mono/metadata/sgen-copy-object.h +++ b/mta-mono/vendor/mono/metadata/sgen-copy-object.h @@ -21,16 +21,18 @@ #include "mono/utils/mono-compiler.h" -extern long long stat_copy_object_called_nursery; -extern long long stat_objects_copied_nursery; +extern guint64 stat_copy_object_called_nursery; +extern guint64 stat_objects_copied_nursery; -extern long long stat_nursery_copy_object_failed_from_space; -extern long long stat_nursery_copy_object_failed_forwarded; -extern long long stat_nursery_copy_object_failed_pinned; +extern guint64 stat_nursery_copy_object_failed_from_space; +extern guint64 stat_nursery_copy_object_failed_forwarded; +extern guint64 stat_nursery_copy_object_failed_pinned; -extern long long stat_slots_allocated_in_vain; +extern guint64 stat_slots_allocated_in_vain; /* + * Copies an object and enqueues it if a queue is given. + * * This function can be used even if the vtable of obj is not valid * anymore, which is the case in the parallel collector. */ @@ -77,15 +79,20 @@ copy_object_no_checks (void *obj, SgenGrayQueue *queue) MonoVTable *vt = ((MonoObject*)obj)->vtable; gboolean has_references = SGEN_VTABLE_HAS_REFERENCES (vt); mword objsize = SGEN_ALIGN_UP (sgen_par_object_get_size (vt, (MonoObject*)obj)); + /* FIXME: Does this not mark the newly allocated object? */ char *destination = COLLECTOR_SERIAL_ALLOC_FOR_PROMOTION (vt, obj, objsize, has_references); if (G_UNLIKELY (!destination)) { + /* FIXME: Is this path ever tested? */ collector_pin_object (obj, queue); sgen_set_pinned_from_failed_allocation (objsize); return obj; } - par_copy_object_no_checks (destination, vt, obj, objsize, has_references ? queue : NULL); + if (!has_references) + queue = NULL; + + par_copy_object_no_checks (destination, vt, obj, objsize, queue); /* FIXME: mark mod union cards if necessary */ /* set the forwarding pointer */ diff --git a/mta-mono/vendor/mono/metadata/sgen-debug.c b/mta-mono/vendor/mono/metadata/sgen-debug.c index 113078c..ccc8ef5 100644 --- a/mta-mono/vendor/mono/metadata/sgen-debug.c +++ b/mta-mono/vendor/mono/metadata/sgen-debug.c @@ -51,13 +51,13 @@ void check_object (char *start); const char*descriptor_types [] = { "INVALID", - "run_length", - "small_bitmap", + "run length", + "bitmap", + "small pointer-free", "complex", "vector", - "large_bitmap", - "complex_arr", - "complex_ptrfree" + "complex arrray", + "complex pointer-free" }; static char* describe_nursery_ptr (char *ptr, gboolean need_setup); @@ -131,7 +131,7 @@ describe_pointer (char *ptr, gboolean need_setup) desc = ((GCVTable*)vtable)->desc; printf ("Descriptor: %lx\n", (long)desc); - type = desc & 0x7; + type = desc & DESC_TYPE_MASK; printf ("Descriptor type: %d (%s)\n", type, descriptor_types [type]); size = sgen_safe_object_get_size ((MonoObject*)ptr); @@ -348,6 +348,16 @@ find_object_in_nursery_dump (char *object) return FALSE; } +static void +iterate_valid_nursery_objects (IterateObjectCallbackFunc callback, void *data) +{ + int i; + for (i = 0; i < valid_nursery_object_count; ++i) { + char *obj = valid_nursery_objects [i]; + callback (obj, safe_object_get_size ((MonoObject*)obj), data); + } +} + static char* describe_nursery_ptr (char *ptr, gboolean need_setup) { @@ -540,15 +550,14 @@ find_pinning_reference (char *obj, size_t size) #define HANDLE_PTR(ptr,obj) do { \ char* __target = *(char**)ptr; \ if (__target) { \ - g_assert (is_valid_object_pointer (__target)); \ if (sgen_ptr_in_nursery (__target)) { \ - g_assert (SGEN_OBJECT_IS_PINNED (__target)); \ - } else if (sgen_los_is_valid_object (__target)) { \ - g_assert (sgen_los_object_is_pinned (__target)); \ - } else if (major_collector.is_valid_object (__target)) { \ - g_assert (major_collector.is_object_live (__target)); \ + g_assert (!SGEN_OBJECT_IS_FORWARDED (__target)); \ } else { \ - g_assert_not_reached (); \ + mword __size = sgen_safe_object_get_size ((MonoObject*)__target); \ + if (__size <= SGEN_MAX_SMALL_OBJ_SIZE) \ + g_assert (major_collector.is_object_live (__target)); \ + else \ + g_assert (sgen_los_object_is_pinned (__target)); \ } \ } \ } while (0) @@ -556,10 +565,13 @@ find_pinning_reference (char *obj, size_t size) static void check_marked_callback (char *start, size_t size, void *dummy) { - gboolean is_los = (gboolean) (size_t) dummy; + gboolean flag = (gboolean) (size_t) dummy; mword desc; - if (is_los) { + if (sgen_ptr_in_nursery (start)) { + if (flag) + SGEN_ASSERT (0, SGEN_OBJECT_IS_PINNED (start), "All objects remaining in the nursery must be pinned"); + } else if (flag) { if (!sgen_los_object_is_pinned (start)) return; } else { @@ -567,16 +579,17 @@ check_marked_callback (char *start, size_t size, void *dummy) return; } - desc = sgen_obj_get_descriptor (start); + desc = sgen_obj_get_descriptor_safe (start); #include "sgen-scan-object.h" } void -sgen_check_major_heap_marked (void) +sgen_check_heap_marked (gboolean nursery_must_be_pinned) { setup_valid_nursery_objects (); + iterate_valid_nursery_objects (check_marked_callback, (void*)(size_t)nursery_must_be_pinned); major_collector.iterate_objects (ITERATE_OBJECTS_SWEEP_ALL, check_marked_callback, (void*)FALSE); sgen_los_iterate_objects (check_marked_callback, (void*)TRUE); } @@ -620,7 +633,7 @@ scan_object_for_specific_ref (char *start, MonoObject *key) start = forwarded; if (scan_object_for_specific_ref_precise) { - mword desc = sgen_obj_get_descriptor (start); + mword desc = sgen_obj_get_descriptor_safe (start); #include "sgen-scan-object.h" } else { mword *words = (mword*)start; diff --git a/mta-mono/vendor/mono/metadata/sgen-descriptor.c b/mta-mono/vendor/mono/metadata/sgen-descriptor.c index 6da8f72..7171d45 100644 --- a/mta-mono/vendor/mono/metadata/sgen-descriptor.c +++ b/mta-mono/vendor/mono/metadata/sgen-descriptor.c @@ -33,7 +33,6 @@ #endif #include #include -#include #include #include #ifdef __MACH__ @@ -60,7 +59,8 @@ static int user_descriptors_next = 0; static void *all_ref_root_descrs [32]; #ifdef HEAVY_STATISTICS -static long long stat_scanned_count_per_descriptor [DESC_TYPE_MAX]; +static guint64 stat_scanned_count_per_descriptor [DESC_TYPE_MAX]; +static guint64 stat_copied_count_per_descriptor [DESC_TYPE_MAX]; #endif static int @@ -121,7 +121,7 @@ sgen_get_complex_descriptor (mword desc) void* mono_gc_make_descr_for_string (gsize *bitmap, int numbits) { - return (void*) DESC_TYPE_RUN_LENGTH; + return (void*)SGEN_DESC_STRING; } void* @@ -145,14 +145,23 @@ mono_gc_make_descr_for_object (gsize *bitmap, int numbits, size_t obj_size) if (first_set < 0) { SGEN_LOG (6, "Ptrfree descriptor %p, size: %zd", (void*)desc, stored_size); - if (stored_size <= MAX_RUNLEN_OBJECT_SIZE) - return (void*)(DESC_TYPE_RUN_LENGTH | stored_size); + if (stored_size <= MAX_RUNLEN_OBJECT_SIZE && stored_size <= SGEN_MAX_SMALL_OBJ_SIZE) + return (void*)(DESC_TYPE_SMALL_PTRFREE | stored_size); return (void*)DESC_TYPE_COMPLEX_PTRFREE; } g_assert (!(stored_size & 0x7)); - if (stored_size <= MAX_RUNLEN_OBJECT_SIZE) { + SGEN_ASSERT (5, stored_size == SGEN_ALIGN_UP (stored_size), "Size is not aligned"); + + /* we know the 2-word header is ptr-free */ + if (last_set < BITMAP_NUM_BITS + OBJECT_HEADER_WORDS && stored_size <= SGEN_MAX_SMALL_OBJ_SIZE) { + desc = DESC_TYPE_BITMAP | ((*bitmap >> OBJECT_HEADER_WORDS) << LOW_TYPE_BITS); + SGEN_LOG (6, "Largebitmap descriptor %p, size: %zd, last set: %d", (void*)desc, stored_size, last_set); + return (void*) desc; + } + + if (stored_size <= MAX_RUNLEN_OBJECT_SIZE && stored_size <= SGEN_MAX_SMALL_OBJ_SIZE) { /* check run-length encoding first: one byte offset, one byte number of pointers * on 64 bit archs, we can have 3 runs, just one on 32. * It may be better to use nibbles. @@ -164,19 +173,6 @@ mono_gc_make_descr_for_object (gsize *bitmap, int numbits, size_t obj_size) } } - /* we know the 2-word header is ptr-free */ - if (last_set < SMALL_BITMAP_SIZE + OBJECT_HEADER_WORDS && stored_size < (1 << SMALL_BITMAP_SHIFT)) { - desc = DESC_TYPE_SMALL_BITMAP | stored_size | ((*bitmap >> OBJECT_HEADER_WORDS) << SMALL_BITMAP_SHIFT); - SGEN_LOG (6, "Smallbitmap descriptor %p, size: %zd, last set: %d", (void*)desc, stored_size, last_set); - return (void*) desc; - } - - /* we know the 2-word header is ptr-free */ - if (last_set < LARGE_BITMAP_SIZE + OBJECT_HEADER_WORDS) { - desc = DESC_TYPE_LARGE_BITMAP | ((*bitmap >> OBJECT_HEADER_WORDS) << LOW_TYPE_BITS); - SGEN_LOG (6, "Largebitmap descriptor %p, size: %zd, last set: %d", (void*)desc, stored_size, last_set); - return (void*) desc; - } /* it's a complex object ... */ desc = DESC_TYPE_COMPLEX | (alloc_complex_descriptor (bitmap, last_set + 1) << LOW_TYPE_BITS); return (void*) desc; @@ -214,7 +210,7 @@ mono_gc_make_descr_for_array (int vector, gsize *elem_bitmap, int numbits, size_ } /* FIXME: try run-len first */ /* Note: we can't skip the object header here, because it's not present */ - if (last_set < SMALL_BITMAP_SIZE) { + if (last_set < VECTOR_BITMAP_SIZE) { return (void*)(desc | VECTOR_SUBTYPE_BITMAP | (*elem_bitmap << 16)); } } @@ -231,7 +227,7 @@ mono_gc_get_bitmap_for_descr (void *descr, int *numbits) mword d = (mword)descr; gsize *bitmap; - switch (d & 0x7) { + switch (d & DESC_TYPE_MASK) { case DESC_TYPE_RUN_LENGTH: { int first_set = (d >> 16) & 0xff; int num_set = (d >> 24) & 0xff; @@ -247,15 +243,7 @@ mono_gc_get_bitmap_for_descr (void *descr, int *numbits) return bitmap; } - case DESC_TYPE_SMALL_BITMAP: - bitmap = g_new0 (gsize, 1); - - bitmap [0] = (d >> SMALL_BITMAP_SHIFT) << OBJECT_HEADER_WORDS; - - *numbits = GC_BITS_PER_WORD; - return bitmap; - - case DESC_TYPE_LARGE_BITMAP: { + case DESC_TYPE_BITMAP: { gsize bmap = (d >> LOW_TYPE_BITS) << OBJECT_HEADER_WORDS; bitmap = g_new0 (gsize, 1); @@ -356,23 +344,39 @@ sgen_get_user_descriptor_func (mword desc) void sgen_descriptor_count_scanned_object (mword desc) { - int type = desc & 7; + int type = desc & DESC_TYPE_MASK; SGEN_ASSERT (0, type, "Descriptor type can't be zero"); ++stat_scanned_count_per_descriptor [type - 1]; } + +void +sgen_descriptor_count_copied_object (mword desc) +{ + int type = desc & DESC_TYPE_MASK; + SGEN_ASSERT (0, type, "Descriptor type can't be zero"); + ++stat_copied_count_per_descriptor [type - 1]; +} #endif void sgen_init_descriptors (void) { #ifdef HEAVY_STATISTICS - mono_counters_register ("# scanned RUN_LENGTH", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_RUN_LENGTH - 1]); - mono_counters_register ("# scanned SMALL_BITMAP", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_SMALL_BITMAP - 1]); - mono_counters_register ("# scanned COMPLEX", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_COMPLEX - 1]); - mono_counters_register ("# scanned VECTOR", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_VECTOR - 1]); - mono_counters_register ("# scanned LARGE_BITMAP", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_LARGE_BITMAP - 1]); - mono_counters_register ("# scanned COMPLEX_ARR", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_COMPLEX_ARR - 1]); - mono_counters_register ("# scanned COMPLEX_PTRFREE", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_COMPLEX_PTRFREE - 1]); + mono_counters_register ("# scanned RUN_LENGTH", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_scanned_count_per_descriptor [DESC_TYPE_RUN_LENGTH - 1]); + mono_counters_register ("# scanned SMALL_PTRFREE", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_scanned_count_per_descriptor [DESC_TYPE_SMALL_PTRFREE - 1]); + mono_counters_register ("# scanned COMPLEX", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_scanned_count_per_descriptor [DESC_TYPE_COMPLEX - 1]); + mono_counters_register ("# scanned VECTOR", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_scanned_count_per_descriptor [DESC_TYPE_VECTOR - 1]); + mono_counters_register ("# scanned BITMAP", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_scanned_count_per_descriptor [DESC_TYPE_BITMAP - 1]); + mono_counters_register ("# scanned COMPLEX_ARR", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_scanned_count_per_descriptor [DESC_TYPE_COMPLEX_ARR - 1]); + mono_counters_register ("# scanned COMPLEX_PTRFREE", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_scanned_count_per_descriptor [DESC_TYPE_COMPLEX_PTRFREE - 1]); + + mono_counters_register ("# copied RUN_LENGTH", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_copied_count_per_descriptor [DESC_TYPE_RUN_LENGTH - 1]); + mono_counters_register ("# copied SMALL_PTRFREE", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_copied_count_per_descriptor [DESC_TYPE_SMALL_PTRFREE - 1]); + mono_counters_register ("# copied COMPLEX", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_copied_count_per_descriptor [DESC_TYPE_COMPLEX - 1]); + mono_counters_register ("# copied VECTOR", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_copied_count_per_descriptor [DESC_TYPE_VECTOR - 1]); + mono_counters_register ("# copied BITMAP", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_copied_count_per_descriptor [DESC_TYPE_BITMAP - 1]); + mono_counters_register ("# copied COMPLEX_ARR", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_copied_count_per_descriptor [DESC_TYPE_COMPLEX_ARR - 1]); + mono_counters_register ("# copied COMPLEX_PTRFREE", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_copied_count_per_descriptor [DESC_TYPE_COMPLEX_PTRFREE - 1]); #endif } diff --git a/mta-mono/vendor/mono/metadata/sgen-descriptor.h b/mta-mono/vendor/mono/metadata/sgen-descriptor.h index c06354d..610865d 100644 --- a/mta-mono/vendor/mono/metadata/sgen-descriptor.h +++ b/mta-mono/vendor/mono/metadata/sgen-descriptor.h @@ -36,26 +36,39 @@ */ #define OBJECT_HEADER_WORDS (sizeof(MonoObject)/sizeof(gpointer)) #define LOW_TYPE_BITS 3 +#define DESC_TYPE_MASK ((1 << LOW_TYPE_BITS) - 1) #define MAX_RUNLEN_OBJECT_SIZE 0xFFFF -#define SMALL_BITMAP_SHIFT 16 -#define SMALL_BITMAP_SIZE (GC_BITS_PER_WORD - SMALL_BITMAP_SHIFT) #define VECTOR_INFO_SHIFT 14 #define VECTOR_KIND_SHIFT 13 #define VECTOR_ELSIZE_SHIFT 3 -#define LARGE_BITMAP_SIZE (GC_BITS_PER_WORD - LOW_TYPE_BITS) +#define VECTOR_BITMAP_SHIFT 16 +#define VECTOR_BITMAP_SIZE (GC_BITS_PER_WORD - VECTOR_BITMAP_SHIFT) +#define BITMAP_NUM_BITS (GC_BITS_PER_WORD - LOW_TYPE_BITS) #define MAX_ELEMENT_SIZE 0x3ff #define VECTOR_SUBTYPE_PTRFREE (DESC_TYPE_V_PTRFREE << VECTOR_INFO_SHIFT) #define VECTOR_SUBTYPE_REFS (DESC_TYPE_V_REFS << VECTOR_INFO_SHIFT) -#define VECTOR_SUBTYPE_RUN_LEN (DESC_TYPE_V_RUN_LEN << VECTOR_INFO_SHIFT) #define VECTOR_SUBTYPE_BITMAP (DESC_TYPE_V_BITMAP << VECTOR_INFO_SHIFT) #define VECTOR_KIND_SZARRAY (DESC_TYPE_V_SZARRAY << VECTOR_KIND_SHIFT) #define VECTOR_KIND_ARRAY (DESC_TYPE_V_ARRAY << VECTOR_KIND_SHIFT) -/* objects are aligned to 8 bytes boundaries +/* + * Objects are aligned to 8 bytes boundaries. + * * A descriptor is a pointer in MonoVTable, so 32 or 64 bits of size. * The low 3 bits define the type of the descriptor. The other bits * depend on the type. + * + * It's important to be able to quickly identify two properties of classes from their + * descriptors: whether they are small enough to live in the regular major heap (size <= + * SGEN_MAX_SMALL_OBJ_SIZE), and whether they contain references. + * + * To that end we have three descriptor types that only apply to small classes: RUN_LENGTH, + * BITMAP, and SMALL_PTRFREE. We also have the type COMPLEX_PTRFREE, which applies to + * classes that are either not small or of unknown size (those being strings and arrays). + * The lowest two bits of the SMALL_PTRFREE and COMPLEX_PTRFREE tags are the same, so we can + * quickly check for references. + * * As a general rule the 13 remaining low bits define the size, either * of the whole object or of the elements in the arrays. While for objects * the size is already in bytes, for arrays we need to shift, because @@ -69,37 +82,42 @@ * will be allocated in the large object heap. * If we want 4-bytes alignment, we need to put vector and small bitmap * inside complex. + * + * We don't use 0 so that 0 isn't a valid GC descriptor. No deep reason for this other than + * to be able to identify a non-inited descriptor for debugging. */ enum { - /* - * We don't use 0 so that 0 isn't a valid GC descriptor. No - * deep reason for this other than to be able to identify a - * non-inited descriptor for debugging. - * - * If an object contains no references, its GC descriptor is - * always DESC_TYPE_RUN_LENGTH, without a size, no exceptions. - * This is so that we can quickly check for that in - * copy_object_no_checks(), without having to fetch the - * object's class. - */ + /* Keep in sync with `descriptor_types` in sgen-debug.c! */ DESC_TYPE_RUN_LENGTH = 1, /* 16 bits aligned byte size | 1-3 (offset, numptr) bytes tuples */ - DESC_TYPE_SMALL_BITMAP = 2, /* 16 bits aligned byte size | 16-48 bit bitmap */ - DESC_TYPE_COMPLEX = 3, /* index for bitmap into complex_descriptors */ - DESC_TYPE_VECTOR = 4, /* 10 bits element size | 1 bit kind | 2 bits desc | element desc */ - DESC_TYPE_LARGE_BITMAP = 5, /* | 29-61 bitmap bits */ + DESC_TYPE_BITMAP = 2, /* | 29-61 bitmap bits */ + DESC_TYPE_SMALL_PTRFREE = 3, + DESC_TYPE_MAX_SMALL_OBJ = 3, + DESC_TYPE_COMPLEX = 4, /* index for bitmap into complex_descriptors */ + DESC_TYPE_VECTOR = 5, /* 10 bits element size | 1 bit kind | 2 bits desc | element desc */ DESC_TYPE_COMPLEX_ARR = 6, /* index for bitmap into complex_descriptors */ - DESC_TYPE_COMPLEX_PTRFREE = 7, /*Nothing, used to encode large ptr objects. */ + DESC_TYPE_COMPLEX_PTRFREE = 7, /* Nothing, used to encode large ptr objects and strings. */ DESC_TYPE_MAX = 7, - /* values for array kind */ + + DESC_TYPE_PTRFREE_MASK = 3, + DESC_TYPE_PTRFREE_BITS = 3 +}; + +/* values for array kind */ +enum { DESC_TYPE_V_SZARRAY = 0, /*vector with no bounds data */ DESC_TYPE_V_ARRAY = 1, /* array with bounds data */ - /* subtypes for arrays and vectors */ +}; + +/* subtypes for arrays and vectors */ +enum { DESC_TYPE_V_PTRFREE = 0,/* there are no refs: keep first so it has a zero value */ DESC_TYPE_V_REFS, /* all the array elements are refs */ DESC_TYPE_V_RUN_LEN, /* elements are run-length encoded as DESC_TYPE_RUN_LENGTH */ DESC_TYPE_V_BITMAP /* elements are as the bitmap in DESC_TYPE_SMALL_BITMAP */ }; +#define SGEN_DESC_STRING (DESC_TYPE_COMPLEX_PTRFREE | (1 << LOW_TYPE_BITS)) + /* Root bitmap descriptors are simpler: the lower three bits describe the type * and we either have 30/62 bitmap bits or nibble-based run-length, * or a complex descriptor, or a user defined marker function. @@ -122,22 +140,20 @@ void sgen_init_descriptors (void) MONO_INTERNAL; #ifdef HEAVY_STATISTICS void sgen_descriptor_count_scanned_object (mword desc) MONO_INTERNAL; +void sgen_descriptor_count_copied_object (mword desc) MONO_INTERNAL; #endif static inline gboolean sgen_gc_descr_has_references (mword desc) { - /*Both string and fixed size objects are encoded using a zero run RUN_LEN*/ - if ((desc & 0xffff0007) == DESC_TYPE_RUN_LENGTH) + /* This covers SMALL_PTRFREE and COMPLEX_PTRFREE */ + if ((desc & DESC_TYPE_PTRFREE_MASK) == DESC_TYPE_PTRFREE_BITS) return FALSE; /*The array is ptr-free*/ if ((desc & 0xC007) == (DESC_TYPE_VECTOR | VECTOR_SUBTYPE_PTRFREE)) return FALSE; - if ((desc & 0x7) == DESC_TYPE_COMPLEX_PTRFREE) - return FALSE; - return TRUE; } @@ -146,18 +162,12 @@ sgen_gc_descr_has_references (mword desc) #define SGEN_OBJECT_HAS_REFERENCES(o) (SGEN_VTABLE_HAS_REFERENCES (SGEN_LOAD_VTABLE ((o)))) /* helper macros to scan and traverse objects, macros because we resue them in many functions */ -#define OBJ_RUN_LEN_SIZE(size,desc,obj) do { \ - (size) = ((desc) & 0xfff8); \ - } while (0) - -#define OBJ_BITMAP_SIZE(size,desc,obj) do { \ - (size) = ((desc) & 0xfff8); \ - } while (0) - #ifdef __GNUC__ -#define PREFETCH(addr) __builtin_prefetch ((addr)) +#define PREFETCH_READ(addr) __builtin_prefetch ((addr), 0, 1) +#define PREFETCH_WRITE(addr) __builtin_prefetch ((addr), 1, 1) #else -#define PREFETCH(addr) +#define PREFETCH_READ(addr) +#define PREFETCH_WRITE(addr) #endif #if defined(__GNUC__) && SIZEOF_VOID_P==4 @@ -177,56 +187,42 @@ sgen_gc_descr_has_references (mword desc) while (_objptr < _objptr_end) { \ HANDLE_PTR (_objptr, (obj)); \ _objptr++; \ - } \ + }; \ } \ } while (0) -#if defined(__GNUC__) -#define OBJ_BITMAP_FOREACH_PTR(desc,obj) do { \ - /* there are pointers */ \ - void **_objptr = (void**)(obj); \ - gsize _bmap = (desc) >> 16; \ - _objptr += OBJECT_HEADER_WORDS; \ - do { \ - int _index = GNUC_BUILTIN_CTZ (_bmap); \ - _objptr += _index; \ - _bmap >>= (_index + 1); \ - HANDLE_PTR (_objptr, (obj)); \ - _objptr ++; \ - } while (_bmap); \ - } while (0) -#else -#define OBJ_BITMAP_FOREACH_PTR(desc,obj) do { \ - /* there are pointers */ \ - void **_objptr = (void**)(obj); \ - gsize _bmap = (desc) >> 16; \ - _objptr += OBJECT_HEADER_WORDS; \ - while (_bmap) { \ - if ((_bmap & 1)) { \ - HANDLE_PTR (_objptr, (obj)); \ - } \ - _bmap >>= 1; \ - ++_objptr; \ - } \ - } while (0) -#endif - /* a bitmap desc means that there are pointer references or we'd have * choosen run-length, instead: add an assert to check. */ -#define OBJ_LARGE_BITMAP_FOREACH_PTR(desc,obj) do { \ +#ifdef __GNUC__ +#define OBJ_BITMAP_FOREACH_PTR(desc,obj) do { \ + /* there are pointers */ \ + void **_objptr = (void**)(obj); \ + gsize _bmap = (desc) >> LOW_TYPE_BITS; \ + _objptr += OBJECT_HEADER_WORDS; \ + do { \ + int _index = GNUC_BUILTIN_CTZ (_bmap); \ + _objptr += _index; \ + _bmap >>= (_index + 1); \ + HANDLE_PTR (_objptr, (obj)); \ + ++_objptr; \ + } while (_bmap); \ + } while (0) +#else +#define OBJ_BITMAP_FOREACH_PTR(desc,obj) do { \ /* there are pointers */ \ void **_objptr = (void**)(obj); \ gsize _bmap = (desc) >> LOW_TYPE_BITS; \ _objptr += OBJECT_HEADER_WORDS; \ - while (_bmap) { \ + do { \ if ((_bmap & 1)) { \ HANDLE_PTR (_objptr, (obj)); \ } \ _bmap >>= 1; \ ++_objptr; \ - } \ + } while (_bmap); \ } while (0) +#endif #define OBJ_COMPLEX_FOREACH_PTR(vt,obj) do { \ /* there are pointers */ \ diff --git a/mta-mono/vendor/mono/metadata/sgen-fin-weak-hash.c b/mta-mono/vendor/mono/metadata/sgen-fin-weak-hash.c index 3793c94..5c91436 100644 --- a/mta-mono/vendor/mono/metadata/sgen-fin-weak-hash.c +++ b/mta-mono/vendor/mono/metadata/sgen-fin-weak-hash.c @@ -30,6 +30,7 @@ #include "metadata/sgen-gc.h" #include "metadata/sgen-gray.h" #include "metadata/sgen-protocol.h" +#include "metadata/sgen-pointer-queue.h" #include "utils/dtrace.h" #include "utils/mono-counters.h" @@ -73,7 +74,7 @@ tagged_object_apply (void *object, int tag_bits) static int tagged_object_hash (MonoObject *o) { - return mono_object_hash (tagged_object_get_object (o)); + return mono_aligned_addr_hash (tagged_object_get_object (o)); } static gboolean @@ -116,6 +117,9 @@ sgen_collect_bridge_objects (int generation, ScanCopyContext ctx) MonoObject *object; gpointer dummy; char *copy; + SgenPointerQueue moved_fin_objects; + + sgen_pointer_queue_init (&moved_fin_objects, INTERNAL_MEM_TEMPORARY); if (no_finalize) return; @@ -154,12 +158,24 @@ sgen_collect_bridge_objects (int generation, ScanCopyContext ctx) SGEN_LOG (5, "Promoting finalization of object %p (%s) (was at %p) to major table", copy, sgen_safe_name (copy), object); continue; - } else { + } else if (copy != (char*)object) { /* update pointer */ + SGEN_HASH_TABLE_FOREACH_REMOVE (TRUE); + + /* register for reinsertion */ + sgen_pointer_queue_add (&moved_fin_objects, tagged_object_apply (copy, tag)); + SGEN_LOG (5, "Updating object for finalization: %p (%s) (was at %p)", copy, sgen_safe_name (copy), object); - SGEN_HASH_TABLE_FOREACH_SET_KEY (tagged_object_apply (copy, tag)); + + continue; } } SGEN_HASH_TABLE_FOREACH_END; + + while (!sgen_pointer_queue_is_empty (&moved_fin_objects)) { + sgen_hash_table_replace (hash_table, sgen_pointer_queue_pop (&moved_fin_objects), NULL, NULL); + } + + sgen_pointer_queue_free (&moved_fin_objects); } @@ -172,6 +188,9 @@ sgen_finalize_in_range (int generation, ScanCopyContext ctx) SgenHashTable *hash_table = get_finalize_entry_hash_table (generation); MonoObject *object; gpointer dummy; + SgenPointerQueue moved_fin_objects; + + sgen_pointer_queue_init (&moved_fin_objects, INTERNAL_MEM_TEMPORARY); if (no_finalize) return; @@ -201,14 +220,26 @@ sgen_finalize_in_range (int generation, ScanCopyContext ctx) SGEN_LOG (5, "Promoting finalization of object %p (%s) (was at %p) to major table", copy, sgen_safe_name (copy), object); continue; - } else { + } else if (copy != object) { /* update pointer */ + SGEN_HASH_TABLE_FOREACH_REMOVE (TRUE); + + /* register for reinsertion */ + sgen_pointer_queue_add (&moved_fin_objects, tagged_object_apply (copy, tag)); + SGEN_LOG (5, "Updating object for finalization: %p (%s) (was at %p)", copy, sgen_safe_name (copy), object); - SGEN_HASH_TABLE_FOREACH_SET_KEY (tagged_object_apply (copy, tag)); + + continue; } } } } SGEN_HASH_TABLE_FOREACH_END; + + while (!sgen_pointer_queue_is_empty (&moved_fin_objects)) { + sgen_hash_table_replace (hash_table, sgen_pointer_queue_pop (&moved_fin_objects), NULL, NULL); + } + + sgen_pointer_queue_free (&moved_fin_objects); } /* LOCKING: requires that the GC lock is held */ @@ -391,12 +422,12 @@ process_stage_entries (int num_entries, volatile gint32 *next_entry, StageEntry } #ifdef HEAVY_STATISTICS -static long long stat_overflow_abort = 0; -static long long stat_wait_for_processing = 0; -static long long stat_increment_other_thread = 0; -static long long stat_index_decremented = 0; -static long long stat_entry_invalidated = 0; -static long long stat_success = 0; +static guint64 stat_overflow_abort = 0; +static guint64 stat_wait_for_processing = 0; +static guint64 stat_increment_other_thread = 0; +static guint64 stat_index_decremented = 0; +static guint64 stat_entry_invalidated = 0; +static guint64 stat_success = 0; #endif static int @@ -725,21 +756,23 @@ sgen_null_links_for_domain (MonoDomain *domain, int generation) SgenHashTable *hash = get_dislink_hash_table (generation); SGEN_HASH_TABLE_FOREACH (hash, link, dummy) { char *object = DISLINK_OBJECT (link); - if (*link && object && !((MonoObject*)object)->vtable) { - gboolean free = TRUE; - if (*link) { - *link = NULL; - binary_protocol_dislink_update (link, NULL, 0, 0); - free = FALSE; - /* - * This can happen if finalizers are not ran, i.e. Environment.Exit () - * is called from finalizer like in finalizer-abort.cs. - */ - SGEN_LOG (5, "Disappearing link %p not freed", link); - } + if (object) + SGEN_ASSERT (0, ((MonoObject*)object)->vtable, "Can't have objects without vtables."); - SGEN_HASH_TABLE_FOREACH_REMOVE (free); + if (*link && object && ((MonoObject*)object)->vtable->domain == domain) { + *link = NULL; + binary_protocol_dislink_update (link, NULL, 0, 0); + /* + * This can happen if finalizers are not ran, i.e. Environment.Exit () + * is called from finalizer like in finalizer-abort.cs. + */ + SGEN_LOG (5, "Disappearing link %p not freed", link); + + /* + * FIXME: Why don't we free the entry here? + */ + SGEN_HASH_TABLE_FOREACH_REMOVE (FALSE); continue; } @@ -874,12 +907,12 @@ void sgen_init_fin_weak_hash (void) { #ifdef HEAVY_STATISTICS - mono_counters_register ("FinWeak Successes", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_success); - mono_counters_register ("FinWeak Overflow aborts", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_overflow_abort); - mono_counters_register ("FinWeak Wait for processing", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_wait_for_processing); - mono_counters_register ("FinWeak Increment other thread", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_increment_other_thread); - mono_counters_register ("FinWeak Index decremented", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_index_decremented); - mono_counters_register ("FinWeak Entry invalidated", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_entry_invalidated); + mono_counters_register ("FinWeak Successes", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_success); + mono_counters_register ("FinWeak Overflow aborts", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_overflow_abort); + mono_counters_register ("FinWeak Wait for processing", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_wait_for_processing); + mono_counters_register ("FinWeak Increment other thread", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_increment_other_thread); + mono_counters_register ("FinWeak Index decremented", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_index_decremented); + mono_counters_register ("FinWeak Entry invalidated", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_entry_invalidated); #endif } diff --git a/mta-mono/vendor/mono/metadata/sgen-gc.c b/mta-mono/vendor/mono/metadata/sgen-gc.c index 4b0b5a3..b9dddd4 100644 --- a/mta-mono/vendor/mono/metadata/sgen-gc.c +++ b/mta-mono/vendor/mono/metadata/sgen-gc.c @@ -187,7 +187,6 @@ #endif #include #include -#include #include #include @@ -279,6 +278,9 @@ static gboolean conservative_stack_mark = FALSE; /* If set, do a plausibility check on the scan_starts before and after each collection */ static gboolean do_scan_starts_check = FALSE; +/* If set, do not run finalizers. */ +static gboolean do_not_finalize = FALSE; + /* * If the major collector is concurrent and this is FALSE, we will * never initiate a synchronous major collection, unless requested via @@ -293,23 +295,23 @@ static gboolean do_dump_nursery_content = FALSE; static gboolean enable_nursery_canaries = FALSE; #ifdef HEAVY_STATISTICS -long long stat_objects_alloced_degraded = 0; -long long stat_bytes_alloced_degraded = 0; +guint64 stat_objects_alloced_degraded = 0; +guint64 stat_bytes_alloced_degraded = 0; -long long stat_copy_object_called_nursery = 0; -long long stat_objects_copied_nursery = 0; -long long stat_copy_object_called_major = 0; -long long stat_objects_copied_major = 0; +guint64 stat_copy_object_called_nursery = 0; +guint64 stat_objects_copied_nursery = 0; +guint64 stat_copy_object_called_major = 0; +guint64 stat_objects_copied_major = 0; -long long stat_scan_object_called_nursery = 0; -long long stat_scan_object_called_major = 0; +guint64 stat_scan_object_called_nursery = 0; +guint64 stat_scan_object_called_major = 0; -long long stat_slots_allocated_in_vain; +guint64 stat_slots_allocated_in_vain; -long long stat_nursery_copy_object_failed_from_space = 0; -long long stat_nursery_copy_object_failed_forwarded = 0; -long long stat_nursery_copy_object_failed_pinned = 0; -long long stat_nursery_copy_object_failed_to_space = 0; +guint64 stat_nursery_copy_object_failed_from_space = 0; +guint64 stat_nursery_copy_object_failed_forwarded = 0; +guint64 stat_nursery_copy_object_failed_pinned = 0; +guint64 stat_nursery_copy_object_failed_to_space = 0; static int stat_wbarrier_add_to_global_remset = 0; static int stat_wbarrier_set_field = 0; @@ -322,32 +324,32 @@ static int stat_wbarrier_value_copy = 0; static int stat_wbarrier_object_copy = 0; #endif -static long long stat_pinned_objects = 0; +static guint64 stat_pinned_objects = 0; -static long long time_minor_pre_collection_fragment_clear = 0; -static long long time_minor_pinning = 0; -static long long time_minor_scan_remsets = 0; -static long long time_minor_scan_pinned = 0; -static long long time_minor_scan_registered_roots = 0; -static long long time_minor_scan_thread_data = 0; -static long long time_minor_finish_gray_stack = 0; -static long long time_minor_fragment_creation = 0; +static guint64 time_minor_pre_collection_fragment_clear = 0; +static guint64 time_minor_pinning = 0; +static guint64 time_minor_scan_remsets = 0; +static guint64 time_minor_scan_pinned = 0; +static guint64 time_minor_scan_registered_roots = 0; +static guint64 time_minor_scan_thread_data = 0; +static guint64 time_minor_finish_gray_stack = 0; +static guint64 time_minor_fragment_creation = 0; -static long long time_major_pre_collection_fragment_clear = 0; -static long long time_major_pinning = 0; -static long long time_major_scan_pinned = 0; -static long long time_major_scan_registered_roots = 0; -static long long time_major_scan_thread_data = 0; -static long long time_major_scan_alloc_pinned = 0; -static long long time_major_scan_finalized = 0; -static long long time_major_scan_big_objects = 0; -static long long time_major_finish_gray_stack = 0; -static long long time_major_free_bigobjs = 0; -static long long time_major_los_sweep = 0; -static long long time_major_sweep = 0; -static long long time_major_fragment_creation = 0; +static guint64 time_major_pre_collection_fragment_clear = 0; +static guint64 time_major_pinning = 0; +static guint64 time_major_scan_pinned = 0; +static guint64 time_major_scan_registered_roots = 0; +static guint64 time_major_scan_thread_data = 0; +static guint64 time_major_scan_alloc_pinned = 0; +static guint64 time_major_scan_finalized = 0; +static guint64 time_major_scan_big_objects = 0; +static guint64 time_major_finish_gray_stack = 0; +static guint64 time_major_free_bigobjs = 0; +static guint64 time_major_los_sweep = 0; +static guint64 time_major_sweep = 0; +static guint64 time_major_fragment_creation = 0; -static long long time_max = 0; +static guint64 time_max = 0; static SGEN_TV_DECLARE (time_major_conc_collection_start); static SGEN_TV_DECLARE (time_major_conc_collection_end); @@ -371,7 +373,6 @@ mono_gc_flush_info (void) #define TV_DECLARE SGEN_TV_DECLARE #define TV_GETTIME SGEN_TV_GETTIME #define TV_ELAPSED SGEN_TV_ELAPSED -#define TV_ELAPSED_MS SGEN_TV_ELAPSED_MS SGEN_TV_DECLARE (sgen_init_timestamp); @@ -382,7 +383,6 @@ NurseryClearPolicy nursery_clear_policy = CLEAR_AT_TLAB_CREATION; #define object_is_forwarded SGEN_OBJECT_IS_FORWARDED #define object_is_pinned SGEN_OBJECT_IS_PINNED #define pin_object SGEN_PIN_OBJECT -#define unpin_object SGEN_UNPIN_OBJECT #define ptr_in_nursery sgen_ptr_in_nursery @@ -425,14 +425,10 @@ size_t degraded_mode = 0; static mword bytes_pinned_from_failed_allocation = 0; GCMemSection *nursery_section = NULL; -static mword lowest_heap_address = ~(mword)0; -static mword highest_heap_address = 0; +static volatile mword lowest_heap_address = ~(mword)0; +static volatile mword highest_heap_address = 0; LOCK_DECLARE (sgen_interruption_mutex); -static LOCK_DECLARE (pin_queue_mutex); - -#define LOCK_PIN_QUEUE mono_mutex_lock (&pin_queue_mutex) -#define UNLOCK_PIN_QUEUE mono_mutex_unlock (&pin_queue_mutex) typedef struct _FinalizeReadyEntry FinalizeReadyEntry; struct _FinalizeReadyEntry { @@ -520,7 +516,6 @@ guint32 tlab_size = (1024 * 4); static MonoGCCallbacks gc_callbacks; #define ALLOC_ALIGN SGEN_ALLOC_ALIGN -#define ALLOC_ALIGN_BITS SGEN_ALLOC_ALIGN_BITS #define ALIGN_UP SGEN_ALIGN_UP @@ -574,8 +569,6 @@ static int mark_ephemerons_in_range (ScanCopyContext ctx); static void clear_unreachable_ephemerons (ScanCopyContext ctx); static void null_ephemerons_for_domain (MonoDomain *domain); -static gboolean major_update_or_finish_concurrent_collection (gboolean force_finish); - SgenObjectOperations current_object_ops; SgenMajorCollector major_collector; SgenMinorCollector sgen_minor_collector; @@ -601,7 +594,6 @@ gray_queue_redirect (SgenGrayQueue *queue) { gboolean wake = FALSE; - for (;;) { GrayQueueSection *section = sgen_gray_object_dequeue_section (queue); if (!section) @@ -613,7 +605,7 @@ gray_queue_redirect (SgenGrayQueue *queue) if (wake) { g_assert (concurrent_collection_in_progress); if (sgen_workers_have_started ()) { - sgen_workers_wake_up_all (); + sgen_workers_ensure_awake (); } else { if (concurrent_collection_in_progress) g_assert (current_collection_generation == -1); @@ -621,6 +613,16 @@ gray_queue_redirect (SgenGrayQueue *queue) } } +static void +gray_queue_enable_redirect (SgenGrayQueue *queue) +{ + if (!concurrent_collection_in_progress) + return; + + sgen_gray_queue_set_alloc_prepare (queue, gray_queue_redirect, sgen_workers_get_distribute_section_gray_queue ()); + gray_queue_redirect (queue); +} + void sgen_scan_area_with_callback (char *start, char *end, IterateObjectCallbackFunc callback, void *data, gboolean allow_flags) { @@ -820,6 +822,7 @@ mono_gc_clear_domain (MonoDomain * domain) sgen_restart_world (0, NULL); binary_protocol_domain_unload_end (domain); + binary_protocol_flush_buffers (FALSE); UNLOCK_GC; } @@ -886,6 +889,9 @@ sgen_drain_gray_stack (int max_objs, ScanCopyContext ctx) ScanObjectFunc scan_func = ctx.scan_func; GrayQueue *queue = ctx.queue; + if (current_collection_generation == GENERATION_OLD && major_collector.drain_gray_stack) + return major_collector.drain_gray_stack (ctx); + do { int i; for (i = 0; i != max_objs; ++i) { @@ -912,8 +918,8 @@ static int pin_objects_from_nursery_pin_queue (ScanCopyContext ctx) { GCMemSection *section = nursery_section; - void **start = section->pin_queue_start; - void **end = start + section->pin_queue_num_entries; + void **start = sgen_pinning_get_entry (section->pin_queue_first_entry); + void **end = sgen_pinning_get_entry (section->pin_queue_last_entry); void *start_nursery = section->data; void *end_nursery = section->next_data; void *last = NULL; @@ -982,7 +988,7 @@ pin_objects_from_nursery_pin_queue (ScanCopyContext ctx) * search_start must point to zeroed mem or point to an object. */ do { - size_t obj_size; + size_t obj_size, canarified_obj_size; /* Skip zeros. */ if (!*(void**)search_start) { @@ -991,22 +997,27 @@ pin_objects_from_nursery_pin_queue (ScanCopyContext ctx) continue; } - obj_size = ALIGN_UP (safe_object_get_size ((MonoObject*)search_start)); + canarified_obj_size = obj_size = ALIGN_UP (safe_object_get_size ((MonoObject*)search_start)); - if (addr >= search_start && (char*)addr < (char*)search_start + obj_size) { - /* This is the object we're looking for. */ - obj_to_pin = search_start; - obj_to_pin_size = obj_size; - break; + /* + * Filler arrays are marked by an invalid sync word. We don't + * consider them for pinning. They are not delimited by canaries, + * either. + */ + if (((MonoObject*)search_start)->synchronisation != GINT_TO_POINTER (-1)) { + CHECK_CANARY_FOR_OBJECT (search_start); + CANARIFY_SIZE (canarified_obj_size); + + if (addr >= search_start && (char*)addr < (char*)search_start + obj_size) { + /* This is the object we're looking for. */ + obj_to_pin = search_start; + obj_to_pin_size = canarified_obj_size; + break; + } } /* Skip to the next object */ - if (((MonoObject*)search_start)->synchronisation != GINT_TO_POINTER (-1)) { - CHECK_CANARY_FOR_OBJECT (search_start); - CANARIFY_SIZE (obj_size); - CANARIFY_SIZE (obj_to_pin_size); - } - search_start = (void*)((char*)search_start + obj_size); + search_start = (void*)((char*)search_start + canarified_obj_size); } while (search_start <= addr); /* We've searched past the address we were looking for. */ @@ -1080,28 +1091,24 @@ pin_objects_in_nursery (ScanCopyContext ctx) { size_t reduced_to; - if (!nursery_section->pin_queue_num_entries) + if (nursery_section->pin_queue_first_entry == nursery_section->pin_queue_last_entry) return; reduced_to = pin_objects_from_nursery_pin_queue (ctx); - nursery_section->pin_queue_num_entries = reduced_to; - if (!reduced_to) - nursery_section->pin_queue_start = NULL; + nursery_section->pin_queue_last_entry = nursery_section->pin_queue_first_entry + reduced_to; } void sgen_pin_object (void *object, GrayQueue *queue) { - g_assert (!concurrent_collection_in_progress); - SGEN_PIN_OBJECT (object); sgen_pin_stage_ptr (object); ++objects_pinned; if (G_UNLIKELY (do_pin_stats)) sgen_pin_stats_register_object (object, safe_object_get_size (object)); - GRAY_OBJECT_ENQUEUE (queue, object, sgen_obj_get_descriptor (object)); + GRAY_OBJECT_ENQUEUE (queue, object, sgen_obj_get_descriptor_safe (object)); binary_protocol_pin (object, (gpointer)LOAD_VTABLE (object), safe_object_get_size (object)); #ifdef ENABLE_DTRACE @@ -1232,6 +1239,7 @@ conservatively_pin_objects_from (void **start, void **end, void *start_nursery, if (addr >= (mword)start_nursery && addr < (mword)end_nursery) { SGEN_LOG (6, "Pinning address %p from %p", (void*)addr, start); sgen_pin_stage_ptr ((void*)addr); + binary_protocol_pin_stage (start, (void*)addr); count++; } if (G_UNLIKELY (do_pin_stats)) { @@ -1319,7 +1327,6 @@ precisely_scan_objects_from (void** start_root, void** end_root, char* n_start, if ((desc & 1) && *start_root) { copy_func (start_root, queue); SGEN_LOG (9, "Overwrote root at %p with %p", start_root, *start_root); - sgen_drain_gray_stack (-1, ctx); } desc >>= 1; start_root++; @@ -1337,7 +1344,6 @@ precisely_scan_objects_from (void** start_root, void** end_root, char* n_start, if ((bmap & 1) && *objptr) { copy_func (objptr, queue); SGEN_LOG (9, "Overwrote root at %p with %p", objptr, *objptr); - sgen_drain_gray_stack (-1, ctx); } bmap >>= 1; ++objptr; @@ -1930,32 +1936,32 @@ init_stats (void) if (inited) return; - mono_counters_register ("Collection max time", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME | MONO_COUNTER_MONOTONIC, &time_max); + mono_counters_register ("Collection max time", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME | MONO_COUNTER_MONOTONIC, &time_max); - mono_counters_register ("Minor fragment clear", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_minor_pre_collection_fragment_clear); - mono_counters_register ("Minor pinning", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_minor_pinning); - mono_counters_register ("Minor scan remembered set", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_minor_scan_remsets); - mono_counters_register ("Minor scan pinned", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_minor_scan_pinned); - mono_counters_register ("Minor scan registered roots", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_minor_scan_registered_roots); - mono_counters_register ("Minor scan thread data", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_minor_scan_thread_data); - mono_counters_register ("Minor finish gray stack", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_minor_finish_gray_stack); - mono_counters_register ("Minor fragment creation", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_minor_fragment_creation); + mono_counters_register ("Minor fragment clear", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_minor_pre_collection_fragment_clear); + mono_counters_register ("Minor pinning", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_minor_pinning); + mono_counters_register ("Minor scan remembered set", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_minor_scan_remsets); + mono_counters_register ("Minor scan pinned", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_minor_scan_pinned); + mono_counters_register ("Minor scan registered roots", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_minor_scan_registered_roots); + mono_counters_register ("Minor scan thread data", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_minor_scan_thread_data); + mono_counters_register ("Minor finish gray stack", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_minor_finish_gray_stack); + mono_counters_register ("Minor fragment creation", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_minor_fragment_creation); - mono_counters_register ("Major fragment clear", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_pre_collection_fragment_clear); - mono_counters_register ("Major pinning", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_pinning); - mono_counters_register ("Major scan pinned", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_scan_pinned); - mono_counters_register ("Major scan registered roots", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_scan_registered_roots); - mono_counters_register ("Major scan thread data", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_scan_thread_data); - mono_counters_register ("Major scan alloc_pinned", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_scan_alloc_pinned); - mono_counters_register ("Major scan finalized", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_scan_finalized); - mono_counters_register ("Major scan big objects", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_scan_big_objects); - mono_counters_register ("Major finish gray stack", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_finish_gray_stack); - mono_counters_register ("Major free big objects", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_free_bigobjs); - mono_counters_register ("Major LOS sweep", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_los_sweep); - mono_counters_register ("Major sweep", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_sweep); - mono_counters_register ("Major fragment creation", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_major_fragment_creation); + mono_counters_register ("Major fragment clear", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_pre_collection_fragment_clear); + mono_counters_register ("Major pinning", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_pinning); + mono_counters_register ("Major scan pinned", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_scan_pinned); + mono_counters_register ("Major scan registered roots", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_scan_registered_roots); + mono_counters_register ("Major scan thread data", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_scan_thread_data); + mono_counters_register ("Major scan alloc_pinned", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_scan_alloc_pinned); + mono_counters_register ("Major scan finalized", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_scan_finalized); + mono_counters_register ("Major scan big objects", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_scan_big_objects); + mono_counters_register ("Major finish gray stack", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_finish_gray_stack); + mono_counters_register ("Major free big objects", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_free_bigobjs); + mono_counters_register ("Major LOS sweep", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_los_sweep); + mono_counters_register ("Major sweep", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_sweep); + mono_counters_register ("Major fragment creation", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_major_fragment_creation); - mono_counters_register ("Number of pinned objects", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_pinned_objects); + mono_counters_register ("Number of pinned objects", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_pinned_objects); #ifdef HEAVY_STATISTICS mono_counters_register ("WBarrier remember pointer", MONO_COUNTER_GC | MONO_COUNTER_INT, &stat_wbarrier_add_to_global_remset); @@ -1968,23 +1974,23 @@ init_stats (void) mono_counters_register ("WBarrier value copy", MONO_COUNTER_GC | MONO_COUNTER_INT, &stat_wbarrier_value_copy); mono_counters_register ("WBarrier object copy", MONO_COUNTER_GC | MONO_COUNTER_INT, &stat_wbarrier_object_copy); - mono_counters_register ("# objects allocated degraded", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_objects_alloced_degraded); - mono_counters_register ("bytes allocated degraded", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_bytes_alloced_degraded); + mono_counters_register ("# objects allocated degraded", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_objects_alloced_degraded); + mono_counters_register ("bytes allocated degraded", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_bytes_alloced_degraded); - mono_counters_register ("# copy_object() called (nursery)", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copy_object_called_nursery); - mono_counters_register ("# objects copied (nursery)", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_objects_copied_nursery); - mono_counters_register ("# copy_object() called (major)", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copy_object_called_major); - mono_counters_register ("# objects copied (major)", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_objects_copied_major); + mono_counters_register ("# copy_object() called (nursery)", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_copy_object_called_nursery); + mono_counters_register ("# objects copied (nursery)", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_objects_copied_nursery); + mono_counters_register ("# copy_object() called (major)", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_copy_object_called_major); + mono_counters_register ("# objects copied (major)", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_objects_copied_major); - mono_counters_register ("# scan_object() called (nursery)", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scan_object_called_nursery); - mono_counters_register ("# scan_object() called (major)", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scan_object_called_major); + mono_counters_register ("# scan_object() called (nursery)", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_scan_object_called_nursery); + mono_counters_register ("# scan_object() called (major)", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_scan_object_called_major); - mono_counters_register ("Slots allocated in vain", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_slots_allocated_in_vain); + mono_counters_register ("Slots allocated in vain", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_slots_allocated_in_vain); - mono_counters_register ("# nursery copy_object() failed from space", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_nursery_copy_object_failed_from_space); - mono_counters_register ("# nursery copy_object() failed forwarded", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_nursery_copy_object_failed_forwarded); - mono_counters_register ("# nursery copy_object() failed pinned", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_nursery_copy_object_failed_pinned); - mono_counters_register ("# nursery copy_object() failed to space", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_nursery_copy_object_failed_to_space); + mono_counters_register ("# nursery copy_object() failed from space", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_nursery_copy_object_failed_from_space); + mono_counters_register ("# nursery copy_object() failed forwarded", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_nursery_copy_object_failed_forwarded); + mono_counters_register ("# nursery copy_object() failed pinned", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_nursery_copy_object_failed_pinned); + mono_counters_register ("# nursery copy_object() failed to space", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_nursery_copy_object_failed_to_space); sgen_nursery_allocator_init_heavy_stats (); sgen_alloc_init_heavy_stats (); @@ -2194,18 +2200,15 @@ check_nursery_is_clean (void) static void init_gray_queue (void) { - if (sgen_collection_is_concurrent ()) { + if (sgen_collection_is_concurrent ()) sgen_workers_init_distribute_gray_queue (); - sgen_gray_object_queue_init_with_alloc_prepare (&gray_queue, NULL, - gray_queue_redirect, sgen_workers_get_distribute_section_gray_queue ()); - } else { - sgen_gray_object_queue_init (&gray_queue, NULL); - } + sgen_gray_object_queue_init (&gray_queue, NULL); } /* - * Collect objects in the nursery. Returns whether to trigger a major - * collection. + * Perform a nursery collection. + * + * Return whether any objects were late-pinned due to being out of memory. */ static gboolean collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark) @@ -2274,6 +2277,13 @@ collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark) gc_stats.minor_gc_count ++; + if (whole_heap_check_before_collection) { + sgen_clear_nursery_fragments (); + sgen_check_whole_heap (finish_up_concurrent_mark); + } + if (consistency_check_at_minor_collection) + sgen_check_consistency (); + MONO_GC_CHECKPOINT_1 (GENERATION_NURSERY); sgen_process_fin_stage_entries (); @@ -2303,16 +2313,6 @@ collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark) MONO_GC_CHECKPOINT_3 (GENERATION_NURSERY); - if (whole_heap_check_before_collection) { - sgen_clear_nursery_fragments (); - sgen_check_whole_heap (finish_up_concurrent_mark); - } - if (consistency_check_at_minor_collection) - sgen_check_consistency (); - - sgen_workers_start_all_workers (); - sgen_workers_start_marking (); - frssjd = sgen_alloc_internal_dynamic (sizeof (FinishRememberedSetScanJobData), INTERNAL_MEM_WORKER_JOB_DATA, TRUE); frssjd->heap_start = sgen_get_nursery_start (); frssjd->heap_end = nursery_next; @@ -2407,9 +2407,7 @@ collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark) * next allocations. */ mono_profiler_gc_event (MONO_GC_EVENT_RECLAIM_START, 0); - fragment_total = sgen_build_nursery_fragments (nursery_section, - nursery_section->pin_queue_start, nursery_section->pin_queue_num_entries, - unpin_queue); + fragment_total = sgen_build_nursery_fragments (nursery_section, unpin_queue); if (!fragment_total) degraded_mode = 1; @@ -2458,7 +2456,7 @@ collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark) objects_pinned = 0; MONO_GC_END (GENERATION_NURSERY); - binary_protocol_collection_end (gc_stats.minor_gc_count - 1, GENERATION_NURSERY); + binary_protocol_collection_end (gc_stats.minor_gc_count - 1, GENERATION_NURSERY, 0, 0); if (check_nursery_objects_pinned && !sgen_minor_collector.is_split) sgen_check_nursery_objects_pinned (unpin_queue != NULL); @@ -2484,7 +2482,7 @@ scan_nursery_objects (ScanCopyContext ctx) } static void -major_copy_or_mark_from_roots (size_t *old_next_pin_slot, gboolean finish_up_concurrent_mark, gboolean scan_mod_union) +major_copy_or_mark_from_roots (size_t *old_next_pin_slot, gboolean start_concurrent_mark, gboolean finish_up_concurrent_mark, gboolean scan_mod_union, gboolean scan_whole_nursery) { LOSObject *bigobj; TV_DECLARE (atv); @@ -2569,17 +2567,6 @@ major_copy_or_mark_from_roots (size_t *old_next_pin_slot, gboolean finish_up_con sgen_optimize_pin_queue (); - /* - * The concurrent collector doesn't move objects, neither on - * the major heap nor in the nursery, so we can mark even - * before pinning has finished. For the non-concurrent - * collector we start the workers after pinning. - */ - if (concurrent_collection_in_progress) { - sgen_workers_start_all_workers (); - sgen_workers_start_marking (); - } - /* * pin_queue now contains all candidate pointers, sorted and * uniqued. We must do two passes now to figure out which @@ -2600,7 +2587,7 @@ major_copy_or_mark_from_roots (size_t *old_next_pin_slot, gboolean finish_up_con SGEN_LOG (6, "Pinning from large objects"); for (bigobj = los_object_list; bigobj; bigobj = bigobj->next) { size_t dummy; - if (sgen_find_optimized_pin_queue_area (bigobj->data, (char*)bigobj->data + sgen_los_object_size (bigobj), &dummy)) { + if (sgen_find_optimized_pin_queue_area (bigobj->data, (char*)bigobj->data + sgen_los_object_size (bigobj), &dummy, &dummy)) { binary_protocol_pin (bigobj->data, (gpointer)LOAD_VTABLE (bigobj->data), safe_object_get_size (((MonoObject*)(bigobj->data)))); #ifdef ENABLE_DTRACE @@ -2633,26 +2620,32 @@ major_copy_or_mark_from_roots (size_t *old_next_pin_slot, gboolean finish_up_con ctx.queue = WORKERS_DISTRIBUTE_GRAY_QUEUE; /* - * Concurrent mark never follows references into the nursery. - * In the start and finish pauses we must scan live nursery - * objects, though. We could simply scan all nursery objects, - * but that would be conservative. The easiest way is to do a - * nursery collection, which copies all live nursery objects - * (except pinned ones, with the simple nursery) to the major - * heap. Scanning the mod union table later will then scan - * those promoted objects, provided they're reachable. Pinned - * objects in the nursery - which we can trivially find in the - * pinning queue - are treated as roots in the mark pauses. + * Concurrent mark never follows references into the nursery. In the start and + * finish pauses we must scan live nursery objects, though. * - * The split nursery complicates the latter part because - * non-pinned objects can survive in the nursery. That's why - * we need to do a full front-to-back scan of the nursery, - * marking all objects. + * In the finish pause we do this conservatively by scanning all nursery objects. + * Previously we would only scan pinned objects here. We assumed that all objects + * that were pinned during the nursery collection immediately preceding this finish + * mark would be pinned again here. Due to the way we get the stack end for the GC + * thread, however, that's not necessarily the case: we scan part of the stack used + * by the GC itself, which changes constantly, so pinning isn't entirely + * deterministic. + * + * The split nursery also complicates things because non-pinned objects can survive + * in the nursery. That's why we need to do a full scan of the nursery for it, too. + * + * In the future we shouldn't do a preceding nursery collection at all and instead + * do the finish pause with promotion from the nursery. + * + * A further complication arises when we have late-pinned objects from the preceding + * nursery collection. Those are the result of being out of memory when trying to + * evacuate objects. They won't be found from the roots, so we just scan the whole + * nursery. * * Non-concurrent mark evacuates from the nursery, so it's * sufficient to just scan pinned nursery objects. */ - if (concurrent_collection_in_progress && sgen_minor_collector.is_split) { + if (scan_whole_nursery || finish_up_concurrent_mark || (concurrent_collection_in_progress && sgen_minor_collector.is_split)) { scan_nursery_objects (ctx); } else { pin_objects_in_nursery (ctx); @@ -2671,6 +2664,17 @@ major_copy_or_mark_from_roots (size_t *old_next_pin_slot, gboolean finish_up_con major_collector.init_to_space (); + /* + * The concurrent collector doesn't move objects, neither on + * the major heap nor in the nursery, so we can mark even + * before pinning has finished. For the non-concurrent + * collector we start the workers after pinning. + */ + if (start_concurrent_mark) { + sgen_workers_start_all_workers (); + gray_queue_enable_redirect (WORKERS_DISTRIBUTE_GRAY_QUEUE); + } + #ifdef SGEN_DEBUG_INTERNAL_ALLOC main_gc_thread = mono_native_thread_self (); #endif @@ -2733,16 +2737,25 @@ major_copy_or_mark_from_roots (size_t *old_next_pin_slot, gboolean finish_up_con TV_GETTIME (btv); time_major_scan_big_objects += TV_ELAPSED (atv, btv); +} - if (concurrent_collection_in_progress) { - /* prepare the pin queue for the next collection */ - sgen_finish_pinning (); +static void +major_finish_copy_or_mark (void) +{ + if (!concurrent_collection_in_progress) + return; - sgen_pin_stats_reset (); + /* + * Prepare the pin queue for the next collection. Since pinning runs on the worker + * threads we must wait for the jobs to finish before we can reset it. + */ + sgen_workers_wait_for_jobs_finished (); + sgen_finish_pinning (); - if (do_concurrent_checks) - check_nursery_is_clean (); - } + sgen_pin_stats_reset (); + + if (do_concurrent_checks) + check_nursery_is_clean (); } static void @@ -2785,7 +2798,8 @@ major_start_collection (gboolean concurrent, size_t *old_next_pin_slot) if (major_collector.start_major_collection) major_collector.start_major_collection (); - major_copy_or_mark_from_roots (old_next_pin_slot, FALSE, FALSE); + major_copy_or_mark_from_roots (old_next_pin_slot, concurrent, FALSE, FALSE, FALSE); + major_finish_copy_or_mark (); } static void @@ -2796,43 +2810,39 @@ wait_for_workers_to_finish (void) } static void -join_workers (void) -{ - if (concurrent_collection_in_progress) { - gray_queue_redirect (&gray_queue); - sgen_workers_join (); - } - - g_assert (sgen_gray_object_queue_is_empty (&gray_queue)); - -#ifdef SGEN_DEBUG_INTERNAL_ALLOC - main_gc_thread = NULL; -#endif -} - -static void -major_finish_collection (const char *reason, size_t old_next_pin_slot, gboolean scan_mod_union) +major_finish_collection (const char *reason, size_t old_next_pin_slot, gboolean scan_mod_union, gboolean scan_whole_nursery) { + ScannedObjectCounts counts; LOSObject *bigobj, *prevbo; TV_DECLARE (atv); TV_DECLARE (btv); TV_GETTIME (btv); - if (concurrent_collection_in_progress) - join_workers (); - if (concurrent_collection_in_progress) { + sgen_workers_signal_start_nursery_collection_and_wait (); + current_object_ops = major_collector.major_concurrent_ops; - major_copy_or_mark_from_roots (NULL, TRUE, scan_mod_union); - join_workers (); + major_copy_or_mark_from_roots (NULL, FALSE, TRUE, scan_mod_union, scan_whole_nursery); - g_assert (sgen_gray_object_queue_is_empty (&gray_queue)); + sgen_workers_signal_finish_nursery_collection (); + + major_finish_copy_or_mark (); + gray_queue_enable_redirect (WORKERS_DISTRIBUTE_GRAY_QUEUE); + + sgen_workers_join (); + + SGEN_ASSERT (0, sgen_gray_object_queue_is_empty (&gray_queue), "Why is the gray queue not empty after workers have finished working?"); + +#ifdef SGEN_DEBUG_INTERNAL_ALLOC + main_gc_thread = NULL; +#endif if (do_concurrent_checks) check_nursery_is_clean (); } else { + SGEN_ASSERT (0, !scan_whole_nursery, "scan_whole_nursery only applies to concurrent collections"); current_object_ops = major_collector.major_ops; } @@ -2849,6 +2859,8 @@ major_finish_collection (const char *reason, size_t old_next_pin_slot, gboolean TV_GETTIME (atv); time_major_finish_gray_stack += TV_ELAPSED (btv, atv); + SGEN_ASSERT (0, sgen_workers_all_done (), "Can't have workers working after joining"); + /* * The (single-threaded) finalization code might have done * some copying/marking so we can only reset the GC thread's @@ -2860,8 +2872,20 @@ major_finish_collection (const char *reason, size_t old_next_pin_slot, gboolean if (objects_pinned) { g_assert (!concurrent_collection_in_progress); - /*This is slow, but we just OOM'd*/ + /* + * This is slow, but we just OOM'd. + * + * See comment at `sgen_pin_queue_clear_discarded_entries` for how the pin + * queue is laid out at this point. + */ sgen_pin_queue_clear_discarded_entries (nursery_section, old_next_pin_slot); + /* + * We need to reestablish all pinned nursery objects in the pin queue + * because they're needed for fragment creation. Unpinning happens by + * walking the whole queue, so it's not necessary to reestablish where major + * heap block pins are - all we care is that they're still in there + * somewhere. + */ sgen_optimize_pin_queue (); sgen_find_section_pin_queue_start_end (nursery_section); objects_pinned = 0; @@ -2870,8 +2894,33 @@ major_finish_collection (const char *reason, size_t old_next_pin_slot, gboolean reset_heap_boundaries (); sgen_update_heap_boundaries ((mword)sgen_get_nursery_start (), (mword)sgen_get_nursery_end ()); + if (!concurrent_collection_in_progress) { + /* walk the pin_queue, build up the fragment list of free memory, unmark + * pinned objects as we go, memzero() the empty fragments so they are ready for the + * next allocations. + */ + if (!sgen_build_nursery_fragments (nursery_section, NULL)) + degraded_mode = 1; + + /* prepare the pin queue for the next collection */ + sgen_finish_pinning (); + + /* Clear TLABs for all threads */ + sgen_clear_tlabs (); + + sgen_pin_stats_reset (); + } + + if (concurrent_collection_in_progress) + sgen_cement_concurrent_finish (); + sgen_cement_clear_below_threshold (); + if (check_mark_bits_after_major_collection) - sgen_check_major_heap_marked (); + sgen_check_heap_marked (concurrent_collection_in_progress); + + TV_GETTIME (btv); + time_major_fragment_creation += TV_ELAPSED (atv, btv); + MONO_GC_SWEEP_BEGIN (GENERATION_OLD, !major_collector.sweeps_lazily); @@ -2898,44 +2947,20 @@ major_finish_collection (const char *reason, size_t old_next_pin_slot, gboolean bigobj = bigobj->next; } - TV_GETTIME (btv); - time_major_free_bigobjs += TV_ELAPSED (atv, btv); + TV_GETTIME (atv); + time_major_free_bigobjs += TV_ELAPSED (btv, atv); sgen_los_sweep (); - TV_GETTIME (atv); - time_major_los_sweep += TV_ELAPSED (btv, atv); + TV_GETTIME (btv); + time_major_los_sweep += TV_ELAPSED (atv, btv); major_collector.sweep (); MONO_GC_SWEEP_END (GENERATION_OLD, !major_collector.sweeps_lazily); - TV_GETTIME (btv); - time_major_sweep += TV_ELAPSED (atv, btv); - - if (!concurrent_collection_in_progress) { - /* walk the pin_queue, build up the fragment list of free memory, unmark - * pinned objects as we go, memzero() the empty fragments so they are ready for the - * next allocations. - */ - if (!sgen_build_nursery_fragments (nursery_section, nursery_section->pin_queue_start, nursery_section->pin_queue_num_entries, NULL)) - degraded_mode = 1; - - /* prepare the pin queue for the next collection */ - sgen_finish_pinning (); - - /* Clear TLABs for all threads */ - sgen_clear_tlabs (); - - sgen_pin_stats_reset (); - } - - if (concurrent_collection_in_progress) - sgen_cement_concurrent_finish (); - sgen_cement_clear_below_threshold (); - TV_GETTIME (atv); - time_major_fragment_creation += TV_ELAPSED (btv, atv); + time_major_sweep += TV_ELAPSED (btv, atv); if (heap_dump_file) dump_heap ("major", gc_stats.major_gc_count - 1, reason); @@ -2950,10 +2975,12 @@ major_finish_collection (const char *reason, size_t old_next_pin_slot, gboolean sgen_memgov_major_collection_end (); current_collection_generation = -1; - major_collector.finish_major_collection (); + memset (&counts, 0, sizeof (ScannedObjectCounts)); + major_collector.finish_major_collection (&counts); g_assert (sgen_section_gray_queue_is_empty (sgen_workers_get_distribute_section_gray_queue ())); + SGEN_ASSERT (0, sgen_workers_all_done (), "Can't have workers working after major collection has finished"); if (concurrent_collection_in_progress) concurrent_collection_in_progress = FALSE; @@ -2964,7 +2991,7 @@ major_finish_collection (const char *reason, size_t old_next_pin_slot, gboolean //consistency_check (); MONO_GC_END (GENERATION_OLD); - binary_protocol_collection_end (gc_stats.major_gc_count - 1, GENERATION_OLD); + binary_protocol_collection_end (gc_stats.major_gc_count - 1, GENERATION_OLD, counts.num_scanned_objects, counts.num_unique_scanned_objects); } static gboolean @@ -2986,7 +3013,7 @@ major_do_collection (const char *reason) TV_GETTIME (time_start); major_start_collection (FALSE, &old_next_pin_slot); - major_finish_collection (reason, old_next_pin_slot, FALSE); + major_finish_collection (reason, old_next_pin_slot, FALSE, FALSE); TV_GETTIME (time_end); gc_stats.major_gc_time += TV_ELAPSED (time_start, time_end); @@ -3021,7 +3048,6 @@ major_start_concurrent_collection (const char *reason) major_start_collection (TRUE, NULL); gray_queue_redirect (&gray_queue); - sgen_workers_wait_for_jobs (); num_objects_marked = major_collector.get_and_reset_num_major_objects_marked (); MONO_GC_CONCURRENT_START_END (GENERATION_OLD, num_objects_marked); @@ -3032,32 +3058,49 @@ major_start_concurrent_collection (const char *reason) current_collection_generation = -1; } +/* + * Returns whether the major collection has finished. + */ static gboolean -major_update_or_finish_concurrent_collection (gboolean force_finish) +major_should_finish_concurrent_collection (void) +{ + SGEN_ASSERT (0, sgen_gray_object_queue_is_empty (&gray_queue), "Why is the gray queue not empty before we have started doing anything?"); + return sgen_workers_all_done (); +} + +static void +major_update_concurrent_collection (void) { TV_DECLARE (total_start); TV_DECLARE (total_end); + + TV_GETTIME (total_start); + + MONO_GC_CONCURRENT_UPDATE_FINISH_BEGIN (GENERATION_OLD, major_collector.get_and_reset_num_major_objects_marked ()); + binary_protocol_concurrent_update (); + + major_collector.update_cardtable_mod_union (); + sgen_los_update_cardtable_mod_union (); + + MONO_GC_CONCURRENT_UPDATE_END (GENERATION_OLD, major_collector.get_and_reset_num_major_objects_marked ()); + + TV_GETTIME (total_end); + gc_stats.major_gc_time += TV_ELAPSED (total_start, total_end); +} + +static void +major_finish_concurrent_collection (void) +{ + TV_DECLARE (total_start); + TV_DECLARE (total_end); + gboolean late_pinned; SgenGrayQueue unpin_queue; memset (&unpin_queue, 0, sizeof (unpin_queue)); TV_GETTIME (total_start); MONO_GC_CONCURRENT_UPDATE_FINISH_BEGIN (GENERATION_OLD, major_collector.get_and_reset_num_major_objects_marked ()); - binary_protocol_concurrent_update_finish (); - - g_assert (sgen_gray_object_queue_is_empty (&gray_queue)); - - if (!force_finish && !sgen_workers_all_done ()) { - major_collector.update_cardtable_mod_union (); - sgen_los_update_cardtable_mod_union (); - - MONO_GC_CONCURRENT_UPDATE_END (GENERATION_OLD, major_collector.get_and_reset_num_major_objects_marked ()); - - TV_GETTIME (total_end); - gc_stats.major_gc_time += TV_ELAPSED (total_start, total_end); - - return FALSE; - } + binary_protocol_concurrent_finish (); /* * The major collector can add global remsets which are processed in the finishing @@ -3073,13 +3116,13 @@ major_update_or_finish_concurrent_collection (gboolean force_finish) major_collector.update_cardtable_mod_union (); sgen_los_update_cardtable_mod_union (); - collect_nursery (&unpin_queue, TRUE); + late_pinned = collect_nursery (&unpin_queue, TRUE); if (mod_union_consistency_check) sgen_check_mod_union_consistency (); current_collection_generation = GENERATION_OLD; - major_finish_collection ("finishing", -1, TRUE); + major_finish_collection ("finishing", -1, TRUE, late_pinned); if (whole_heap_check_before_collection) sgen_check_whole_heap (FALSE); @@ -3093,8 +3136,6 @@ major_update_or_finish_concurrent_collection (gboolean force_finish) gc_stats.major_gc_time += TV_ELAPSED (total_start, total_end) - TV_ELAPSED (last_minor_collection_start_tv, last_minor_collection_end_tv); current_collection_generation = -1; - - return TRUE; } /* @@ -3147,6 +3188,7 @@ sgen_ensure_free_space (size_t size) void sgen_perform_collection (size_t requested_size, int generation_to_collect, const char *reason, gboolean wait_to_finish) { + TV_DECLARE (gc_start); TV_DECLARE (gc_end); TV_DECLARE (gc_total_start); TV_DECLARE (gc_total_end); @@ -3159,67 +3201,94 @@ sgen_perform_collection (size_t requested_size, int generation_to_collect, const if (wait_to_finish) binary_protocol_collection_force (generation_to_collect); - g_assert (generation_to_collect == GENERATION_NURSERY || generation_to_collect == GENERATION_OLD); + SGEN_ASSERT (0, generation_to_collect == GENERATION_NURSERY || generation_to_collect == GENERATION_OLD, "What generation is this?"); - memset (infos, 0, sizeof (infos)); mono_profiler_gc_event (MONO_GC_EVENT_START, generation_to_collect); - infos [0].generation = generation_to_collect; - infos [0].reason = reason; - infos [0].is_overflow = FALSE; - TV_GETTIME (infos [0].total_time); - infos [1].generation = -1; + TV_GETTIME (gc_start); sgen_stop_world (generation_to_collect); TV_GETTIME (gc_total_start); if (concurrent_collection_in_progress) { - if (major_update_or_finish_concurrent_collection (wait_to_finish && generation_to_collect == GENERATION_OLD)) { + /* + * We update the concurrent collection. If it finished, we're done. If + * not, and we've been asked to do a nursery collection, we do that. + */ + gboolean finish = major_should_finish_concurrent_collection () || (wait_to_finish && generation_to_collect == GENERATION_OLD); + + if (finish) { + major_finish_concurrent_collection (); oldest_generation_collected = GENERATION_OLD; - goto done; - } - if (generation_to_collect == GENERATION_OLD) - goto done; - } else { - if (generation_to_collect == GENERATION_OLD && - allow_synchronous_major && - major_collector.want_synchronous_collection && - *major_collector.want_synchronous_collection) { - wait_to_finish = TRUE; + } else { + sgen_workers_signal_start_nursery_collection_and_wait (); + + major_update_concurrent_collection (); + if (generation_to_collect == GENERATION_NURSERY) + collect_nursery (NULL, FALSE); + + sgen_workers_signal_finish_nursery_collection (); } + + goto done; } - //FIXME extract overflow reason + /* + * If we've been asked to do a major collection, and the major collector wants to + * run synchronously (to evacuate), we set the flag to do that. + */ + if (generation_to_collect == GENERATION_OLD && + allow_synchronous_major && + major_collector.want_synchronous_collection && + *major_collector.want_synchronous_collection) { + wait_to_finish = TRUE; + } + + SGEN_ASSERT (0, !concurrent_collection_in_progress, "Why did this not get handled above?"); + + /* + * There's no concurrent collection in progress. Collect the generation we're asked + * to collect. If the major collector is concurrent and we're not forced to wait, + * start a concurrent collection. + */ + // FIXME: extract overflow reason if (generation_to_collect == GENERATION_NURSERY) { if (collect_nursery (NULL, FALSE)) { overflow_generation_to_collect = GENERATION_OLD; overflow_reason = "Minor overflow"; } } else { - if (major_collector.is_concurrent) { - g_assert (!concurrent_collection_in_progress); - if (!wait_to_finish) - collect_nursery (NULL, FALSE); - } - if (major_collector.is_concurrent && !wait_to_finish) { + collect_nursery (NULL, FALSE); major_start_concurrent_collection (reason); // FIXME: set infos[0] properly goto done; - } else { - if (major_do_collection (reason)) { - overflow_generation_to_collect = GENERATION_NURSERY; - overflow_reason = "Excessive pinning"; - } + } + + if (major_do_collection (reason)) { + overflow_generation_to_collect = GENERATION_NURSERY; + overflow_reason = "Excessive pinning"; } } TV_GETTIME (gc_end); - infos [0].total_time = SGEN_TV_ELAPSED (infos [0].total_time, gc_end); + memset (infos, 0, sizeof (infos)); + infos [0].generation = generation_to_collect; + infos [0].reason = reason; + infos [0].is_overflow = FALSE; + infos [1].generation = -1; + infos [0].total_time = SGEN_TV_ELAPSED (gc_start, gc_end); + + SGEN_ASSERT (0, !concurrent_collection_in_progress, "Why did this not get handled above?"); + + if (overflow_generation_to_collect != -1) { + /* + * We need to do an overflow collection, either because we ran out of memory + * or the nursery is fully pinned. + */ - if (!major_collector.is_concurrent && overflow_generation_to_collect != -1) { mono_profiler_gc_event (MONO_GC_EVENT_START, overflow_generation_to_collect); infos [1].generation = overflow_generation_to_collect; infos [1].reason = overflow_reason; @@ -3425,7 +3494,10 @@ null_ephemerons_for_domain (MonoDomain *domain) while (current) { MonoObject *object = (MonoObject*)current->array; - if (object && !object->vtable) { + if (object) + SGEN_ASSERT (0, object->vtable, "Can't have objects without vtables."); + + if (object && object->vtable->domain == domain) { EphemeronLinkNode *tmp = current; if (prev) @@ -3620,7 +3692,8 @@ mono_gc_invoke_finalizers (void) count++; /* the object is on the stack so it is pinned */ /*g_print ("Calling finalizer for object: %p (%s)\n", entry->object, safe_name (entry->object));*/ - mono_gc_run_finalize (obj, NULL); + if (!do_not_finalize) + mono_gc_run_finalize (obj, NULL); } g_assert (!entry); return count; @@ -4124,7 +4197,7 @@ void mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value) { SGEN_LOG (8, "Wbarrier store at %p to %p (%s)", ptr, value, value ? safe_name (value) : "null"); - *(void**)ptr = value; + SGEN_UPDATE_REFERENCE_ALLOW_NULL (ptr, value); if (ptr_in_nursery (value)) mono_gc_wbarrier_generic_nostore (ptr); sgen_dummy_use (value); @@ -4157,7 +4230,7 @@ void mono_gc_wbarrier_value_copy_bitmap (gpointer _dest, gpointer _src, int size if (bitmap & 0x1) mono_gc_wbarrier_generic_store (dest, (MonoObject*)*src); else - *dest = *src; + SGEN_UPDATE_REFERENCE_ALLOW_NULL (dest, *src); ++src; ++dest; size -= SIZEOF_VOID_P; @@ -4577,6 +4650,8 @@ mono_gc_base_init (void) gboolean have_split_nursery = FALSE; gboolean cement_enabled = TRUE; + mono_counters_init (); + do { result = InterlockedCompareExchange (&gc_initialized, -1, 0); switch (result) { @@ -4615,7 +4690,6 @@ mono_gc_base_init (void) mono_threads_init (&cb, sizeof (SgenThreadInfo)); LOCK_INIT (sgen_interruption_mutex); - LOCK_INIT (pin_queue_mutex); if ((env = g_getenv (MONO_GC_PARAMS_NAME))) { opts = g_strsplit (env, ",", -1); @@ -4991,6 +5065,8 @@ mono_gc_base_init (void) do_verify_nursery = TRUE; sgen_set_use_managed_allocator (FALSE); enable_nursery_canaries = TRUE; + } else if (!strcmp (opt, "do-not-finalize")) { + do_not_finalize = TRUE; } else if (!sgen_bridge_handle_gc_debug (opt)) { sgen_env_var_error (MONO_GC_DEBUG_NAME, "Ignoring.", "Unknown option `%s`.", opt); @@ -5021,6 +5097,7 @@ mono_gc_base_init (void) fprintf (stderr, " heap-dump=\n"); fprintf (stderr, " binary-protocol=[:]\n"); fprintf (stderr, " nursery-canaries\n"); + fprintf (stderr, " do-not-finalize\n"); sgen_bridge_print_gc_debug_usage (); fprintf (stderr, "\n"); @@ -5030,6 +5107,9 @@ mono_gc_base_init (void) g_strfreev (opts); } + if (check_mark_bits_after_major_collection) + nursery_clear_policy = CLEAR_AT_GC; + if (major_collector.post_param_init) major_collector.post_param_init (&major_collector); @@ -5264,7 +5344,8 @@ sgen_get_array_fill_vtable (void) { if (!array_fill_vtable) { static MonoClass klass; - static MonoVTable vtable; + static char _vtable[sizeof(MonoVTable)+8]; + MonoVTable* vtable = (MonoVTable*) ALIGN_TO(_vtable, 8); gsize bmap; MonoDomain *domain = mono_get_root_domain (); @@ -5276,12 +5357,12 @@ sgen_get_array_fill_vtable (void) klass.sizes.element_size = 1; klass.name = "array_filler_type"; - vtable.klass = &klass; + vtable->klass = &klass; bmap = 0; - vtable.gc_descr = mono_gc_make_descr_for_array (TRUE, &bmap, 0, 1); - vtable.rank = 1; + vtable->gc_descr = mono_gc_make_descr_for_array (TRUE, &bmap, 0, 1); + vtable->rank = 1; - array_fill_vtable = &vtable; + array_fill_vtable = vtable; } return array_fill_vtable; } diff --git a/mta-mono/vendor/mono/metadata/sgen-gc.h b/mta-mono/vendor/mono/metadata/sgen-gc.h index ece9af2..2bc393a 100644 --- a/mta-mono/vendor/mono/metadata/sgen-gc.h +++ b/mta-mono/vendor/mono/metadata/sgen-gc.h @@ -34,7 +34,6 @@ typedef struct _SgenThreadInfo SgenThreadInfo; #ifdef HAVE_PTHREAD_H #include #endif -#include #include #include #include @@ -67,7 +66,6 @@ NurseryClearPolicy sgen_get_nursery_clear_policy (void) MONO_INTERNAL; #define SGEN_TV_DECLARE(name) gint64 name #define SGEN_TV_GETTIME(tv) tv = mono_100ns_ticks () #define SGEN_TV_ELAPSED(start,end) (int)((end-start)) -#define SGEN_TV_ELAPSED_MS(start,end) ((SGEN_TV_ELAPSED((start),(end)) + 5000) / 10000) #if !defined(__MACH__) && !MONO_MACH_ARCH_SUPPORTED && defined(HAVE_PTHREAD_KILL) #define SGEN_POSIX_STW 1 @@ -144,8 +142,8 @@ struct _GCMemSection { */ char **scan_starts; /* in major collections indexes in the pin_queue for objects that pin this section */ - void **pin_queue_start; - size_t pin_queue_num_entries; + size_t pin_queue_first_entry; + size_t pin_queue_last_entry; size_t num_scan_start; }; @@ -160,7 +158,6 @@ struct _GCMemSection { mono_mutex_lock (&gc_mutex); \ MONO_GC_LOCKED (); \ } while (0) -#define TRYLOCK_GC (mono_mutex_trylock (&gc_mutex) == 0) #define UNLOCK_GC do { sgen_gc_unlock (); } while (0) extern LOCK_DECLARE (sgen_interruption_mutex); @@ -190,10 +187,10 @@ extern LOCK_DECLARE (sgen_interruption_mutex); #endif #ifdef HEAVY_STATISTICS -extern long long stat_objects_alloced_degraded; -extern long long stat_bytes_alloced_degraded; -extern long long stat_copy_object_called_major; -extern long long stat_objects_copied_major; +extern guint64 stat_objects_alloced_degraded; +extern guint64 stat_bytes_alloced_degraded; +extern guint64 stat_copy_object_called_major; +extern guint64 stat_objects_copied_major; #endif #define SGEN_ASSERT(level, a, ...) do { \ @@ -213,11 +210,6 @@ extern long long stat_objects_copied_major; mono_gc_printf (gc_debug_file, format, ##__VA_ARGS__); \ } } while (0) -#define SGEN_LOG_DO(level, fun) do { \ - if (G_UNLIKELY ((level) <= SGEN_MAX_DEBUG_LEVEL && (level) <= gc_debug_level)) { \ - fun; \ -} } while (0) - extern int gc_debug_level; extern FILE* gc_debug_file; @@ -310,27 +302,37 @@ typedef struct { mword desc; } GCVTable; -/* these bits are set in the object vtable: we could merge them since an object can be - * either pinned or forwarded but not both. - * We store them in the vtable slot because the bits are used in the sync block for - * other purposes: if we merge them and alloc the sync blocks aligned to 8 bytes, we can change +/* + * We use the lowest three bits in the vtable pointer of objects to tag whether they're + * forwarded, pinned, and/or cemented. These are the valid states: + * + * | State | bits | + * |------------------+------+ + * | default | 000 | + * | forwarded | 001 | + * | pinned | 010 | + * | pinned, cemented | 110 | + * + * We store them in the vtable slot because the bits are used in the sync block for other + * purposes: if we merge them and alloc the sync blocks aligned to 8 bytes, we can change * this and use bit 3 in the syncblock (with the lower two bits both set for forwarded, that * would be an invalid combination for the monitor and hash code). - * The values are already shifted. - * The forwarding address is stored in the sync block. */ -#define SGEN_VTABLE_BITS_MASK 0x3 - #include "sgen-tagged-pointer.h" +#define SGEN_VTABLE_BITS_MASK SGEN_TAGGED_POINTER_MASK + #define SGEN_POINTER_IS_TAGGED_FORWARDED(p) SGEN_POINTER_IS_TAGGED_1((p)) -#define SGEN_POINTER_TAG_FORWARDED(p) SGEN_POINTER_TAG_1((p)) +#define SGEN_POINTER_TAG_FORWARDED(p) SGEN_POINTER_TAG_1((p)) #define SGEN_POINTER_IS_TAGGED_PINNED(p) SGEN_POINTER_IS_TAGGED_2((p)) -#define SGEN_POINTER_TAG_PINNED(p) SGEN_POINTER_TAG_2((p)) +#define SGEN_POINTER_TAG_PINNED(p) SGEN_POINTER_TAG_2((p)) -#define SGEN_POINTER_UNTAG_VTABLE(p) SGEN_POINTER_UNTAG_12((p)) +#define SGEN_POINTER_IS_TAGGED_CEMENTED(p) SGEN_POINTER_IS_TAGGED_4((p)) +#define SGEN_POINTER_TAG_CEMENTED(p) SGEN_POINTER_TAG_4((p)) + +#define SGEN_POINTER_UNTAG_VTABLE(p) SGEN_POINTER_UNTAG_ALL((p)) /* returns NULL if not forwarded, or the forwarded address */ #define SGEN_VTABLE_IS_FORWARDED(vtable) (SGEN_POINTER_IS_TAGGED_FORWARDED ((vtable)) ? SGEN_POINTER_UNTAG_VTABLE ((vtable)) : NULL) @@ -339,6 +341,8 @@ typedef struct { #define SGEN_VTABLE_IS_PINNED(vtable) SGEN_POINTER_IS_TAGGED_PINNED ((vtable)) #define SGEN_OBJECT_IS_PINNED(obj) (SGEN_VTABLE_IS_PINNED (((mword*)(obj))[0])) +#define SGEN_OBJECT_IS_CEMENTED(obj) (SGEN_POINTER_IS_TAGGED_CEMENTED (((mword*)(obj))[0])) + /* set the forwarded address fw_addr for object obj */ #define SGEN_FORWARD_OBJECT(obj,fw_addr) do { \ *(void**)(obj) = SGEN_POINTER_TAG_FORWARDED ((fw_addr)); \ @@ -346,15 +350,19 @@ typedef struct { #define SGEN_PIN_OBJECT(obj) do { \ *(void**)(obj) = SGEN_POINTER_TAG_PINNED (*(void**)(obj)); \ } while (0) +#define SGEN_CEMENT_OBJECT(obj) do { \ + *(void**)(obj) = SGEN_POINTER_TAG_CEMENTED (*(void**)(obj)); \ + } while (0) +/* Unpins and uncements */ #define SGEN_UNPIN_OBJECT(obj) do { \ - *(void**)(obj) = SGEN_POINTER_UNTAG_2 (*(void**)(obj)); \ + *(void**)(obj) = SGEN_POINTER_UNTAG_VTABLE (*(void**)(obj)); \ } while (0) /* * Since we set bits in the vtable, use the macro to load it from the pointer to * an object that is potentially pinned. */ -#define SGEN_LOAD_VTABLE(addr) SGEN_POINTER_UNTAG_12 (*(void**)(addr)) +#define SGEN_LOAD_VTABLE(addr) SGEN_POINTER_UNTAG_ALL (*(void**)(addr)) /* List of what each bit on of the vtable gc bits means. @@ -437,6 +445,7 @@ enum { INTERNAL_MEM_TOGGLEREF_DATA, INTERNAL_MEM_CARDTABLE_MOD_UNION, INTERNAL_MEM_BINARY_PROTOCOL, + INTERNAL_MEM_TEMPORARY, INTERNAL_MEM_MAX }; @@ -486,10 +495,6 @@ void sgen_free_internal (void *addr, int type) MONO_INTERNAL; void* sgen_alloc_internal_dynamic (size_t size, int type, gboolean assert_on_failure) MONO_INTERNAL; void sgen_free_internal_dynamic (void *addr, size_t size, int type) MONO_INTERNAL; -void** sgen_find_optimized_pin_queue_area (void *start, void *end, size_t *num) MONO_INTERNAL; -void sgen_find_section_pin_queue_start_end (GCMemSection *section) MONO_INTERNAL; -void sgen_pin_objects_in_section (GCMemSection *section, ScanCopyContext ctx) MONO_INTERNAL; - void sgen_pin_stats_register_object (char *obj, size_t size); void sgen_pin_stats_register_global_remset (char *obj); void sgen_pin_stats_print_class_stats (void); @@ -613,6 +618,27 @@ extern SgenMinorCollector sgen_minor_collector; void sgen_simple_nursery_init (SgenMinorCollector *collector) MONO_INTERNAL; void sgen_split_nursery_init (SgenMinorCollector *collector) MONO_INTERNAL; +/* Updating references */ + +#ifdef SGEN_CHECK_UPDATE_REFERENCE +static inline void +sgen_update_reference (void **p, void *o, gboolean allow_null) +{ + if (!allow_null) + SGEN_ASSERT (0, o, "Cannot update a reference with a NULL pointer"); + SGEN_ASSERT (0, !sgen_is_worker_thread (mono_native_thread_id_get ()), "Can't update a reference in the worker thread"); + *p = o; +} + +#define SGEN_UPDATE_REFERENCE_ALLOW_NULL(p,o) sgen_update_reference ((void**)(p), (void*)(o), TRUE) +#define SGEN_UPDATE_REFERENCE(p,o) sgen_update_reference ((void**)(p), (void*)(o), FALSE) +#else +#define SGEN_UPDATE_REFERENCE_ALLOW_NULL(p,o) (*(void**)(p) = (void*)(o)) +#define SGEN_UPDATE_REFERENCE(p,o) SGEN_UPDATE_REFERENCE_ALLOW_NULL ((p), (o)) +#endif + +/* Major collector */ + typedef void (*sgen_cardtable_block_callback) (mword start, mword size); void sgen_major_collector_iterate_live_block_ranges (sgen_cardtable_block_callback callback) MONO_INTERNAL; @@ -626,6 +652,12 @@ typedef enum { ITERATE_OBJECTS_SWEEP_ALL = ITERATE_OBJECTS_SWEEP | ITERATE_OBJECTS_NON_PINNED | ITERATE_OBJECTS_PINNED } IterateObjectsFlags; +typedef struct +{ + size_t num_scanned_objects; + size_t num_unique_scanned_objects; +} ScannedObjectCounts; + typedef struct _SgenMajorCollector SgenMajorCollector; struct _SgenMajorCollector { size_t section_size; @@ -671,7 +703,8 @@ struct _SgenMajorCollector { void (*start_nursery_collection) (void); void (*finish_nursery_collection) (void); void (*start_major_collection) (void); - void (*finish_major_collection) (void); + void (*finish_major_collection) (ScannedObjectCounts *counts); + gboolean (*drain_gray_stack) (ScanCopyContext ctx); void (*have_computed_minor_collection_allowance) (void); gboolean (*ptr_is_in_non_pinned_space) (char *ptr, char **start); gboolean (*obj_is_from_pinned_alloc) (char *obj); @@ -731,7 +764,7 @@ slow_object_get_size (MonoVTable *vtable, MonoObject* o) * mono_array_length_fast not using the object's vtable. */ if (klass == mono_defaults.string_class) { - return sizeof (MonoString) + 2 * mono_string_length_fast ((MonoString*) o) + 2; + return G_STRUCT_OFFSET (MonoString, chars) + 2 * mono_string_length_fast ((MonoString*) o) + 2; } else if (klass->rank) { MonoArray *array = (MonoArray*)o; size_t size = sizeof (MonoArray) + klass->sizes.element_size * mono_array_length_fast (array); @@ -757,7 +790,7 @@ static inline mword sgen_obj_get_descriptor (char *obj) { MonoVTable *vtable = ((MonoObject*)obj)->vtable; - SGEN_ASSERT (0, !SGEN_POINTER_IS_TAGGED_1_OR_2 (vtable), "Object can't be tagged"); + SGEN_ASSERT (9, !SGEN_POINTER_IS_TAGGED_ANY (vtable), "Object can't be tagged"); return sgen_vtable_get_descriptor (vtable); } @@ -773,23 +806,28 @@ sgen_obj_get_descriptor_safe (char *obj) * vtable field, is not intact. This is necessary for the parallel * collector. */ -static inline mword +static MONO_NEVER_INLINE mword sgen_par_object_get_size (MonoVTable *vtable, MonoObject* o) { mword descr = (mword)vtable->gc_descr; - mword type = descr & 0x7; + mword type = descr & DESC_TYPE_MASK; - if (type == DESC_TYPE_RUN_LENGTH || type == DESC_TYPE_SMALL_BITMAP) { + if (type == DESC_TYPE_RUN_LENGTH || type == DESC_TYPE_SMALL_PTRFREE) { mword size = descr & 0xfff8; - if (size == 0) /* This is used to encode a string */ - return sizeof (MonoString) + 2 * mono_string_length_fast ((MonoString*) o) + 2; + SGEN_ASSERT (9, size >= sizeof (MonoObject), "Run length object size to small"); return size; + } else if (descr == SGEN_DESC_STRING) { + return G_STRUCT_OFFSET (MonoString, chars) + 2 * mono_string_length_fast ((MonoString*) o) + 2; } else if (type == DESC_TYPE_VECTOR) { int element_size = ((descr) >> VECTOR_ELSIZE_SHIFT) & MAX_ELEMENT_SIZE; MonoArray *array = (MonoArray*)o; size_t size = sizeof (MonoArray) + element_size * mono_array_length_fast (array); - if (descr & VECTOR_KIND_ARRAY) { + /* + * Non-vector arrays with a single dimension whose lower bound is zero are + * allocated without bounds. + */ + if ((descr & VECTOR_KIND_ARRAY) && array->bounds) { size += sizeof (mono_array_size_t) - 1; size &= ~(sizeof (mono_array_size_t) - 1); size += sizeof (MonoArrayBounds) * vtable->klass->rank; @@ -978,7 +1016,7 @@ gboolean sgen_los_object_is_pinned (char *obj) MONO_INTERNAL; void sgen_clear_nursery_fragments (void) MONO_INTERNAL; void sgen_nursery_allocator_prepare_for_pinning (void) MONO_INTERNAL; void sgen_nursery_allocator_set_nursery_bounds (char *nursery_start, char *nursery_end) MONO_INTERNAL; -mword sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_t num_entries, SgenGrayQueue *unpin_queue) MONO_INTERNAL; +mword sgen_build_nursery_fragments (GCMemSection *nursery_section, SgenGrayQueue *unpin_queue) MONO_INTERNAL; void sgen_init_nursery_allocator (void) MONO_INTERNAL; void sgen_nursery_allocator_init_heavy_stats (void) MONO_INTERNAL; void sgen_alloc_init_heavy_stats (void) MONO_INTERNAL; @@ -1123,7 +1161,7 @@ void sgen_check_major_refs (void); void sgen_check_whole_heap (gboolean allow_missing_pinning); void sgen_check_whole_heap_stw (void) MONO_INTERNAL; void sgen_check_objref (char *obj); -void sgen_check_major_heap_marked (void) MONO_INTERNAL; +void sgen_check_heap_marked (gboolean nursery_must_be_pinned) MONO_INTERNAL; void sgen_check_nursery_objects_pinned (gboolean pinned) MONO_INTERNAL; void sgen_scan_for_registered_roots_in_domain (MonoDomain *domain, int root_type) MONO_INTERNAL; void sgen_check_for_xdomain_refs (void) MONO_INTERNAL; @@ -1186,7 +1224,7 @@ gboolean nursery_canaries_enabled (void) MONO_INTERNAL; char* canary_ptr = (char*) (addr) + sgen_safe_object_get_size_unaligned ((MonoObject *) (addr)); \ if (!CANARY_VALID(canary_ptr)) { \ char canary_copy[CANARY_SIZE +1]; \ - strncpy (canary_copy, canary_ptr, 8); \ + strncpy (canary_copy, canary_ptr, CANARY_SIZE); \ canary_copy[CANARY_SIZE] = 0; \ g_error ("CORRUPT CANARY:\naddr->%p\ntype->%s\nexcepted->'%s'\nfound->'%s'\n", (char*) addr, ((MonoObject*)addr)->vtable->klass->name, CANARY_STRING, canary_copy); \ } } diff --git a/mta-mono/vendor/mono/metadata/sgen-gray.c b/mta-mono/vendor/mono/metadata/sgen-gray.c index 9bff2c7..6407ef8 100644 --- a/mta-mono/vendor/mono/metadata/sgen-gray.c +++ b/mta-mono/vendor/mono/metadata/sgen-gray.c @@ -26,12 +26,12 @@ #include "sgen-protocol.h" #ifdef HEAVY_STATISTICS -unsigned long long stat_gray_queue_section_alloc; -unsigned long long stat_gray_queue_section_free; -unsigned long long stat_gray_queue_enqueue_fast_path; -unsigned long long stat_gray_queue_dequeue_fast_path; -unsigned long long stat_gray_queue_enqueue_slow_path; -unsigned long long stat_gray_queue_dequeue_slow_path; +guint64 stat_gray_queue_section_alloc; +guint64 stat_gray_queue_section_free; +guint64 stat_gray_queue_enqueue_fast_path; +guint64 stat_gray_queue_dequeue_fast_path; +guint64 stat_gray_queue_enqueue_slow_path; +guint64 stat_gray_queue_dequeue_slow_path; #endif #define GRAY_QUEUE_LENGTH_LIMIT 64 @@ -99,7 +99,7 @@ sgen_gray_object_free_queue_section (GrayQueueSection *section) void sgen_gray_object_enqueue (SgenGrayQueue *queue, char *obj, mword desc) { - GrayQueueEntry entry = { obj, desc }; + GrayQueueEntry entry = SGEN_GRAY_QUEUE_ENTRY (obj, desc); HEAVY_STAT (stat_gray_queue_enqueue_slow_path ++); @@ -252,13 +252,20 @@ sgen_gray_object_queue_init_invalid (SgenGrayQueue *queue) queue->alloc_prepare_data = NULL; } +void +sgen_gray_queue_set_alloc_prepare (SgenGrayQueue *queue, GrayQueueAllocPrepareFunc alloc_prepare_func, void *data) +{ + SGEN_ASSERT (0, !queue->alloc_prepare_func && !queue->alloc_prepare_data, "Can't set gray queue alloc-prepare twice"); + queue->alloc_prepare_func = alloc_prepare_func; + queue->alloc_prepare_data = data; +} + void sgen_gray_object_queue_init_with_alloc_prepare (SgenGrayQueue *queue, GrayQueueEnqueueCheckFunc enqueue_check_func, GrayQueueAllocPrepareFunc alloc_prepare_func, void *data) { sgen_gray_object_queue_init (queue, enqueue_check_func); - queue->alloc_prepare_func = alloc_prepare_func; - queue->alloc_prepare_data = data; + sgen_gray_queue_set_alloc_prepare (queue, alloc_prepare_func, data); } void diff --git a/mta-mono/vendor/mono/metadata/sgen-gray.h b/mta-mono/vendor/mono/metadata/sgen-gray.h index a020323..c51822c 100644 --- a/mta-mono/vendor/mono/metadata/sgen-gray.h +++ b/mta-mono/vendor/mono/metadata/sgen-gray.h @@ -20,7 +20,7 @@ #ifndef __MONO_SGEN_GRAY_H__ #define __MONO_SGEN_GRAY_H__ -#include "sgen-protocol.h" +#include "metadata/sgen-protocol.h" /* * This gray queue has to be as optimized as possible, because it is in the core of @@ -74,6 +74,8 @@ struct _GrayQueueEntry { mword desc; }; +#define SGEN_GRAY_QUEUE_ENTRY(obj,desc) { (obj), (desc) } + /* * This is a stack now instead of a queue, so the most recently added items are removed * first, improving cache locality, and keeping the stack size manageable. @@ -124,12 +126,12 @@ struct _SgenSectionGrayQueue { #define GRAY_FIRST_CURSOR_POSITION(s) ((s)->entries) #ifdef HEAVY_STATISTICS -extern unsigned long long stat_gray_queue_section_alloc; -extern unsigned long long stat_gray_queue_section_free; -extern unsigned long long stat_gray_queue_enqueue_fast_path; -extern unsigned long long stat_gray_queue_dequeue_fast_path; -extern unsigned long long stat_gray_queue_enqueue_slow_path; -extern unsigned long long stat_gray_queue_dequeue_slow_path; +extern guint64 stat_gray_queue_section_alloc; +extern guint64 stat_gray_queue_section_free; +extern guint64 stat_gray_queue_enqueue_fast_path; +extern guint64 stat_gray_queue_dequeue_fast_path; +extern guint64 stat_gray_queue_enqueue_slow_path; +extern guint64 stat_gray_queue_dequeue_slow_path; #endif void sgen_init_gray_queues (void) MONO_INTERNAL; @@ -141,6 +143,7 @@ void sgen_gray_object_enqueue_section (SgenGrayQueue *queue, GrayQueueSection *s void sgen_gray_object_queue_trim_free_list (SgenGrayQueue *queue) MONO_INTERNAL; void sgen_gray_object_queue_init (SgenGrayQueue *queue, GrayQueueEnqueueCheckFunc enqueue_check_func) MONO_INTERNAL; void sgen_gray_object_queue_init_invalid (SgenGrayQueue *queue) MONO_INTERNAL; +void sgen_gray_queue_set_alloc_prepare (SgenGrayQueue *queue, GrayQueueAllocPrepareFunc alloc_prepare_func, void *data) MONO_INTERNAL; void sgen_gray_object_queue_init_with_alloc_prepare (SgenGrayQueue *queue, GrayQueueEnqueueCheckFunc enqueue_check_func, GrayQueueAllocPrepareFunc func, void *data) MONO_INTERNAL; void sgen_gray_object_queue_deinit (SgenGrayQueue *queue) MONO_INTERNAL; @@ -154,6 +157,8 @@ gboolean sgen_section_gray_queue_is_empty (SgenSectionGrayQueue *queue) MONO_INT GrayQueueSection* sgen_section_gray_queue_dequeue (SgenSectionGrayQueue *queue) MONO_INTERNAL; void sgen_section_gray_queue_enqueue (SgenSectionGrayQueue *queue, GrayQueueSection *section) MONO_INTERNAL; +gboolean sgen_gray_object_fill_prefetch (SgenGrayQueue *queue); + static inline gboolean sgen_gray_object_queue_is_empty (SgenGrayQueue *queue) { @@ -169,7 +174,7 @@ GRAY_OBJECT_ENQUEUE (SgenGrayQueue *queue, char* obj, mword desc) if (G_UNLIKELY (!queue->first || queue->cursor == GRAY_LAST_CURSOR_POSITION (queue->first))) { sgen_gray_object_enqueue (queue, obj, desc); } else { - GrayQueueEntry entry = { obj, desc }; + GrayQueueEntry entry = SGEN_GRAY_QUEUE_ENTRY (obj, desc); HEAVY_STAT (stat_gray_queue_enqueue_fast_path ++); @@ -186,7 +191,7 @@ GRAY_OBJECT_DEQUEUE (SgenGrayQueue *queue, char** obj, mword *desc) { GrayQueueEntry entry; #if SGEN_MAX_DEBUG_LEVEL >= 9 - entry = sgen_gray_object_enqueue (queue); + entry = sgen_gray_object_dequeue (queue); *obj = entry.obj; *desc = entry.desc; #else @@ -194,9 +199,6 @@ GRAY_OBJECT_DEQUEUE (SgenGrayQueue *queue, char** obj, mword *desc) HEAVY_STAT (stat_gray_queue_dequeue_fast_path ++); *obj = NULL; -#ifdef SGEN_HEAVY_BINARY_PROTOCOL - binary_protocol_gray_dequeue (queue, queue->cursor, *obj); -#endif } else if (G_UNLIKELY (queue->cursor == GRAY_FIRST_CURSOR_POSITION (queue->first))) { entry = sgen_gray_object_dequeue (queue); *obj = entry.obj; diff --git a/mta-mono/vendor/mono/metadata/sgen-hash-table.c b/mta-mono/vendor/mono/metadata/sgen-hash-table.c index cebba4f..176a563 100644 --- a/mta-mono/vendor/mono/metadata/sgen-hash-table.c +++ b/mta-mono/vendor/mono/metadata/sgen-hash-table.c @@ -30,9 +30,9 @@ #include #ifdef HEAVY_STATISTICS -static long long stat_lookups; -static long long stat_lookup_iterations; -static long long stat_lookup_max_iterations; +static guint64 stat_lookups; +static guint64 stat_lookup_iterations; +static guint64 stat_lookup_max_iterations; #endif static void @@ -82,7 +82,7 @@ lookup (SgenHashTable *hash_table, gpointer key, guint *_hash) guint hash; GEqualFunc equal = hash_table->equal_func; #ifdef HEAVY_STATISTICS - long long iterations = 0; + guint64 iterations = 0; ++stat_lookups; #endif @@ -241,9 +241,9 @@ void sgen_init_hash_table (void) { #ifdef HEAVY_STATISTICS - mono_counters_register ("Hash table lookups", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_lookups); - mono_counters_register ("Hash table lookup iterations", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_lookup_iterations); - mono_counters_register ("Hash table lookup max iterations", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_lookup_max_iterations); + mono_counters_register ("Hash table lookups", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_lookups); + mono_counters_register ("Hash table lookup iterations", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_lookup_iterations); + mono_counters_register ("Hash table lookup max iterations", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_lookup_max_iterations); #endif } diff --git a/mta-mono/vendor/mono/metadata/sgen-internal.c b/mta-mono/vendor/mono/metadata/sgen-internal.c index 333f8c3..f5b8995 100644 --- a/mta-mono/vendor/mono/metadata/sgen-internal.c +++ b/mta-mono/vendor/mono/metadata/sgen-internal.c @@ -150,6 +150,7 @@ description_for_type (int type) case INTERNAL_MEM_TOGGLEREF_DATA: return "toggleref-data"; case INTERNAL_MEM_CARDTABLE_MOD_UNION: return "cardtable-mod-union"; case INTERNAL_MEM_BINARY_PROTOCOL: return "binary-protocol"; + case INTERNAL_MEM_TEMPORARY: return "temporary"; default: g_assert_not_reached (); } diff --git a/mta-mono/vendor/mono/metadata/sgen-major-copy-object.h b/mta-mono/vendor/mono/metadata/sgen-major-copy-object.h index e912be7..a4b10ff 100644 --- a/mta-mono/vendor/mono/metadata/sgen-major-copy-object.h +++ b/mta-mono/vendor/mono/metadata/sgen-major-copy-object.h @@ -29,7 +29,5 @@ } while (0) #define COLLECTOR_SERIAL_ALLOC_FOR_PROMOTION sgen_minor_collector.alloc_for_promotion -#define COLLECTOR_PARALLEL_ALLOC_FOR_PROMOTION sgen_minor_collector.par_alloc_for_promotion - #include "sgen-copy-object.h" diff --git a/mta-mono/vendor/mono/metadata/sgen-marksweep-drain-gray-stack.h b/mta-mono/vendor/mono/metadata/sgen-marksweep-drain-gray-stack.h new file mode 100644 index 0000000..73d22fe --- /dev/null +++ b/mta-mono/vendor/mono/metadata/sgen-marksweep-drain-gray-stack.h @@ -0,0 +1,254 @@ +/* + * sgen-marksweep-drain-gray-stack.h: The copy/mark and gray stack + * draining functions of the M&S major collector. + * + * Copyright (C) 2014 Xamarin Inc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License 2.0 as published by the Free Software Foundation; + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License 2.0 along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * COPY_OR_MARK_FUNCTION_NAME must be defined to be the function name of the copy/mark + * function. + * + * SCAN_OBJECT_FUNCTION_NAME must be defined to be the function name of the object scanning + * function. + * + * DRAIN_GRAY_STACK_FUNCTION_NAME must be defined to be the function name of the gray stack + * draining function. + * + * Define COPY_OR_MARK_WITH_EVACUATION to support evacuation. + */ + +/* Returns whether the object is still in the nursery. */ +static inline MONO_ALWAYS_INLINE gboolean +COPY_OR_MARK_FUNCTION_NAME (void **ptr, void *obj, SgenGrayQueue *queue) +{ + MSBlockInfo *block; + +#ifdef HEAVY_STATISTICS + ++stat_optimized_copy; + { + char *forwarded; + mword desc; + if ((forwarded = SGEN_OBJECT_IS_FORWARDED (obj))) + desc = sgen_obj_get_descriptor_safe (forwarded); + else + desc = sgen_obj_get_descriptor_safe (obj); + + sgen_descriptor_count_copied_object (desc); + } +#endif + + SGEN_ASSERT (9, obj, "null object from pointer %p", ptr); + SGEN_ASSERT (9, current_collection_generation == GENERATION_OLD, "old gen parallel allocator called from a %d collection", current_collection_generation); + + if (sgen_ptr_in_nursery (obj)) { + int word, bit; + char *forwarded, *old_obj; + mword vtable_word = *(mword*)obj; + + HEAVY_STAT (++stat_optimized_copy_nursery); + +#if SGEN_MAX_DEBUG_LEVEL >= 9 + if (sgen_nursery_is_to_space (obj)) + SGEN_ASSERT (9, !SGEN_VTABLE_IS_PINNED (vtable_word) && !SGEN_VTABLE_IS_FORWARDED (vtable_word), "To-space object can't be pinned or forwarded."); +#endif + + if (SGEN_VTABLE_IS_PINNED (vtable_word)) { + SGEN_ASSERT (9, !SGEN_VTABLE_IS_FORWARDED (vtable_word), "Cannot be both pinned and forwarded."); + HEAVY_STAT (++stat_optimized_copy_nursery_pinned); + return TRUE; + } + if ((forwarded = SGEN_VTABLE_IS_FORWARDED (vtable_word))) { + HEAVY_STAT (++stat_optimized_copy_nursery_forwarded); + SGEN_UPDATE_REFERENCE (ptr, forwarded); + return sgen_ptr_in_nursery (forwarded); + } + + /* An object in the nursery To Space has already been copied and grayed. Nothing to do. */ + if (sgen_nursery_is_to_space (obj)) + return TRUE; + +#ifdef COPY_OR_MARK_WITH_EVACUATION + do_copy_object: +#endif + old_obj = obj; + obj = copy_object_no_checks (obj, queue); + if (G_UNLIKELY (old_obj == obj)) { + /* + * If we fail to evacuate an object we just stop doing it for a + * given block size as all other will surely fail too. + */ + /* FIXME: test this case somehow. */ + if (!sgen_ptr_in_nursery (obj)) { + int size_index; + block = MS_BLOCK_FOR_OBJ (obj); + size_index = block->obj_size_index; + evacuate_block_obj_sizes [size_index] = FALSE; + MS_MARK_OBJECT_AND_ENQUEUE (obj, sgen_obj_get_descriptor (obj), block, queue); + return FALSE; + } + return TRUE; + } + HEAVY_STAT (++stat_objects_copied_major); + SGEN_UPDATE_REFERENCE (ptr, obj); + + if (sgen_ptr_in_nursery (obj)) + return TRUE; + + /* + * FIXME: See comment for copy_object_no_checks(). If + * we have that, we can let the allocation function + * give us the block info, too, and we won't have to + * re-fetch it. + * + * FIXME (2): We should rework this to avoid all those nursery checks. + */ + /* + * For the split nursery allocator the object might + * still be in the nursery despite having being + * promoted, in which case we can't mark it. + */ + block = MS_BLOCK_FOR_OBJ (obj); + MS_CALC_MARK_BIT (word, bit, obj); + SGEN_ASSERT (9, !MS_MARK_BIT (block, word, bit), "object %p already marked", obj); + MS_SET_MARK_BIT (block, word, bit); + binary_protocol_mark (obj, (gpointer)LOAD_VTABLE (obj), sgen_safe_object_get_size ((MonoObject*)obj)); + + return FALSE; + } else { + mword vtable_word = *(mword*)obj; + mword desc; + int type; + + HEAVY_STAT (++stat_optimized_copy_major); + +#ifdef COPY_OR_MARK_WITH_EVACUATION + { + char *forwarded; + if ((forwarded = SGEN_VTABLE_IS_FORWARDED (vtable_word))) { + HEAVY_STAT (++stat_optimized_copy_major_forwarded); + SGEN_UPDATE_REFERENCE (ptr, forwarded); + SGEN_ASSERT (9, !sgen_ptr_in_nursery (forwarded), "Cannot be forwarded to nursery."); + return FALSE; + } + } +#endif + + SGEN_ASSERT (9, !SGEN_VTABLE_IS_PINNED (vtable_word), "Pinned object in non-pinned block?"); + + desc = sgen_vtable_get_descriptor ((MonoVTable*)vtable_word); + type = desc & DESC_TYPE_MASK; + + if (type <= DESC_TYPE_MAX_SMALL_OBJ || SGEN_ALIGN_UP (sgen_safe_object_get_size ((MonoObject*)obj)) <= SGEN_MAX_SMALL_OBJ_SIZE) { +#ifdef HEAVY_STATISTICS + if (type <= DESC_TYPE_MAX_SMALL_OBJ) + ++stat_optimized_copy_major_small_fast; + else + ++stat_optimized_copy_major_small_slow; +#endif + + block = MS_BLOCK_FOR_OBJ (obj); + +#ifdef COPY_OR_MARK_WITH_EVACUATION + { + int size_index = block->obj_size_index; + + if (evacuate_block_obj_sizes [size_index] && !block->has_pinned) { + HEAVY_STAT (++stat_optimized_copy_major_small_evacuate); + if (block->is_to_space) + return FALSE; + goto do_copy_object; + } + } +#endif + + MS_MARK_OBJECT_AND_ENQUEUE (obj, desc, block, queue); + } else { + HEAVY_STAT (++stat_optimized_copy_major_large); + + if (sgen_los_object_is_pinned (obj)) + return FALSE; + binary_protocol_pin (obj, (gpointer)SGEN_LOAD_VTABLE (obj), sgen_safe_object_get_size ((MonoObject*)obj)); + + sgen_los_pin_object (obj); + if (SGEN_OBJECT_HAS_REFERENCES (obj)) + GRAY_OBJECT_ENQUEUE (queue, obj, sgen_obj_get_descriptor (obj)); + } + return FALSE; + } + SGEN_ASSERT (0, FALSE, "How is this happening?"); + return FALSE; +} + +static void +SCAN_OBJECT_FUNCTION_NAME (char *obj, mword desc, SgenGrayQueue *queue) +{ + char *start = obj; + +#ifdef HEAVY_STATISTICS + ++stat_optimized_major_scan; + if (!sgen_gc_descr_has_references (desc)) + ++stat_optimized_major_scan_no_refs; + sgen_descriptor_count_scanned_object (desc); +#endif +#ifdef SGEN_HEAVY_BINARY_PROTOCOL + add_scanned_object (start); +#endif + + /* Now scan the object. */ + +#undef HANDLE_PTR +#define HANDLE_PTR(ptr,obj) do { \ + void *__old = *(ptr); \ + binary_protocol_scan_process_reference ((obj), (ptr), __old); \ + if (__old) { \ + gboolean __still_in_nursery = COPY_OR_MARK_FUNCTION_NAME ((ptr), __old, queue); \ + if (G_UNLIKELY (__still_in_nursery && !sgen_ptr_in_nursery ((ptr)) && !SGEN_OBJECT_IS_CEMENTED (*(ptr)))) { \ + void *__copy = *(ptr); \ + sgen_add_to_global_remset ((ptr), __copy); \ + } \ + } \ + } while (0) + +#define SCAN_OBJECT_PROTOCOL +#include "sgen-scan-object.h" +} + +static gboolean +DRAIN_GRAY_STACK_FUNCTION_NAME (ScanCopyContext ctx) +{ + SgenGrayQueue *queue = ctx.queue; + + SGEN_ASSERT (0, ctx.scan_func == major_scan_object_with_evacuation, "Wrong scan function"); + + for (;;) { + char *obj; + mword desc; + + HEAVY_STAT (++stat_drain_loops); + + GRAY_OBJECT_DEQUEUE (queue, &obj, &desc); + if (!obj) + return TRUE; + + SCAN_OBJECT_FUNCTION_NAME (obj, desc, ctx.queue); + } +} + +#undef COPY_OR_MARK_FUNCTION_NAME +#undef COPY_OR_MARK_WITH_EVACUATION +#undef SCAN_OBJECT_FUNCTION_NAME +#undef DRAIN_GRAY_STACK_FUNCTION_NAME diff --git a/mta-mono/vendor/mono/metadata/sgen-marksweep-scan-object-concurrent.h b/mta-mono/vendor/mono/metadata/sgen-marksweep-scan-object-concurrent.h new file mode 100644 index 0000000..7902104 --- /dev/null +++ b/mta-mono/vendor/mono/metadata/sgen-marksweep-scan-object-concurrent.h @@ -0,0 +1,93 @@ +/* + * sgen-major-scan-object.h: Object scanning in the major collectors. + * + * Copyright 2001-2003 Ximian, Inc + * Copyright 2003-2010 Novell, Inc. + * Copyright (C) 2012 Xamarin Inc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License 2.0 as published by the Free Software Foundation; + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License 2.0 along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +extern guint64 stat_scan_object_called_major; + +/* + * FIXME: We use the same scanning function in the concurrent collector whether we scan + * during the starting/finishing collection pause (with the world stopped) or from the + * concurrent worker thread. + * + * As long as the world is stopped, we should just follow pointers into the nursery and + * evict if possible. In that case we also don't need the ALWAYS_ADD_TO_GLOBAL_REMSET case, + * which only seems to make sense for when the world is stopped, in which case we only need + * it because we don't follow into the nursery. + */ + +#undef HANDLE_PTR +#define HANDLE_PTR(ptr,obj) do { \ + void *__old = *(ptr); \ + SGEN_OBJECT_LAYOUT_STATISTICS_MARK_BITMAP ((obj), (ptr)); \ + binary_protocol_scan_process_reference ((obj), (ptr), __old); \ + if (__old && !sgen_ptr_in_nursery (__old)) { \ + void *__copy; \ + PREFETCH_READ (__old); \ + major_copy_or_mark_object_with_evacuation_concurrent ((ptr), __old, queue); \ + __copy = *(ptr); \ + SGEN_COND_LOG (9, __old != __copy, "Overwrote field at %p with %p (was: %p)", (ptr), *(ptr), __old); \ + if (G_UNLIKELY (sgen_ptr_in_nursery (__copy) && !sgen_ptr_in_nursery ((ptr)) && !SGEN_OBJECT_IS_CEMENTED (__copy))) \ + sgen_add_to_global_remset ((ptr), __copy); \ + } else { \ + if (G_UNLIKELY (sgen_ptr_in_nursery (__old) && !sgen_ptr_in_nursery ((ptr)))) \ + sgen_add_to_global_remset ((ptr), __old); \ + } \ + } while (0) + +/* FIXME: Unify this with optimized code in sgen-marksweep.c. */ + +static void +major_scan_object_no_mark_concurrent (char *start, mword desc, SgenGrayQueue *queue) +{ + SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP; + +#ifdef HEAVY_STATISTICS + sgen_descriptor_count_scanned_object (desc); +#endif +#ifdef SGEN_HEAVY_BINARY_PROTOCOL + add_scanned_object (start); +#endif + +#define SCAN_OBJECT_PROTOCOL +#include "sgen-scan-object.h" + + SGEN_OBJECT_LAYOUT_STATISTICS_COMMIT_BITMAP; + HEAVY_STAT (++stat_scan_object_called_major); +} + +static void +major_scan_vtype_concurrent (char *start, mword desc, SgenGrayQueue *queue BINARY_PROTOCOL_ARG (size_t size)) +{ + SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP; + +#ifdef HEAVY_STATISTICS + /* FIXME: We're half scanning this object. How do we account for that? */ + //add_scanned_object (start); +#endif + + /* The descriptors include info about the MonoObject header as well */ + start -= sizeof (MonoObject); + +#define SCAN_OBJECT_NOVTABLE +#define SCAN_OBJECT_PROTOCOL +#include "sgen-scan-object.h" + + SGEN_OBJECT_LAYOUT_STATISTICS_COMMIT_BITMAP; +} diff --git a/mta-mono/vendor/mono/metadata/sgen-marksweep.c b/mta-mono/vendor/mono/metadata/sgen-marksweep.c index 8980687..9d4e319 100644 --- a/mta-mono/vendor/mono/metadata/sgen-marksweep.c +++ b/mta-mono/vendor/mono/metadata/sgen-marksweep.c @@ -41,11 +41,16 @@ #include "metadata/sgen-layout-stats.h" #include "metadata/gc-internal.h" #include "metadata/sgen-pointer-queue.h" +#include "metadata/sgen-pinning.h" +#include "metadata/sgen-workers.h" -#define SGEN_HAVE_CONCURRENT_MARK - -#define MS_BLOCK_SIZE (16*1024) -#define MS_BLOCK_SIZE_SHIFT 14 +#if defined(ARCH_MIN_MS_BLOCK_SIZE) && defined(ARCH_MIN_MS_BLOCK_SIZE_SHIFT) +#define MS_BLOCK_SIZE ARCH_MIN_MS_BLOCK_SIZE +#define MS_BLOCK_SIZE_SHIFT ARCH_MIN_MS_BLOCK_SIZE_SHIFT +#else +#define MS_BLOCK_SIZE_SHIFT 14 /* INT FASTENABLE */ +#define MS_BLOCK_SIZE (1 << MS_BLOCK_SIZE_SHIFT) +#endif #define MAJOR_SECTION_SIZE MS_BLOCK_SIZE #define CARDS_PER_BLOCK (MS_BLOCK_SIZE / CARD_SIZE_IN_BYTES) @@ -60,47 +65,40 @@ * of a block is the MSBlockHeader, then opional padding, then come * the objects, so this must be >= sizeof (MSBlockHeader). */ -#define MS_BLOCK_SKIP 16 +#define MS_BLOCK_SKIP ((sizeof (MSBlockHeader) + 15) & ~15) #define MS_BLOCK_FREE (MS_BLOCK_SIZE - MS_BLOCK_SKIP) #define MS_NUM_MARK_WORDS ((MS_BLOCK_SIZE / SGEN_ALLOC_ALIGN + sizeof (mword) * 8 - 1) / (sizeof (mword) * 8)) -#if SGEN_MAX_SMALL_OBJ_SIZE > MS_BLOCK_FREE / 2 -#error MAX_SMALL_OBJ_SIZE must be at most MS_BLOCK_FREE / 2 -#endif - typedef struct _MSBlockInfo MSBlockInfo; struct _MSBlockInfo { int obj_size; int obj_size_index; - size_t pin_queue_num_entries; unsigned int pinned : 1; unsigned int has_references : 1; unsigned int has_pinned : 1; /* means cannot evacuate */ unsigned int is_to_space : 1; unsigned int swept : 1; - char *block; void **free_list; MSBlockInfo *next_free; - void **pin_queue_start; -#ifdef SGEN_HAVE_CONCURRENT_MARK + size_t pin_queue_first_entry; + size_t pin_queue_last_entry; guint8 *cardtable_mod_union; -#endif mword mark_words [MS_NUM_MARK_WORDS]; }; -#define MS_BLOCK_FOR_BLOCK_INFO(b) ((b)->block) +#define MS_BLOCK_FOR_BLOCK_INFO(b) ((char*)(b)) #define MS_BLOCK_OBJ(b,i) (MS_BLOCK_FOR_BLOCK_INFO(b) + MS_BLOCK_SKIP + (b)->obj_size * (i)) #define MS_BLOCK_OBJ_FOR_SIZE(b,i,obj_size) (MS_BLOCK_FOR_BLOCK_INFO(b) + MS_BLOCK_SKIP + (obj_size) * (i)) #define MS_BLOCK_DATA_FOR_OBJ(o) ((char*)((mword)(o) & ~(mword)(MS_BLOCK_SIZE - 1))) typedef struct { - MSBlockInfo *info; + MSBlockInfo info; } MSBlockHeader; -#define MS_BLOCK_FOR_OBJ(o) (((MSBlockHeader*)MS_BLOCK_DATA_FOR_OBJ ((o)))->info) +#define MS_BLOCK_FOR_OBJ(o) (&((MSBlockHeader*)MS_BLOCK_DATA_FOR_OBJ ((o)))->info) /* object index will always be small */ #define MS_BLOCK_OBJ_INDEX(o,b) ((int)(((char*)(o) - (MS_BLOCK_FOR_BLOCK_INFO(b) + MS_BLOCK_SKIP)) / (b)->obj_size)) @@ -119,25 +117,10 @@ typedef struct { #define MS_MARK_BIT(bl,w,b) ((bl)->mark_words [(w)] & (ONE_P << (b))) #define MS_SET_MARK_BIT(bl,w,b) ((bl)->mark_words [(w)] |= (ONE_P << (b))) -#define MS_PAR_SET_MARK_BIT(was_marked,bl,w,b) do { \ - mword __old = (bl)->mark_words [(w)]; \ - mword __bitmask = ONE_P << (b); \ - if (__old & __bitmask) { \ - was_marked = TRUE; \ - break; \ - } \ - if (SGEN_CAS_PTR ((gpointer*)&(bl)->mark_words [(w)], \ - (gpointer)(__old | __bitmask), \ - (gpointer)__old) == \ - (gpointer)__old) { \ - was_marked = FALSE; \ - break; \ - } \ - } while (1) #define MS_OBJ_ALLOCED(o,b) (*(void**)(o) && (*(char**)(o) < MS_BLOCK_FOR_BLOCK_INFO (b) || *(char**)(o) >= MS_BLOCK_FOR_BLOCK_INFO (b) + MS_BLOCK_SIZE)) -#define MS_BLOCK_OBJ_SIZE_FACTOR (sqrt (2.0)) +#define MS_BLOCK_OBJ_SIZE_FACTOR (pow (2.0, 1.0 / 3)) /* * This way we can lookup block object size indexes for sizes up to @@ -156,17 +139,13 @@ static int fast_block_obj_size_indexes [MS_NUM_FAST_BLOCK_OBJ_SIZE_INDEXES]; static gboolean *evacuate_block_obj_sizes; static float evacuation_threshold = 0.666f; -#ifdef SGEN_HAVE_CONCURRENT_MARK static float concurrent_evacuation_threshold = 0.666f; static gboolean want_evacuation = FALSE; -#endif static gboolean lazy_sweep = TRUE; static gboolean have_swept; -#ifdef SGEN_HAVE_CONCURRENT_MARK static gboolean concurrent_mark; -#endif #define BLOCK_IS_TAGGED_HAS_REFERENCES(bl) SGEN_POINTER_IS_TAGGED_1 ((bl)) #define BLOCK_TAG_HAS_REFERENCES(bl) SGEN_POINTER_TAG_1 ((bl)) @@ -190,25 +169,41 @@ static size_t num_major_sections = 0; /* one free block list for each block object size */ static MSBlockInfo **free_block_lists [MS_BLOCK_TYPE_MAX]; -static long long stat_major_blocks_alloced = 0; -static long long stat_major_blocks_freed = 0; -static long long stat_major_blocks_lazy_swept = 0; -static long long stat_major_objects_evacuated = 0; +static guint64 stat_major_blocks_alloced = 0; +static guint64 stat_major_blocks_freed = 0; +static guint64 stat_major_blocks_lazy_swept = 0; +static guint64 stat_major_objects_evacuated = 0; #if SIZEOF_VOID_P != 8 -static long long stat_major_blocks_freed_ideal = 0; -static long long stat_major_blocks_freed_less_ideal = 0; -static long long stat_major_blocks_freed_individual = 0; -static long long stat_major_blocks_alloced_less_ideal = 0; +static guint64 stat_major_blocks_freed_ideal = 0; +static guint64 stat_major_blocks_freed_less_ideal = 0; +static guint64 stat_major_blocks_freed_individual = 0; +static guint64 stat_major_blocks_alloced_less_ideal = 0; #endif #ifdef SGEN_COUNT_NUMBER_OF_MAJOR_OBJECTS_MARKED -static long long num_major_objects_marked = 0; +static guint64 num_major_objects_marked = 0; #define INC_NUM_MAJOR_OBJECTS_MARKED() (++num_major_objects_marked) #else #define INC_NUM_MAJOR_OBJECTS_MARKED() #endif +#ifdef SGEN_HEAVY_BINARY_PROTOCOL +static mono_mutex_t scanned_objects_list_lock; +static SgenPointerQueue scanned_objects_list; + +static void +add_scanned_object (void *ptr) +{ + if (!binary_protocol_is_enabled ()) + return; + + mono_mutex_lock (&scanned_objects_list_lock); + sgen_pointer_queue_add (&scanned_objects_list, ptr); + mono_mutex_unlock (&scanned_objects_list_lock); +} +#endif + static void sweep_block (MSBlockInfo *block, gboolean during_major_collection); @@ -413,7 +408,6 @@ ms_alloc_block (int size_index, gboolean pinned, gboolean has_references) int size = block_obj_sizes [size_index]; int count = MS_BLOCK_FREE / size; MSBlockInfo *info; - MSBlockHeader *header; MSBlockInfo **free_blocks = FREE_BLOCKS (pinned, has_references); char *obj_start; int i; @@ -421,7 +415,7 @@ ms_alloc_block (int size_index, gboolean pinned, gboolean has_references) if (!sgen_memgov_try_alloc_space (MS_BLOCK_SIZE, SPACE_MAJOR)) return FALSE; - info = sgen_alloc_internal (INTERNAL_MEM_MS_BLOCK_INFO); + info = (MSBlockInfo*)ms_get_empty_block (); SGEN_ASSERT (9, count >= 2, "block with %d objects, it must hold at least 2", count); @@ -438,13 +432,7 @@ ms_alloc_block (int size_index, gboolean pinned, gboolean has_references) */ info->is_to_space = (sgen_get_current_collection_generation () == GENERATION_OLD); info->swept = 1; - info->block = ms_get_empty_block (); - - header = (MSBlockHeader*) info->block; - header->info = info; -#ifdef SGEN_HAVE_CONCURRENT_MARK info->cardtable_mod_union = NULL; -#endif update_heap_boundaries_for_block (info); @@ -613,8 +601,6 @@ major_alloc_degraded (MonoVTable *vtable, size_t size) return obj; } -#define MAJOR_OBJ_IS_IN_TO_SPACE(obj) FALSE - /* * obj is some object. If it's not in the major heap (i.e. if it's in * the nursery or LOS), return FALSE. Otherwise return whether it's @@ -834,9 +820,9 @@ major_dump_heap (FILE *heap_dump_file) #define MS_MARK_OBJECT_AND_ENQUEUE_CHECKED(obj,desc,block,queue) do { \ int __word, __bit; \ MS_CALC_MARK_BIT (__word, __bit, (obj)); \ - if (!MS_MARK_BIT ((block), __word, __bit) && MS_OBJ_ALLOCED ((obj), (block))) { \ + if (!MS_MARK_BIT ((block), __word, __bit) && MS_OBJ_ALLOCED ((obj), (block))) { \ MS_SET_MARK_BIT ((block), __word, __bit); \ - if ((block)->has_references) \ + if (sgen_gc_descr_has_references (desc)) \ GRAY_OBJECT_ENQUEUE ((queue), (obj), (desc)); \ binary_protocol_mark ((obj), (gpointer)LOAD_VTABLE ((obj)), sgen_safe_object_get_size ((MonoObject*)(obj))); \ INC_NUM_MAJOR_OBJECTS_MARKED (); \ @@ -845,23 +831,10 @@ major_dump_heap (FILE *heap_dump_file) #define MS_MARK_OBJECT_AND_ENQUEUE(obj,desc,block,queue) do { \ int __word, __bit; \ MS_CALC_MARK_BIT (__word, __bit, (obj)); \ - SGEN_ASSERT (9, MS_OBJ_ALLOCED ((obj), (block)), "object %p not allocated", obj); \ + SGEN_ASSERT (9, MS_OBJ_ALLOCED ((obj), (block)), "object %p not allocated", obj); \ if (!MS_MARK_BIT ((block), __word, __bit)) { \ MS_SET_MARK_BIT ((block), __word, __bit); \ - if ((block)->has_references) \ - GRAY_OBJECT_ENQUEUE ((queue), (obj), (desc)); \ - binary_protocol_mark ((obj), (gpointer)LOAD_VTABLE ((obj)), sgen_safe_object_get_size ((MonoObject*)(obj))); \ - INC_NUM_MAJOR_OBJECTS_MARKED (); \ - } \ - } while (0) -#define MS_PAR_MARK_OBJECT_AND_ENQUEUE(obj,desc,block,queue) do { \ - int __word, __bit; \ - gboolean __was_marked; \ - SGEN_ASSERT (9, MS_OBJ_ALLOCED ((obj), (block)), "object %p not allocated", obj); \ - MS_CALC_MARK_BIT (__word, __bit, (obj)); \ - MS_PAR_SET_MARK_BIT (__was_marked, (block), __word, __bit); \ - if (!__was_marked) { \ - if ((block)->has_references) \ + if (sgen_gc_descr_has_references (desc)) \ GRAY_OBJECT_ENQUEUE ((queue), (obj), (desc)); \ binary_protocol_mark ((obj), (gpointer)LOAD_VTABLE ((obj)), sgen_safe_object_get_size ((MonoObject*)(obj))); \ INC_NUM_MAJOR_OBJECTS_MARKED (); \ @@ -873,10 +846,8 @@ pin_major_object (char *obj, SgenGrayQueue *queue) { MSBlockInfo *block; -#ifdef SGEN_HAVE_CONCURRENT_MARK if (concurrent_mark) g_assert_not_reached (); -#endif block = MS_BLOCK_FOR_OBJ (obj); block->has_pinned = TRUE; @@ -885,10 +856,12 @@ pin_major_object (char *obj, SgenGrayQueue *queue) #include "sgen-major-copy-object.h" -#ifdef SGEN_HAVE_CONCURRENT_MARK static void -major_copy_or_mark_object_concurrent (void **ptr, void *obj, SgenGrayQueue *queue) +major_copy_or_mark_object_with_evacuation_concurrent (void **ptr, void *obj, SgenGrayQueue *queue) { + SGEN_ASSERT (9, sgen_concurrent_collection_in_progress (), "Why are we scanning concurrently when there's no concurrent collection on?"); + SGEN_ASSERT (9, !sgen_workers_are_working () || sgen_is_worker_thread (mono_native_thread_id_get ()), "We must not scan from two threads at the same time!"); + g_assert (!SGEN_OBJECT_IS_FORWARDED (obj)); if (!sgen_ptr_in_nursery (obj)) { @@ -917,139 +890,6 @@ major_copy_or_mark_object_concurrent (void **ptr, void *obj, SgenGrayQueue *queu } } } -#endif - -static void -major_copy_or_mark_object (void **ptr, void *obj, SgenGrayQueue *queue) -{ - MSBlockInfo *block; - - HEAVY_STAT (++stat_copy_object_called_major); - - SGEN_ASSERT (9, obj, "null object from pointer %p", ptr); - SGEN_ASSERT (9, current_collection_generation == GENERATION_OLD, "old gen parallel allocator called from a %d collection", current_collection_generation); - - if (sgen_ptr_in_nursery (obj)) { - int word, bit; - char *forwarded, *old_obj; - - if ((forwarded = SGEN_OBJECT_IS_FORWARDED (obj))) { - *ptr = forwarded; - return; - } - if (SGEN_OBJECT_IS_PINNED (obj)) - return; - - /* An object in the nursery To Space has already been copied and grayed. Nothing to do. */ - if (sgen_nursery_is_to_space (obj)) - return; - - HEAVY_STAT (++stat_objects_copied_major); - - do_copy_object: - old_obj = obj; - obj = copy_object_no_checks (obj, queue); - if (G_UNLIKELY (old_obj == obj)) { - /*If we fail to evacuate an object we just stop doing it for a given block size as all other will surely fail too.*/ - if (!sgen_ptr_in_nursery (obj)) { - int size_index; - block = MS_BLOCK_FOR_OBJ (obj); - size_index = block->obj_size_index; - evacuate_block_obj_sizes [size_index] = FALSE; - MS_MARK_OBJECT_AND_ENQUEUE (obj, sgen_obj_get_descriptor (obj), block, queue); - } - return; - } - *ptr = obj; - - /* - * FIXME: See comment for copy_object_no_checks(). If - * we have that, we can let the allocation function - * give us the block info, too, and we won't have to - * re-fetch it. - * - * FIXME (2): We should rework this to avoid all those nursery checks. - */ - /* - * For the split nursery allocator the object might - * still be in the nursery despite having being - * promoted, in which case we can't mark it. - */ - if (!sgen_ptr_in_nursery (obj)) { - block = MS_BLOCK_FOR_OBJ (obj); - MS_CALC_MARK_BIT (word, bit, obj); - SGEN_ASSERT (9, !MS_MARK_BIT (block, word, bit), "object %p already marked", obj); - MS_SET_MARK_BIT (block, word, bit); - binary_protocol_mark (obj, (gpointer)LOAD_VTABLE (obj), sgen_safe_object_get_size ((MonoObject*)obj)); - } - } else { - char *forwarded; - mword objsize; - - /* - * If we have don't have a fixed heap we cannot know - * whether an object is in the LOS or in the small - * object major heap without checking its size. To do - * that, however, we need to know that we actually - * have a valid object, not a forwarding pointer, so - * we have to do this check first. - */ - if ((forwarded = SGEN_OBJECT_IS_FORWARDED (obj))) { - *ptr = forwarded; - return; - } - - objsize = SGEN_ALIGN_UP (sgen_safe_object_get_size ((MonoObject*)obj)); - - if (objsize <= SGEN_MAX_SMALL_OBJ_SIZE) { - int size_index; - gboolean evacuate; - - block = MS_BLOCK_FOR_OBJ (obj); - size_index = block->obj_size_index; - evacuate = evacuate_block_obj_sizes [size_index]; - - if (evacuate && !block->has_pinned) { - g_assert (!SGEN_OBJECT_IS_PINNED (obj)); - if (block->is_to_space) - return; - HEAVY_STAT (++stat_major_objects_evacuated); - goto do_copy_object; - } else { - MS_MARK_OBJECT_AND_ENQUEUE (obj, sgen_obj_get_descriptor (obj), block, queue); - } - } else { - if (sgen_los_object_is_pinned (obj)) - return; - binary_protocol_pin (obj, (gpointer)SGEN_LOAD_VTABLE (obj), sgen_safe_object_get_size ((MonoObject*)obj)); - -#ifdef ENABLE_DTRACE - if (G_UNLIKELY (MONO_GC_OBJ_PINNED_ENABLED ())) { - MonoVTable *vt = (MonoVTable*)SGEN_LOAD_VTABLE (obj); - MONO_GC_OBJ_PINNED ((mword)obj, sgen_safe_object_get_size (obj), vt->klass->name_space, vt->klass->name, GENERATION_OLD); - } -#endif - - sgen_los_pin_object (obj); - if (SGEN_OBJECT_HAS_REFERENCES (obj)) - GRAY_OBJECT_ENQUEUE (queue, obj, sgen_obj_get_descriptor (obj)); - } - } -} - -static void -major_copy_or_mark_object_canonical (void **ptr, SgenGrayQueue *queue) -{ - major_copy_or_mark_object (ptr, *ptr, queue); -} - -#ifdef SGEN_HAVE_CONCURRENT_MARK -static void -major_copy_or_mark_object_concurrent_canonical (void **ptr, SgenGrayQueue *queue) -{ - major_copy_or_mark_object_concurrent (ptr, *ptr, queue); -} -#endif static long long major_get_and_reset_num_major_objects_marked (void) @@ -1063,29 +903,103 @@ major_get_and_reset_num_major_objects_marked (void) #endif } -#include "sgen-major-scan-object.h" - -#ifdef SGEN_HAVE_CONCURRENT_MARK -#define SCAN_FOR_CONCURRENT_MARK -#include "sgen-major-scan-object.h" -#undef SCAN_FOR_CONCURRENT_MARK +#define PREFETCH_CARDS 1 /* BOOL FASTENABLE */ +#if !PREFETCH_CARDS +#undef PREFETCH_CARDS #endif +/* gcc 4.2.1 from xcode4 crashes on sgen_card_table_get_card_address () when this is enabled */ +#if defined(PLATFORM_MACOSX) +#define GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) +#if GCC_VERSION <= 40300 +#undef PREFETCH_CARDS +#endif +#endif + +#ifdef HEAVY_STATISTICS +static guint64 stat_optimized_copy; +static guint64 stat_optimized_copy_nursery; +static guint64 stat_optimized_copy_nursery_forwarded; +static guint64 stat_optimized_copy_nursery_pinned; +static guint64 stat_optimized_copy_major; +static guint64 stat_optimized_copy_major_small_fast; +static guint64 stat_optimized_copy_major_small_slow; +static guint64 stat_optimized_copy_major_large; +static guint64 stat_optimized_copy_major_forwarded; +static guint64 stat_optimized_copy_major_small_evacuate; +static guint64 stat_optimized_major_scan; +static guint64 stat_optimized_major_scan_no_refs; + +static guint64 stat_drain_prefetch_fills; +static guint64 stat_drain_prefetch_fill_failures; +static guint64 stat_drain_loops; +#endif + +static void major_scan_object_with_evacuation (char *start, mword desc, SgenGrayQueue *queue); + +#define COPY_OR_MARK_FUNCTION_NAME major_copy_or_mark_object_no_evacuation +#define SCAN_OBJECT_FUNCTION_NAME major_scan_object_no_evacuation +#define DRAIN_GRAY_STACK_FUNCTION_NAME drain_gray_stack_no_evacuation +#include "sgen-marksweep-drain-gray-stack.h" + +#define COPY_OR_MARK_WITH_EVACUATION +#define COPY_OR_MARK_FUNCTION_NAME major_copy_or_mark_object_with_evacuation +#define SCAN_OBJECT_FUNCTION_NAME major_scan_object_with_evacuation +#define DRAIN_GRAY_STACK_FUNCTION_NAME drain_gray_stack_with_evacuation +#include "sgen-marksweep-drain-gray-stack.h" + +static gboolean +drain_gray_stack (ScanCopyContext ctx) +{ + gboolean evacuation = FALSE; + int i; + for (i = 0; i < num_block_obj_sizes; ++i) { + if (evacuate_block_obj_sizes [i]) { + evacuation = TRUE; + break; + } + } + + if (evacuation) + return drain_gray_stack_with_evacuation (ctx); + else + return drain_gray_stack_no_evacuation (ctx); +} + +#include "sgen-marksweep-scan-object-concurrent.h" + +static void +major_copy_or_mark_object_canonical (void **ptr, SgenGrayQueue *queue) +{ + major_copy_or_mark_object_with_evacuation (ptr, *ptr, queue); +} + +static void +major_copy_or_mark_object_concurrent_canonical (void **ptr, SgenGrayQueue *queue) +{ + major_copy_or_mark_object_with_evacuation_concurrent (ptr, *ptr, queue); +} + static void mark_pinned_objects_in_block (MSBlockInfo *block, SgenGrayQueue *queue) { - int i; + void **entry, **end; int last_index = -1; - if (!block->pin_queue_num_entries) + if (block->pin_queue_first_entry == block->pin_queue_last_entry) return; block->has_pinned = TRUE; - for (i = 0; i < block->pin_queue_num_entries; ++i) { - int index = MS_BLOCK_OBJ_INDEX (block->pin_queue_start [i], block); + entry = sgen_pinning_get_entry (block->pin_queue_first_entry); + end = sgen_pinning_get_entry (block->pin_queue_last_entry); + + for (; entry < end; ++entry) { + int index = MS_BLOCK_OBJ_INDEX (*entry, block); char *obj; - SGEN_ASSERT (9, index >= 0 && index < MS_BLOCK_FREE / block->obj_size, "invalid object %p index %d max-index %d", block->pin_queue_start [i], index, MS_BLOCK_FREE / block->obj_size); + SGEN_ASSERT (9, index >= 0 && index < MS_BLOCK_FREE / block->obj_size, "invalid object %p index %d max-index %d", *entry, index, MS_BLOCK_FREE / block->obj_size); if (index == last_index) continue; obj = MS_BLOCK_OBJ (block, index); @@ -1203,10 +1117,8 @@ ms_sweep (void) int *slots_used = alloca (sizeof (int) * num_block_obj_sizes); int *num_blocks = alloca (sizeof (int) * num_block_obj_sizes); -#ifdef SGEN_HAVE_CONCURRENT_MARK mword total_evacuate_heap = 0; mword total_evacuate_saved = 0; -#endif for (i = 0; i < num_block_obj_sizes; ++i) slots_available [i] = slots_used [i] = num_blocks [i] = 0; @@ -1238,12 +1150,10 @@ ms_sweep (void) count = MS_BLOCK_FREE / block->obj_size; -#ifdef SGEN_HAVE_CONCURRENT_MARK if (block->cardtable_mod_union) { sgen_free_internal_dynamic (block->cardtable_mod_union, CARDS_PER_BLOCK, INTERNAL_MEM_CARDTABLE_MOD_UNION); block->cardtable_mod_union = NULL; } -#endif /* Count marked objects in the block */ for (i = 0; i < MS_NUM_MARK_WORDS; ++i) { @@ -1285,8 +1195,7 @@ ms_sweep (void) DELETE_BLOCK_IN_FOREACH (); binary_protocol_empty (MS_BLOCK_OBJ (block, 0), (char*)MS_BLOCK_OBJ (block, count) - (char*)MS_BLOCK_OBJ (block, 0)); - ms_free_block (block->block); - sgen_free_internal (block, INTERNAL_MEM_MS_BLOCK_INFO); + ms_free_block (block); --num_major_sections; } @@ -1304,19 +1213,15 @@ ms_sweep (void) } else { evacuate_block_obj_sizes [i] = FALSE; } -#ifdef SGEN_HAVE_CONCURRENT_MARK { mword total_bytes = block_obj_sizes [i] * slots_available [i]; total_evacuate_heap += total_bytes; if (evacuate_block_obj_sizes [i]) total_evacuate_saved += total_bytes - block_obj_sizes [i] * slots_used [i]; } -#endif } -#ifdef SGEN_HAVE_CONCURRENT_MARK want_evacuation = (float)total_evacuate_saved / (float)total_evacuate_heap > (1 - concurrent_evacuation_threshold); -#endif have_swept = TRUE; } @@ -1450,8 +1355,18 @@ major_start_major_collection (void) } static void -major_finish_major_collection (void) +major_finish_major_collection (ScannedObjectCounts *counts) { +#ifdef SGEN_HEAVY_BINARY_PROTOCOL + if (binary_protocol_is_enabled ()) { + counts->num_scanned_objects = scanned_objects_list.next_slot; + + sgen_pointer_queue_sort_uniq (&scanned_objects_list); + counts->num_unique_scanned_objects = scanned_objects_list.next_slot; + + sgen_pointer_queue_clear (&scanned_objects_list); + } +#endif } #if SIZEOF_VOID_P != 8 @@ -1626,8 +1541,8 @@ major_find_pin_queue_start_ends (SgenGrayQueue *queue) MSBlockInfo *block; FOREACH_BLOCK (block) { - block->pin_queue_start = sgen_find_optimized_pin_queue_area (MS_BLOCK_FOR_BLOCK_INFO (block) + MS_BLOCK_SKIP, MS_BLOCK_FOR_BLOCK_INFO (block) + MS_BLOCK_SIZE, - &block->pin_queue_num_entries); + sgen_find_optimized_pin_queue_area (MS_BLOCK_FOR_BLOCK_INFO (block) + MS_BLOCK_SKIP, MS_BLOCK_FOR_BLOCK_INFO (block) + MS_BLOCK_SIZE, + &block->pin_queue_first_entry, &block->pin_queue_last_entry); } END_FOREACH_BLOCK; } @@ -1721,10 +1636,10 @@ major_iterate_live_block_ranges (sgen_cardtable_block_callback callback) } #ifdef HEAVY_STATISTICS -extern long long marked_cards; -extern long long scanned_cards; -extern long long scanned_objects; -extern long long remarked_cards; +extern guint64 marked_cards; +extern guint64 scanned_cards; +extern guint64 scanned_objects; +extern guint64 remarked_cards; #endif #define CARD_WORDS_PER_BLOCK (CARDS_PER_BLOCK / SIZEOF_VOID_P) @@ -1763,19 +1678,16 @@ initial_skip_card (guint8 *card_data) #endif } - -static G_GNUC_UNUSED guint8* -skip_card (guint8 *card_data, guint8 *card_data_end) -{ - while (card_data < card_data_end && !*card_data) - ++card_data; - return card_data; -} - #define MS_BLOCK_OBJ_INDEX_FAST(o,b,os) (((char*)(o) - ((b) + MS_BLOCK_SKIP)) / (os)) #define MS_BLOCK_OBJ_FAST(b,os,i) ((b) + MS_BLOCK_SKIP + (os) * (i)) #define MS_OBJ_ALLOCED_FAST(o,b) (*(void**)(o) && (*(char**)(o) < (b) || *(char**)(o) >= (b) + MS_BLOCK_SIZE)) +static size_t +card_offset (char *obj, char *base) +{ + return (obj - base) >> CARD_BITS; +} + static void major_scan_card_table (gboolean mod_union, SgenGrayQueue *queue) { @@ -1783,156 +1695,138 @@ major_scan_card_table (gboolean mod_union, SgenGrayQueue *queue) gboolean has_references; ScanObjectFunc scan_func = sgen_get_current_object_ops ()->scan_object; -#ifdef SGEN_HAVE_CONCURRENT_MARK if (!concurrent_mark) g_assert (!mod_union); -#else - g_assert (!mod_union); -#endif FOREACH_BLOCK_HAS_REFERENCES (block, has_references) { +#ifndef SGEN_HAVE_OVERLAPPING_CARDS + guint8 cards_copy [CARDS_PER_BLOCK]; +#endif + gboolean small_objects; int block_obj_size; char *block_start; + guint8 *card_data, *card_base; + guint8 *card_data_end; + char *scan_front = NULL; + +#ifdef PREFETCH_CARDS + int prefetch_index = __index + 6; + if (prefetch_index < allocated_blocks.next_slot) { + MSBlockInfo *prefetch_block = BLOCK_UNTAG_HAS_REFERENCES (allocated_blocks.data [prefetch_index]); + guint8 *prefetch_cards = sgen_card_table_get_card_scan_address ((mword)MS_BLOCK_FOR_BLOCK_INFO (prefetch_block)); + PREFETCH_READ (prefetch_block); + PREFETCH_WRITE (prefetch_cards); + PREFETCH_WRITE (prefetch_cards + 32); + } +#endif if (!has_references) continue; block_obj_size = block->obj_size; + small_objects = block_obj_size < CARD_SIZE_IN_BYTES; + block_start = MS_BLOCK_FOR_BLOCK_INFO (block); - if (block_obj_size >= CARD_SIZE_IN_BYTES) { - guint8 *cards; -#ifndef SGEN_HAVE_OVERLAPPING_CARDS - guint8 cards_data [CARDS_PER_BLOCK]; -#endif - char *obj, *end, *base; - - if (mod_union) { -#ifdef SGEN_HAVE_CONCURRENT_MARK - cards = block->cardtable_mod_union; - /* - * This happens when the nursery - * collection that precedes finishing - * the concurrent collection allocates - * new major blocks. - */ - if (!cards) - continue; -#endif - } else { - /*We can avoid the extra copy since the remark cardtable was cleaned before */ + /* + * This is safe in face of card aliasing for the following reason: + * + * Major blocks are 16k aligned, or 32 cards aligned. + * Cards aliasing happens in powers of two, so as long as major blocks are aligned to their + * sizes, they won't overflow the cardtable overlap modulus. + */ + if (mod_union) { + card_data = card_base = block->cardtable_mod_union; + /* + * This happens when the nursery collection that precedes finishing + * the concurrent collection allocates new major blocks. + */ + if (!card_data) + continue; + } else { #ifdef SGEN_HAVE_OVERLAPPING_CARDS - cards = sgen_card_table_get_card_scan_address ((mword)block_start); + card_data = card_base = sgen_card_table_get_card_scan_address ((mword)block_start); #else - cards = cards_data; - if (!sgen_card_table_get_card_data (cards_data, (mword)block_start, CARDS_PER_BLOCK)) - continue; + if (!sgen_card_table_get_card_data (cards_copy, (mword)block_start, CARDS_PER_BLOCK)) + continue; + card_data = card_base = cards_copy; #endif + } + card_data_end = card_data + CARDS_PER_BLOCK; + + card_data += MS_BLOCK_SKIP >> CARD_BITS; + + card_data = initial_skip_card (card_data); + while (card_data < card_data_end) { + size_t card_index, first_object_index; + char *start; + char *end; + char *first_obj, *obj; + + HEAVY_STAT (++scanned_cards); + + if (!*card_data) { + ++card_data; + continue; } - obj = (char*)MS_BLOCK_OBJ_FAST (block_start, block_obj_size, 0); - end = block_start + MS_BLOCK_SIZE; - base = sgen_card_table_align_pointer (obj); + card_index = card_data - card_base; + start = (char*)(block_start + card_index * CARD_SIZE_IN_BYTES); + end = start + CARD_SIZE_IN_BYTES; + + if (!block->swept) + sweep_block (block, FALSE); + + HEAVY_STAT (++marked_cards); + + if (small_objects) + sgen_card_table_prepare_card_for_scanning (card_data); + + /* + * If the card we're looking at starts at or in the block header, we + * must start at the first object in the block, without calculating + * the index of the object we're hypothetically starting at, because + * it would be negative. + */ + if (card_index <= (MS_BLOCK_SKIP >> CARD_BITS)) + first_object_index = 0; + else + first_object_index = MS_BLOCK_OBJ_INDEX_FAST (start, block_start, block_obj_size); + + obj = first_obj = (char*)MS_BLOCK_OBJ_FAST (block_start, block_obj_size, first_object_index); while (obj < end) { - size_t card_offset; - - if (!block->swept) - sweep_block (block, FALSE); - - if (!MS_OBJ_ALLOCED_FAST (obj, block_start)) - goto next_large; + if (obj < scan_front || !MS_OBJ_ALLOCED_FAST (obj, block_start)) + goto next_object; if (mod_union) { /* FIXME: do this more efficiently */ int w, b; MS_CALC_MARK_BIT (w, b, obj); if (!MS_MARK_BIT (block, w, b)) - goto next_large; + goto next_object; } - card_offset = (obj - base) >> CARD_BITS; - sgen_cardtable_scan_object (obj, block_obj_size, cards + card_offset, mod_union, queue); - - next_large: - obj += block_obj_size; - } - } else { - guint8 *card_data, *card_base; - guint8 *card_data_end; - - /* - * This is safe in face of card aliasing for the following reason: - * - * Major blocks are 16k aligned, or 32 cards aligned. - * Cards aliasing happens in powers of two, so as long as major blocks are aligned to their - * sizes, they won't overflow the cardtable overlap modulus. - */ - if (mod_union) { -#ifdef SGEN_HAVE_CONCURRENT_MARK - card_data = card_base = block->cardtable_mod_union; - /* - * This happens when the nursery - * collection that precedes finishing - * the concurrent collection allocates - * new major blocks. - */ - if (!card_data) - continue; -#else - g_assert_not_reached (); - card_data = NULL; -#endif - } else { - card_data = card_base = sgen_card_table_get_card_scan_address ((mword)block_start); - } - card_data_end = card_data + CARDS_PER_BLOCK; - - for (card_data = initial_skip_card (card_data); card_data < card_data_end; ++card_data) { //card_data = skip_card (card_data + 1, card_data_end)) { - size_t index; - size_t idx = card_data - card_base; - char *start = (char*)(block_start + idx * CARD_SIZE_IN_BYTES); - char *end = start + CARD_SIZE_IN_BYTES; - char *first_obj, *obj; - - HEAVY_STAT (++scanned_cards); - - if (!*card_data) - continue; - - if (!block->swept) - sweep_block (block, FALSE); - - HEAVY_STAT (++marked_cards); - - sgen_card_table_prepare_card_for_scanning (card_data); - - if (idx == 0) - index = 0; - else - index = MS_BLOCK_OBJ_INDEX_FAST (start, block_start, block_obj_size); - - obj = first_obj = (char*)MS_BLOCK_OBJ_FAST (block_start, block_obj_size, index); - while (obj < end) { - if (!MS_OBJ_ALLOCED_FAST (obj, block_start)) - goto next_small; - - if (mod_union) { - /* FIXME: do this more efficiently */ - int w, b; - MS_CALC_MARK_BIT (w, b, obj); - if (!MS_MARK_BIT (block, w, b)) - goto next_small; - } - + if (small_objects) { HEAVY_STAT (++scanned_objects); scan_func (obj, sgen_obj_get_descriptor (obj), queue); - next_small: - obj += block_obj_size; + } else { + size_t offset = card_offset (obj, block_start); + sgen_cardtable_scan_object (obj, block_obj_size, card_base + offset, mod_union, queue); } - HEAVY_STAT (if (*card_data) ++remarked_cards); - binary_protocol_card_scan (first_obj, obj - first_obj); + next_object: + obj += block_obj_size; + g_assert (scan_front <= obj); + scan_front = obj; } + + HEAVY_STAT (if (*card_data) ++remarked_cards); + binary_protocol_card_scan (first_obj, obj - first_obj); + + if (small_objects) + ++card_data; + else + card_data = card_base + card_offset (obj, block_start); } } END_FOREACH_BLOCK; } @@ -1963,7 +1857,6 @@ major_count_cards (long long *num_total_cards, long long *num_marked_cards) *num_marked_cards = marked_cards; } -#ifdef SGEN_HAVE_CONCURRENT_MARK static void update_cardtable_mod_union (void) { @@ -1983,9 +1876,9 @@ static guint8* major_get_cardtable_mod_union_for_object (char *obj) { MSBlockInfo *block = MS_BLOCK_FOR_OBJ (obj); - return &block->cardtable_mod_union [(obj - (char*)sgen_card_table_align_pointer (MS_BLOCK_FOR_BLOCK_INFO (block))) >> CARD_BITS]; + size_t offset = card_offset (obj, (char*)sgen_card_table_align_pointer (MS_BLOCK_FOR_BLOCK_INFO (block))); + return &block->cardtable_mod_union [offset]; } -#endif static void alloc_free_block_lists (MSBlockInfo ***lists) @@ -2003,12 +1896,8 @@ post_param_init (SgenMajorCollector *collector) collector->sweeps_lazily = lazy_sweep; } -#ifdef SGEN_HAVE_CONCURRENT_MARK static void sgen_marksweep_init_internal (SgenMajorCollector *collector, gboolean is_concurrent) -#else // SGEN_HAVE_CONCURRENT_MARK -#error unknown configuration -#endif // SGEN_HAVE_CONCURRENT_MARK { int i; @@ -2038,27 +1927,24 @@ sgen_marksweep_init_internal (SgenMajorCollector *collector, gboolean is_concurr for (i = 0; i < MS_NUM_FAST_BLOCK_OBJ_SIZE_INDEXES * 8; ++i) g_assert (MS_BLOCK_OBJ_SIZE_INDEX (i) == ms_find_block_obj_size_index (i)); - mono_counters_register ("# major blocks allocated", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_alloced); - mono_counters_register ("# major blocks freed", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_freed); - mono_counters_register ("# major blocks lazy swept", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_lazy_swept); - mono_counters_register ("# major objects evacuated", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_objects_evacuated); + mono_counters_register ("# major blocks allocated", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_major_blocks_alloced); + mono_counters_register ("# major blocks freed", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_major_blocks_freed); + mono_counters_register ("# major blocks lazy swept", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_major_blocks_lazy_swept); + mono_counters_register ("# major objects evacuated", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_major_objects_evacuated); #if SIZEOF_VOID_P != 8 - mono_counters_register ("# major blocks freed ideally", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_freed_ideal); - mono_counters_register ("# major blocks freed less ideally", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_freed_less_ideal); - mono_counters_register ("# major blocks freed individually", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_freed_individual); - mono_counters_register ("# major blocks allocated less ideally", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_alloced_less_ideal); + mono_counters_register ("# major blocks freed ideally", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_major_blocks_freed_ideal); + mono_counters_register ("# major blocks freed less ideally", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_major_blocks_freed_less_ideal); + mono_counters_register ("# major blocks freed individually", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_major_blocks_freed_individual); + mono_counters_register ("# major blocks allocated less ideally", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_major_blocks_alloced_less_ideal); #endif collector->section_size = MAJOR_SECTION_SIZE; -#ifdef SGEN_HAVE_CONCURRENT_MARK concurrent_mark = is_concurrent; if (is_concurrent) { collector->is_concurrent = TRUE; collector->want_synchronous_collection = &want_evacuation; - } else -#endif - { + } else { collector->is_concurrent = FALSE; collector->want_synchronous_collection = NULL; } @@ -2081,12 +1967,10 @@ sgen_marksweep_init_internal (SgenMajorCollector *collector, gboolean is_concurr collector->pin_major_object = pin_major_object; collector->scan_card_table = major_scan_card_table; collector->iterate_live_block_ranges = (void*)(void*) major_iterate_live_block_ranges; -#ifdef SGEN_HAVE_CONCURRENT_MARK if (is_concurrent) { collector->update_cardtable_mod_union = update_cardtable_mod_union; collector->get_cardtable_mod_union_for_object = major_get_cardtable_mod_union_for_object; } -#endif collector->init_to_space = major_init_to_space; collector->sweep = major_sweep; collector->check_scan_starts = major_check_scan_starts; @@ -2109,20 +1993,46 @@ sgen_marksweep_init_internal (SgenMajorCollector *collector, gboolean is_concurr collector->count_cards = major_count_cards; collector->major_ops.copy_or_mark_object = major_copy_or_mark_object_canonical; - collector->major_ops.scan_object = major_scan_object; -#ifdef SGEN_HAVE_CONCURRENT_MARK + collector->major_ops.scan_object = major_scan_object_with_evacuation; if (is_concurrent) { collector->major_concurrent_ops.copy_or_mark_object = major_copy_or_mark_object_concurrent_canonical; - collector->major_concurrent_ops.scan_object = major_scan_object_concurrent; + collector->major_concurrent_ops.scan_object = major_scan_object_no_mark_concurrent; collector->major_concurrent_ops.scan_vtype = major_scan_vtype_concurrent; } + +#if !defined (FIXED_HEAP) && !defined (SGEN_PARALLEL_MARK) + /* FIXME: this will not work with evacuation or the split nursery. */ + if (!is_concurrent) + collector->drain_gray_stack = drain_gray_stack; + +#ifdef HEAVY_STATISTICS + mono_counters_register ("Optimized copy", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_optimized_copy); + mono_counters_register ("Optimized copy nursery", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_optimized_copy_nursery); + mono_counters_register ("Optimized copy nursery forwarded", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_optimized_copy_nursery_forwarded); + mono_counters_register ("Optimized copy nursery pinned", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_optimized_copy_nursery_pinned); + mono_counters_register ("Optimized copy major", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_optimized_copy_major); + mono_counters_register ("Optimized copy major small fast", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_optimized_copy_major_small_fast); + mono_counters_register ("Optimized copy major small slow", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_optimized_copy_major_small_slow); + mono_counters_register ("Optimized copy major large", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_optimized_copy_major_large); + mono_counters_register ("Optimized major scan", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_optimized_major_scan); + mono_counters_register ("Optimized major scan no refs", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_optimized_major_scan_no_refs); + + mono_counters_register ("Gray stack drain loops", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_drain_loops); + mono_counters_register ("Gray stack prefetch fills", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_drain_prefetch_fills); + mono_counters_register ("Gray stack prefetch failures", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_drain_prefetch_fill_failures); #endif +#endif + +#ifdef SGEN_HEAVY_BINARY_PROTOCOL + mono_mutex_init (&scanned_objects_list_lock); +#endif + + SGEN_ASSERT (0, SGEN_MAX_SMALL_OBJ_SIZE <= MS_BLOCK_FREE / 2, "MAX_SMALL_OBJ_SIZE must be at most MS_BLOCK_FREE / 2"); /*cardtable requires major pages to be 8 cards aligned*/ g_assert ((MS_BLOCK_SIZE % (8 * CARD_SIZE_IN_BYTES)) == 0); } -#ifdef SGEN_HAVE_CONCURRENT_MARK void sgen_marksweep_init (SgenMajorCollector *collector) { @@ -2134,6 +2044,5 @@ sgen_marksweep_conc_init (SgenMajorCollector *collector) { sgen_marksweep_init_internal (collector, TRUE); } -#endif #endif diff --git a/mta-mono/vendor/mono/metadata/sgen-memory-governor.c b/mta-mono/vendor/mono/metadata/sgen-memory-governor.c index 5d17a0d..5e49822 100644 --- a/mta-mono/vendor/mono/metadata/sgen-memory-governor.c +++ b/mta-mono/vendor/mono/metadata/sgen-memory-governor.c @@ -355,8 +355,10 @@ sgen_memgov_release_space (mword size, int space) gboolean sgen_memgov_try_alloc_space (mword size, int space) { - if (sgen_memgov_available_free_space () < size) + if (sgen_memgov_available_free_space () < size) { + SGEN_ASSERT (4, !sgen_is_worker_thread (mono_native_thread_id_get ()), "Memory shouldn't run out in worker thread"); return FALSE; + } SGEN_ATOMIC_ADD_P (allocated_heap, size); mono_runtime_resource_check_limit (MONO_RESOURCE_GC_HEAP, allocated_heap); diff --git a/mta-mono/vendor/mono/metadata/sgen-minor-copy-object.h b/mta-mono/vendor/mono/metadata/sgen-minor-copy-object.h index c18e49f..f1061ee 100644 --- a/mta-mono/vendor/mono/metadata/sgen-minor-copy-object.h +++ b/mta-mono/vendor/mono/metadata/sgen-minor-copy-object.h @@ -22,7 +22,7 @@ #define collector_pin_object(obj, queue) sgen_pin_object (obj, queue); #define COLLECTOR_SERIAL_ALLOC_FOR_PROMOTION alloc_for_promotion -extern long long stat_nursery_copy_object_failed_to_space; /* from sgen-gc.c */ +extern guint64 stat_nursery_copy_object_failed_to_space; /* from sgen-gc.c */ #include "mono/utils/mono-compiler.h" @@ -52,6 +52,7 @@ static MONO_ALWAYS_INLINE void SERIAL_COPY_OBJECT (void **obj_slot, SgenGrayQueue *queue) { char *forwarded; + char *copy; char *obj = *obj_slot; SGEN_ASSERT (9, current_collection_generation == GENERATION_NURSERY, "calling minor-serial-copy from a %d generation collection", current_collection_generation); @@ -75,7 +76,7 @@ SERIAL_COPY_OBJECT (void **obj_slot, SgenGrayQueue *queue) SGEN_ASSERT (9, (*(MonoVTable**)SGEN_LOAD_VTABLE (obj))->gc_descr, "forwarded object %p has no gc descriptor", forwarded); SGEN_LOG (9, " (already forwarded to %p)", forwarded); HEAVY_STAT (++stat_nursery_copy_object_failed_forwarded); - *obj_slot = forwarded; + SGEN_UPDATE_REFERENCE (obj_slot, forwarded); return; } if (G_UNLIKELY (SGEN_OBJECT_IS_PINNED (obj))) { @@ -96,7 +97,8 @@ SERIAL_COPY_OBJECT (void **obj_slot, SgenGrayQueue *queue) HEAVY_STAT (++stat_objects_copied_nursery); - *obj_slot = copy_object_no_checks (obj, queue); + copy = copy_object_no_checks (obj, queue); + SGEN_UPDATE_REFERENCE (obj_slot, copy); } /* @@ -132,9 +134,9 @@ SERIAL_COPY_OBJECT_FROM_OBJ (void **obj_slot, SgenGrayQueue *queue) SGEN_ASSERT (9, (*(MonoVTable**)SGEN_LOAD_VTABLE (obj))->gc_descr, "forwarded object %p has no gc descriptor", forwarded); SGEN_LOG (9, " (already forwarded to %p)", forwarded); HEAVY_STAT (++stat_nursery_copy_object_failed_forwarded); - *obj_slot = forwarded; + SGEN_UPDATE_REFERENCE (obj_slot, forwarded); #ifndef SGEN_SIMPLE_NURSERY - if (G_UNLIKELY (sgen_ptr_in_nursery (forwarded) && !sgen_ptr_in_nursery (obj_slot))) + if (G_UNLIKELY (sgen_ptr_in_nursery (forwarded) && !sgen_ptr_in_nursery (obj_slot) && !SGEN_OBJECT_IS_CEMENTED (forwarded))) sgen_add_to_global_remset (obj_slot, forwarded); #endif return; @@ -143,7 +145,7 @@ SERIAL_COPY_OBJECT_FROM_OBJ (void **obj_slot, SgenGrayQueue *queue) SGEN_ASSERT (9, ((MonoVTable*)SGEN_LOAD_VTABLE(obj))->gc_descr, "pinned object %p has no gc descriptor", obj); SGEN_LOG (9, " (pinned, no change)"); HEAVY_STAT (++stat_nursery_copy_object_failed_pinned); - if (!sgen_ptr_in_nursery (obj_slot)) + if (!sgen_ptr_in_nursery (obj_slot) && !SGEN_OBJECT_IS_CEMENTED (obj)) sgen_add_to_global_remset (obj_slot, obj); return; } @@ -187,7 +189,7 @@ SERIAL_COPY_OBJECT_FROM_OBJ (void **obj_slot, SgenGrayQueue *queue) * remsets will be overwritten. Scanning objects at * most once would be the icing on the cake. */ - if (!sgen_ptr_in_nursery (obj_slot)) + if (!sgen_ptr_in_nursery (obj_slot) && !SGEN_OBJECT_IS_CEMENTED (obj)) sgen_add_to_global_remset (obj_slot, obj); return; @@ -197,14 +199,14 @@ SERIAL_COPY_OBJECT_FROM_OBJ (void **obj_slot, SgenGrayQueue *queue) HEAVY_STAT (++stat_objects_copied_nursery); copy = copy_object_no_checks (obj, queue); - *obj_slot = copy; + SGEN_UPDATE_REFERENCE (obj_slot, copy); #ifndef SGEN_SIMPLE_NURSERY - if (G_UNLIKELY (sgen_ptr_in_nursery (copy) && !sgen_ptr_in_nursery (obj_slot))) + if (G_UNLIKELY (sgen_ptr_in_nursery (copy) && !sgen_ptr_in_nursery (obj_slot) && !SGEN_OBJECT_IS_CEMENTED (copy))) sgen_add_to_global_remset (obj_slot, copy); #else /* copy_object_no_checks () can return obj on OOM */ if (G_UNLIKELY (obj == copy)) { - if (G_UNLIKELY (sgen_ptr_in_nursery (copy) && !sgen_ptr_in_nursery (obj_slot))) + if (G_UNLIKELY (sgen_ptr_in_nursery (copy) && !sgen_ptr_in_nursery (obj_slot) && !SGEN_OBJECT_IS_CEMENTED (copy))) sgen_add_to_global_remset (obj_slot, copy); } #endif diff --git a/mta-mono/vendor/mono/metadata/sgen-minor-scan-object.h b/mta-mono/vendor/mono/metadata/sgen-minor-scan-object.h index 3cff269..cd660cc 100644 --- a/mta-mono/vendor/mono/metadata/sgen-minor-scan-object.h +++ b/mta-mono/vendor/mono/metadata/sgen-minor-scan-object.h @@ -19,7 +19,7 @@ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -extern long long stat_scan_object_called_nursery; +extern guint64 stat_scan_object_called_nursery; #if defined(SGEN_SIMPLE_NURSERY) #define SERIAL_SCAN_OBJECT simple_nursery_serial_scan_object @@ -38,6 +38,7 @@ extern long long stat_scan_object_called_nursery; #define HANDLE_PTR(ptr,obj) do { \ void *__old = *(ptr); \ SGEN_OBJECT_LAYOUT_STATISTICS_MARK_BITMAP ((obj), (ptr)); \ + binary_protocol_scan_process_reference ((obj), (ptr), __old); \ if (__old) { \ SERIAL_COPY_OBJECT_FROM_OBJ ((ptr), queue); \ SGEN_COND_LOG (9, __old != *(ptr), "Overwrote field at %p with %p (was: %p)", (ptr), *(ptr), __old); \ @@ -53,6 +54,8 @@ SERIAL_SCAN_OBJECT (char *start, mword desc, SgenGrayQueue *queue) sgen_descriptor_count_scanned_object (desc); #endif + SGEN_ASSERT (9, sgen_get_current_collection_generation () == GENERATION_NURSERY, "Must not use minor scan during major collection."); + #define SCAN_OBJECT_PROTOCOL #include "sgen-scan-object.h" @@ -65,6 +68,8 @@ SERIAL_SCAN_VTYPE (char *start, mword desc, SgenGrayQueue *queue BINARY_PROTOCOL { SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP; + SGEN_ASSERT (9, sgen_get_current_collection_generation () == GENERATION_NURSERY, "Must not use minor scan during major collection."); + /* The descriptors include info about the MonoObject header as well */ start -= sizeof (MonoObject); diff --git a/mta-mono/vendor/mono/metadata/sgen-new-bridge.c b/mta-mono/vendor/mono/metadata/sgen-new-bridge.c index 51b00e9..1733d57 100644 --- a/mta-mono/vendor/mono/metadata/sgen-new-bridge.c +++ b/mta-mono/vendor/mono/metadata/sgen-new-bridge.c @@ -665,7 +665,7 @@ dfs1 (HashEntry *obj_entry) if (!obj_entry->v.dfs1.is_visited) { int num_links = 0; - mword desc = sgen_obj_get_descriptor (start); + mword desc = sgen_obj_get_descriptor_safe (start); obj_entry->v.dfs1.is_visited = 1; diff --git a/mta-mono/vendor/mono/metadata/sgen-nursery-allocator.c b/mta-mono/vendor/mono/metadata/sgen-nursery-allocator.c index 01d1bd1..dc79eb1 100644 --- a/mta-mono/vendor/mono/metadata/sgen-nursery-allocator.c +++ b/mta-mono/vendor/mono/metadata/sgen-nursery-allocator.c @@ -50,7 +50,6 @@ #endif #include #include -#include #include #include #ifdef __MACH__ @@ -71,6 +70,7 @@ #include "metadata/sgen-archdep.h" #include "metadata/sgen-bridge.h" #include "metadata/sgen-memory-governor.h" +#include "metadata/sgen-pinning.h" #include "metadata/mono-gc.h" #include "metadata/method-builder.h" #include "metadata/profiler-private.h" @@ -207,7 +207,7 @@ dump_alloc_records (void) printf ("------------------------------------DUMP RECORDS----------------------------\n"); for (i = 0; i < next_record; ++i) { AllocRecord *rec = alloc_records + i; - printf ("obj [%p, %p] size %zd reason %s seq %d tid %zx\n", rec->address, rec_end (rec), rec->size, get_reason_name (rec), rec->seq, (size_t)rec->tid); + printf ("obj [%p, %p] size %d reason %s seq %d tid %x\n", rec->address, rec_end (rec), (int)rec->size, get_reason_name (rec), rec->seq, (size_t)rec->tid); } } @@ -234,7 +234,7 @@ verify_alloc_records (void) hole_size = rec->address - rec_end (prev); max_hole = MAX (max_hole, hole_size); } - printf ("obj [%p, %p] size %zd hole to prev %d reason %s seq %d tid %zx\n", rec->address, rec_end (rec), rec->size, hole_size, get_reason_name (rec), rec->seq, (size_t)rec->tid); + printf ("obj [%p, %p] size %d hole to prev %d reason %s seq %d tid %zx\n", rec->address, rec_end (rec), (int)rec->size, hole_size, get_reason_name (rec), rec->seq, (size_t)rec->tid); prev = rec; } printf ("SUMMARY total alloc'd %d holes %d max_hole %d\n", total, holes, max_hole); @@ -747,12 +747,12 @@ fragment_list_reverse (SgenFragmentAllocator *allocator) } mword -sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_t num_entries, SgenGrayQueue *unpin_queue) +sgen_build_nursery_fragments (GCMemSection *nursery_section, SgenGrayQueue *unpin_queue) { char *frag_start, *frag_end; size_t frag_size; - size_t i = 0; SgenFragment *frags_ranges; + void **pin_start, **pin_entry, **pin_end; #ifdef NALLOC_DEBUG reset_alloc_records (); @@ -769,14 +769,17 @@ sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_ /* clear scan starts */ memset (nursery_section->scan_starts, 0, nursery_section->num_scan_start * sizeof (gpointer)); - while (i < num_entries || frags_ranges) { + pin_start = pin_entry = sgen_pinning_get_entry (nursery_section->pin_queue_first_entry); + pin_end = sgen_pinning_get_entry (nursery_section->pin_queue_last_entry); + + while (pin_entry < pin_end || frags_ranges) { char *addr0, *addr1; size_t size; SgenFragment *last_frag = NULL; addr0 = addr1 = sgen_nursery_end; - if (i < num_entries) - addr0 = start [i]; + if (pin_entry < pin_end) + addr0 = *pin_entry; if (frags_ranges) addr1 = frags_ranges->fragment_start; @@ -789,7 +792,7 @@ sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_ CANARIFY_SIZE (size); sgen_set_nursery_scan_start (addr0); frag_end = addr0; - ++i; + ++pin_entry; } else { frag_end = addr1; size = frags_ranges->fragment_next - addr1; @@ -809,7 +812,7 @@ sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_ frag_size = size; #ifdef NALLOC_DEBUG - add_alloc_record (start [i], frag_size, PINNING); + add_alloc_record (*pin_entry, frag_size, PINNING); #endif frag_start = frag_end + frag_size; } @@ -830,9 +833,10 @@ sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_ sgen_minor_collector.build_fragments_finish (&mutator_allocator); if (!unmask (mutator_allocator.alloc_head)) { - SGEN_LOG (1, "Nursery fully pinned (%zd)", num_entries); - for (i = 0; i < num_entries; ++i) { - SGEN_LOG (3, "Bastard pinning obj %p (%s), size: %zd", start [i], sgen_safe_name (start [i]), sgen_safe_object_get_size (start [i])); + SGEN_LOG (1, "Nursery fully pinned"); + for (pin_entry = pin_start; pin_entry < pin_end; ++pin_entry) { + void *p = *pin_entry; + SGEN_LOG (3, "Bastard pinning obj %p (%s), size: %zd", p, sgen_safe_name (p), sgen_safe_object_get_size (p)); } } return fragment_total; diff --git a/mta-mono/vendor/mono/metadata/sgen-old-bridge.c b/mta-mono/vendor/mono/metadata/sgen-old-bridge.c index 4e2ba7b..5982c1b 100644 --- a/mta-mono/vendor/mono/metadata/sgen-old-bridge.c +++ b/mta-mono/vendor/mono/metadata/sgen-old-bridge.c @@ -526,7 +526,7 @@ dfs1 (HashEntry *obj_entry) obj = obj_entry->obj; start = (char*)obj; - desc = sgen_obj_get_descriptor (start); + desc = sgen_obj_get_descriptor_safe (start); if (src) { //g_print ("link %s -> %s\n", sgen_safe_name (src->obj), sgen_safe_name (obj)); diff --git a/mta-mono/vendor/mono/metadata/sgen-os-posix.c b/mta-mono/vendor/mono/metadata/sgen-os-posix.c index 55acf51..8f4ee52 100644 --- a/mta-mono/vendor/mono/metadata/sgen-os-posix.c +++ b/mta-mono/vendor/mono/metadata/sgen-os-posix.c @@ -70,7 +70,7 @@ suspend_thread (SgenThreadInfo *info, void *context) if (context) { mono_sigctx_to_monoctx (context, &ctx); info->stopped_ip = MONO_CONTEXT_GET_IP (&ctx); - stack_start = MONO_CONTEXT_GET_SP (&ctx) - REDZONE_SIZE; + stack_start = (((guint8 *) MONO_CONTEXT_GET_SP (&ctx)) - REDZONE_SIZE); } else { info->stopped_ip = NULL; stack_start = NULL; diff --git a/mta-mono/vendor/mono/metadata/sgen-os-win32.c b/mta-mono/vendor/mono/metadata/sgen-os-win32.c index 36769f3..fa1ed01 100644 --- a/mta-mono/vendor/mono/metadata/sgen-os-win32.c +++ b/mta-mono/vendor/mono/metadata/sgen-os-win32.c @@ -57,6 +57,7 @@ sgen_suspend_thread (SgenThreadInfo *info) CloseHandle (handle); +#if !defined(MONO_CROSS_COMPILE) #ifdef USE_MONO_CTX memset (&info->ctx, 0, sizeof (MonoContext)); #ifdef TARGET_AMD64 @@ -103,6 +104,7 @@ sgen_suspend_thread (SgenThreadInfo *info) info->regs [7] = context.Esp; info->stopped_ip = (gpointer)context.Eip; info->stack_start = (char*)context.Esp - REDZONE_SIZE; +#endif #endif /* Notify the JIT */ diff --git a/mta-mono/vendor/mono/metadata/sgen-pinning.c b/mta-mono/vendor/mono/metadata/sgen-pinning.c index 71a8dbe..dac7f8e 100644 --- a/mta-mono/vendor/mono/metadata/sgen-pinning.c +++ b/mta-mono/vendor/mono/metadata/sgen-pinning.c @@ -37,6 +37,7 @@ void sgen_init_pinning (void) { memset (pin_hash_filter, 0, sizeof (pin_hash_filter)); + pin_queue.mem_type = INTERNAL_MEM_PIN_QUEUE; } void @@ -59,50 +60,89 @@ sgen_pin_stage_ptr (void *ptr) sgen_pointer_queue_add (&pin_queue, ptr); } -void** -sgen_find_optimized_pin_queue_area (void *start, void *end, size_t *num) +gboolean +sgen_find_optimized_pin_queue_area (void *start, void *end, size_t *first_out, size_t *last_out) { - size_t first, last; - first = sgen_pointer_queue_search (&pin_queue, start); - last = sgen_pointer_queue_search (&pin_queue, end); - *num = last - first; - if (first == last) - return NULL; - return pin_queue.data + first; + size_t first = sgen_pointer_queue_search (&pin_queue, start); + size_t last = sgen_pointer_queue_search (&pin_queue, end); + SGEN_ASSERT (0, last == pin_queue.next_slot || pin_queue.data [last] >= end, "Pin queue search gone awry"); + *first_out = first; + *last_out = last; + return first != last; +} + +void** +sgen_pinning_get_entry (size_t index) +{ + SGEN_ASSERT (0, index <= pin_queue.next_slot, "Pin queue entry out of range"); + return &pin_queue.data [index]; } void sgen_find_section_pin_queue_start_end (GCMemSection *section) { SGEN_LOG (6, "Pinning from section %p (%p-%p)", section, section->data, section->end_data); - section->pin_queue_start = sgen_find_optimized_pin_queue_area (section->data, section->end_data, §ion->pin_queue_num_entries); - SGEN_LOG (6, "Found %zd pinning addresses in section %p", section->pin_queue_num_entries, section); + + sgen_find_optimized_pin_queue_area (section->data, section->end_data, + §ion->pin_queue_first_entry, §ion->pin_queue_last_entry); + + SGEN_LOG (6, "Found %zd pinning addresses in section %p", + section->pin_queue_last_entry - section->pin_queue_first_entry, section); } /*This will setup the given section for the while pin queue. */ void sgen_pinning_setup_section (GCMemSection *section) { - section->pin_queue_start = pin_queue.data; - section->pin_queue_num_entries = pin_queue.next_slot; + section->pin_queue_first_entry = 0; + section->pin_queue_last_entry = pin_queue.next_slot; } void sgen_pinning_trim_queue_to_section (GCMemSection *section) { - pin_queue.next_slot = section->pin_queue_num_entries; + SGEN_ASSERT (0, section->pin_queue_first_entry == 0, "Pin queue trimming assumes the whole pin queue is used by the nursery"); + pin_queue.next_slot = section->pin_queue_last_entry; } +/* + * This is called when we've run out of memory during a major collection. + * + * After collecting potential pin entries and sorting the array, this is what it looks like: + * + * +--------------------+---------------------------------------------+--------------------+ + * | major heap entries | nursery entries | major heap entries | + * +--------------------+---------------------------------------------+--------------------+ + * + * Of course there might not be major heap entries before and/or after the nursery entries, + * depending on where the major heap sections are in the address space, and whether there + * were any potential pointers there. + * + * When we pin nursery objects, we compact the nursery part of the pin array, which leaves + * discarded entries after the ones that actually pointed to nursery objects: + * + * +--------------------+-----------------+---------------------------+--------------------+ + * | major heap entries | nursery entries | discarded nursery entries | major heap entries | + * +--------------------+-----------------+---------------------------+--------------------+ + * + * When, due to being out of memory, we late pin more objects, the pin array looks like + * this: + * + * +--------------------+-----------------+---------------------------+--------------------+--------------+ + * | major heap entries | nursery entries | discarded nursery entries | major heap entries | late entries | + * +--------------------+-----------------+---------------------------+--------------------+--------------+ + * + * This function gets rid of the discarded nursery entries by nulling them out. Note that + * we can late pin objects not only in the nursery but also in the major heap, which happens + * when evacuation fails. + */ void sgen_pin_queue_clear_discarded_entries (GCMemSection *section, size_t max_pin_slot) { - void **start = section->pin_queue_start + section->pin_queue_num_entries; - void **end = pin_queue.data + max_pin_slot; + void **start = sgen_pinning_get_entry (section->pin_queue_last_entry); + void **end = sgen_pinning_get_entry (max_pin_slot); void *addr; - if (!start) - return; - for (; start < end; ++start) { addr = *start; if ((char*)addr < section->data || (char*)addr > section->end_data) @@ -253,6 +293,9 @@ sgen_cement_lookup_or_register (char *obj) ++hash [i].count; if (hash [i].count == SGEN_CEMENT_THRESHOLD) { + SGEN_ASSERT (9, SGEN_OBJECT_IS_PINNED (obj), "Can only cement pinned objects"); + SGEN_CEMENT_OBJECT (obj); + if (G_UNLIKELY (MONO_GC_OBJ_CEMENTED_ENABLED())) { MonoVTable *vt G_GNUC_UNUSED = (MonoVTable*)SGEN_LOAD_VTABLE (obj); MONO_GC_OBJ_CEMENTED ((mword)obj, sgen_safe_object_get_size ((MonoObject*)obj), @@ -265,21 +308,32 @@ sgen_cement_lookup_or_register (char *obj) return FALSE; } -void -sgen_pin_cemented_objects (void) +static void +pin_from_hash (CementHashEntry *hash, gboolean has_been_reset) { int i; for (i = 0; i < SGEN_CEMENT_HASH_SIZE; ++i) { - if (!cement_hash [i].count) + if (!hash [i].count) continue; - SGEN_ASSERT (5, cement_hash [i].count >= SGEN_CEMENT_THRESHOLD, "Cementing hash inconsistent"); + if (has_been_reset) + SGEN_ASSERT (5, hash [i].count >= SGEN_CEMENT_THRESHOLD, "Cementing hash inconsistent"); - sgen_pin_stage_ptr (cement_hash [i].obj); + sgen_pin_stage_ptr (hash [i].obj); /* FIXME: do pin stats if enabled */ + + SGEN_CEMENT_OBJECT (hash [i].obj); } } +void +sgen_pin_cemented_objects (void) +{ + pin_from_hash (cement_hash, TRUE); + if (cement_concurrent) + pin_from_hash (cement_hash_concurrent, FALSE); +} + void sgen_cement_clear_below_threshold (void) { diff --git a/mta-mono/vendor/mono/metadata/sgen-pinning.h b/mta-mono/vendor/mono/metadata/sgen-pinning.h index 19840be..9a2dcbb 100644 --- a/mta-mono/vendor/mono/metadata/sgen-pinning.h +++ b/mta-mono/vendor/mono/metadata/sgen-pinning.h @@ -38,6 +38,11 @@ void sgen_pinning_trim_queue_to_section (GCMemSection *section) MONO_INTERNAL; void sgen_dump_pin_queue (void) MONO_INTERNAL; +gboolean sgen_find_optimized_pin_queue_area (void *start, void *end, size_t *first_out, size_t *last_out) MONO_INTERNAL; +void sgen_find_section_pin_queue_start_end (GCMemSection *section) MONO_INTERNAL; +void** sgen_pinning_get_entry (size_t index) MONO_INTERNAL; +void sgen_pin_objects_in_section (GCMemSection *section, ScanCopyContext ctx) MONO_INTERNAL; + /* Pinning stats */ void sgen_pin_stats_register_address (char *addr, int pin_type) MONO_INTERNAL; diff --git a/mta-mono/vendor/mono/metadata/sgen-pointer-queue.c b/mta-mono/vendor/mono/metadata/sgen-pointer-queue.c index 793c294..e201e12 100644 --- a/mta-mono/vendor/mono/metadata/sgen-pointer-queue.c +++ b/mta-mono/vendor/mono/metadata/sgen-pointer-queue.c @@ -29,13 +29,23 @@ sgen_pointer_queue_clear (SgenPointerQueue *queue) queue->next_slot = 0; } +void +sgen_pointer_queue_init (SgenPointerQueue *queue, int mem_type) +{ + queue->next_slot = 0; + queue->size = 0; + queue->data = NULL; + queue->mem_type = mem_type; +} + static void realloc_queue (SgenPointerQueue *queue) { size_t new_size = queue->size ? queue->size + queue->size/2 : 1024; - void **new_data = sgen_alloc_internal_dynamic (sizeof (void*) * new_size, INTERNAL_MEM_PIN_QUEUE, TRUE); + void **new_data = sgen_alloc_internal_dynamic (sizeof (void*) * new_size, queue->mem_type, TRUE); + memcpy (new_data, queue->data, sizeof (void*) * queue->next_slot); - sgen_free_internal_dynamic (queue->data, sizeof (void*) * queue->size, INTERNAL_MEM_PIN_QUEUE); + sgen_free_internal_dynamic (queue->data, sizeof (void*) * queue->size, queue->mem_type); queue->data = new_data; queue->size = new_size; SGEN_LOG (4, "Reallocated pointer queue to size: %lu", new_size); @@ -50,6 +60,14 @@ sgen_pointer_queue_add (SgenPointerQueue *queue, void *ptr) queue->data [queue->next_slot++] = ptr; } +void* +sgen_pointer_queue_pop (SgenPointerQueue *queue) +{ + g_assert (queue->next_slot); + + return queue->data [--queue->next_slot]; +} + size_t sgen_pointer_queue_search (SgenPointerQueue *queue, void *addr) { @@ -121,4 +139,16 @@ sgen_pointer_queue_find (SgenPointerQueue *queue, void *ptr) return (size_t)-1; } +gboolean +sgen_pointer_queue_is_empty (SgenPointerQueue *queue) +{ + return !queue->next_slot; +} + +void +sgen_pointer_queue_free (SgenPointerQueue *queue) +{ + sgen_free_internal_dynamic (queue->data, sizeof (void*) * queue->size, queue->mem_type); +} + #endif diff --git a/mta-mono/vendor/mono/metadata/sgen-pointer-queue.h b/mta-mono/vendor/mono/metadata/sgen-pointer-queue.h index d972f3c..0bbeedf 100644 --- a/mta-mono/vendor/mono/metadata/sgen-pointer-queue.h +++ b/mta-mono/vendor/mono/metadata/sgen-pointer-queue.h @@ -20,10 +20,13 @@ #ifndef __MONO_SGEN_POINTER_QUEUE_H__ #define __MONO_SGEN_POINTER_QUEUE_H__ +#include + typedef struct { void **data; size_t size; size_t next_slot; + int mem_type; } SgenPointerQueue; void sgen_pointer_queue_add (SgenPointerQueue *queue, void *ptr) MONO_INTERNAL; @@ -32,5 +35,9 @@ void sgen_pointer_queue_remove_nulls (SgenPointerQueue *queue) MONO_INTERNAL; void sgen_pointer_queue_sort_uniq (SgenPointerQueue *queue) MONO_INTERNAL; size_t sgen_pointer_queue_search (SgenPointerQueue *queue, void *addr) MONO_INTERNAL; size_t sgen_pointer_queue_find (SgenPointerQueue *queue, void *ptr) MONO_INTERNAL; +void sgen_pointer_queue_init (SgenPointerQueue *queue, int mem_type) MONO_INTERNAL; +void* sgen_pointer_queue_pop (SgenPointerQueue *queue) MONO_INTERNAL; +gboolean sgen_pointer_queue_is_empty (SgenPointerQueue *queue) MONO_INTERNAL; +void sgen_pointer_queue_free (SgenPointerQueue *queue) MONO_INTERNAL; #endif diff --git a/mta-mono/vendor/mono/metadata/sgen-protocol-def.h b/mta-mono/vendor/mono/metadata/sgen-protocol-def.h new file mode 100644 index 0000000..63656f4 --- /dev/null +++ b/mta-mono/vendor/mono/metadata/sgen-protocol-def.h @@ -0,0 +1,309 @@ +BEGIN_PROTOCOL_ENTRY1 (binary_protocol_collection_force, TYPE_INT, generation) +FLUSH () +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY2 (binary_protocol_collection_begin, TYPE_INT, index, TYPE_INT, generation) +FLUSH () +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY4 (binary_protocol_collection_end, TYPE_INT, index, TYPE_INT, generation, TYPE_LONGLONG, num_scanned_objects, TYPE_LONGLONG, num_unique_scanned_objects) +FLUSH() +CUSTOM_PRINT (printf ("%d generation %d scanned %lld unique %lld %0.2f%%", entry->index, entry->generation, entry->num_scanned_objects, entry->num_unique_scanned_objects, entry->num_unique_scanned_objects ? (100.0 * (double) entry->num_scanned_objects / (double) entry->num_unique_scanned_objects) : 0.0)) +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY0 (binary_protocol_concurrent_start) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY0 (binary_protocol_concurrent_update) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY0 (binary_protocol_concurrent_finish) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY1 (binary_protocol_world_stopping, TYPE_LONGLONG, timestamp) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY5 (binary_protocol_world_stopped, TYPE_LONGLONG, timestamp, TYPE_LONGLONG, total_major_cards, TYPE_LONGLONG, marked_major_cards, TYPE_LONGLONG, total_los_cards, TYPE_LONGLONG, marked_los_cards) +CUSTOM_PRINT (printf ("timestamp %lld total %lld marked %lld %0.2f%%", entry->timestamp, entry->total_major_cards + entry->total_los_cards, entry->marked_major_cards + entry->marked_los_cards, 100.0 * (double) (entry->marked_major_cards + entry->marked_los_cards) / (double) (entry->total_major_cards + entry->total_los_cards))) +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY6 (binary_protocol_world_restarting, TYPE_INT, generation, TYPE_LONGLONG, timestamp, TYPE_LONGLONG, total_major_cards, TYPE_LONGLONG, marked_major_cards, TYPE_LONGLONG, total_los_cards, TYPE_LONGLONG, marked_los_cards) +CUSTOM_PRINT (printf ("generation %d timestamp %lld total %lld marked %lld %0.2f%%", entry->generation, entry->timestamp, entry->total_major_cards + entry->total_los_cards, entry->marked_major_cards + entry->marked_los_cards, 100.0 * (double) (entry->marked_major_cards + entry->marked_los_cards) / (double) (entry->total_major_cards + entry->total_los_cards))) +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY2 (binary_protocol_world_restarted, TYPE_INT, generation, TYPE_LONGLONG, timestamp) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_alloc, TYPE_POINTER, obj, TYPE_POINTER, vtable, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->obj, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->vtable) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY4 (binary_protocol_copy, TYPE_POINTER, from, TYPE_POINTER, to, TYPE_POINTER, vtable, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->from, entry->size) ? 0 : matches_interval (ptr, entry->to, entry->size) ? 1 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->vtable) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY2 (binary_protocol_pin_stage, TYPE_POINTER, addr_ptr, TYPE_POINTER, addr) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (ptr == entry->addr_ptr ? 0 : ptr == entry->addr ? 1 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_pin, TYPE_POINTER, obj, TYPE_POINTER, vtable, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->obj, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->vtable) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_mark, TYPE_POINTER, obj, TYPE_POINTER, vtable, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->obj, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_scan_begin, TYPE_POINTER, obj, TYPE_POINTER, vtable, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->obj, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->vtable) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY2 (binary_protocol_scan_vtype_begin, TYPE_POINTER, obj, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->obj, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_scan_process_reference, TYPE_POINTER, obj, TYPE_POINTER, ptr, TYPE_POINTER, value) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (ptr == entry->obj ? 0 : ptr == entry->ptr ? 1 : ptr == entry->value ? 2 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_wbarrier, TYPE_POINTER, ptr, TYPE_POINTER, value, TYPE_POINTER, value_vtable) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (ptr == entry->ptr ? 0 : ptr == entry->value ? 1 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->value_vtable) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_global_remset, TYPE_POINTER, ptr, TYPE_POINTER, value, TYPE_POINTER, value_vtable) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (ptr == entry->ptr ? 0 : ptr == entry->value ? 1 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->value_vtable) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY5 (binary_protocol_ptr_update, TYPE_POINTER, ptr, TYPE_POINTER, old_value, TYPE_POINTER, new_value, TYPE_POINTER, vtable, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (ptr == entry->ptr ? 0 : matches_interval (ptr, entry->old_value, entry->size) ? 1 : matches_interval (ptr, entry->new_value, entry->size) ? 2 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->vtable) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_cleanup, TYPE_POINTER, ptr, TYPE_POINTER, vtable, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->ptr, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->vtable) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY2 (binary_protocol_empty, TYPE_POINTER, start, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->start, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY2 (binary_protocol_thread_suspend, TYPE_POINTER, thread, TYPE_POINTER, stopped_ip) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY1 (binary_protocol_thread_restart, TYPE_POINTER, thread) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY1 (binary_protocol_thread_register, TYPE_POINTER, thread) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY1 (binary_protocol_thread_unregister, TYPE_POINTER, thread) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY6 (binary_protocol_missing_remset, TYPE_POINTER, obj, TYPE_POINTER, obj_vtable, TYPE_INT, offset, TYPE_POINTER, value, TYPE_POINTER, value_vtable, TYPE_INT, value_pinned) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (ptr == entry->obj ? 0 : ptr == entry->value ? 3 : ptr == (char*)entry->obj + entry->offset ? BINARY_PROTOCOL_MATCH : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->obj_vtable || ptr == entry->value_vtable) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_alloc_pinned, TYPE_POINTER, obj, TYPE_POINTER, vtable, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->obj, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->vtable) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_alloc_degraded, TYPE_POINTER, obj, TYPE_POINTER, vtable, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->obj, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->vtable) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY2 (binary_protocol_card_scan, TYPE_POINTER, start, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->start, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY3 (binary_protocol_cement, TYPE_POINTER, obj, TYPE_POINTER, vtable, TYPE_INT, size) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (matches_interval (ptr, entry->obj, entry->size) ? 0 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (ptr == entry->vtable) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY0 (binary_protocol_cement_reset) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY_HEAVY4 (binary_protocol_dislink_update, TYPE_POINTER, link, TYPE_POINTER, obj, TYPE_INT, track, TYPE_INT, staged) +CUSTOM_PRINT(entry->obj ? printf ("link %p obj %p staged %d track %d", entry->link, entry->obj, entry->staged, entry->track) : printf ("link %p obj %p staged %d", entry->link, entry->obj, entry->staged)) +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (ptr == entry->link ? 0 : ptr == entry->obj ? 1 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY4 (binary_protocol_dislink_update_staged, TYPE_POINTER, link, TYPE_POINTER, obj, TYPE_INT, track, TYPE_INT, index) +CUSTOM_PRINT(entry->obj ? printf ("link %p obj %p index %d track %d", entry->link, entry->obj, entry->index, entry->track) : printf ("link %p obj %p index %d", entry->link, entry->obj, entry->index)) +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (ptr == entry->link ? 0 : ptr == entry->obj ? 1 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_dislink_process_staged, TYPE_POINTER, link, TYPE_POINTER, obj, TYPE_INT, index) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (ptr == entry->link ? 0 : ptr == entry->obj ? 1 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY1 (binary_protocol_domain_unload_begin, TYPE_POINTER, domain) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY1 (binary_protocol_domain_unload_end, TYPE_POINTER, domain) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (TRUE) +MATCH_INDEX (BINARY_PROTOCOL_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_gray_enqueue, TYPE_POINTER, queue, TYPE_POINTER, cursor, TYPE_POINTER, value) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (ptr == entry->cursor ? 1 : ptr == entry->value ? 2 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY_HEAVY + +BEGIN_PROTOCOL_ENTRY_HEAVY3 (binary_protocol_gray_dequeue, TYPE_POINTER, queue, TYPE_POINTER, cursor, TYPE_POINTER, value) +DEFAULT_PRINT () +IS_ALWAYS_MATCH (FALSE) +MATCH_INDEX (ptr == entry->cursor ? 1 : ptr == entry->value ? 2 : BINARY_PROTOCOL_NO_MATCH) +IS_VTABLE_MATCH (FALSE) +END_PROTOCOL_ENTRY_HEAVY + +#undef BEGIN_PROTOCOL_ENTRY0 +#undef BEGIN_PROTOCOL_ENTRY1 +#undef BEGIN_PROTOCOL_ENTRY2 +#undef BEGIN_PROTOCOL_ENTRY3 +#undef BEGIN_PROTOCOL_ENTRY4 +#undef BEGIN_PROTOCOL_ENTRY5 +#undef BEGIN_PROTOCOL_ENTRY6 +#undef BEGIN_PROTOCOL_ENTRY_HEAVY0 +#undef BEGIN_PROTOCOL_ENTRY_HEAVY1 +#undef BEGIN_PROTOCOL_ENTRY_HEAVY2 +#undef BEGIN_PROTOCOL_ENTRY_HEAVY3 +#undef BEGIN_PROTOCOL_ENTRY_HEAVY4 +#undef BEGIN_PROTOCOL_ENTRY_HEAVY5 +#undef BEGIN_PROTOCOL_ENTRY_HEAVY6 + +#undef FLUSH + +#undef DEFAULT_PRINT +#undef CUSTOM_PRINT + +#undef IS_ALWAYS_MATCH +#undef MATCH_INDEX +#undef IS_VTABLE_MATCH + +#undef END_PROTOCOL_ENTRY +#undef END_PROTOCOL_ENTRY_HEAVY diff --git a/mta-mono/vendor/mono/metadata/sgen-protocol.c b/mta-mono/vendor/mono/metadata/sgen-protocol.c index a8f9b34..22f70c3 100644 --- a/mta-mono/vendor/mono/metadata/sgen-protocol.c +++ b/mta-mono/vendor/mono/metadata/sgen-protocol.c @@ -23,14 +23,22 @@ #ifdef HAVE_SGEN_GC #include "config.h" +#include "sgen-conf.h" #include "sgen-gc.h" #include "sgen-protocol.h" #include "sgen-memory-governor.h" #include "utils/mono-mmap.h" #include "utils/mono-threads.h" -/* If not null, dump binary protocol to this file */ -static FILE *binary_protocol_file = NULL; +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +/* FIXME Implement binary protocol IO on systems that don't have unistd */ +#ifdef HAVE_UNISTD_H +/* If valid, dump binary protocol to this file */ +static int binary_protocol_file = -1; /* We set this to -1 to indicate an exclusive lock */ static volatile int binary_protocol_use_count = 0; @@ -82,27 +90,48 @@ binary_protocol_open_file (void) else filename = filename_or_prefix; - binary_protocol_file = fopen (filename, "w"); + do { + binary_protocol_file = open (filename, O_CREAT|O_WRONLY|O_TRUNC, 0644); + if (binary_protocol_file == -1 && errno != EINTR) + break; /* Failed */ + } while (binary_protocol_file == -1); if (file_size_limit > 0) free_filename (filename); } +#endif void binary_protocol_init (const char *filename, long long limit) { +#ifdef HAVE_UNISTD_H filename_or_prefix = sgen_alloc_internal_dynamic (strlen (filename) + 1, INTERNAL_MEM_BINARY_PROTOCOL, TRUE); strcpy (filename_or_prefix, filename); file_size_limit = limit; binary_protocol_open_file (); +#endif } gboolean binary_protocol_is_enabled (void) { - return binary_protocol_file != NULL; +#ifdef HAVE_UNISTD_H + return binary_protocol_file != -1; +#else + return FALSE; +#endif +} + +#ifdef HAVE_UNISTD_H + +static void +close_binary_protocol_file (void) +{ + while (close (binary_protocol_file) == -1 && errno == EINTR) + ; + binary_protocol_file = -1; } static gboolean @@ -155,8 +184,21 @@ unlock_recursive (void) static void binary_protocol_flush_buffer (BinaryProtocolBuffer *buffer) { + ssize_t ret; + size_t to_write = buffer->index; + size_t written = 0; g_assert (buffer->index > 0); - fwrite (buffer->buffer, 1, buffer->index, binary_protocol_file); + + while (written < to_write) { + ret = write (binary_protocol_file, buffer->buffer + written, to_write - written); + if (ret >= 0) + written += ret; + else if (errno == EINTR) + continue; + else + close_binary_protocol_file (); + } + current_file_size += buffer->index; sgen_free_os_memory (buffer, sizeof (BinaryProtocolBuffer), SGEN_ALLOC_INTERNAL); @@ -168,8 +210,7 @@ binary_protocol_check_file_overflow (void) if (file_size_limit <= 0 || current_file_size < file_size_limit) return; - fclose (binary_protocol_file); - binary_protocol_file = NULL; + close_binary_protocol_file (); if (current_file_index > 0) { char *filename = filename_for_index (current_file_index - 1); @@ -182,15 +223,17 @@ binary_protocol_check_file_overflow (void) binary_protocol_open_file (); } +#endif void binary_protocol_flush_buffers (gboolean force) { +#ifdef HAVE_UNISTD_H int num_buffers = 0, i; BinaryProtocolBuffer *buf; BinaryProtocolBuffer **bufs; - if (!binary_protocol_file) + if (binary_protocol_file == -1) return; if (!force && !try_lock_exclusive ()) @@ -214,15 +257,14 @@ binary_protocol_flush_buffers (gboolean force) if (!force) unlock_exclusive (); - - fflush (binary_protocol_file); +#endif } +#ifdef HAVE_UNISTD_H static BinaryProtocolBuffer* binary_protocol_get_buffer (int length) { BinaryProtocolBuffer *buffer, *new_buffer; - retry: buffer = binary_protocol_buffers; if (buffer && buffer->index + length <= BINARY_PROTOCOL_BUFFER_SIZE) @@ -239,15 +281,16 @@ binary_protocol_get_buffer (int length) return new_buffer; } - +#endif static void protocol_entry (unsigned char type, gpointer data, int size) { +#ifdef HAVE_UNISTD_H int index; BinaryProtocolBuffer *buffer; - if (!binary_protocol_file) + if (binary_protocol_file == -1) return; if (sgen_is_worker_thread (mono_native_thread_id_get ())) @@ -275,272 +318,105 @@ protocol_entry (unsigned char type, gpointer data, int size) g_assert (index <= BINARY_PROTOCOL_BUFFER_SIZE); unlock_recursive (); +#endif } -void -binary_protocol_collection_force (int generation) -{ - SGenProtocolCollectionForce entry = { generation }; - binary_protocol_flush_buffers (FALSE); - protocol_entry (SGEN_PROTOCOL_COLLECTION_FORCE, &entry, sizeof (SGenProtocolCollectionForce)); -} +#define TYPE_INT int +#define TYPE_LONGLONG long long +#define TYPE_SIZE size_t +#define TYPE_POINTER gpointer -void -binary_protocol_collection_begin (int index, int generation) -{ - SGenProtocolCollection entry = { index, generation }; - binary_protocol_flush_buffers (FALSE); - protocol_entry (SGEN_PROTOCOL_COLLECTION_BEGIN, &entry, sizeof (SGenProtocolCollection)); -} +#define BEGIN_PROTOCOL_ENTRY0(method) \ + void method (void) { \ + int __type = PROTOCOL_ID(method); \ + gpointer __data = NULL; \ + int __size = 0; +#define BEGIN_PROTOCOL_ENTRY1(method,t1,f1) \ + void method (t1 f1) { \ + PROTOCOL_STRUCT(method) __entry = { f1 }; \ + int __type = PROTOCOL_ID(method); \ + gpointer __data = &__entry; \ + int __size = sizeof (PROTOCOL_STRUCT(method)); +#define BEGIN_PROTOCOL_ENTRY2(method,t1,f1,t2,f2) \ + void method (t1 f1, t2 f2) { \ + PROTOCOL_STRUCT(method) __entry = { f1, f2 }; \ + int __type = PROTOCOL_ID(method); \ + gpointer __data = &__entry; \ + int __size = sizeof (PROTOCOL_STRUCT(method)); +#define BEGIN_PROTOCOL_ENTRY3(method,t1,f1,t2,f2,t3,f3) \ + void method (t1 f1, t2 f2, t3 f3) { \ + PROTOCOL_STRUCT(method) __entry = { f1, f2, f3 }; \ + int __type = PROTOCOL_ID(method); \ + gpointer __data = &__entry; \ + int __size = sizeof (PROTOCOL_STRUCT(method)); +#define BEGIN_PROTOCOL_ENTRY4(method,t1,f1,t2,f2,t3,f3,t4,f4) \ + void method (t1 f1, t2 f2, t3 f3, t4 f4) { \ + PROTOCOL_STRUCT(method) __entry = { f1, f2, f3, f4 }; \ + int __type = PROTOCOL_ID(method); \ + gpointer __data = &__entry; \ + int __size = sizeof (PROTOCOL_STRUCT(method)); +#define BEGIN_PROTOCOL_ENTRY5(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) \ + void method (t1 f1, t2 f2, t3 f3, t4 f4, t5 f5) { \ + PROTOCOL_STRUCT(method) __entry = { f1, f2, f3, f4, f5 }; \ + int __type = PROTOCOL_ID(method); \ + gpointer __data = &__entry; \ + int __size = sizeof (PROTOCOL_STRUCT(method)); +#define BEGIN_PROTOCOL_ENTRY6(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) \ + void method (t1 f1, t2 f2, t3 f3, t4 f4, t5 f5, t6 f6) { \ + PROTOCOL_STRUCT(method) __entry = { f1, f2, f3, f4, f5, f6 }; \ + int __type = PROTOCOL_ID(method); \ + gpointer __data = &__entry; \ + int __size = sizeof (PROTOCOL_STRUCT(method)); -void -binary_protocol_collection_end (int index, int generation) -{ - SGenProtocolCollection entry = { index, generation }; - binary_protocol_flush_buffers (FALSE); - protocol_entry (SGEN_PROTOCOL_COLLECTION_END, &entry, sizeof (SGenProtocolCollection)); -} +#define FLUSH() \ + binary_protocol_flush_buffers (FALSE); -void -binary_protocol_concurrent_start (void) -{ - protocol_entry (SGEN_PROTOCOL_CONCURRENT_START, NULL, 0); -} +#define DEFAULT_PRINT() +#define CUSTOM_PRINT(_) -void -binary_protocol_concurrent_update_finish (void) -{ - protocol_entry (SGEN_PROTOCOL_CONCURRENT_UPDATE_FINISH, NULL, 0); -} +#define IS_ALWAYS_MATCH(_) +#define MATCH_INDEX(_) +#define IS_VTABLE_MATCH(_) -void -binary_protocol_world_stopping (long long timestamp) -{ - SGenProtocolWorldStopping entry = { timestamp }; - protocol_entry (SGEN_PROTOCOL_WORLD_STOPPING, &entry, sizeof (SGenProtocolWorldStopping)); -} - -void -binary_protocol_world_stopped (long long timestamp, long long total_major_cards, - long long marked_major_cards, long long total_los_cards, long long marked_los_cards) -{ - SGenProtocolWorldStopped entry = { timestamp, total_major_cards, marked_major_cards, total_los_cards, marked_los_cards }; - protocol_entry (SGEN_PROTOCOL_WORLD_STOPPED, &entry, sizeof (SGenProtocolWorldStopped)); -} - -void -binary_protocol_world_restarting (int generation, long long timestamp, - long long total_major_cards, long long marked_major_cards, long long total_los_cards, long long marked_los_cards) -{ - SGenProtocolWorldRestarting entry = { generation, timestamp, total_major_cards, marked_major_cards, total_los_cards, marked_los_cards }; - protocol_entry (SGEN_PROTOCOL_WORLD_RESTARTING, &entry, sizeof (SGenProtocolWorldRestarting)); -} - -void -binary_protocol_world_restarted (int generation, long long timestamp) -{ - SGenProtocolWorldRestarted entry = { generation, timestamp }; - protocol_entry (SGEN_PROTOCOL_WORLD_RESTARTED, &entry, sizeof (SGenProtocolWorldRestarted)); -} - -void -binary_protocol_thread_suspend (gpointer thread, gpointer stopped_ip) -{ - SGenProtocolThreadSuspend entry = { thread, stopped_ip }; - protocol_entry (SGEN_PROTOCOL_THREAD_SUSPEND, &entry, sizeof (SGenProtocolThreadSuspend)); -} - -void -binary_protocol_thread_restart (gpointer thread) -{ - SGenProtocolThreadRestart entry = { thread }; - protocol_entry (SGEN_PROTOCOL_THREAD_RESTART, &entry, sizeof (SGenProtocolThreadRestart)); -} - -void -binary_protocol_thread_register (gpointer thread) -{ - SGenProtocolThreadRegister entry = { thread }; - protocol_entry (SGEN_PROTOCOL_THREAD_REGISTER, &entry, sizeof (SGenProtocolThreadRegister)); - -} - -void -binary_protocol_thread_unregister (gpointer thread) -{ - SGenProtocolThreadUnregister entry = { thread }; - protocol_entry (SGEN_PROTOCOL_THREAD_UNREGISTER, &entry, sizeof (SGenProtocolThreadUnregister)); - -} - -void -binary_protocol_missing_remset (gpointer obj, gpointer obj_vtable, int offset, gpointer value, gpointer value_vtable, int value_pinned) -{ - SGenProtocolMissingRemset entry = { obj, obj_vtable, offset, value, value_vtable, value_pinned }; - protocol_entry (SGEN_PROTOCOL_MISSING_REMSET, &entry, sizeof (SGenProtocolMissingRemset)); - -} - -void -binary_protocol_cement (gpointer obj, gpointer vtable, int size) -{ - SGenProtocolCement entry = { obj, vtable, size }; - protocol_entry (SGEN_PROTOCOL_CEMENT, &entry, sizeof (SGenProtocolCement)); -} - -void -binary_protocol_cement_reset (void) -{ - protocol_entry (SGEN_PROTOCOL_CEMENT_RESET, NULL, 0); -} - -void -binary_protocol_domain_unload_begin (gpointer domain) -{ - SGenProtocolDomainUnload entry = { domain }; - protocol_entry (SGEN_PROTOCOL_DOMAIN_UNLOAD_BEGIN, &entry, sizeof (SGenProtocolDomainUnload)); -} - -void -binary_protocol_domain_unload_end (gpointer domain) -{ - SGenProtocolDomainUnload entry = { domain }; - protocol_entry (SGEN_PROTOCOL_DOMAIN_UNLOAD_END, &entry, sizeof (SGenProtocolDomainUnload)); -} +#define END_PROTOCOL_ENTRY \ + protocol_entry (__type, __data, __size); \ + } #ifdef SGEN_HEAVY_BINARY_PROTOCOL -void -binary_protocol_alloc (gpointer obj, gpointer vtable, int size) -{ - SGenProtocolAlloc entry = { obj, vtable, size }; - protocol_entry (SGEN_PROTOCOL_ALLOC, &entry, sizeof (SGenProtocolAlloc)); -} +#define BEGIN_PROTOCOL_ENTRY_HEAVY0(method) \ + BEGIN_PROTOCOL_ENTRY0 (method) +#define BEGIN_PROTOCOL_ENTRY_HEAVY1(method,t1,f1) \ + BEGIN_PROTOCOL_ENTRY1 (method,t1,f1) +#define BEGIN_PROTOCOL_ENTRY_HEAVY2(method,t1,f1,t2,f2) \ + BEGIN_PROTOCOL_ENTRY2 (method,t1,f1,t2,f2) +#define BEGIN_PROTOCOL_ENTRY_HEAVY3(method,t1,f1,t2,f2,t3,f3) \ + BEGIN_PROTOCOL_ENTRY3 (method,t1,f1,t2,f2,t3,f3) +#define BEGIN_PROTOCOL_ENTRY_HEAVY4(method,t1,f1,t2,f2,t3,f3,t4,f4) \ + BEGIN_PROTOCOL_ENTRY4 (method,t1,f1,t2,f2,t3,f3,t4,f4) +#define BEGIN_PROTOCOL_ENTRY_HEAVY5(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) \ + BEGIN_PROTOCOL_ENTRY5 (method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) +#define BEGIN_PROTOCOL_ENTRY_HEAVY6(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) \ + BEGIN_PROTOCOL_ENTRY6 (method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) -void -binary_protocol_alloc_pinned (gpointer obj, gpointer vtable, int size) -{ - SGenProtocolAlloc entry = { obj, vtable, size }; - protocol_entry (SGEN_PROTOCOL_ALLOC_PINNED, &entry, sizeof (SGenProtocolAlloc)); -} +#define END_PROTOCOL_ENTRY_HEAVY \ + END_PROTOCOL_ENTRY +#else +#define BEGIN_PROTOCOL_ENTRY_HEAVY0(method) +#define BEGIN_PROTOCOL_ENTRY_HEAVY1(method,t1,f1) +#define BEGIN_PROTOCOL_ENTRY_HEAVY2(method,t1,f1,t2,f2) +#define BEGIN_PROTOCOL_ENTRY_HEAVY3(method,t1,f1,t2,f2,t3,f3) +#define BEGIN_PROTOCOL_ENTRY_HEAVY4(method,t1,f1,t2,f2,t3,f3,t4,f4) +#define BEGIN_PROTOCOL_ENTRY_HEAVY5(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) +#define BEGIN_PROTOCOL_ENTRY_HEAVY6(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) -void -binary_protocol_alloc_degraded (gpointer obj, gpointer vtable, int size) -{ - SGenProtocolAlloc entry = { obj, vtable, size }; - protocol_entry (SGEN_PROTOCOL_ALLOC_DEGRADED, &entry, sizeof (SGenProtocolAlloc)); -} - -void -binary_protocol_copy (gpointer from, gpointer to, gpointer vtable, int size) -{ - SGenProtocolCopy entry = { from, to, vtable, size }; - protocol_entry (SGEN_PROTOCOL_COPY, &entry, sizeof (SGenProtocolCopy)); -} - -void -binary_protocol_pin (gpointer obj, gpointer vtable, int size) -{ - SGenProtocolPin entry = { obj, vtable, size }; - protocol_entry (SGEN_PROTOCOL_PIN, &entry, sizeof (SGenProtocolPin)); -} - -void -binary_protocol_mark (gpointer obj, gpointer vtable, int size) -{ - SGenProtocolMark entry = { obj, vtable, size }; - protocol_entry (SGEN_PROTOCOL_MARK, &entry, sizeof (SGenProtocolMark)); -} - -void -binary_protocol_scan_begin (gpointer obj, gpointer vtable, int size) -{ - SGenProtocolScanBegin entry = { obj, vtable, size }; - protocol_entry (SGEN_PROTOCOL_SCAN_BEGIN, &entry, sizeof (SGenProtocolScanBegin)); -} - -void -binary_protocol_scan_vtype_begin (gpointer obj, int size) -{ - SGenProtocolScanVTypeBegin entry = { obj, size }; - protocol_entry (SGEN_PROTOCOL_SCAN_VTYPE_BEGIN, &entry, sizeof (SGenProtocolScanVTypeBegin)); -} - -void -binary_protocol_wbarrier (gpointer ptr, gpointer value, gpointer value_vtable) -{ - SGenProtocolWBarrier entry = { ptr, value, value_vtable }; - protocol_entry (SGEN_PROTOCOL_WBARRIER, &entry, sizeof (SGenProtocolWBarrier)); -} - -void -binary_protocol_global_remset (gpointer ptr, gpointer value, gpointer value_vtable) -{ - SGenProtocolGlobalRemset entry = { ptr, value, value_vtable }; - protocol_entry (SGEN_PROTOCOL_GLOBAL_REMSET, &entry, sizeof (SGenProtocolGlobalRemset)); -} - -void -binary_protocol_ptr_update (gpointer ptr, gpointer old_value, gpointer new_value, gpointer vtable, int size) -{ - SGenProtocolPtrUpdate entry = { ptr, old_value, new_value, vtable, size }; - protocol_entry (SGEN_PROTOCOL_PTR_UPDATE, &entry, sizeof (SGenProtocolPtrUpdate)); -} - -void -binary_protocol_cleanup (gpointer ptr, gpointer vtable, int size) -{ - SGenProtocolCleanup entry = { ptr, vtable, size }; - protocol_entry (SGEN_PROTOCOL_CLEANUP, &entry, sizeof (SGenProtocolCleanup)); -} - -void -binary_protocol_empty (gpointer start, int size) -{ - SGenProtocolEmpty entry = { start, size }; - protocol_entry (SGEN_PROTOCOL_EMPTY, &entry, sizeof (SGenProtocolEmpty)); -} - -void -binary_protocol_card_scan (gpointer start, int size) -{ - SGenProtocolCardScan entry = { start, size }; - protocol_entry (SGEN_PROTOCOL_CARD_SCAN, &entry, sizeof (SGenProtocolCardScan)); -} - -void -binary_protocol_dislink_update (gpointer link, gpointer obj, int track, int staged) -{ - SGenProtocolDislinkUpdate entry = { link, obj, track, staged }; - protocol_entry (SGEN_PROTOCOL_DISLINK_UPDATE, &entry, sizeof (SGenProtocolDislinkUpdate)); -} - -void -binary_protocol_dislink_update_staged (gpointer link, gpointer obj, int track, int index) -{ - SGenProtocolDislinkUpdateStaged entry = { link, obj, track, index }; - protocol_entry (SGEN_PROTOCOL_DISLINK_UPDATE_STAGED, &entry, sizeof (SGenProtocolDislinkUpdateStaged)); -} - -void -binary_protocol_dislink_process_staged (gpointer link, gpointer obj, int index) -{ - SGenProtocolDislinkProcessStaged entry = { link, obj, index }; - protocol_entry (SGEN_PROTOCOL_DISLINK_PROCESS_STAGED, &entry, sizeof (SGenProtocolDislinkProcessStaged)); -} - -void -binary_protocol_gray_enqueue (gpointer queue, gpointer cursor, gpointer value) -{ - SGenProtocolGrayQueue entry = { queue, cursor, value }; - protocol_entry (SGEN_PROTOCOL_GRAY_ENQUEUE, &entry, sizeof (SGenProtocolGrayQueue)); -} - -void -binary_protocol_gray_dequeue (gpointer queue, gpointer cursor, gpointer value) -{ - SGenProtocolGrayQueue entry = { queue, cursor, value }; - protocol_entry (SGEN_PROTOCOL_GRAY_DEQUEUE, &entry, sizeof (SGenProtocolGrayQueue)); -} +#define END_PROTOCOL_ENTRY_HEAVY #endif +#include "sgen-protocol-def.h" + +#undef TYPE_INT +#undef TYPE_LONGLONG +#undef TYPE_SIZE +#undef TYPE_POINTER + #endif /* HAVE_SGEN_GC */ diff --git a/mta-mono/vendor/mono/metadata/sgen-protocol.h b/mta-mono/vendor/mono/metadata/sgen-protocol.h index c255228..6abd32c 100644 --- a/mta-mono/vendor/mono/metadata/sgen-protocol.h +++ b/mta-mono/vendor/mono/metadata/sgen-protocol.h @@ -25,212 +25,118 @@ #include "sgen-gc.h" +/* Special indices returned by MATCH_INDEX. */ +#define BINARY_PROTOCOL_NO_MATCH (-1) +#define BINARY_PROTOCOL_MATCH (-2) + +#define PROTOCOL_ID(method) method ## _id +#define PROTOCOL_STRUCT(method) method ## _struct + +#define TYPE_INT int +#define TYPE_LONGLONG long long +#define TYPE_SIZE size_t +#define TYPE_POINTER gpointer + enum { - SGEN_PROTOCOL_COLLECTION_FORCE, - SGEN_PROTOCOL_COLLECTION_BEGIN, - SGEN_PROTOCOL_COLLECTION_END, - SGEN_PROTOCOL_CONCURRENT_START, - SGEN_PROTOCOL_CONCURRENT_UPDATE_FINISH, - SGEN_PROTOCOL_WORLD_STOPPING, - SGEN_PROTOCOL_WORLD_STOPPED, - SGEN_PROTOCOL_WORLD_RESTARTING, - SGEN_PROTOCOL_WORLD_RESTARTED, - SGEN_PROTOCOL_ALLOC, - SGEN_PROTOCOL_COPY, - SGEN_PROTOCOL_PIN, - SGEN_PROTOCOL_MARK, - SGEN_PROTOCOL_SCAN_BEGIN, - SGEN_PROTOCOL_SCAN_VTYPE_BEGIN, - SGEN_PROTOCOL_WBARRIER, - SGEN_PROTOCOL_GLOBAL_REMSET, - SGEN_PROTOCOL_PTR_UPDATE, - SGEN_PROTOCOL_CLEANUP, - SGEN_PROTOCOL_EMPTY, - SGEN_PROTOCOL_THREAD_SUSPEND, - SGEN_PROTOCOL_THREAD_RESTART, - SGEN_PROTOCOL_THREAD_REGISTER, - SGEN_PROTOCOL_THREAD_UNREGISTER, - SGEN_PROTOCOL_MISSING_REMSET, - SGEN_PROTOCOL_ALLOC_PINNED, - SGEN_PROTOCOL_ALLOC_DEGRADED, - SGEN_PROTOCOL_CARD_SCAN, - SGEN_PROTOCOL_CEMENT, - SGEN_PROTOCOL_CEMENT_RESET, - SGEN_PROTOCOL_DISLINK_UPDATE, - SGEN_PROTOCOL_DISLINK_UPDATE_STAGED, - SGEN_PROTOCOL_DISLINK_PROCESS_STAGED, - SGEN_PROTOCOL_DOMAIN_UNLOAD_BEGIN, - SGEN_PROTOCOL_DOMAIN_UNLOAD_END, - SGEN_PROTOCOL_GRAY_ENQUEUE, - SGEN_PROTOCOL_GRAY_DEQUEUE, +#define BEGIN_PROTOCOL_ENTRY0(method) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY1(method,t1,f1) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY2(method,t1,f1,t2,f2) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY3(method,t1,f1,t2,f2,t3,f3) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY4(method,t1,f1,t2,f2,t3,f3,t4,f4) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY5(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY6(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY_HEAVY0(method) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY_HEAVY1(method,t1,f1) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY_HEAVY2(method,t1,f1,t2,f2) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY_HEAVY3(method,t1,f1,t2,f2,t3,f3) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY_HEAVY4(method,t1,f1,t2,f2,t3,f3,t4,f4) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY_HEAVY5(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) PROTOCOL_ID(method), +#define BEGIN_PROTOCOL_ENTRY_HEAVY6(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) PROTOCOL_ID(method), + +#define FLUSH() + +#define DEFAULT_PRINT() +#define CUSTOM_PRINT(_) + +#define IS_ALWAYS_MATCH(_) +#define MATCH_INDEX(_) +#define IS_VTABLE_MATCH(_) + +#define END_PROTOCOL_ENTRY +#define END_PROTOCOL_ENTRY_HEAVY + +#include "sgen-protocol-def.h" }; -typedef struct { - int generation; -} SGenProtocolCollectionForce; +#define BEGIN_PROTOCOL_ENTRY0(method) +#define BEGIN_PROTOCOL_ENTRY1(method,t1,f1) \ + typedef struct { \ + t1 f1; \ + } PROTOCOL_STRUCT(method); +#define BEGIN_PROTOCOL_ENTRY2(method,t1,f1,t2,f2) \ + typedef struct { \ + t1 f1; \ + t2 f2; \ + } PROTOCOL_STRUCT(method); +#define BEGIN_PROTOCOL_ENTRY3(method,t1,f1,t2,f2,t3,f3) \ + typedef struct { \ + t1 f1; \ + t2 f2; \ + t3 f3; \ + } PROTOCOL_STRUCT(method); +#define BEGIN_PROTOCOL_ENTRY4(method,t1,f1,t2,f2,t3,f3,t4,f4) \ + typedef struct { \ + t1 f1; \ + t2 f2; \ + t3 f3; \ + t4 f4; \ + } PROTOCOL_STRUCT(method); +#define BEGIN_PROTOCOL_ENTRY5(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) \ + typedef struct { \ + t1 f1; \ + t2 f2; \ + t3 f3; \ + t4 f4; \ + t5 f5; \ + } PROTOCOL_STRUCT(method); +#define BEGIN_PROTOCOL_ENTRY6(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) \ + typedef struct { \ + t1 f1; \ + t2 f2; \ + t3 f3; \ + t4 f4; \ + t5 f5; \ + t6 f6; \ + } PROTOCOL_STRUCT(method); -typedef struct { - int index, generation; -} SGenProtocolCollection; +#define BEGIN_PROTOCOL_ENTRY_HEAVY0(method) \ + BEGIN_PROTOCOL_ENTRY0 (method) +#define BEGIN_PROTOCOL_ENTRY_HEAVY1(method,t1,f1) \ + BEGIN_PROTOCOL_ENTRY1 (method,t1,f1) +#define BEGIN_PROTOCOL_ENTRY_HEAVY2(method,t1,f1,t2,f2) \ + BEGIN_PROTOCOL_ENTRY2 (method,t1,f1,t2,f2) +#define BEGIN_PROTOCOL_ENTRY_HEAVY3(method,t1,f1,t2,f2,t3,f3) \ + BEGIN_PROTOCOL_ENTRY3 (method,t1,f1,t2,f2,t3,f3) +#define BEGIN_PROTOCOL_ENTRY_HEAVY4(method,t1,f1,t2,f2,t3,f3,t4,f4) \ + BEGIN_PROTOCOL_ENTRY4 (method,t1,f1,t2,f2,t3,f3,t4,f4) +#define BEGIN_PROTOCOL_ENTRY_HEAVY5(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) \ + BEGIN_PROTOCOL_ENTRY5 (method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) +#define BEGIN_PROTOCOL_ENTRY_HEAVY6(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) \ + BEGIN_PROTOCOL_ENTRY6 (method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) -typedef struct { - long long timestamp; -} SGenProtocolWorldStopping; +#define FLUSH() -typedef struct { - long long timestamp; - long long total_major_cards; - long long marked_major_cards; - long long total_los_cards; - long long marked_los_cards; -} SGenProtocolWorldStopped; +#define DEFAULT_PRINT() +#define CUSTOM_PRINT(_) -typedef struct { - int generation; - long long timestamp; - long long total_major_cards; - long long marked_major_cards; - long long total_los_cards; - long long marked_los_cards; -} SGenProtocolWorldRestarting; +#define IS_ALWAYS_MATCH(_) +#define MATCH_INDEX(_) +#define IS_VTABLE_MATCH(_) -typedef struct { - int generation; - long long timestamp; -} SGenProtocolWorldRestarted; +#define END_PROTOCOL_ENTRY +#define END_PROTOCOL_ENTRY_HEAVY -typedef struct { - gpointer obj; - gpointer vtable; - int size; -} SGenProtocolAlloc; - -typedef struct { - gpointer from; - gpointer to; - gpointer vtable; - int size; -} SGenProtocolCopy; - -typedef struct { - gpointer obj; - gpointer vtable; - int size; -} SGenProtocolPin; - -typedef struct { - gpointer obj; - gpointer vtable; - int size; -} SGenProtocolMark; - -typedef struct { - gpointer obj; - gpointer vtable; - int size; -} SGenProtocolScanBegin; - -typedef struct { - gpointer obj; - int size; -} SGenProtocolScanVTypeBegin; - -typedef struct { - gpointer ptr; - gpointer value; - gpointer value_vtable; -} SGenProtocolWBarrier; - -typedef struct { - gpointer ptr; - gpointer value; - gpointer value_vtable; -} SGenProtocolGlobalRemset; - -typedef struct { - gpointer ptr; - gpointer old_value; - gpointer new_value; - gpointer vtable; - int size; -} SGenProtocolPtrUpdate; - -typedef struct { - gpointer ptr; - gpointer vtable; - int size; -} SGenProtocolCleanup; - -typedef struct { - gpointer start; - int size; -} SGenProtocolEmpty; - -typedef struct { - gpointer thread, stopped_ip; -} SGenProtocolThreadSuspend; - -typedef struct { - gpointer thread; -} SGenProtocolThreadRestart; - -typedef struct { - gpointer thread; -} SGenProtocolThreadRegister; - -typedef struct { - gpointer thread; -} SGenProtocolThreadUnregister; - -typedef struct { - gpointer obj; - gpointer obj_vtable; - int offset; - gpointer value; - gpointer value_vtable; - int value_pinned; -} SGenProtocolMissingRemset; - -typedef struct { - gpointer start; - int size; -} SGenProtocolCardScan; - -typedef struct { - gpointer obj; - gpointer vtable; - int size; -} SGenProtocolCement; - -typedef struct { - gpointer link; - gpointer obj; - int track; - int staged; -} SGenProtocolDislinkUpdate; - -typedef struct { - gpointer link; - gpointer obj; - int track; - int index; -} SGenProtocolDislinkUpdateStaged; - -typedef struct { - gpointer link; - gpointer obj; - int index; -} SGenProtocolDislinkProcessStaged; - -typedef struct { - gpointer domain; -} SGenProtocolDomainUnload; - -typedef struct { - gpointer queue; - gpointer cursor; - gpointer value; -} SGenProtocolGrayQueue; +#include "sgen-protocol-def.h" /* missing: finalizers, roots, non-store wbarriers */ @@ -239,79 +145,74 @@ gboolean binary_protocol_is_enabled (void) MONO_INTERNAL; void binary_protocol_flush_buffers (gboolean force) MONO_INTERNAL; -void binary_protocol_collection_force (int generation) MONO_INTERNAL; -void binary_protocol_collection_begin (int index, int generation) MONO_INTERNAL; -void binary_protocol_collection_end (int index, int generation) MONO_INTERNAL; -void binary_protocol_concurrent_start (void) MONO_INTERNAL; -void binary_protocol_concurrent_update_finish (void) MONO_INTERNAL; -void binary_protocol_world_stopping (long long timestamp) MONO_INTERNAL; -void binary_protocol_world_stopped (long long timestamp, long long total_major_cards, - long long marked_major_cards, long long total_los_cards, long long marked_los_cards) MONO_INTERNAL; -void binary_protocol_world_restarting (int generation, long long timestamp, - long long total_major_cards, long long marked_major_cards, long long total_los_cards, long long marked_los_cards) MONO_INTERNAL; -void binary_protocol_world_restarted (int generation, long long timestamp) MONO_INTERNAL; - -void binary_protocol_thread_suspend (gpointer thread, gpointer stopped_ip) MONO_INTERNAL; -void binary_protocol_thread_restart (gpointer thread) MONO_INTERNAL; -void binary_protocol_thread_register (gpointer thread) MONO_INTERNAL; -void binary_protocol_thread_unregister (gpointer thread) MONO_INTERNAL; -void binary_protocol_missing_remset (gpointer obj, gpointer obj_vtable, int offset, - gpointer value, gpointer value_vtable, int value_pinned) MONO_INTERNAL; - -void binary_protocol_cement (gpointer ptr, gpointer vtable, int size) MONO_INTERNAL; -void binary_protocol_cement_reset (void) MONO_INTERNAL; - -void binary_protocol_domain_unload_begin (gpointer domain) MONO_INTERNAL; -void binary_protocol_domain_unload_end (gpointer domain) MONO_INTERNAL; +#define BEGIN_PROTOCOL_ENTRY0(method) \ + void method (void) MONO_INTERNAL; +#define BEGIN_PROTOCOL_ENTRY1(method,t1,f1) \ + void method (t1 f1) MONO_INTERNAL; +#define BEGIN_PROTOCOL_ENTRY2(method,t1,f1,t2,f2) \ + void method (t1 f1, t2 f2) MONO_INTERNAL; +#define BEGIN_PROTOCOL_ENTRY3(method,t1,f1,t2,f2,t3,f3) \ + void method (t1 f1, t2 f2, t3 f3) MONO_INTERNAL; +#define BEGIN_PROTOCOL_ENTRY4(method,t1,f1,t2,f2,t3,f3,t4,f4) \ + void method (t1 f1, t2 f2, t3 f3, t4 f4) MONO_INTERNAL; +#define BEGIN_PROTOCOL_ENTRY5(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) \ + void method (t1 f1, t2 f2, t3 f3, t4 f4, t5 f5) MONO_INTERNAL; +#define BEGIN_PROTOCOL_ENTRY6(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) \ + void method (t1 f1, t2 f2, t3 f3, t4 f4, t5 f5, t6 f6) MONO_INTERNAL; #ifdef SGEN_HEAVY_BINARY_PROTOCOL - #define binary_protocol_is_heavy_enabled() binary_protocol_is_enabled () -void binary_protocol_alloc (gpointer obj, gpointer vtable, int size) MONO_INTERNAL; -void binary_protocol_alloc_pinned (gpointer obj, gpointer vtable, int size) MONO_INTERNAL; -void binary_protocol_alloc_degraded (gpointer obj, gpointer vtable, int size) MONO_INTERNAL; -void binary_protocol_copy (gpointer from, gpointer to, gpointer vtable, int size) MONO_INTERNAL; -void binary_protocol_pin (gpointer obj, gpointer vtable, int size) MONO_INTERNAL; -void binary_protocol_mark (gpointer obj, gpointer vtable, int size) MONO_INTERNAL; -void binary_protocol_scan_begin (gpointer obj, gpointer vtable, int size) MONO_INTERNAL; -void binary_protocol_scan_vtype_begin (gpointer start, int size) MONO_INTERNAL; -void binary_protocol_wbarrier (gpointer ptr, gpointer value, gpointer value_vtable) MONO_INTERNAL; -void binary_protocol_global_remset (gpointer ptr, gpointer value, gpointer value_vtable) MONO_INTERNAL; -void binary_protocol_ptr_update (gpointer ptr, gpointer old_value, gpointer new_value, gpointer vtable, int size) MONO_INTERNAL; -void binary_protocol_cleanup (gpointer ptr, gpointer vtable, int size) MONO_INTERNAL; -void binary_protocol_empty (gpointer start, int size) MONO_INTERNAL; -void binary_protocol_card_scan (gpointer start, int size) MONO_INTERNAL; -void binary_protocol_dislink_update (gpointer link, gpointer obj, int track, int staged) MONO_INTERNAL; -void binary_protocol_dislink_update_staged (gpointer link, gpointer obj, int track, int index) MONO_INTERNAL; -void binary_protocol_dislink_process_staged (gpointer link, gpointer obj, int index) MONO_INTERNAL; -void binary_protocol_gray_enqueue (gpointer queue, gpointer cursor, gpointer value) MONO_INTERNAL; -void binary_protocol_gray_dequeue (gpointer queue, gpointer cursor, gpointer value) MONO_INTERNAL; - +#define BEGIN_PROTOCOL_ENTRY_HEAVY0(method) \ + BEGIN_PROTOCOL_ENTRY0 (method) +#define BEGIN_PROTOCOL_ENTRY_HEAVY1(method,t1,f1) \ + BEGIN_PROTOCOL_ENTRY1 (method,t1,f1) +#define BEGIN_PROTOCOL_ENTRY_HEAVY2(method,t1,f1,t2,f2) \ + BEGIN_PROTOCOL_ENTRY2 (method,t1,f1,t2,f2) +#define BEGIN_PROTOCOL_ENTRY_HEAVY3(method,t1,f1,t2,f2,t3,f3) \ + BEGIN_PROTOCOL_ENTRY3 (method,t1,f1,t2,f2,t3,f3) +#define BEGIN_PROTOCOL_ENTRY_HEAVY4(method,t1,f1,t2,f2,t3,f3,t4,f4) \ + BEGIN_PROTOCOL_ENTRY4 (method,t1,f1,t2,f2,t3,f3,t4,f4) +#define BEGIN_PROTOCOL_ENTRY_HEAVY5(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) \ + BEGIN_PROTOCOL_ENTRY5 (method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) +#define BEGIN_PROTOCOL_ENTRY_HEAVY6(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) \ + BEGIN_PROTOCOL_ENTRY6 (method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) #else - #define binary_protocol_is_heavy_enabled() FALSE -#define binary_protocol_alloc(obj, vtable, size) -#define binary_protocol_alloc_pinned(obj, vtable, size) -#define binary_protocol_alloc_degraded(obj, vtable, size) -#define binary_protocol_copy(from, to, vtable, size) -#define binary_protocol_pin(obj, vtable, size) -#define binary_protocol_mark(obj, vtable, size) -#define binary_protocol_scan_begin(obj, vtable, size) -#define binary_protocol_scan_vtype_begin(obj, size) -#define binary_protocol_wbarrier(ptr, value, value_vtable) -#define binary_protocol_global_remset(ptr, value, value_vtable) -#define binary_protocol_ptr_update(ptr, old_value, new_value, vtable, size) -#define binary_protocol_cleanup(ptr, vtable, size) -#define binary_protocol_empty(start, size) -#define binary_protocol_card_scan(start, size) -#define binary_protocol_dislink_update(link,obj,track,staged) -#define binary_protocol_dislink_update_staged(link,obj,track,index) -#define binary_protocol_dislink_process_staged(link,obj,index) -#define binary_protocol_gray_enqueue(queue,cursor,value) -#define binary_protocol_gray_dequeue(queue,cursor,value) - +#define BEGIN_PROTOCOL_ENTRY_HEAVY0(method) \ + static inline void method (void) {} +#define BEGIN_PROTOCOL_ENTRY_HEAVY1(method,t1,f1) \ + static inline void method (t1 f1) {} +#define BEGIN_PROTOCOL_ENTRY_HEAVY2(method,t1,f1,t2,f2) \ + static inline void method (t1 f1, t2 f2) {} +#define BEGIN_PROTOCOL_ENTRY_HEAVY3(method,t1,f1,t2,f2,t3,f3) \ + static inline void method (t1 f1, t2 f2, t3 f3) {} +#define BEGIN_PROTOCOL_ENTRY_HEAVY4(method,t1,f1,t2,f2,t3,f3,t4,f4) \ + static inline void method (t1 f1, t2 f2, t3 f3, t4 f4) {} +#define BEGIN_PROTOCOL_ENTRY_HEAVY5(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5) \ + static inline void method (t1 f1, t2 f2, t3 f3, t4 f4, t5 f5) {} +#define BEGIN_PROTOCOL_ENTRY_HEAVY6(method,t1,f1,t2,f2,t3,f3,t4,f4,t5,f5,t6,f6) \ + static inline void method (t1 f1, t2 f2, t3 f3, t4 f4, t5 f5, t6 f6) {} #endif +#define FLUSH() + +#define DEFAULT_PRINT() +#define CUSTOM_PRINT(_) + +#define IS_ALWAYS_MATCH(_) +#define MATCH_INDEX(_) +#define IS_VTABLE_MATCH(_) + +#define END_PROTOCOL_ENTRY +#define END_PROTOCOL_ENTRY_HEAVY + +#include "sgen-protocol-def.h" + +#undef TYPE_INT +#undef TYPE_LONGLONG +#undef TYPE_SIZE +#undef TYPE_POINTER + #endif diff --git a/mta-mono/vendor/mono/metadata/sgen-scan-object.h b/mta-mono/vendor/mono/metadata/sgen-scan-object.h index ad569dd..30c43fb 100644 --- a/mta-mono/vendor/mono/metadata/sgen-scan-object.h +++ b/mta-mono/vendor/mono/metadata/sgen-scan-object.h @@ -53,19 +53,12 @@ binary_protocol_scan_vtype_begin (start + sizeof (MonoObject), size); #endif #endif - switch (desc & 0x7) { + switch (desc & DESC_TYPE_MASK) { case DESC_TYPE_RUN_LENGTH: #define SCAN OBJ_RUN_LEN_FOREACH_PTR (desc, start) #ifndef SCAN_OBJECT_NOSCAN SCAN; #endif -#undef SCAN - break; - case DESC_TYPE_SMALL_BITMAP: -#define SCAN OBJ_BITMAP_FOREACH_PTR (desc, start) -#ifndef SCAN_OBJECT_NOSCAN - SCAN; -#endif #undef SCAN break; case DESC_TYPE_VECTOR: @@ -75,8 +68,8 @@ #endif #undef SCAN break; - case DESC_TYPE_LARGE_BITMAP: -#define SCAN OBJ_LARGE_BITMAP_FOREACH_PTR (desc, start) + case DESC_TYPE_BITMAP: +#define SCAN OBJ_BITMAP_FOREACH_PTR (desc, start) #ifndef SCAN_OBJECT_NOSCAN SCAN; #endif @@ -100,6 +93,7 @@ #undef SCAN break; #endif + case DESC_TYPE_SMALL_PTRFREE: case DESC_TYPE_COMPLEX_PTRFREE: /*Nothing to do*/ break; diff --git a/mta-mono/vendor/mono/metadata/sgen-stw.c b/mta-mono/vendor/mono/metadata/sgen-stw.c index 2a9bf34..eb6a50d 100644 --- a/mta-mono/vendor/mono/metadata/sgen-stw.c +++ b/mta-mono/vendor/mono/metadata/sgen-stw.c @@ -38,7 +38,6 @@ #define TV_DECLARE SGEN_TV_DECLARE #define TV_GETTIME SGEN_TV_GETTIME #define TV_ELAPSED SGEN_TV_ELAPSED -#define TV_ELAPSED_MS SGEN_TV_ELAPSED_MS inline static void* align_pointer (void *ptr) @@ -202,8 +201,8 @@ count_cards (long long *major_total, long long *major_marked, long long *los_tot static TV_DECLARE (stop_world_time); static unsigned long max_pause_usec = 0; -static long long time_stop_world; -static long long time_restart_world; +static guint64 time_stop_world; +static guint64 time_restart_world; /* LOCKING: assumes the GC lock is held */ int @@ -235,8 +234,9 @@ sgen_stop_world (int generation) mono_profiler_gc_event (MONO_GC_EVENT_POST_STOP_WORLD, generation); MONO_GC_WORLD_STOP_END (); if (binary_protocol_is_enabled ()) { - long long major_total, major_marked, los_total, los_marked; - count_cards (&major_total, &major_marked, &los_total, &los_marked); + long long major_total = -1, major_marked = -1, los_total = -1, los_marked = -1; + if (binary_protocol_is_heavy_enabled ()) + count_cards (&major_total, &major_marked, &los_total, &los_marked); binary_protocol_world_stopped (sgen_timestamp (), major_total, major_marked, los_total, los_marked); } @@ -262,8 +262,9 @@ sgen_restart_world (int generation, GGTimingInfo *timing) unsigned long usec, bridge_usec; if (binary_protocol_is_enabled ()) { - long long major_total, major_marked, los_total, los_marked; - count_cards (&major_total, &major_marked, &los_total, &los_marked); + long long major_total = -1, major_marked = -1, los_total = -1, los_marked = -1; + if (binary_protocol_is_heavy_enabled ()) + count_cards (&major_total, &major_marked, &los_total, &los_marked); binary_protocol_world_restarting (generation, sgen_timestamp (), major_total, major_marked, los_total, los_marked); } @@ -326,8 +327,8 @@ sgen_restart_world (int generation, GGTimingInfo *timing) void sgen_init_stw (void) { - mono_counters_register ("World stop", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_stop_world); - mono_counters_register ("World restart", MONO_COUNTER_GC | MONO_COUNTER_LONG | MONO_COUNTER_TIME, &time_restart_world); + mono_counters_register ("World stop", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_stop_world); + mono_counters_register ("World restart", MONO_COUNTER_GC | MONO_COUNTER_ULONG | MONO_COUNTER_TIME, &time_restart_world); } #endif diff --git a/mta-mono/vendor/mono/metadata/sgen-tagged-pointer.h b/mta-mono/vendor/mono/metadata/sgen-tagged-pointer.h index fc065f7..3d63e94 100644 --- a/mta-mono/vendor/mono/metadata/sgen-tagged-pointer.h +++ b/mta-mono/vendor/mono/metadata/sgen-tagged-pointer.h @@ -20,6 +20,8 @@ #ifndef __MONO_SGEN_TAGGED_POINTER_H__ #define __MONO_SGEN_TAGGED_POINTER_H__ +#define SGEN_TAGGED_POINTER_MASK 7 + #define SGEN_POINTER_IS_TAGGED_1(p) ((mword)(p) & 1) #define SGEN_POINTER_TAG_1(p) ((void*)((mword)(p) | 1)) #define SGEN_POINTER_UNTAG_1(p) ((void*)((mword)(p) & ~1)) @@ -28,7 +30,16 @@ #define SGEN_POINTER_TAG_2(p) ((void*)((mword)(p) | 2)) #define SGEN_POINTER_UNTAG_2(p) ((void*)((mword)(p) & ~2)) -#define SGEN_POINTER_IS_TAGGED_1_OR_2(p) ((mword)(p) & 3) -#define SGEN_POINTER_UNTAG_12(p) ((void*)((mword)(p) & ~3)) +#define SGEN_POINTER_TAG_12(p) ((mword)(p) & 3) +#define SGEN_POINTER_SET_TAG_12(p,t) ((void*)(((mword)(p) & ~3) | (t))) + +#define SGEN_POINTER_IS_TAGGED_4(p) ((mword)(p) & 4) +#define SGEN_POINTER_TAG_4(p) ((void*)((mword)(p) | 4)) +#define SGEN_POINTER_UNTAG_4(p) ((void*)((mword)(p) & ~4)) + +#define SGEN_POINTER_UNTAG_24(p) ((void*)((mword)(p) & ~6)) + +#define SGEN_POINTER_IS_TAGGED_ANY(p) ((mword)(p) & SGEN_TAGGED_POINTER_MASK) +#define SGEN_POINTER_UNTAG_ALL(p) ((void*)((mword)(p) & ~SGEN_TAGGED_POINTER_MASK)) #endif diff --git a/mta-mono/vendor/mono/metadata/sgen-tarjan-bridge.c b/mta-mono/vendor/mono/metadata/sgen-tarjan-bridge.c index 5c6525e..fbfc8d4 100644 --- a/mta-mono/vendor/mono/metadata/sgen-tarjan-bridge.c +++ b/mta-mono/vendor/mono/metadata/sgen-tarjan-bridge.c @@ -661,7 +661,7 @@ push_all (ScanData *data) { MonoObject *obj = data->obj; char *start = (char*)obj; - mword desc = sgen_obj_get_descriptor (start); + mword desc = sgen_obj_get_descriptor_safe (start); #if DUMP_GRAPH printf ("**scanning %p %s\n", obj, safe_name_bridge (obj)); @@ -713,7 +713,7 @@ compute_low (ScanData *data) { MonoObject *obj = data->obj; char *start = (char*)obj; - mword desc = sgen_obj_get_descriptor (start); + mword desc = sgen_obj_get_descriptor_safe (start); #include "sgen-scan-object.h" } diff --git a/mta-mono/vendor/mono/metadata/sgen-toggleref.h b/mta-mono/vendor/mono/metadata/sgen-toggleref.h index b7cce12..e7c4b91 100644 --- a/mta-mono/vendor/mono/metadata/sgen-toggleref.h +++ b/mta-mono/vendor/mono/metadata/sgen-toggleref.h @@ -42,9 +42,8 @@ typedef enum { MONO_TOGGLE_REF_WEAK } MonoToggleRefStatus; -void mono_gc_toggleref_register_callback (MonoToggleRefStatus (*proccess_toggleref) (MonoObject *obj)); -void mono_gc_toggleref_add (MonoObject *object, mono_bool strong_ref); - +MONO_API void mono_gc_toggleref_register_callback (MonoToggleRefStatus (*proccess_toggleref) (MonoObject *obj)); +MONO_API void mono_gc_toggleref_add (MonoObject *object, mono_bool strong_ref); MONO_END_DECLS diff --git a/mta-mono/vendor/mono/metadata/sgen-workers.c b/mta-mono/vendor/mono/metadata/sgen-workers.c index 2d48745..e74e3ad 100644 --- a/mta-mono/vendor/mono/metadata/sgen-workers.c +++ b/mta-mono/vendor/mono/metadata/sgen-workers.c @@ -33,21 +33,32 @@ static void *workers_gc_thread_major_collector_data = NULL; static SgenSectionGrayQueue workers_distribute_gray_queue; static gboolean workers_distribute_gray_queue_inited; -static volatile gboolean workers_marking = FALSE; static gboolean workers_started = FALSE; +enum { + STATE_NOT_WORKING, + STATE_WORKING, + STATE_NURSERY_COLLECTION +} WorkersStateName; + +/* + * | state | num_awake | num_posted | post_done | + * |--------------------------+-----------+----------------------------+-----------| + * | STATE_NOT_WORKING | 0 | * | 0 | + * | STATE_WORKING | > 0 | <= workers_num - num_awake | * | + * | STATE_NURSERY_COLLECTION | * | <= workers_num - num_awake | 1 | + * | STATE_NURSERY_COLLECTION | 0 | 0 | 0 | + */ typedef union { gint32 value; struct { - /* - * Decremented by the main thread and incremented by - * worker threads. - */ - guint32 num_waiting : 8; - /* Set by worker threads and reset by the main thread. */ - guint32 done_posted : 1; - /* Set by the main thread. */ - guint32 gc_in_progress : 1; + guint state : 4; /* WorkersStateName */ + /* Number of worker threads awake. */ + guint num_awake : 8; + /* The state of the waiting semaphore. */ + guint num_posted : 8; + /* Whether to post `workers_done_sem` */ + guint post_done : 1; } data; } State; @@ -62,79 +73,147 @@ static LOCK_DECLARE (workers_job_queue_mutex); static int workers_num_jobs_enqueued = 0; static volatile int workers_num_jobs_finished = 0; -static long long stat_workers_stolen_from_self_lock; -static long long stat_workers_stolen_from_self_no_lock; -static long long stat_workers_stolen_from_others; -static long long stat_workers_num_waited; +static guint64 stat_workers_stolen_from_self_lock; +static guint64 stat_workers_stolen_from_self_no_lock; +static guint64 stat_workers_stolen_from_others; +static guint64 stat_workers_num_waited; static gboolean set_state (State old_state, State new_state) { + if (old_state.data.state == STATE_NURSERY_COLLECTION) + SGEN_ASSERT (0, new_state.data.state != STATE_NOT_WORKING, "Can't go from nursery collection to not working"); + return InterlockedCompareExchange (&workers_state.value, new_state.value, old_state.value) == old_state.value; } static void -workers_wake_up (int max) +assert_not_working (State state) { - int i; + SGEN_ASSERT (0, state.data.state == STATE_NOT_WORKING, "Can only signal enqueue work when in no work state"); + SGEN_ASSERT (0, state.data.num_awake == 0, "No workers can be awake when not working"); + SGEN_ASSERT (0, state.data.num_posted == 0, "Can't have posted already"); + SGEN_ASSERT (0, !state.data.post_done, "post_done can only be set when working"); - for (i = 0; i < max; ++i) { - State old_state, new_state; - do { - old_state = new_state = workers_state; - /* - * We must not wake workers up once done has - * been posted. - */ - if (old_state.data.done_posted) - return; - if (old_state.data.num_waiting == 0) - return; - --new_state.data.num_waiting; - } while (!set_state (old_state, new_state)); - MONO_SEM_POST (&workers_waiting_sem); +} + +static void +assert_working (State state, gboolean from_worker) +{ + SGEN_ASSERT (0, state.data.state == STATE_WORKING, "A worker can't wait without being in working state"); + if (from_worker) + SGEN_ASSERT (0, state.data.num_awake > 0, "How can we be awake, yet we are not counted?"); + else + SGEN_ASSERT (0, state.data.num_awake + state.data.num_posted > 0, "How can we be working, yet no worker threads are awake or to be awoken?"); + SGEN_ASSERT (0, state.data.num_awake + state.data.num_posted <= workers_num, "There are too many worker threads awake"); +} + +static void +assert_nursery_collection (State state, gboolean from_worker) +{ + SGEN_ASSERT (0, state.data.state == STATE_NURSERY_COLLECTION, "Must be in the nursery collection state"); + if (from_worker) { + SGEN_ASSERT (0, state.data.num_awake > 0, "We're awake, but num_awake is zero"); + SGEN_ASSERT (0, state.data.post_done, "post_done must be set in the nursery collection state"); + } + SGEN_ASSERT (0, state.data.num_awake <= workers_num, "There are too many worker threads awake"); + if (!state.data.post_done) { + SGEN_ASSERT (0, state.data.num_awake == 0, "Once done has been posted no threads can be awake"); + SGEN_ASSERT (0, state.data.num_posted == 0, "Once done has been posted no thread must be awoken"); } } static void -workers_wake_up_all (void) +assert_working_or_nursery_collection (State state) { - workers_wake_up (workers_num); + if (state.data.state == STATE_WORKING) + assert_working (state, TRUE); + else + assert_nursery_collection (state, TRUE); +} + +static void +workers_signal_enqueue_work (int num_wake_up, gboolean from_nursery_collection) +{ + State old_state = workers_state; + State new_state = old_state; + int i; + gboolean did_set_state; + + SGEN_ASSERT (0, num_wake_up <= workers_num, "Cannot wake up more workers than are present"); + + if (from_nursery_collection) + assert_nursery_collection (old_state, FALSE); + else + assert_not_working (old_state); + + new_state.data.state = STATE_WORKING; + new_state.data.num_posted = num_wake_up; + + did_set_state = set_state (old_state, new_state); + SGEN_ASSERT (0, did_set_state, "Nobody else should be mutating the state"); + + for (i = 0; i < num_wake_up; ++i) + MONO_SEM_POST (&workers_waiting_sem); +} + +static void +workers_signal_enqueue_work_if_necessary (int num_wake_up) +{ + if (workers_state.data.state == STATE_NOT_WORKING) + workers_signal_enqueue_work (num_wake_up, FALSE); } void -sgen_workers_wake_up_all (void) +sgen_workers_ensure_awake (void) { - g_assert (workers_state.data.gc_in_progress); - workers_wake_up_all (); + SGEN_ASSERT (0, workers_state.data.state != STATE_NURSERY_COLLECTION, "Can't wake workers during nursery collection"); + workers_signal_enqueue_work_if_necessary (workers_num); } static void workers_wait (void) { State old_state, new_state; + gboolean post_done; + ++stat_workers_num_waited; + do { - old_state = new_state = workers_state; - /* - * Only the last worker thread awake can set the done - * posted flag, and since we're awake and haven't set - * it yet, it cannot be set. - */ - g_assert (!old_state.data.done_posted); - ++new_state.data.num_waiting; - /* - * This is the only place where we use - * workers_gc_in_progress in the worker threads. - */ - if (new_state.data.num_waiting == workers_num && !old_state.data.gc_in_progress) - new_state.data.done_posted = 1; + new_state = old_state = workers_state; + + assert_working_or_nursery_collection (old_state); + + --new_state.data.num_awake; + post_done = FALSE; + if (!new_state.data.num_awake && !new_state.data.num_posted) { + /* We are the last thread to go to sleep. */ + if (old_state.data.state == STATE_WORKING) + new_state.data.state = STATE_NOT_WORKING; + + new_state.data.post_done = 0; + if (old_state.data.post_done) + post_done = TRUE; + } } while (!set_state (old_state, new_state)); - mono_memory_barrier (); - if (new_state.data.done_posted) + + if (post_done) MONO_SEM_POST (&workers_done_sem); + MONO_SEM_WAIT (&workers_waiting_sem); + + do { + new_state = old_state = workers_state; + + SGEN_ASSERT (0, old_state.data.num_posted > 0, "How can we be awake without the semaphore having been posted?"); + SGEN_ASSERT (0, old_state.data.num_awake < workers_num, "There are too many worker threads awake"); + + --new_state.data.num_posted; + ++new_state.data.num_awake; + + assert_working_or_nursery_collection (new_state); + } while (!set_state (old_state, new_state)); } static gboolean @@ -154,8 +233,6 @@ sgen_workers_enqueue_job (JobFunc func, void *data) return; } - g_assert (workers_state.data.gc_in_progress); - entry = sgen_alloc_internal (INTERNAL_MEM_JOB_QUEUE_ENTRY); entry->func = func; entry->data = data; @@ -167,23 +244,60 @@ sgen_workers_enqueue_job (JobFunc func, void *data) ++workers_num_jobs_enqueued; mono_mutex_unlock (&workers_job_queue_mutex); - workers_wake_up (num_entries); + if (workers_state.data.state != STATE_NURSERY_COLLECTION) + workers_signal_enqueue_work_if_necessary (num_entries < workers_num ? num_entries : workers_num); } void -sgen_workers_wait_for_jobs (void) +sgen_workers_wait_for_jobs_finished (void) { // FIXME: implement this properly while (workers_num_jobs_finished < workers_num_jobs_enqueued) { - State state = workers_state; - g_assert (state.data.gc_in_progress); - g_assert (!state.data.done_posted); - if (state.data.num_waiting == workers_num) - workers_wake_up_all (); + workers_signal_enqueue_work_if_necessary (workers_num); + /* FIXME: sleep less? */ g_usleep (1000); } } +void +sgen_workers_signal_start_nursery_collection_and_wait (void) +{ + State old_state, new_state; + + do { + new_state = old_state = workers_state; + + new_state.data.state = STATE_NURSERY_COLLECTION; + + if (old_state.data.state == STATE_NOT_WORKING) { + assert_not_working (old_state); + } else { + assert_working (old_state, FALSE); + SGEN_ASSERT (0, !old_state.data.post_done, "We are not waiting for the workers"); + + new_state.data.post_done = 1; + } + } while (!set_state (old_state, new_state)); + + if (new_state.data.post_done) + MONO_SEM_WAIT (&workers_done_sem); + + old_state = workers_state; + assert_nursery_collection (old_state, FALSE); + SGEN_ASSERT (0, !old_state.data.post_done, "We got the semaphore, so it must have been posted"); +} + +void +sgen_workers_signal_finish_nursery_collection (void) +{ + State old_state = workers_state; + + assert_nursery_collection (old_state, FALSE); + SGEN_ASSERT (0, !old_state.data.post_done, "We are finishing the nursery collection, so we should have waited for the semaphore earlier"); + + workers_signal_enqueue_work (workers_num, TRUE); +} + static gboolean workers_dequeue_and_do_job (WorkerData *data) { @@ -325,8 +439,7 @@ workers_gray_queue_share_redirect (SgenGrayQueue *queue) * There are still objects in the stealable stack, so * wake up any workers that might be sleeping */ - if (workers_state.data.gc_in_progress) - workers_wake_up_all (); + workers_signal_enqueue_work_if_necessary (workers_num); return; } @@ -355,8 +468,7 @@ workers_gray_queue_share_redirect (SgenGrayQueue *queue) mono_mutex_unlock (&data->stealable_stack_mutex); - if (workers_state.data.gc_in_progress) - workers_wake_up_all (); + workers_signal_enqueue_work_if_necessary (workers_num); } static void @@ -391,12 +503,14 @@ workers_thread_func (void *data_untyped) for (;;) { gboolean did_work = FALSE; - while (workers_dequeue_and_do_job (data)) { + SGEN_ASSERT (0, sgen_get_current_collection_generation () != GENERATION_NURSERY, "Why are we doing work while there's a nursery collection happening?"); + + while (workers_state.data.state == STATE_WORKING && workers_dequeue_and_do_job (data)) { did_work = TRUE; /* FIXME: maybe distribute the gray queue here? */ } - if (workers_marking && (!sgen_gray_object_queue_is_empty (&data->private_gray_queue) || workers_get_work (data))) { + if (!sgen_gray_object_queue_is_empty (&data->private_gray_queue) || workers_get_work (data)) { SgenObjectOperations *ops = sgen_concurrent_collection_in_progress () ? &major->major_concurrent_ops : &major->major_ops; @@ -404,8 +518,12 @@ workers_thread_func (void *data_untyped) g_assert (!sgen_gray_object_queue_is_empty (&data->private_gray_queue)); - while (!sgen_drain_gray_stack (32, ctx)) + while (!sgen_drain_gray_stack (32, ctx)) { + if (workers_state.data.state == STATE_NURSERY_COLLECTION) + workers_wait (); + workers_gray_queue_share_redirect (&data->private_gray_queue); + } g_assert (sgen_gray_object_queue_is_empty (&data->private_gray_queue)); init_private_gray_queue (data); @@ -482,10 +600,10 @@ sgen_workers_init (int num_workers) sgen_register_fixed_internal_mem_type (INTERNAL_MEM_JOB_QUEUE_ENTRY, sizeof (JobQueueEntry)); - mono_counters_register ("Stolen from self lock", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_workers_stolen_from_self_lock); - mono_counters_register ("Stolen from self no lock", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_workers_stolen_from_self_no_lock); - mono_counters_register ("Stolen from others", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_workers_stolen_from_others); - mono_counters_register ("# workers waited", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_workers_num_waited); + mono_counters_register ("Stolen from self lock", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_workers_stolen_from_self_lock); + mono_counters_register ("Stolen from self no lock", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_workers_stolen_from_self_no_lock); + mono_counters_register ("Stolen from others", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_workers_stolen_from_others); + mono_counters_register ("# workers waited", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_workers_num_waited); } /* only the GC thread is allowed to start and join workers */ @@ -504,6 +622,7 @@ sgen_workers_start_all_workers (void) { State old_state, new_state; int i; + gboolean result; if (!collection_needs_workers ()) return; @@ -512,35 +631,21 @@ sgen_workers_start_all_workers (void) sgen_get_major_collector ()->init_worker_thread (workers_gc_thread_major_collector_data); old_state = new_state = workers_state; - g_assert (!old_state.data.gc_in_progress); - new_state.data.gc_in_progress = TRUE; - - workers_marking = FALSE; + assert_not_working (old_state); g_assert (workers_job_queue_num_entries == 0); workers_num_jobs_enqueued = 0; workers_num_jobs_finished = 0; if (workers_started) { - g_assert (old_state.data.done_posted); - if (old_state.data.num_waiting != workers_num) { - g_error ("Expecting all %d sgen workers to be parked, but only %d are", - workers_num, old_state.data.num_waiting); - } - - /* Clear the done posted flag */ - new_state.data.done_posted = 0; - if (!set_state (old_state, new_state)) - g_assert_not_reached (); - - workers_wake_up_all (); + workers_signal_enqueue_work (workers_num, FALSE); return; } - g_assert (!old_state.data.done_posted); - - if (!set_state (old_state, new_state)) - g_assert_not_reached (); + new_state.data.state = STATE_WORKING; + new_state.data.num_awake = workers_num; + result = set_state (old_state, new_state); + SGEN_ASSERT (0, result, "Nobody else should have modified the state - workers have not been started yet"); for (i = 0; i < workers_num; ++i) workers_start_worker (i); @@ -551,84 +656,51 @@ sgen_workers_start_all_workers (void) gboolean sgen_workers_have_started (void) { - return workers_state.data.gc_in_progress; -} - -void -sgen_workers_start_marking (void) -{ - if (!collection_needs_workers ()) - return; - - g_assert (workers_started && workers_state.data.gc_in_progress); - g_assert (!workers_marking); - - workers_marking = TRUE; - - workers_wake_up_all (); + return workers_started; } void sgen_workers_join (void) { - State old_state, new_state; + State old_state; int i; if (!collection_needs_workers ()) return; - do { - old_state = new_state = workers_state; - g_assert (old_state.data.gc_in_progress); - g_assert (!old_state.data.done_posted); + for (;;) { + old_state = workers_state; + SGEN_ASSERT (0, old_state.data.state != STATE_NURSERY_COLLECTION, "Can't be in nursery collection when joining"); - new_state.data.gc_in_progress = 0; - } while (!set_state (old_state, new_state)); + if (old_state.data.state == STATE_WORKING) { + State new_state = old_state; + + SGEN_ASSERT (0, !old_state.data.post_done, "Why is post_done already set?"); + new_state.data.post_done = 1; + if (!set_state (old_state, new_state)) + continue; + + MONO_SEM_WAIT (&workers_done_sem); + + old_state = workers_state; + } + + assert_not_working (old_state); - if (new_state.data.num_waiting == workers_num) { /* - * All the workers have shut down but haven't posted - * the done semaphore yet, or, if we come from below, - * haven't done all their work yet. - * - * It's not a big deal to wake them up again - they'll - * just do one iteration of their loop trying to find - * something to do and then go back to waiting again. + * Checking whether there is still work left and, if not, going to sleep, + * are two separate actions that are not performed atomically by the + * workers. Therefore there's a race condition where work can be added + * after they've checked for work, and before they've gone to sleep. */ - reawaken: - workers_wake_up_all (); - } - MONO_SEM_WAIT (&workers_done_sem); + if (!workers_job_queue_num_entries && sgen_section_gray_queue_is_empty (&workers_distribute_gray_queue)) + break; - old_state = new_state = workers_state; - g_assert (old_state.data.num_waiting == workers_num); - g_assert (old_state.data.done_posted); - - if (workers_job_queue_num_entries || !sgen_section_gray_queue_is_empty (&workers_distribute_gray_queue)) { - /* - * There's a small race condition that we avoid here. - * It's possible that a worker thread runs out of - * things to do, so it goes to sleep. Right at that - * moment a new job is enqueued, but the thread is - * still registered as running. Now the threads are - * joined, and we wait for the semaphore. Only at - * this point does the worker go to sleep, and posts - * the semaphore, because workers_gc_in_progress is - * already FALSE. The job is still in the queue, - * though. - * - * Clear the done posted flag. - */ - new_state.data.done_posted = 0; - if (!set_state (old_state, new_state)) - g_assert_not_reached (); - goto reawaken; + workers_signal_enqueue_work (workers_num, FALSE); } /* At this point all the workers have stopped. */ - workers_marking = FALSE; - if (sgen_get_major_collector ()->reset_worker_data) { for (i = 0; i < workers_num; ++i) sgen_get_major_collector ()->reset_worker_data (workers_data [i].major_collector_data); @@ -644,15 +716,15 @@ sgen_workers_join (void) gboolean sgen_workers_all_done (void) +{ + return workers_state.data.state == STATE_NOT_WORKING; +} + +gboolean +sgen_workers_are_working (void) { State state = workers_state; - /* - * Can only be called while the collection is still in - * progress, i.e., before done has been posted. - */ - g_assert (state.data.gc_in_progress); - g_assert (!state.data.done_posted); - return state.data.num_waiting == workers_num; + return state.data.num_awake > 0 || state.data.num_posted > 0; } gboolean diff --git a/mta-mono/vendor/mono/metadata/sgen-workers.h b/mta-mono/vendor/mono/metadata/sgen-workers.h index d13c460..298071b 100644 --- a/mta-mono/vendor/mono/metadata/sgen-workers.h +++ b/mta-mono/vendor/mono/metadata/sgen-workers.h @@ -50,15 +50,18 @@ struct _JobQueueEntry { void sgen_workers_init (int num_workers) MONO_INTERNAL; void sgen_workers_start_all_workers (void) MONO_INTERNAL; gboolean sgen_workers_have_started (void) MONO_INTERNAL; -void sgen_workers_wake_up_all (void) MONO_INTERNAL; +void sgen_workers_ensure_awake (void) MONO_INTERNAL; void sgen_workers_init_distribute_gray_queue (void) MONO_INTERNAL; void sgen_workers_enqueue_job (JobFunc func, void *data) MONO_INTERNAL; -void sgen_workers_wait_for_jobs (void) MONO_INTERNAL; -void sgen_workers_start_marking (void) MONO_INTERNAL; +void sgen_workers_wait_for_jobs_finished (void) MONO_INTERNAL; void sgen_workers_distribute_gray_queue_sections (void) MONO_INTERNAL; void sgen_workers_reset_data (void) MONO_INTERNAL; void sgen_workers_join (void) MONO_INTERNAL; gboolean sgen_workers_all_done (void) MONO_INTERNAL; +gboolean sgen_workers_are_working (void) MONO_INTERNAL; SgenSectionGrayQueue* sgen_workers_get_distribute_section_gray_queue (void) MONO_INTERNAL; +void sgen_workers_signal_start_nursery_collection_and_wait (void) MONO_INTERNAL; +void sgen_workers_signal_finish_nursery_collection (void) MONO_INTERNAL; + #endif diff --git a/mta-mono/vendor/mono/metadata/socket-io.c b/mta-mono/vendor/mono/metadata/socket-io.c index 949164e..eef60ab 100644 --- a/mta-mono/vendor/mono/metadata/socket-io.c +++ b/mta-mono/vendor/mono/metadata/socket-io.c @@ -13,7 +13,7 @@ #ifndef DISABLE_SOCKETS -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__FreeBSD__) #define __APPLE_USE_RFC_3542 #endif @@ -24,10 +24,14 @@ #include #else #include +#ifdef HAVE_SYS_IOCTL_H #include +#endif #include #include +#ifdef HAVE_NETDB_H #include +#endif #include #endif #ifdef HAVE_UNISTD_H @@ -53,6 +57,7 @@ #include #include #include +#include #include #ifdef HAVE_SYS_TIME_H @@ -85,36 +90,9 @@ #include "mono/io-layer/socket-wrappers.h" -#if defined(HOST_WIN32) -/* This is a kludge to make this file build under cygwin: - * w32api/ws2tcpip.h has definitions for some AF_INET6 values and - * prototypes for some but not all required functions (notably - * inet_ntop() is missing), but the libws2_32 library is missing the - * actual implementations of these functions. - */ -#undef AF_INET6 -#endif - #define LOGDEBUG(...) /* define LOGDEBUG(...) g_message(__VA_ARGS__) */ -/* - * Some older versions of libc provide IPV6 support without defining the AI_ADDRCONFIG - * flag for getaddrinfo. - */ -#ifndef AI_ADDRCONFIG -#define AI_ADDRCONFIG 0 -#endif - -#ifdef __APPLE__ -/* - * We remove this until we have a Darwin implementation - * that can walk the result of struct ifconf. The current - * implementation only works for Linux - */ -#undef HAVE_SIOCGIFCONF -#endif - static gint32 convert_family(MonoAddressFamily mono_family) { gint32 family=-1; @@ -177,10 +155,9 @@ static gint32 convert_family(MonoAddressFamily mono_family) break; case AddressFamily_InterNetworkV6: -#ifdef AF_INET6 family=AF_INET6; -#endif break; + case AddressFamily_Irda: #ifdef AF_IRDA family=AF_IRDA; @@ -232,11 +209,9 @@ static MonoAddressFamily convert_to_mono_family(guint16 af_family) family=AddressFamily_AppleTalk; break; -#ifdef AF_INET6 case AF_INET6: family=AddressFamily_InterNetworkV6; break; -#endif #ifdef AF_IRDA case AF_IRDA: @@ -464,24 +439,7 @@ static gint32 convert_sockopt_level_and_name(MonoSocketOptionLevel mono_level, break; case SocketOptionLevel_IP: -#ifdef HAVE_SOL_IP - *system_level = SOL_IP; -#else - if (1) { - static int cached = 0; - static int proto; - - if (!cached) { - struct protoent *pent; - - pent = getprotobyname ("IP"); - proto = pent ? pent->p_proto : 0 /* 0 a good default value?? */; - cached = 1; - } - - *system_level = proto; - } -#endif /* HAVE_SOL_IP */ + *system_level = mono_networking_get_ip_protocol (); switch(mono_name) { case SocketOptionName_IPOptions: @@ -548,26 +506,8 @@ static gint32 convert_sockopt_level_and_name(MonoSocketOptionLevel mono_level, } break; -#ifdef AF_INET6 case SocketOptionLevel_IPv6: -#ifdef HAVE_SOL_IPV6 - *system_level = SOL_IPV6; -#else - if (1) { - static int cached = 0; - static int proto; - - if (!cached) { - struct protoent *pent; - - pent = getprotobyname ("IPV6"); - proto = pent ? pent->p_proto : 41 /* 41 a good default value?? */; - cached = 1; - } - - *system_level = proto; - } -#endif /* HAVE_SOL_IPV6 */ + *system_level = mono_networking_get_ipv6_protocol (); switch(mono_name) { case SocketOptionName_IpTimeToLive: @@ -611,27 +551,9 @@ static gint32 convert_sockopt_level_and_name(MonoSocketOptionLevel mono_level, } break; /* SocketOptionLevel_IPv6 */ -#endif case SocketOptionLevel_Tcp: -#ifdef HAVE_SOL_TCP - *system_level = SOL_TCP; -#else - if (1) { - static int cached = 0; - static int proto; - - if (!cached) { - struct protoent *pent; - - pent = getprotobyname ("TCP"); - proto = pent ? pent->p_proto : 6 /* is 6 a good default value?? */; - cached = 1; - } - - *system_level = proto; - } -#endif /* HAVE_SOL_TCP */ + *system_level = mono_networking_get_tcp_protocol (); switch(mono_name) { case SocketOptionName_NoDelay: @@ -697,7 +619,6 @@ static MonoImage *get_socket_assembly (void) return domain->socket_assembly; } -#ifdef AF_INET6 static gint32 get_family_hint(void) { MonoDomain *domain = mono_domain_get (); @@ -736,7 +657,6 @@ static gint32 get_family_hint(void) return PF_UNSPEC; } } -#endif gpointer ves_icall_System_Net_Sockets_Socket_Socket_internal(MonoObject *this, gint32 family, gint32 type, gint32 proto, gint32 *error) { @@ -745,8 +665,6 @@ gpointer ves_icall_System_Net_Sockets_Socket_Socket_internal(MonoObject *this, g gint32 sock_proto; gint32 sock_type; - MONO_ARCH_SAVE_REGS; - *error = 0; sock_family=convert_family(family); @@ -775,16 +693,6 @@ gpointer ves_icall_System_Net_Sockets_Socket_Socket_internal(MonoObject *this, g return(NULL); } - if (sock_family == AF_INET && sock_type == SOCK_DGRAM) { - return (GUINT_TO_POINTER (sock)); - } - -#ifdef AF_INET6 - if (sock_family == AF_INET6 && sock_type == SOCK_DGRAM) { - return (GUINT_TO_POINTER (sock)); - } -#endif - return(GUINT_TO_POINTER (sock)); } @@ -794,8 +702,6 @@ gpointer ves_icall_System_Net_Sockets_Socket_Socket_internal(MonoObject *this, g void ves_icall_System_Net_Sockets_Socket_Close_internal(SOCKET sock, gint32 *error) { - MONO_ARCH_SAVE_REGS; - LOGDEBUG (g_message ("%s: closing 0x%x", __func__, sock)); *error = 0; @@ -808,8 +714,6 @@ void ves_icall_System_Net_Sockets_Socket_Close_internal(SOCKET sock, gint32 ves_icall_System_Net_Sockets_SocketException_WSAGetLastError_internal(void) { - MONO_ARCH_SAVE_REGS; - LOGDEBUG (g_message("%s: returning %d", __func__, WSAGetLastError())); return(WSAGetLastError()); @@ -821,8 +725,6 @@ gint32 ves_icall_System_Net_Sockets_Socket_Available_internal(SOCKET sock, int ret; int amount; - MONO_ARCH_SAVE_REGS; - *error = 0; /* FIXME: this might require amount to be unsigned long. */ @@ -841,8 +743,6 @@ void ves_icall_System_Net_Sockets_Socket_Blocking_internal(SOCKET sock, { int ret; - MONO_ARCH_SAVE_REGS; - *error = 0; /* @@ -863,8 +763,6 @@ gpointer ves_icall_System_Net_Sockets_Socket_Accept_internal(SOCKET sock, { SOCKET newsock; - MONO_ARCH_SAVE_REGS; - *error = 0; #ifdef HOST_WIN32 { @@ -890,8 +788,6 @@ void ves_icall_System_Net_Sockets_Socket_Listen_internal(SOCKET sock, { int ret; - MONO_ARCH_SAVE_REGS; - *error = 0; ret = _wapi_listen (sock, backlog); @@ -900,7 +796,6 @@ void ves_icall_System_Net_Sockets_Socket_Listen_internal(SOCKET sock, } } -#ifdef AF_INET6 // Check whether it's ::ffff::0:0. static gboolean is_ipv4_mapped_any (const struct in6_addr *addr) @@ -919,7 +814,6 @@ is_ipv4_mapped_any (const struct in6_addr *addr) } return TRUE; } -#endif static MonoObject *create_object_from_sockaddr(struct sockaddr *saddr, int sa_size, gint32 *error) @@ -982,7 +876,6 @@ static MonoObject *create_object_from_sockaddr(struct sockaddr *saddr, mono_field_set_value (sockaddr_obj, domain->sockaddr_data_field, data); return(sockaddr_obj); -#ifdef AF_INET6 } else if (saddr->sa_family == AF_INET6) { struct sockaddr_in6 *sa_in=(struct sockaddr_in6 *)saddr; int i; @@ -1019,7 +912,6 @@ static MonoObject *create_object_from_sockaddr(struct sockaddr *saddr, mono_field_set_value (sockaddr_obj, domain->sockaddr_data_field, data); return(sockaddr_obj); -#endif #ifdef HAVE_SYS_UN_H } else if (saddr->sa_family == AF_UNIX) { int i; @@ -1046,10 +938,8 @@ get_sockaddr_size (int family) size = 0; if (family == AF_INET) { size = sizeof (struct sockaddr_in); -#ifdef AF_INET6 } else if (family == AF_INET6) { size = sizeof (struct sockaddr_in6); -#endif #ifdef HAVE_SYS_UN_H } else if (family == AF_UNIX) { size = sizeof (struct sockaddr_un); @@ -1065,8 +955,6 @@ extern MonoObject *ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal(SO int ret; MonoObject *result; - MONO_ARCH_SAVE_REGS; - *error = 0; salen = get_sockaddr_size (convert_family (af)); @@ -1099,8 +987,6 @@ extern MonoObject *ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal(S int ret; MonoObject *result; - MONO_ARCH_SAVE_REGS; - *error = 0; salen = get_sockaddr_size (convert_family (af)); @@ -1177,8 +1063,6 @@ static struct sockaddr *create_sockaddr_from_object(MonoObject *saddr_obj, *sa_size = sizeof(struct sockaddr_in); return((struct sockaddr *)sa); - -#ifdef AF_INET6 } else if (family == AF_INET6) { struct sockaddr_in6 *sa; int i; @@ -1207,7 +1091,6 @@ static struct sockaddr *create_sockaddr_from_object(MonoObject *saddr_obj, *sa_size = sizeof(struct sockaddr_in6); return((struct sockaddr *)sa); -#endif #ifdef HAVE_SYS_UN_H } else if (family == AF_UNIX) { struct sockaddr_un *sock_un; @@ -1244,8 +1127,6 @@ extern void ves_icall_System_Net_Sockets_Socket_Bind_internal(SOCKET sock, MonoO socklen_t sa_size; int ret; - MONO_ARCH_SAVE_REGS; - *error = 0; sa=create_sockaddr_from_object(sockaddr, &sa_size, error); @@ -1278,9 +1159,6 @@ ves_icall_System_Net_Sockets_Socket_Poll_internal (SOCKET sock, gint mode, int ret; time_t start; - - MONO_ARCH_SAVE_REGS; - pfds = g_new0 (mono_pollfd, 1); pfds[0].fd = GPOINTER_TO_INT (sock); pfds[0].events = (mode == SelectModeRead) ? MONO_POLLIN : @@ -1350,8 +1228,6 @@ extern void ves_icall_System_Net_Sockets_Socket_Connect_internal(SOCKET sock, Mo socklen_t sa_size; int ret; - MONO_ARCH_SAVE_REGS; - *error = 0; sa=create_sockaddr_from_object(sockaddr, &sa_size, error); @@ -1393,8 +1269,6 @@ extern void ves_icall_System_Net_Sockets_Socket_Disconnect_internal(SOCKET sock, LPFN_TRANSMITFILE _wapi_transmitfile = NULL; gboolean bret; - MONO_ARCH_SAVE_REGS; - *error = 0; LOGDEBUG (g_message("%s: disconnecting from socket %p (reuse %d)", __func__, sock, reuse)); @@ -1453,8 +1327,6 @@ gint32 ves_icall_System_Net_Sockets_Socket_Receive_internal(SOCKET sock, MonoArr gint32 alen; int recvflags=0; - MONO_ARCH_SAVE_REGS; - *error = 0; alen = mono_array_length (buffer); @@ -1496,8 +1368,6 @@ gint32 ves_icall_System_Net_Sockets_Socket_Receive_array_internal(SOCKET sock, M WSABUF *wsabufs; DWORD recvflags = 0; - MONO_ARCH_SAVE_REGS; - *error = 0; wsabufs = mono_array_addr (buffers, WSABUF, 0); @@ -1527,8 +1397,6 @@ gint32 ves_icall_System_Net_Sockets_Socket_RecvFrom_internal(SOCKET sock, MonoAr struct sockaddr *sa; socklen_t sa_size; - MONO_ARCH_SAVE_REGS; - *error = 0; alen = mono_array_length (buffer); @@ -1577,8 +1445,6 @@ gint32 ves_icall_System_Net_Sockets_Socket_Send_internal(SOCKET sock, MonoArray gint32 alen; int sendflags=0; - MONO_ARCH_SAVE_REGS; - *error = 0; alen = mono_array_length (buffer); @@ -1614,8 +1480,6 @@ gint32 ves_icall_System_Net_Sockets_Socket_Send_array_internal(SOCKET sock, Mono WSABUF *wsabufs; DWORD sendflags = 0; - MONO_ARCH_SAVE_REGS; - *error = 0; wsabufs = mono_array_addr (buffers, WSABUF, 0); @@ -1645,8 +1509,6 @@ gint32 ves_icall_System_Net_Sockets_Socket_SendTo_internal(SOCKET sock, MonoArra struct sockaddr *sa; socklen_t sa_size; - MONO_ARCH_SAVE_REGS; - *error = 0; alen = mono_array_length (buffer); @@ -1707,8 +1569,6 @@ void ves_icall_System_Net_Sockets_Socket_Select_internal(MonoArray **sockets, gi time_t start; uintptr_t socks_size; - MONO_ARCH_SAVE_REGS; - /* *sockets -> READ, null, WRITE, null, ERROR, null */ count = mono_array_length (*sockets); nfds = count - 3; /* NULL separators */ @@ -1846,8 +1706,6 @@ void ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal(SOCKET soc MonoClass *obj_class; MonoClassField *field; - MONO_ARCH_SAVE_REGS; - *error = 0; #if !defined(SO_EXCLUSIVEADDRUSE) && defined(SO_REUSEADDR) @@ -1985,8 +1843,6 @@ void ves_icall_System_Net_Sockets_Socket_GetSocketOption_arr_internal(SOCKET soc guchar *buf; socklen_t valsize; - MONO_ARCH_SAVE_REGS; - *error = 0; ret=convert_sockopt_level_and_name(level, name, &system_level, @@ -2024,7 +1880,6 @@ static struct in_addr ipaddress_to_struct_in_addr(MonoObject *ipaddr) return(inaddr); } -#ifdef AF_INET6 static struct in6_addr ipaddress_to_struct_in6_addr(MonoObject *ipaddr) { struct in6_addr in6addr; @@ -2048,10 +1903,9 @@ static struct in6_addr ipaddress_to_struct_in6_addr(MonoObject *ipaddr) #endif return(in6addr); } -#endif /* AF_INET6 */ #endif -#if defined(__APPLE__) +#if defined(__APPLE__) || defined(__FreeBSD__) #if defined(HAVE_GETIFADDRS) && defined(HAVE_IF_NAMETOINDEX) static int @@ -2089,7 +1943,7 @@ get_local_interface_id (int family) } #endif -#endif /* __APPLE__ */ +#endif /* defined(__APPLE__) || defined(__FreeBSD__) */ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, gint32 level, gint32 name, MonoObject *obj_val, MonoArray *byte_val, gint32 int_val, gint32 *error) { @@ -2097,34 +1951,13 @@ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, g int system_level = 0; int system_name = 0; int ret; -#ifdef AF_INET6 int sol_ip; int sol_ipv6; *error = 0; - -#ifdef HAVE_SOL_IPV6 - sol_ipv6 = SOL_IPV6; -#else - { - struct protoent *pent; - pent = getprotobyname ("ipv6"); - sol_ipv6 = (pent != NULL) ? pent->p_proto : 41; - } -#endif -#ifdef HAVE_SOL_IP - sol_ip = SOL_IP; -#else - { - struct protoent *pent; - pent = getprotobyname ("ip"); - sol_ip = (pent != NULL) ? pent->p_proto : 0; - } -#endif -#endif /* AF_INET6 */ - - MONO_ARCH_SAVE_REGS; + sol_ipv6 = mono_networking_get_ipv6_protocol (); + sol_ip = mono_networking_get_ip_protocol (); ret=convert_sockopt_level_and_name(level, name, &system_level, &system_name); @@ -2170,7 +2003,6 @@ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, g { MonoObject *address = NULL; -#ifdef AF_INET6 if(system_level == sol_ipv6) { struct ipv6_mreq mreq6; @@ -2187,7 +2019,7 @@ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, g field=mono_class_get_field_from_name(obj_val->vtable->klass, "ifIndex"); mreq6.ipv6mr_interface =*(guint64 *)(((char *)obj_val)+field->offset); -#if defined(__APPLE__) +#if defined(__APPLE__) || defined(__FreeBSD__) /* * Bug #5504: * @@ -2205,9 +2037,7 @@ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, g ret = _wapi_setsockopt (sock, system_level, system_name, &mreq6, sizeof (mreq6)); - } else if(system_level == sol_ip) -#endif /* AF_INET6 */ - { + } else if(system_level == sol_ip) { #ifdef HAVE_STRUCT_IP_MREQN struct ip_mreqn mreq = {{0}}; #else @@ -2325,8 +2155,6 @@ void ves_icall_System_Net_Sockets_Socket_Shutdown_internal(SOCKET sock, { int ret; - MONO_ARCH_SAVE_REGS; - *error = 0; /* Currently, the values for how (recv=0, send=1, both=2) match @@ -2348,8 +2176,6 @@ ves_icall_System_Net_Sockets_Socket_WSAIoctl (SOCKET sock, gint32 code, gint i_len, o_len; gint ret; - MONO_ARCH_SAVE_REGS; - *error = 0; if ((guint32)code == FIONBIO) { @@ -2382,501 +2208,14 @@ ves_icall_System_Net_Sockets_Socket_WSAIoctl (SOCKET sock, gint32 code, return (gint) output_bytes; } -#ifdef HAVE_SIOCGIFCONF -static gboolean -is_loopback (int family, void *ad) -{ - char *ptr = (char *) ad; - - if (family == AF_INET) { - return (ptr [0] == 127); - } -#ifdef AF_INET6 - else { - return (IN6_IS_ADDR_LOOPBACK ((struct in6_addr *) ptr)); - } -#endif - return FALSE; -} - -static void * -get_local_ips (int family, int *nips) -{ - int addr_size, offset, fd, i, count; - int max_ifaces = 50; /* 50 interfaces should be enough... */ - struct ifconf ifc; - struct ifreq *ifr; - struct ifreq iflags; - char *result, *tmp_ptr; - gboolean ignore_loopback = FALSE; - - *nips = 0; - if (family == AF_INET) { - addr_size = sizeof (struct in_addr); - offset = G_STRUCT_OFFSET (struct sockaddr_in, sin_addr); -#ifdef AF_INET6 - } else if (family == AF_INET6) { - addr_size = sizeof (struct in6_addr); - offset = G_STRUCT_OFFSET (struct sockaddr_in6, sin6_addr); -#endif - } else { - return NULL; - } - - fd = socket (family, SOCK_STREAM, 0); - - ifc.ifc_len = max_ifaces * sizeof (struct ifreq); - ifc.ifc_buf = g_malloc (ifc.ifc_len); - if (ioctl (fd, SIOCGIFCONF, &ifc) < 0) { - close (fd); - g_free (ifc.ifc_buf); - return NULL; - } - - count = ifc.ifc_len / sizeof (struct ifreq); - *nips = count; - if (count == 0) { - g_free (ifc.ifc_buf); - close (fd); - return NULL; - } - - for (i = 0, ifr = ifc.ifc_req; i < *nips; i++, ifr++) { - strcpy (iflags.ifr_name, ifr->ifr_name); - if (ioctl (fd, SIOCGIFFLAGS, &iflags) < 0) { - continue; - } - - if ((iflags.ifr_flags & IFF_UP) == 0) { - ifr->ifr_name [0] = '\0'; - continue; - } - - if ((iflags.ifr_flags & IFF_LOOPBACK) == 0) { - ignore_loopback = TRUE; - } - } - - close (fd); - result = g_malloc (addr_size * count); - tmp_ptr = result; - for (i = 0, ifr = ifc.ifc_req; i < count; i++, ifr++) { - if (ifr->ifr_name [0] == '\0') { - (*nips)--; - continue; - } - - if (ignore_loopback && is_loopback (family, ((char *) &ifr->ifr_addr) + offset)) { - (*nips)--; - continue; - } - - memcpy (tmp_ptr, ((char *) &ifr->ifr_addr) + offset, addr_size); - tmp_ptr += addr_size; - } - - g_free (ifc.ifc_buf); - return result; -} -#elif defined(HAVE_GETIFADDRS) -static gboolean -is_loopback (int family, void *ad) -{ - char *ptr = (char *) ad; - - if (family == AF_INET) { - return (ptr [0] == 127); - } -#ifdef AF_INET6 - else { - return (IN6_IS_ADDR_LOOPBACK ((struct in6_addr *) ptr)); - } -#endif - return FALSE; -} - -static void * -get_local_ips (int family, int *nips) -{ - struct ifaddrs *ifap = NULL, *ptr; - int addr_size, offset, count, i; - char *result, *tmp_ptr; - - *nips = 0; - if (family == AF_INET) { - addr_size = sizeof (struct in_addr); - offset = G_STRUCT_OFFSET (struct sockaddr_in, sin_addr); -#ifdef AF_INET6 - } else if (family == AF_INET6) { - addr_size = sizeof (struct in6_addr); - offset = G_STRUCT_OFFSET (struct sockaddr_in6, sin6_addr); -#endif - } else { - return NULL; - } - - if (getifaddrs (&ifap)) { - return NULL; - } - - count = 0; - for (ptr = ifap; ptr; ptr = ptr->ifa_next) { - if (!ptr->ifa_addr) - continue; - if (ptr->ifa_addr->sa_family != family) - continue; - if (is_loopback (family, ((char *) ptr->ifa_addr) + offset)) - continue; - count++; - } - - result = g_malloc (addr_size * count); - tmp_ptr = result; - for (i = 0, ptr = ifap; ptr; ptr = ptr->ifa_next) { - if (!ptr->ifa_addr) - continue; - if (ptr->ifa_addr->sa_family != family) - continue; - if (is_loopback (family, ((char *) ptr->ifa_addr) + offset)) - continue; - - memcpy (tmp_ptr, ((char *) ptr->ifa_addr) + offset, addr_size); - tmp_ptr += addr_size; - } - - freeifaddrs (ifap); - *nips = count; - return result; -} -#else -static void * -get_local_ips (int family, int *nips) -{ - *nips = 0; - return NULL; -} - -#endif /* HAVE_SIOCGIFCONF */ - -#ifndef AF_INET6 -static gboolean hostent_to_IPHostEntry(struct hostent *he, MonoString **h_name, - MonoArray **h_aliases, - MonoArray **h_addr_list, - gboolean add_local_ips) -{ - MonoDomain *domain = mono_domain_get (); - int i = 0; - struct in_addr *local_in = NULL; - int nlocal_in = 0; - - if (he != NULL) { - if(he->h_length!=4 || he->h_addrtype!=AF_INET) { - return(FALSE); - } - - *h_name=mono_string_new(domain, he->h_name); - - while(he->h_aliases[i]!=NULL) { - i++; - } - - *h_aliases=mono_array_new(domain, mono_get_string_class (), i); - i=0; - while(he->h_aliases[i]!=NULL) { - MonoString *alias; - - alias=mono_string_new(domain, he->h_aliases[i]); - mono_array_setref (*h_aliases, i, alias); - i++; - } - } else if (!add_local_ips) { - return FALSE; - } - - if (add_local_ips) { - local_in = (struct in_addr *) get_local_ips (AF_INET, &nlocal_in); - if (nlocal_in) { - *h_addr_list = mono_array_new(domain, mono_get_string_class (), nlocal_in); - for (i = 0; i < nlocal_in; i++) { - MonoString *addr_string; - char addr [16], *ptr; - - ptr = (char *) &local_in [i]; - g_snprintf(addr, 16, "%u.%u.%u.%u", - (unsigned char) ptr [0], - (unsigned char) ptr [1], - (unsigned char) ptr [2], - (unsigned char) ptr [3]); - - addr_string = mono_string_new (domain, addr); - mono_array_setref (*h_addr_list, i, addr_string); - i++; - } - - g_free (local_in); - } else if (he == NULL) { - /* If requesting "" and there are no other interfaces up, MS returns 127.0.0.1 */ - *h_addr_list = mono_array_new(domain, mono_get_string_class (), 1); - mono_array_setref (*h_addr_list, 0, mono_string_new (domain, "127.0.0.1")); - return TRUE; - } - } - - if (nlocal_in == 0 && he != NULL) { - i = 0; - while (he->h_addr_list[i]!=NULL) { - i++; - } - - *h_addr_list=mono_array_new(domain, mono_get_string_class (), i); - i=0; - while(he->h_addr_list[i]!=NULL) { - MonoString *addr_string; - char addr[16]; - - g_snprintf(addr, 16, "%u.%u.%u.%u", - (unsigned char)he->h_addr_list[i][0], - (unsigned char)he->h_addr_list[i][1], - (unsigned char)he->h_addr_list[i][2], - (unsigned char)he->h_addr_list[i][3]); - - addr_string=mono_string_new(domain, addr); - mono_array_setref (*h_addr_list, i, addr_string); - i++; - } - } - - return(TRUE); -} - -static gboolean ipaddr_to_IPHostEntry(const char *addr, MonoString **h_name, - MonoArray **h_aliases, - MonoArray **h_addr_list) -{ - MonoDomain *domain = mono_domain_get (); - - *h_name=mono_string_new(domain, addr); - *h_aliases=mono_array_new(domain, mono_get_string_class (), 0); - *h_addr_list=mono_array_new(domain, mono_get_string_class (), 1); - mono_array_setref (*h_addr_list, 0, *h_name); - - return(TRUE); -} -#endif - -#if defined(AF_INET6) && defined(HAVE_GETHOSTBYNAME2_R) -static gboolean hostent_to_IPHostEntry2(struct hostent *he1,struct hostent *he2, MonoString **h_name, - MonoArray **h_aliases, MonoArray **h_addr_list, gboolean add_local_ips) -{ - MonoDomain *domain = mono_domain_get (); - int i, host_count, host_index, family_hint; - struct in_addr *local_in = NULL; - int nlocal_in = 0; - struct in6_addr *local_in6 = NULL; - int nlocal_in6 = 0; - gboolean from_local = FALSE; - - family_hint = get_family_hint (); - - /* - * Check if address length and family are correct - */ - if (he1 != NULL && (he1->h_length!=4 || he1->h_addrtype!=AF_INET)) { - return(FALSE); - } - - if (he2 != NULL && (he2->h_length!=16 || he2->h_addrtype!=AF_INET6)) { - return(FALSE); - } - - /* - * Get the aliases and host name from he1 or he2 whichever is - * not null, if he1 is not null then take aliases from he1 - */ - if (he1 != NULL && (family_hint == PF_UNSPEC || - family_hint == PF_INET)) { - *h_name=mono_string_new (domain, he1->h_name); - - i=0; - while(he1->h_aliases[i]!=NULL) { - i++; - } - - *h_aliases=mono_array_new (domain, mono_get_string_class (), - i); - i=0; - while(he1->h_aliases[i]!=NULL) { - MonoString *alias; - - alias=mono_string_new (domain, he1->h_aliases[i]); - mono_array_setref (*h_aliases, i, alias); - i++; - } - } else if (he2 != NULL && (family_hint == PF_UNSPEC || - family_hint == PF_INET6)) { - *h_name=mono_string_new (domain, he2->h_name); - - i=0; - while(he2->h_aliases [i] != NULL) { - i++; - } - - *h_aliases=mono_array_new (domain, mono_get_string_class (), - i); - i=0; - while(he2->h_aliases[i]!=NULL) { - MonoString *alias; - - alias=mono_string_new (domain, he2->h_aliases[i]); - mono_array_setref (*h_aliases, i, alias); - i++; - } - } else if (!add_local_ips) { - return(FALSE); - } - - /* - * Count the number of addresses in he1 + he2 - */ - host_count = 0; - if (he1 != NULL && (family_hint == PF_UNSPEC || - family_hint == PF_INET)) { - i=0; - while(he1->h_addr_list[i]!=NULL) { - i++; - host_count++; - } - } - - if (he2 != NULL && (family_hint == PF_UNSPEC || - family_hint == PF_INET6)) { - i=0; - while(he2->h_addr_list[i]!=NULL) { - i++; - host_count++; - } - } - - /* - * Fills the array - */ - host_index = 0; - if (add_local_ips) { - if (family_hint == PF_UNSPEC || family_hint == PF_INET) - local_in = (struct in_addr *) get_local_ips (AF_INET, &nlocal_in); - - if (family_hint == PF_UNSPEC || family_hint == PF_INET6) - local_in6 = (struct in6_addr *) get_local_ips (AF_INET6, &nlocal_in6); - - if (nlocal_in || nlocal_in6) { - from_local = TRUE; - *h_addr_list = mono_array_new (domain, mono_get_string_class (), - nlocal_in + nlocal_in6); - - if (nlocal_in6) { - int n; - for (n = 0; n < nlocal_in6; n++) { - MonoString *addr_string; - const char *ret; - char addr[48]; /* INET6_ADDRSTRLEN == 46, but IPv6 addresses can be 48 bytes with the trailing NULL */ - - ret = inet_ntop (AF_INET6, &local_in6 [n], addr, sizeof(addr)); - - if (ret != NULL) { - addr_string = mono_string_new (domain, addr); - mono_array_setref (*h_addr_list, host_index, addr_string); - host_index++; - } - } - } - - if (nlocal_in) { - int n; - for (n = 0; n < nlocal_in; n++) { - MonoString *addr_string; - const char *ret; - char addr[16]; /* INET_ADDRSTRLEN == 16 */ - - ret = inet_ntop (AF_INET, &local_in [n], addr, sizeof(addr)); - - if (ret != NULL) { - addr_string = mono_string_new (domain, addr); - mono_array_setref (*h_addr_list, host_index, addr_string); - host_index++; - } - } - } - g_free (local_in); - g_free (local_in6); - return TRUE; - } else if (he1 == NULL && he2 == NULL) { - /* If requesting "" and there are no other interfaces up, MS returns 127.0.0.1 */ - *h_addr_list = mono_array_new(domain, mono_get_string_class (), 1); - mono_array_setref (*h_addr_list, 0, mono_string_new (domain, "127.0.0.1")); - g_free (local_in); - g_free (local_in6); - return TRUE; - } - - g_free (local_in); - g_free (local_in6); - } - - *h_addr_list=mono_array_new (domain, mono_get_string_class (), host_count); - - if (he2 != NULL && (family_hint == PF_UNSPEC || - family_hint == PF_INET6)) { - i = 0; - while(he2->h_addr_list[i] != NULL) { - MonoString *addr_string; - const char *ret; - char addr[48]; /* INET6_ADDRSTRLEN == 46, but IPv6 addresses can be 48 bytes long with the trailing NULL */ - - ret = inet_ntop (AF_INET6, he2->h_addr_list[i], addr, - sizeof(addr)); - - if (ret != NULL) { - addr_string = mono_string_new (domain, addr); - mono_array_setref (*h_addr_list, host_index, addr_string); - i++; - host_index++; - } - } - } - - if (he1 != NULL && (family_hint == PF_UNSPEC || - family_hint == PF_INET)) { - i=0; - while(he1->h_addr_list[i] != NULL) { - MonoString *addr_string; - const char *ret; - char addr[16]; /* INET_ADDRSTRLEN == 16 */ - - ret = inet_ntop (AF_INET, he1->h_addr_list[i], addr, - sizeof(addr)); - - if (ret != NULL) { - addr_string=mono_string_new (domain, addr); - mono_array_setref (*h_addr_list, host_index, addr_string); - i++; - host_index++; - } - } - } - - return(TRUE); -} -#endif - -#if defined(AF_INET6) static gboolean -addrinfo_to_IPHostEntry(struct addrinfo *info, MonoString **h_name, +addrinfo_to_IPHostEntry(MonoAddressInfo *info, MonoString **h_name, MonoArray **h_aliases, MonoArray **h_addr_list, gboolean add_local_ips) { gint32 count, i; - struct addrinfo *ai = NULL; + MonoAddressEntry *ai = NULL; struct in_addr *local_in = NULL; int nlocal_in = 0; struct in6_addr *local_in6 = NULL; @@ -2888,32 +2227,34 @@ addrinfo_to_IPHostEntry(struct addrinfo *info, MonoString **h_name, addr_index = 0; *h_aliases=mono_array_new(domain, mono_get_string_class (), 0); if (add_local_ips) { - local_in = (struct in_addr *) get_local_ips (AF_INET, &nlocal_in); - local_in6 = (struct in6_addr *) get_local_ips (AF_INET6, &nlocal_in6); + local_in = (struct in_addr *) mono_get_local_interfaces (AF_INET, &nlocal_in); + local_in6 = (struct in6_addr *) mono_get_local_interfaces (AF_INET6, &nlocal_in6); if (nlocal_in || nlocal_in6) { + char addr [INET6_ADDRSTRLEN]; *h_addr_list=mono_array_new(domain, mono_get_string_class (), nlocal_in + nlocal_in6); if (nlocal_in) { MonoString *addr_string; - char addr [16]; int i; for (i = 0; i < nlocal_in; i++) { - inet_ntop (AF_INET, &local_in [i], addr, sizeof (addr)); - addr_string = mono_string_new (domain, addr); - mono_array_setref (*h_addr_list, addr_index, addr_string); - addr_index++; + MonoAddress maddr; + mono_address_init (&maddr, AF_INET, &local_in [i]); + if (mono_networking_addr_to_str (&maddr, addr, sizeof (addr))) { + addr_string = mono_string_new (domain, addr); + mono_array_setref (*h_addr_list, addr_index, addr_string); + addr_index++; + } } } if (nlocal_in6) { MonoString *addr_string; - const char *ret; - char addr [48]; int i; for (i = 0; i < nlocal_in6; i++) { - ret = inet_ntop (AF_INET6, &local_in6 [i], addr, sizeof (addr)); - if (ret != NULL) { + MonoAddress maddr; + mono_address_init (&maddr, AF_INET6, &local_in6 [i]); + if (mono_networking_addr_to_str (&maddr, addr, sizeof (addr))) { addr_string = mono_string_new (domain, addr); mono_array_setref (*h_addr_list, addr_index, addr_string); addr_index++; @@ -2924,7 +2265,7 @@ addrinfo_to_IPHostEntry(struct addrinfo *info, MonoString **h_name, g_free (local_in); g_free (local_in6); if (info) { - freeaddrinfo (info); + mono_free_address_info (info); } return TRUE; } @@ -2933,8 +2274,8 @@ addrinfo_to_IPHostEntry(struct addrinfo *info, MonoString **h_name, g_free (local_in6); } - for (count=0, ai=info; ai!=NULL; ai=ai->ai_next) { - if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) + for (count = 0, ai = info->entries; ai != NULL; ai = ai->next) { + if (ai->family != AF_INET && ai->family != AF_INET6) continue; count++; @@ -2942,22 +2283,17 @@ addrinfo_to_IPHostEntry(struct addrinfo *info, MonoString **h_name, *h_addr_list=mono_array_new(domain, mono_get_string_class (), count); - for (ai=info, i=0; ai!=NULL; ai=ai->ai_next) { + for (ai = info->entries, i = 0; ai != NULL; ai = ai->next) { + MonoAddress maddr; MonoString *addr_string; - const char *ret; - char buffer [48]; /* Max. size for IPv6 */ + char buffer [INET6_ADDRSTRLEN]; /* Max. size for IPv6 */ - if((ai->ai_family != PF_INET) && (ai->ai_family != PF_INET6)) { + if((ai->family != PF_INET) && (ai->family != PF_INET6)) { continue; } - if(ai->ai_family == PF_INET) { - ret = inet_ntop(ai->ai_family, (void*)&(((struct sockaddr_in*)ai->ai_addr)->sin_addr), buffer, 16); - } else { - ret = inet_ntop(ai->ai_family, (void*)&(((struct sockaddr_in6*)ai->ai_addr)->sin6_addr), buffer, 48); - } - - if(ret) { + mono_address_init (&maddr, ai->family, &ai->address); + if(mono_networking_addr_to_str (&maddr, buffer, sizeof (buffer))) { addr_string=mono_string_new(domain, buffer); } else { addr_string=mono_string_new(domain, ""); @@ -2967,8 +2303,8 @@ addrinfo_to_IPHostEntry(struct addrinfo *info, MonoString **h_name, if(!i) { i++; - if (ai->ai_canonname != NULL) { - *h_name=mono_string_new(domain, ai->ai_canonname); + if (ai->canonical_name != NULL) { + *h_name=mono_string_new(domain, ai->canonical_name); } else { *h_name=mono_string_new(domain, buffer); } @@ -2978,206 +2314,68 @@ addrinfo_to_IPHostEntry(struct addrinfo *info, MonoString **h_name, } if(info) { - freeaddrinfo(info); + mono_free_address_info (info); } return(TRUE); } -#endif -#ifdef AF_INET6 +static int +get_addrinfo_family_hint (void) +{ + switch (get_family_hint ()) { + case PF_UNSPEC: return MONO_HINT_UNSPECIFIED; + case PF_INET: return MONO_HINT_IPV4; +#ifdef PF_INET6 + case PF_INET6: return MONO_HINT_IPV6; +#endif + default: + g_error ("invalid hint"); + return 0; + } +} + MonoBoolean ves_icall_System_Net_Dns_GetHostByName_internal(MonoString *host, MonoString **h_name, MonoArray **h_aliases, MonoArray **h_addr_list) { gboolean add_local_ips = FALSE; -#ifdef HAVE_SIOCGIFCONF gchar this_hostname [256]; -#endif -#if !defined(HAVE_GETHOSTBYNAME2_R) - struct addrinfo *info = NULL, hints; + MonoAddressInfo *info = NULL; char *hostname; - MONO_ARCH_SAVE_REGS; - hostname=mono_string_to_utf8 (host); if (*hostname == '\0') { add_local_ips = TRUE; *h_name = host; } -#ifdef HAVE_SIOCGIFCONF if (!add_local_ips && gethostname (this_hostname, sizeof (this_hostname)) != -1) { if (!strcmp (hostname, this_hostname)) { add_local_ips = TRUE; *h_name = host; } } -#endif - memset(&hints, 0, sizeof(hints)); - hints.ai_family = get_family_hint (); - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_CANONNAME; - - if (*hostname && getaddrinfo(hostname, NULL, &hints, &info) == -1) { + if (*hostname && mono_get_address_info (hostname, 0, MONO_HINT_CANONICAL_NAME | get_addrinfo_family_hint (), &info)) { g_free (hostname); return(FALSE); } g_free(hostname); - return(addrinfo_to_IPHostEntry(info, h_name, h_aliases, h_addr_list, add_local_ips)); -#else - struct hostent he1,*hp1, he2, *hp2; - int buffer_size1, buffer_size2; - char *buffer1, *buffer2; - int herr; - gboolean return_value; - char *hostname; - - MONO_ARCH_SAVE_REGS; - - hostname=mono_string_to_utf8 (host); - if (*hostname == '\0') - add_local_ips = TRUE; - -#ifdef HAVE_SIOCGIFCONF - if (!add_local_ips && gethostname (this_hostname, sizeof (this_hostname)) != -1) { - if (!strcmp (hostname, this_hostname)) - add_local_ips = TRUE; - } -#endif - - buffer_size1 = 512; - buffer_size2 = 512; - buffer1 = g_malloc0(buffer_size1); - buffer2 = g_malloc0(buffer_size2); - - hp1 = NULL; - hp2 = NULL; - while (*hostname && gethostbyname2_r(hostname, AF_INET, &he1, buffer1, buffer_size1, - &hp1, &herr) == ERANGE) { - buffer_size1 *= 2; - buffer1 = g_realloc(buffer1, buffer_size1); - } - - if (*hostname && hp1 == NULL) - { - while (gethostbyname2_r(hostname, AF_INET6, &he2, buffer2, - buffer_size2, &hp2, &herr) == ERANGE) { - buffer_size2 *= 2; - buffer2 = g_realloc(buffer2, buffer_size2); - } - } - - return_value = hostent_to_IPHostEntry2(hp1, hp2, h_name, h_aliases, - h_addr_list, add_local_ips); - - g_free(buffer1); - g_free(buffer2); - g_free(hostname); - - return(return_value); -#endif /* HAVE_GETHOSTBYNAME2_R */ + return (addrinfo_to_IPHostEntry(info, h_name, h_aliases, h_addr_list, add_local_ips)); } -#else /* AF_INET6 */ -MonoBoolean ves_icall_System_Net_Dns_GetHostByName_internal(MonoString *host, MonoString **h_name, MonoArray **h_aliases, MonoArray **h_addr_list) -{ - struct hostent *he; - char *hostname; - gboolean add_local_ips = FALSE; -#ifdef HAVE_SIOCGIFCONF - gchar this_hostname [256]; -#endif - - MONO_ARCH_SAVE_REGS; - - hostname=mono_string_to_utf8(host); - if (*hostname == '\0') - add_local_ips = TRUE; -#ifdef HAVE_SIOCGIFCONF - if (!add_local_ips && gethostname (this_hostname, sizeof (this_hostname)) != -1) { - if (!strcmp (hostname, this_hostname)) - add_local_ips = TRUE; - } -#endif - -#ifndef HOST_WIN32 - he = NULL; - if (*hostname) - he = _wapi_gethostbyname (hostname); -#else - he = _wapi_gethostbyname (hostname); -#endif - - if (*hostname && he==NULL) { - g_free (hostname); - return(FALSE); - } - - g_free (hostname); - - return(hostent_to_IPHostEntry(he, h_name, h_aliases, h_addr_list, add_local_ips)); -} -#endif /* AF_INET6 */ - -#ifndef HAVE_INET_PTON -static int -inet_pton (int family, const char *address, void *inaddrp) -{ - if (family == AF_INET) { -#ifdef HAVE_INET_ATON - struct in_addr inaddr; - - if (!inet_aton (address, &inaddr)) - return 0; - - memcpy (inaddrp, &inaddr, sizeof (struct in_addr)); - return 1; -#else - /* assume the system has inet_addr(), if it doesn't - have that we're pretty much screwed... */ - guint32 inaddr; - - if (!strcmp (address, "255.255.255.255")) { - /* special-case hack */ - inaddr = 0xffffffff; - } else { - inaddr = inet_addr (address); -#ifndef INADDR_NONE -#define INADDR_NONE ((in_addr_t) -1) -#endif - if (inaddr == INADDR_NONE) - return 0; - } - - memcpy (inaddrp, &inaddr, sizeof (guint32)); - return 1; -#endif /* HAVE_INET_ATON */ - } - - return -1; -} -#endif /* !HAVE_INET_PTON */ extern MonoBoolean ves_icall_System_Net_Dns_GetHostByAddr_internal(MonoString *addr, MonoString **h_name, MonoArray **h_aliases, MonoArray **h_addr_list) { char *address; - -#ifdef AF_INET6 struct sockaddr_in saddr; struct sockaddr_in6 saddr6; - struct addrinfo *info = NULL, hints; + MonoAddressInfo *info = NULL; gint32 family; char hostname[NI_MAXHOST] = {0}; int flags = 0; -#else - struct in_addr inaddr; - struct hostent *he; - gboolean ret; -#endif address = mono_string_to_utf8 (addr); -#ifdef AF_INET6 if (inet_pton (AF_INET, address, &saddr.sin_addr ) <= 0) { /* Maybe an ipv6 address */ if (inet_pton (AF_INET6, address, &saddr6.sin6_addr) <= 0) { @@ -3215,32 +2413,10 @@ extern MonoBoolean ves_icall_System_Net_Dns_GetHostByAddr_internal(MonoString *a } } - memset (&hints, 0, sizeof(hints)); - hints.ai_family = get_family_hint (); - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_CANONNAME | AI_ADDRCONFIG; - - if( getaddrinfo (hostname, NULL, &hints, &info) == -1 ) { - return(FALSE); - } + if (mono_get_address_info (hostname, 0, get_addrinfo_family_hint () | MONO_HINT_CANONICAL_NAME | MONO_HINT_CONFIGURED_ONLY, &info)) + return FALSE; return(addrinfo_to_IPHostEntry (info, h_name, h_aliases, h_addr_list, FALSE)); -#else - if (inet_pton (AF_INET, address, &inaddr) <= 0) { - g_free (address); - return(FALSE); - } - - if ((he = gethostbyaddr ((char *) &inaddr, sizeof (inaddr), AF_INET)) == NULL) { - ret = ipaddr_to_IPHostEntry (address, h_name, h_aliases, h_addr_list); - } else { - ret = hostent_to_IPHostEntry (he, h_name, h_aliases, - h_addr_list, FALSE); - } - - g_free (address); - return(ret); -#endif } extern MonoBoolean ves_icall_System_Net_Dns_GetHostName_internal(MonoString **h_name) @@ -3248,8 +2424,6 @@ extern MonoBoolean ves_icall_System_Net_Dns_GetHostName_internal(MonoString **h_ gchar hostname[256]; int ret; - MONO_ARCH_SAVE_REGS; - ret = gethostname (hostname, sizeof (hostname)); if(ret==-1) { return(FALSE); @@ -3267,8 +2441,6 @@ ves_icall_System_Net_Sockets_Socket_SendFile (SOCKET sock, MonoString *filename, gint32 error; TRANSMIT_FILE_BUFFERS buffers; - MONO_ARCH_SAVE_REGS; - if (filename == NULL) return FALSE; @@ -3299,22 +2471,13 @@ ves_icall_System_Net_Sockets_Socket_SendFile (SOCKET sock, MonoString *filename, void mono_network_init(void) { - WSADATA wsadata; - int err; - - err=WSAStartup(MAKEWORD(2,0), &wsadata); - if(err!=0) { - g_error("%s: Couldn't initialise networking", __func__); - exit(-1); - } - - LOGDEBUG (g_message("%s: Using socket library: %s", __func__, wsadata.szDescription)); - LOGDEBUG (g_message("%s: Socket system status: %s", __func__, wsadata.szSystemStatus)); + mono_networking_init (); } void mono_network_cleanup(void) { - WSACleanup(); + _wapi_cleanup_networking (); + mono_networking_shutdown (); } void diff --git a/mta-mono/vendor/mono/metadata/string-icalls.c b/mta-mono/vendor/mono/metadata/string-icalls.c index 9c95f04..cc9234a 100644 --- a/mta-mono/vendor/mono/metadata/string-icalls.c +++ b/mta-mono/vendor/mono/metadata/string-icalls.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include "mono/utils/mono-membar.h" #include @@ -44,19 +43,18 @@ MonoString * ves_icall_System_String_InternalIntern (MonoString *str) { MonoString *res; - MONO_ARCH_SAVE_REGS; res = mono_string_intern(str); - if (!res) - mono_raise_exception (mono_domain_get ()->out_of_memory_ex); + if (!res) { + mono_set_pending_exception (mono_domain_get ()->out_of_memory_ex); + return NULL; + } return res; } MonoString * ves_icall_System_String_InternalIsInterned (MonoString *str) { - MONO_ARCH_SAVE_REGS; - return mono_string_is_interned(str); } @@ -65,7 +63,7 @@ ves_icall_System_String_GetLOSLimit (void) { int limit = mono_gc_get_los_limit (); - return (limit - 2 - sizeof (MonoString)) / 2; + return (limit - 2 - G_STRUCT_OFFSET (MonoString, chars)) / 2; } void diff --git a/mta-mono/vendor/mono/metadata/sysmath.c b/mta-mono/vendor/mono/metadata/sysmath.c index c5943b4..de24fcb 100644 --- a/mta-mono/vendor/mono/metadata/sysmath.c +++ b/mta-mono/vendor/mono/metadata/sysmath.c @@ -38,13 +38,12 @@ static __huge_val_t __huge_val = { __HUGE_VAL_bytes }; gdouble ves_icall_System_Math_Floor (gdouble x) { - MONO_ARCH_SAVE_REGS; return floor(x); } gdouble ves_icall_System_Math_Round (gdouble x) { double int_part, dec_part; - MONO_ARCH_SAVE_REGS; + int_part = floor(x); dec_part = x - int_part; if (((dec_part == 0.5) && @@ -61,7 +60,6 @@ gdouble ves_icall_System_Math_Round2 (gdouble value, gint32 digits, gboolean awa #endif double p; - MONO_ARCH_SAVE_REGS; if (value == HUGE_VAL) return HUGE_VAL; if (value == -HUGE_VAL) @@ -95,56 +93,42 @@ gdouble ves_icall_System_Math_Round2 (gdouble value, gint32 digits, gboolean awa gdouble ves_icall_System_Math_Sin (gdouble x) { - MONO_ARCH_SAVE_REGS; - return sin (x); } gdouble ves_icall_System_Math_Cos (gdouble x) { - MONO_ARCH_SAVE_REGS; - return cos (x); } gdouble ves_icall_System_Math_Tan (gdouble x) { - MONO_ARCH_SAVE_REGS; - return tan (x); } gdouble ves_icall_System_Math_Sinh (gdouble x) { - MONO_ARCH_SAVE_REGS; - return sinh (x); } gdouble ves_icall_System_Math_Cosh (gdouble x) { - MONO_ARCH_SAVE_REGS; - return cosh (x); } gdouble ves_icall_System_Math_Tanh (gdouble x) { - MONO_ARCH_SAVE_REGS; - return tanh (x); } gdouble ves_icall_System_Math_Acos (gdouble x) { - MONO_ARCH_SAVE_REGS; - if (x < -1 || x > 1) return NAN; @@ -154,8 +138,6 @@ ves_icall_System_Math_Acos (gdouble x) gdouble ves_icall_System_Math_Asin (gdouble x) { - MONO_ARCH_SAVE_REGS; - if (x < -1 || x > 1) return NAN; @@ -165,8 +147,6 @@ ves_icall_System_Math_Asin (gdouble x) gdouble ves_icall_System_Math_Atan (gdouble x) { - MONO_ARCH_SAVE_REGS; - return atan (x); } @@ -174,7 +154,6 @@ gdouble ves_icall_System_Math_Atan2 (gdouble y, gdouble x) { double result; - MONO_ARCH_SAVE_REGS; if ((y == HUGE_VAL && x == HUGE_VAL) || (y == HUGE_VAL && x == -HUGE_VAL) || @@ -189,16 +168,12 @@ ves_icall_System_Math_Atan2 (gdouble y, gdouble x) gdouble ves_icall_System_Math_Exp (gdouble x) { - MONO_ARCH_SAVE_REGS; - return exp (x); } gdouble ves_icall_System_Math_Log (gdouble x) { - MONO_ARCH_SAVE_REGS; - if (x == 0) return -HUGE_VAL; else if (x < 0) @@ -210,8 +185,6 @@ ves_icall_System_Math_Log (gdouble x) gdouble ves_icall_System_Math_Log10 (gdouble x) { - MONO_ARCH_SAVE_REGS; - if (x == 0) return -HUGE_VAL; else if (x < 0) @@ -224,7 +197,6 @@ gdouble ves_icall_System_Math_Pow (gdouble x, gdouble y) { double result; - MONO_ARCH_SAVE_REGS; if (isnan(x) || isnan(y)) { return NAN; @@ -259,8 +231,6 @@ ves_icall_System_Math_Pow (gdouble x, gdouble y) gdouble ves_icall_System_Math_Sqrt (gdouble x) { - MONO_ARCH_SAVE_REGS; - if (x < 0) return NAN; diff --git a/mta-mono/vendor/mono/metadata/threadpool-internals.h b/mta-mono/vendor/mono/metadata/threadpool-internals.h index 165445c..847a070 100644 --- a/mta-mono/vendor/mono/metadata/threadpool-internals.h +++ b/mta-mono/vendor/mono/metadata/threadpool-internals.h @@ -3,10 +3,35 @@ #include #include +#include +#include #include +#include + +typedef struct { + mono_mutex_t io_lock; /* access to sock_to_state */ + int inited; // 0 -> not initialized , 1->initializing, 2->initialized, 3->cleaned up + MonoGHashTable *sock_to_state; + + gint event_system; + gpointer event_data; + void (*modify) (gpointer p, int fd, int operation, int events, gboolean is_new); + void (*wait) (gpointer sock_data); + void (*shutdown) (gpointer event_data); +} SocketIOData; void mono_thread_pool_remove_socket (int sock) MONO_INTERNAL; gboolean mono_thread_pool_is_queue_array (MonoArray *o) MONO_INTERNAL; void mono_internal_thread_unhandled_exception (MonoObject* exc) MONO_INTERNAL; +//TP implementations +gpointer tp_poll_init (SocketIOData *data) MONO_INTERNAL; + +//TP internals the impls use +void check_for_interruption_critical (void) MONO_INTERNAL; +void socket_io_cleanup (SocketIOData *data) MONO_INTERNAL; +MonoObject *get_io_event (MonoMList **list, gint event) MONO_INTERNAL; +int get_events_from_list (MonoMList *list) MONO_INTERNAL; +void threadpool_append_async_io_jobs (MonoObject **jobs, gint njobs) MONO_INTERNAL; + #endif diff --git a/mta-mono/vendor/mono/metadata/threadpool.c b/mta-mono/vendor/mono/metadata/threadpool.c index 36514cc..a66b453 100644 --- a/mta-mono/vendor/mono/metadata/threadpool.c +++ b/mta-mono/vendor/mono/metadata/threadpool.c @@ -83,18 +83,6 @@ enum { MONITOR_STATE_SLEEPING }; -typedef struct { - mono_mutex_t io_lock; /* access to sock_to_state */ - int inited; // 0 -> not initialized , 1->initializing, 2->initialized, 3->cleaned up - MonoGHashTable *sock_to_state; - - gint event_system; - gpointer event_data; - void (*modify) (gpointer p, int fd, int operation, int events, gboolean is_new); - void (*wait) (gpointer sock_data); - void (*shutdown) (gpointer event_data); -} SocketIOData; - static SocketIOData socket_io_data; /* Keep in sync with the System.MonoAsyncCall class which provides GC tracking */ @@ -148,11 +136,7 @@ static void threadpool_kill_idle_threads (ThreadPool *tp); static gboolean threadpool_start_thread (ThreadPool *tp); static void threadpool_kill_thread (ThreadPool *tp); static void monitor_thread (gpointer data); -static void socket_io_cleanup (SocketIOData *data); -static MonoObject *get_io_event (MonoMList **list, gint event); -static int get_events_from_list (MonoMList *list); static int get_event_from_state (MonoSocketAsyncResult *state); -static void check_for_interruption_critical (void); static MonoClass *async_call_klass; static MonoClass *socket_async_call_klass; @@ -196,7 +180,7 @@ enum { AIO_OP_LAST }; -#include +// #include #ifdef HAVE_EPOLL #include #elif defined(USE_KQUEUE_FOR_THREADPOOL) @@ -300,7 +284,10 @@ is_sdp_asyncreadhandler (MonoDomain *domain, MonoClass *klass) #ifdef DISABLE_SOCKETS -#define socket_io_cleanup(x) +void +socket_io_cleanup (SocketIOData *data) +{ +} static int get_event_from_state (MonoSocketAsyncResult *state) @@ -309,7 +296,7 @@ get_event_from_state (MonoSocketAsyncResult *state) return -1; } -static int +int get_events_from_list (MonoMList *list) { return 0; @@ -317,7 +304,7 @@ get_events_from_list (MonoMList *list) #else -static void +void socket_io_cleanup (SocketIOData *data) { mono_mutex_lock (&data->io_lock); @@ -355,7 +342,7 @@ get_event_from_state (MonoSocketAsyncResult *state) } } -static int +int get_events_from_list (MonoMList *list) { MonoSocketAsyncResult *state; @@ -404,7 +391,7 @@ threadpool_jobs_dec (MonoObject *obj) return FALSE; } -static MonoObject * +MonoObject * get_io_event (MonoMList **list, gint event) { MonoObject *state; @@ -1195,9 +1182,11 @@ threadpool_start_thread (ThreadPool *tp) #ifndef DISABLE_PERFCOUNTERS mono_perfcounter_update_value (tp->pc_nthreads, TRUE, 1); #endif - thread = mono_thread_create_internal (mono_get_root_domain (), tp->async_invoke, tp, TRUE, stack_size); - if (!tp->is_io) { + if (tp->is_io) { + thread = mono_thread_create_internal (mono_get_root_domain (), tp->async_invoke, tp, TRUE, stack_size); + } else { mono_mutex_lock (&threads_lock); + thread = mono_thread_create_internal (mono_get_root_domain (), tp->async_invoke, tp, TRUE, stack_size); g_assert (threads != NULL); g_ptr_array_add (threads, thread); mono_mutex_unlock (&threads_lock); @@ -1235,6 +1224,12 @@ threadpool_append_job (ThreadPool *tp, MonoObject *ar) threadpool_append_jobs (tp, &ar, 1); } +void +threadpool_append_async_io_jobs (MonoObject **jobs, gint njobs) +{ + threadpool_append_jobs (&async_io_tp, jobs, njobs); +} + static void threadpool_append_jobs (ThreadPool *tp, MonoObject **jobs, gint njobs) { @@ -1527,7 +1522,7 @@ clear_thread_state (void) ves_icall_System_Threading_Thread_SetState (thread, ThreadState_Background); } -static void +void check_for_interruption_critical (void) { MonoInternalThread *thread; diff --git a/mta-mono/vendor/mono/metadata/threads-types.h b/mta-mono/vendor/mono/metadata/threads-types.h index 860bb5b..0e96e80 100644 --- a/mta-mono/vendor/mono/metadata/threads-types.h +++ b/mta-mono/vendor/mono/metadata/threads-types.h @@ -40,6 +40,14 @@ typedef enum { ThreadApartmentState_Unknown = 0x00000002 } MonoThreadApartmentState; +typedef enum { + ThreadPriority_Lowest = 0, + ThreadPriority_BelowNormal = 1, + ThreadPriority_Normal = 2, + ThreadPriority_AboveNormal = 3, + ThreadPriority_Highest = 4 +} MonoThreadPriority; + #define SPECIAL_STATIC_NONE 0 #define SPECIAL_STATIC_THREAD 1 #define SPECIAL_STATIC_CONTEXT 2 @@ -68,6 +76,8 @@ gint32 ves_icall_System_Threading_Thread_GetDomainID (void) MONO_INTERNAL; gboolean ves_icall_System_Threading_Thread_Yield (void) MONO_INTERNAL; MonoString* ves_icall_System_Threading_Thread_GetName_internal (MonoInternalThread *this_obj) MONO_INTERNAL; void ves_icall_System_Threading_Thread_SetName_internal (MonoInternalThread *this_obj, MonoString *name) MONO_INTERNAL; +int ves_icall_System_Threading_Thread_GetPriority (MonoInternalThread *thread) MONO_INTERNAL; +void ves_icall_System_Threading_Thread_SetPriority (MonoInternalThread *thread, int priority) MONO_INTERNAL; MonoObject* ves_icall_System_Threading_Thread_GetCachedCurrentCulture (MonoInternalThread *this_obj) MONO_INTERNAL; void ves_icall_System_Threading_Thread_SetCachedCurrentCulture (MonoThread *this_obj, MonoObject *culture) MONO_INTERNAL; MonoObject* ves_icall_System_Threading_Thread_GetCachedCurrentUICulture (MonoInternalThread *this_obj) MONO_INTERNAL; @@ -105,6 +115,7 @@ gfloat ves_icall_System_Threading_Interlocked_Exchange_Single(gfloat *location, gdouble ves_icall_System_Threading_Interlocked_Exchange_Double(gdouble *location, gdouble value) MONO_INTERNAL; gint32 ves_icall_System_Threading_Interlocked_CompareExchange_Int(gint32 *location, gint32 value, gint32 comparand) MONO_INTERNAL; +gint32 ves_icall_System_Threading_Interlocked_CompareExchange_Int_Success(gint32 *location, gint32 value, gint32 comparand, MonoBoolean *success) MONO_INTERNAL; gint64 ves_icall_System_Threading_Interlocked_CompareExchange_Long(gint64 *location, gint64 value, gint64 comparand) MONO_INTERNAL; MonoObject *ves_icall_System_Threading_Interlocked_CompareExchange_Object(MonoObject **location, MonoObject *value, MonoObject *comparand) MONO_INTERNAL; gpointer ves_icall_System_Threading_Interlocked_CompareExchange_IntPtr(gpointer *location, gpointer value, gpointer comparand) MONO_INTERNAL; @@ -227,7 +238,8 @@ void mono_threads_clear_cached_culture (MonoDomain *domain) MONO_INTERNAL; MonoException* mono_thread_request_interruption (mono_bool running_managed) MONO_INTERNAL; gboolean mono_thread_interruption_requested (void) MONO_INTERNAL; -void mono_thread_interruption_checkpoint (void) MONO_INTERNAL; +MonoException* mono_thread_interruption_checkpoint (void) MONO_INTERNAL; +MonoException* mono_thread_force_interruption_checkpoint_noraise (void) MONO_INTERNAL; void mono_thread_force_interruption_checkpoint (void) MONO_INTERNAL; gint32* mono_thread_interruption_request_flag (void) MONO_INTERNAL; diff --git a/mta-mono/vendor/mono/metadata/threads.c b/mta-mono/vendor/mono/metadata/threads.c index 36a847d..21a4dab 100644 --- a/mta-mono/vendor/mono/metadata/threads.c +++ b/mta-mono/vendor/mono/metadata/threads.c @@ -14,7 +14,6 @@ #include #include -#include #include #include @@ -44,7 +43,11 @@ #include -#if defined(PLATFORM_ANDROID) && !defined(TARGET_ARM64) +#ifdef HAVE_SIGNAL_H +#include +#endif + +#if defined(PLATFORM_ANDROID) && !defined(TARGET_ARM64) && !defined(TARGET_AMD64) #define USE_TKILL_ON_ANDROID 1 #endif @@ -583,14 +586,12 @@ static guint32 WINAPI start_wrapper_internal(void *data) info = mono_thread_info_current (); g_assert (info); internal->thread_info = info; - + internal->small_id = info->small_id; tid=internal->tid; SET_CURRENT_OBJECT (internal); - mono_monitor_init_tls (); - /* Every thread references the appdomain which created it */ mono_thread_push_appdomain_ref (domain); @@ -924,6 +925,7 @@ mono_thread_attach_full (MonoDomain *domain, gboolean force_attach) info = mono_thread_info_current (); g_assert (info); thread->thread_info = info; + thread->small_id = info->small_id; current_thread = new_thread_with_internal (domain, thread); @@ -938,8 +940,6 @@ mono_thread_attach_full (MonoDomain *domain, gboolean force_attach) SET_CURRENT_OBJECT (thread); mono_domain_set (domain, TRUE); - mono_monitor_init_tls (); - thread_adjust_static_data (thread); init_root_domain_thread (thread, current_thread); @@ -1056,7 +1056,7 @@ ves_icall_System_Threading_Thread_Thread_internal (MonoThread *this, if ((internal->state & ThreadState_Unstarted) == 0) { UNLOCK_THREAD (internal); - mono_raise_exception (mono_get_exception_thread_state ("Thread has already been started.")); + mono_set_pending_exception (mono_get_exception_thread_state ("Thread has already been started.")); return NULL; } @@ -1116,7 +1116,8 @@ ves_icall_System_Threading_InternalThread_Thread_free_internal (MonoInternalThre } } -void ves_icall_System_Threading_Thread_Sleep_internal(gint32 ms) +void +ves_icall_System_Threading_Thread_Sleep_internal(gint32 ms) { guint32 res; MonoInternalThread *thread = mono_thread_internal_current (); @@ -1250,6 +1251,17 @@ ves_icall_System_Threading_Thread_SetName_internal (MonoInternalThread *this_obj mono_thread_set_name_internal (this_obj, name, TRUE); } +int +ves_icall_System_Threading_Thread_GetPriority (MonoInternalThread *thread) +{ + return ThreadPriority_Lowest; +} + +void +ves_icall_System_Threading_Thread_SetPriority (MonoInternalThread *thread, int priority) +{ +} + /* If the array is already in the requested domain, we just return it, otherwise we return a copy in that domain. */ static MonoArray* @@ -1305,8 +1317,9 @@ mono_thread_internal_current (void) return res; } -gboolean ves_icall_System_Threading_Thread_Join_internal(MonoInternalThread *this, - int ms, HANDLE thread) +gboolean +ves_icall_System_Threading_Thread_Join_internal(MonoInternalThread *this, + int ms, HANDLE thread) { MonoInternalThread *cur_thread = mono_thread_internal_current (); gboolean ret; @@ -1318,7 +1331,7 @@ gboolean ves_icall_System_Threading_Thread_Join_internal(MonoInternalThread *thi if ((this->state & ThreadState_Unstarted) != 0) { UNLOCK_THREAD (this); - mono_raise_exception (mono_get_exception_thread_state ("Thread has not been started.")); + mono_set_pending_exception (mono_get_exception_thread_state ("Thread has not been started.")); return FALSE; } @@ -1760,6 +1773,13 @@ gint32 ves_icall_System_Threading_Interlocked_CompareExchange_Int(gint32 *locati return InterlockedCompareExchange(location, value, comparand); } +gint32 ves_icall_System_Threading_Interlocked_CompareExchange_Int_Success(gint32 *location, gint32 value, gint32 comparand, MonoBoolean *success) +{ + gint32 r = InterlockedCompareExchange(location, value, comparand); + *success = r == comparand; + return r; +} + MonoObject * ves_icall_System_Threading_Interlocked_CompareExchange_Object (MonoObject **location, MonoObject *value, MonoObject *comparand) { MonoObject *res; @@ -1969,7 +1989,7 @@ void mono_thread_current_check_pending_interrupt () int mono_thread_get_abort_signal (void) { -#ifdef HOST_WIN32 +#if defined (HOST_WIN32) || !defined (HAVE_SIGACTION) return -1; #elif defined(PLATFORM_ANDROID) return SIGUNUSED; @@ -2107,7 +2127,8 @@ ves_icall_System_Threading_Thread_ResetAbort (void) if (!was_aborting) { const char *msg = "Unable to reset abort because no abort was requested"; - mono_raise_exception (mono_get_exception_thread_state (msg)); + mono_set_pending_exception (mono_get_exception_thread_state (msg)); + return; } thread->abort_exc = NULL; if (thread->abort_state_handle) { @@ -2161,7 +2182,8 @@ ves_icall_System_Threading_Thread_GetAbortExceptionState (MonoThread *this) MonoException *invalid_op_exc = mono_get_exception_invalid_operation ("Thread.ExceptionState cannot access an ExceptionState from a different AppDomain"); if (exc) MONO_OBJECT_SETREF (invalid_op_exc, inner_ex, exc); - mono_raise_exception (invalid_op_exc); + mono_set_pending_exception (invalid_op_exc); + return NULL; } return deserialized; @@ -2199,8 +2221,10 @@ mono_thread_suspend (MonoInternalThread *thread) void ves_icall_System_Threading_Thread_Suspend (MonoInternalThread *thread) { - if (!mono_thread_suspend (thread)) - mono_raise_exception (mono_get_exception_thread_state ("Thread has not been started, or is dead.")); + if (!mono_thread_suspend (thread)) { + mono_set_pending_exception (mono_get_exception_thread_state ("Thread has not been started, or is dead.")); + return; + } } static gboolean @@ -2229,8 +2253,10 @@ mono_thread_resume (MonoInternalThread *thread) void ves_icall_System_Threading_Thread_Resume (MonoThread *thread) { - if (!thread->internal_thread || !mono_thread_resume (thread->internal_thread)) - mono_raise_exception (mono_get_exception_thread_state ("Thread has not been started, or is dead.")); + if (!thread->internal_thread || !mono_thread_resume (thread->internal_thread)) { + mono_set_pending_exception (mono_get_exception_thread_state ("Thread has not been started, or is dead.")); + return; + } } static gboolean @@ -3996,13 +4022,13 @@ mono_thread_alloc_tls (MonoReflectionType *type) return tls_offset; } -void -mono_thread_destroy_tls (uint32_t tls_offset) +static void +destroy_tls (MonoDomain *domain, uint32_t tls_offset) { MonoTlsDataRecord *prev = NULL; MonoTlsDataRecord *cur; guint32 size = 0; - MonoDomain *domain = mono_domain_get (); + mono_domain_lock (domain); cur = domain->tlsrec_list; while (cur) { @@ -4023,6 +4049,12 @@ mono_thread_destroy_tls (uint32_t tls_offset) mono_special_static_data_free_slot (tls_offset, size); } +void +mono_thread_destroy_tls (uint32_t tls_offset) +{ + destroy_tls (mono_domain_get (), tls_offset); +} + /* * This is just to ensure cleanup: the finalizers should have taken care, so this is not perf-critical. */ @@ -4030,7 +4062,7 @@ void mono_thread_destroy_domain_tls (MonoDomain *domain) { while (domain->tlsrec_list) - mono_thread_destroy_tls (domain->tlsrec_list->tls_offset); + destroy_tls (domain, domain->tlsrec_list->tls_offset); } static MonoClassField *local_slots = NULL; @@ -4109,7 +4141,8 @@ static void CALLBACK dummy_apc (ULONG_PTR param) * Performs the operation that the requested thread state requires (abort, * suspend or stop) */ -static MonoException* mono_thread_execute_interruption (MonoInternalThread *thread) +static MonoException* +mono_thread_execute_interruption (MonoInternalThread *thread) { LOCK_THREAD (thread); @@ -4260,35 +4293,56 @@ gboolean mono_thread_interruption_requested () return FALSE; } -static void mono_thread_interruption_checkpoint_request (gboolean bypass_abort_protection) +static MonoException* +mono_thread_interruption_checkpoint_request (gboolean bypass_abort_protection) { MonoInternalThread *thread = mono_thread_internal_current (); /* The thread may already be stopping */ if (thread == NULL) - return; + return NULL; if (thread->interruption_requested && (bypass_abort_protection || !is_running_protected_wrapper ())) { MonoException* exc = mono_thread_execute_interruption (thread); - if (exc) mono_raise_exception (exc); + if (exc) + return exc; } + return NULL; } /* * Performs the interruption of the current thread, if one has been requested, * and the thread is not running a protected wrapper. + * Return the exception which needs to be thrown, if any. */ -void mono_thread_interruption_checkpoint () +MonoException* +mono_thread_interruption_checkpoint (void) { - mono_thread_interruption_checkpoint_request (FALSE); + return mono_thread_interruption_checkpoint_request (FALSE); } /* * Performs the interruption of the current thread, if one has been requested. + * Return the exception which needs to be thrown, if any. */ -void mono_thread_force_interruption_checkpoint () +MonoException* +mono_thread_force_interruption_checkpoint_noraise (void) { - mono_thread_interruption_checkpoint_request (TRUE); + return mono_thread_interruption_checkpoint_request (TRUE); +} + +/* + * Performs the interruption of the current thread, if one has been requested. + * Throw the exception which needs to be thrown, if any. + */ +void +mono_thread_force_interruption_checkpoint (void) +{ + MonoException *ex; + + ex = mono_thread_interruption_checkpoint_request (TRUE); + if (ex) + mono_raise_exception (ex); } /* @@ -4475,7 +4529,7 @@ mono_thread_kill (MonoInternalThread *thread, int signal) /* Workaround pthread_kill abort() in NaCl glibc. */ return -1; #endif -#ifdef HOST_WIN32 +#if defined (HOST_WIN32) || !defined (HAVE_SIGACTION) /* Win32 uses QueueUserAPC and callers of this are guarded */ g_assert_not_reached (); #else diff --git a/mta-mono/vendor/mono/metadata/tpool-poll.c b/mta-mono/vendor/mono/metadata/tpool-poll.c index aa1077b..61254e0 100644 --- a/mta-mono/vendor/mono/metadata/tpool-poll.c +++ b/mta-mono/vendor/mono/metadata/tpool-poll.c @@ -8,6 +8,15 @@ * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com) * Copyright 2004-2011 Novell, Inc (http://www.novell.com) */ +#include +#include +#include + +#include +#include +#include +#include +#include #define INIT_POLLFD(a, b, c) {(a)->fd = b; (a)->events = c; (a)->revents = 0;} struct _tp_poll_data { @@ -22,7 +31,7 @@ static void tp_poll_shutdown (gpointer event_data); static void tp_poll_modify (gpointer p, int fd, int operation, int events, gboolean is_new); static void tp_poll_wait (gpointer p); -static gpointer +gpointer tp_poll_init (SocketIOData *data) { tp_poll_data *result; @@ -315,7 +324,7 @@ tp_poll_wait (gpointer p) } } mono_mutex_unlock (&socket_io_data->io_lock); - threadpool_append_jobs (&async_io_tp, (MonoObject **) async_results.data, nresults); + threadpool_append_async_io_jobs ((MonoObject **) async_results.data, nresults); mono_ptr_array_clear (async_results); } } diff --git a/mta-mono/vendor/mono/metadata/verify.c b/mta-mono/vendor/mono/metadata/verify.c index 95bde8e..cad7c83 100644 --- a/mta-mono/vendor/mono/metadata/verify.c +++ b/mta-mono/vendor/mono/metadata/verify.c @@ -26,10 +26,10 @@ #include #include #include +#include #include #include #include -#include #include static MiniVerifierMode verifier_mode = MONO_VERIFIER_MODE_OFF; @@ -934,6 +934,7 @@ mono_method_is_valid_in_context (VerifyContext *ctx, MonoMethod *method) static MonoClassField* verifier_load_field (VerifyContext *ctx, int token, MonoClass **out_klass, const char *opcode) { + MonoError error; MonoClassField *field; MonoClass *klass = NULL; @@ -946,12 +947,12 @@ verifier_load_field (VerifyContext *ctx, int token, MonoClass **out_klass, const return NULL; } - field = mono_field_from_token (ctx->image, token, &klass, ctx->generic_context); + field = mono_field_from_token_checked (ctx->image, token, &klass, ctx->generic_context, &error); + mono_error_cleanup (&error); /*FIXME don't swallow the error */ } - if (!field || !field->parent || !klass || mono_loader_get_last_error ()) { + if (!field || !field->parent || !klass) { ADD_VERIFY_ERROR2 (ctx, g_strdup_printf ("Cannot load field from token 0x%08x for %s at 0x%04x", token, opcode, ctx->ip_offset), MONO_EXCEPTION_BAD_IMAGE); - mono_loader_clear_error (); return NULL; } @@ -973,20 +974,22 @@ static MonoMethod* verifier_load_method (VerifyContext *ctx, int token, const char *opcode) { MonoMethod* method; + if (ctx->method->wrapper_type != MONO_WRAPPER_NONE) { method = mono_method_get_wrapper_data (ctx->method, (guint32)token); } else { + MonoError error; if (!IS_METHOD_DEF_OR_REF_OR_SPEC (token) || !token_bounds_check (ctx->image, token)) { ADD_VERIFY_ERROR2 (ctx, g_strdup_printf ("Invalid method token 0x%08x for %s at 0x%04x", token, opcode, ctx->ip_offset), MONO_EXCEPTION_BAD_IMAGE); return NULL; } - method = mono_get_method_full (ctx->image, token, NULL, ctx->generic_context); + method = mono_get_method_checked (ctx->image, token, NULL, ctx->generic_context, &error); + mono_error_cleanup (&error); /* FIXME don't swallow this error */ } - if (!method || mono_loader_get_last_error ()) { + if (!method) { ADD_VERIFY_ERROR2 (ctx, g_strdup_printf ("Cannot load method from token 0x%08x for %s at 0x%04x", token, opcode, ctx->ip_offset), MONO_EXCEPTION_BAD_IMAGE); - mono_loader_clear_error (); return NULL; } @@ -2982,6 +2985,12 @@ stack_slot_is_complex_type_not_reference_type (ILStackDesc *slot) return stack_slot_get_type (slot) == TYPE_COMPLEX && !MONO_TYPE_IS_REFERENCE (slot->type) && !stack_slot_is_boxed_value (slot); } +static gboolean +stack_slot_is_reference_value (ILStackDesc *slot) +{ + return stack_slot_get_type (slot) == TYPE_COMPLEX && (MONO_TYPE_IS_REFERENCE (slot->type) || stack_slot_is_boxed_value (slot)); +} + static void do_branch_op (VerifyContext *ctx, signed int delta, const unsigned char table [TYPE_MAX][TYPE_MAX]) { @@ -3055,7 +3064,8 @@ do_cmp_op (VerifyContext *ctx, const unsigned char table [TYPE_MAX][TYPE_MAX], g a = stack_pop (ctx); if (opcode == CEE_CGT_UN) { - if (stack_slot_get_type (a) == TYPE_COMPLEX && stack_slot_get_type (b) == TYPE_COMPLEX) { + if ((stack_slot_is_reference_value (a) && stack_slot_is_null_literal (b)) || + (stack_slot_is_reference_value (b) && stack_slot_is_null_literal (a))) { stack_push_val (ctx, TYPE_I4, &mono_defaults.int32_class->byval_arg); return; } @@ -3078,7 +3088,11 @@ do_cmp_op (VerifyContext *ctx, const unsigned char table [TYPE_MAX][TYPE_MAX], g } if(res == TYPE_INV) { - CODE_NOT_VERIFIABLE (ctx, g_strdup_printf("Compare instruction applyed to ill formed stack (%s x %s) at 0x%04x", stack_slot_get_name (a), stack_slot_get_name (b), ctx->ip_offset)); + char *left_type = stack_slot_full_name (a); + char *right_type = stack_slot_full_name (b); + CODE_NOT_VERIFIABLE (ctx, g_strdup_printf("Compare instruction applyed to ill formed stack (%s x %s) at 0x%04x", left_type, right_type, ctx->ip_offset)); + g_free (left_type); + g_free (right_type); } else if (res & NON_VERIFIABLE_RESULT) { CODE_NOT_VERIFIABLE (ctx, g_strdup_printf ("Compare instruction is not verifiable (%s x %s) at 0x%04x", stack_slot_get_name (a), stack_slot_get_name (b), ctx->ip_offset)); res = res & ~NON_VERIFIABLE_RESULT; @@ -3126,6 +3140,7 @@ do_ret (VerifyContext *ctx) static void do_invoke_method (VerifyContext *ctx, int method_token, gboolean virtual) { + MonoError error; int param_count, i; MonoMethodSignature *sig; ILStackDesc *value; @@ -3155,12 +3170,15 @@ do_invoke_method (VerifyContext *ctx, int method_token, gboolean virtual) } } - if (!(sig = mono_method_get_signature_full (method, ctx->image, method_token, ctx->generic_context))) - sig = mono_method_get_signature (method, ctx->image, method_token); + if (!(sig = mono_method_get_signature_checked (method, ctx->image, method_token, ctx->generic_context, &error))) { + mono_error_cleanup (&error); + sig = mono_method_get_signature_checked (method, ctx->image, method_token, NULL, &error); + } if (!sig) { char *name = mono_type_get_full_name (method->klass); - ADD_VERIFY_ERROR (ctx, g_strdup_printf ("Could not resolve signature of %s:%s at 0x%04x", name, method->name, ctx->ip_offset)); + ADD_VERIFY_ERROR (ctx, g_strdup_printf ("Could not resolve signature of %s:%s at 0x%04x due to: %s", name, method->name, ctx->ip_offset, mono_error_get_message (&error))); + mono_error_cleanup (&error); g_free (name); return; } @@ -3591,6 +3609,7 @@ do_conversion (VerifyContext *ctx, int kind) static void do_load_token (VerifyContext *ctx, int token) { + MonoError error; gpointer handle; MonoClass *handle_class; if (!check_overflow (ctx)) @@ -3620,11 +3639,12 @@ do_load_token (VerifyContext *ctx, int token) return; } - handle = mono_ldtoken (ctx->image, token, &handle_class, ctx->generic_context); + handle = mono_ldtoken_checked (ctx->image, token, &handle_class, ctx->generic_context, &error); } if (!handle) { - ADD_VERIFY_ERROR (ctx, g_strdup_printf ("Invalid token 0x%x for ldtoken at 0x%04x", token, ctx->ip_offset)); + ADD_VERIFY_ERROR (ctx, g_strdup_printf ("Invalid token 0x%x for ldtoken at 0x%04x due to %s", token, ctx->ip_offset, mono_error_get_message (&error))); + mono_error_cleanup (&error); return; } if (handle_class == mono_defaults.typehandle_class) { diff --git a/mta-mono/vendor/mono/mini/Makefile.am.in b/mta-mono/vendor/mono/mini/Makefile.am.in index 7abebc1..4dee163 100644 --- a/mta-mono/vendor/mono/mini/Makefile.am.in +++ b/mta-mono/vendor/mono/mini/Makefile.am.in @@ -51,7 +51,7 @@ AM_CFLAGS = \ -I$(top_srcdir) \ $(GLIB_CFLAGS) \ $(LLVM_CFLAGS) \ - $(PLATFORM_CFLAGS) $(ARCH_CFLAGS) + $(PLATFORM_CFLAGS) $(ARCH_CFLAGS) $(SHARED_CFLAGS) AM_CXXFLAGS = $(LLVM_CXXFLAGS) $(GLIB_CFLAGS) @@ -156,7 +156,7 @@ endif if LOADED_LLVM lib_LTLIBRARIES += libmono-llvm.la libmono_llvm_la_SOURCES = mini-llvm.c mini-llvm-cpp.cpp -libmono_llvm_la_LIBADD = $(LLVM_LIBS) $(LLVM_LDFLAGS) +libmono_llvm_la_LIBADD = $(GLIB_LIBS) $(LLVM_LIBS) $(LLVM_LDFLAGS) if PLATFORM_DARWIN libmono_llvm_la_LDFLAGS=-Wl,-undefined -Wl,suppress -Wl,-flat_namespace else @@ -286,6 +286,7 @@ endif genmdesc_SOURCES = \ mini.h \ + seq-points.h \ genmdesc.c \ helpers.c \ ../metadata/opcodes.c @@ -372,6 +373,8 @@ endif common_sources = \ mini.c \ + seq-points.c \ + seq-points.h \ ir-emit.h \ method-to-ir.c \ decompose.c \ @@ -469,6 +472,7 @@ if AMD64 arch_sources = $(amd64_sources) arch_built=cpu-amd64.h arch_define=__x86_64__ +ARCH_FULLAOT_EXCLUDE=--exclude DYNCALL --exclude GSHAREDVT endif if POWERPC @@ -548,12 +552,12 @@ libmini_la_CFLAGS = $(mono_CFLAGS) libmonoboehm_2_0_la_SOURCES = libmonoboehm_2_0_la_CFLAGS = $(mono_boehm_CFLAGS) -libmonoboehm_2_0_la_LIBADD = libmini.la $(libs) $(LIBMONO_DTRACE_OBJECT) +libmonoboehm_2_0_la_LIBADD = libmini.la $(libs) $(LIBMONO_DTRACE_OBJECT) $(LLVMMONOF) libmonoboehm_2_0_la_LDFLAGS = $(libmonoldflags) libmonosgen_2_0_la_SOURCES = libmonosgen_2_0_la_CFLAGS = $(mono_sgen_CFLAGS) -libmonosgen_2_0_la_LIBADD = libmini.la $(sgen_libs) $(LIBMONO_DTRACE_OBJECT) +libmonosgen_2_0_la_LIBADD = libmini.la $(sgen_libs) $(LIBMONO_DTRACE_OBJECT) $(LLVMMONOF) libmonosgen_2_0_la_LDFLAGS = $(libmonoldflags) # @@ -657,9 +661,16 @@ rcheck: mono $(regtests) if NACL_CODEGEN for i in $(regtests); do echo "running test $$i"; $(RUNTIME) $$i --exclude 'NaClDisable' || exit 1; done else - $(RUNTIME) --regression $(regtests) + -($(RUNTIME) --regression $(regtests); echo $$? > regressionexitcode.out) | ./emitnunit.pl + exit $$(cat regressionexitcode.out) endif +check-seq-points: mono $(regtests) + rm -f TestResults_op_il_seq_point.xml + for i in $(regtests); do ./test_op_il_seq_point.sh $$i || (./test_op_il_seq_point_headerfooter.sh; exit 1) || exit 1; done + for i in $(regtests); do ./test_op_il_seq_point.sh $$i --aot || (./test_op_il_seq_point_headerfooter.sh; exit 1) || exit 1; done + ./test_op_il_seq_point_headerfooter.sh + gctest: mono gc-test.exe MONO_DEBUG_OPTIONS=clear-nursery-at-gc $(RUNTIME) --regression gc-test.exe @@ -688,7 +699,7 @@ fullaotcheck: mono $(fullaot_regtests) cp $(fullaot_regtests) fullaot-tmp/ MONO_PATH=fullaot-tmp $(top_builddir)/runtime/mono-wrapper $(LLVM_AOT_RUNTIME_OPTS) $(GSHAREDVT_RUNTIME_OPTS) --aot=full fullaot-tmp/* || exit 1 ln -s $$PWD/mono fullaot-tmp/ - for i in $(fullaot_regtests); do echo $$i; MONO_PATH=fullaot-tmp $(top_builddir)/runtime/mono-wrapper --full-aot fullaot-tmp/$$i --exclude '!FULLAOT' || exit 1; done + for i in $(fullaot_regtests); do echo $$i; MONO_PATH=fullaot-tmp $(top_builddir)/runtime/mono-wrapper --full-aot fullaot-tmp/$$i --exclude '!FULLAOT' $(ARCH_FULLAOT_EXCLUDE) || exit 1; done llvmfullaotcheck: $(MAKE) fullaotcheck LLVM=1 @@ -717,10 +728,10 @@ stat3: mono bench.exe docu: mini.sgm docbook2txt mini.sgm -check-local: rcheck +check-local: rcheck check-seq-points clean-local: - rm -f mono a.out gmon.out *.o buildver-boehm.h buildver-sgen.h test.exe + rm -f mono a.out gmon.out *.o buildver-boehm.h buildver-sgen.h test.exe regressionexitcode.out TestResults_op_il_seq_point.xml* pkgconfigdir = $(libdir)/pkgconfig @@ -742,6 +753,8 @@ EXTRA_DIST = TestDriver.cs ldscript ldscript.mono \ $(windows_sources) \ $(darwin_sources) Info.plist \ $(posix_sources) \ + test_op_il_seq_point.sh \ + test_op_il_seq_point_headerfooter.sh \ Makefile.am.in version.h: Makefile diff --git a/mta-mono/vendor/mono/mini/TestDriver.cs b/mta-mono/vendor/mono/mini/TestDriver.cs index 97f5520..c779920 100644 --- a/mta-mono/vendor/mono/mini/TestDriver.cs +++ b/mta-mono/vendor/mono/mini/TestDriver.cs @@ -23,6 +23,7 @@ public class TestDriver { MethodInfo[] methods; bool do_timings = false; bool verbose = false; + bool quiet = false; int tms = 0; DateTime start, end = DateTime.Now; @@ -33,13 +34,18 @@ public class TestDriver { if (args != null && args.Length > 0) { for (j = 0; j < args.Length;) { if (args [j] == "--time") { - do_timings = true; + do_timings = !quiet; j ++; } else if (args [j] == "--iter") { iterations = Int32.Parse (args [j + 1]); j += 2; } else if ((args [j] == "-v") || (args [j] == "--verbose")) { - verbose = true; + verbose = !quiet; + j += 1; + } else if ((args [j] == "-q") || (args [j] == "--quiet")) { + quiet = true; + verbose = false; + do_timings = false; j += 1; } else if (args [j] == "--exclude") { exclude [args [j + 1]] = args [j + 1]; @@ -107,13 +113,15 @@ public class TestDriver { } } - if (do_timings) { - Console.WriteLine ("Total ms: {0}", tms); + if (!quiet) { + if (do_timings) { + Console.WriteLine ("Total ms: {0}", tms); + } + if (nskipped > 0) + Console.WriteLine ("Regression tests: {0} ran, {1} skipped, {2} failed in {3}", ran, nskipped, failed, type); + else + Console.WriteLine ("Regression tests: {0} ran, {1} failed in {2}", ran, failed, type); } - if (nskipped > 0) - Console.WriteLine ("Regression tests: {0} ran, {1} skipped, {2} failed in {3}", ran, nskipped, failed, type); - else - Console.WriteLine ("Regression tests: {0} ran, {1} failed in {2}", ran, failed, type); } //Console.WriteLine ("Regression tests: {0} ran, {1} failed in [{2}]{3}", ran, failed, type.Assembly.GetName().Name, type); diff --git a/mta-mono/vendor/mono/mini/aot-compiler.c b/mta-mono/vendor/mono/mini/aot-compiler.c index bb3b34a..5185f3d 100644 --- a/mta-mono/vendor/mono/mini/aot-compiler.c +++ b/mta-mono/vendor/mono/mini/aot-compiler.c @@ -10,17 +10,6 @@ * Copyright 2011 Xamarin Inc (http://www.xamarin.com) */ -/* Remaining AOT-only work: - * - optimize the trampolines, generate more code in the arch files. - * - make things more consistent with how elf works, for example, use ELF - * relocations. - * Remaining generics sharing work: - * - optimize the size of the data which is encoded. - * - optimize the runtime loading of data: - * - the trampoline code calls mono_jit_info_table_find () to find the rgctx, - * which loads the debugging+exception handling info for the method. This is a - * huge waste of time and code, since the rgctx structure is currently empty. - */ #include "config.h" #include #ifdef HAVE_UNISTD_H @@ -42,7 +31,6 @@ #include #include - #include #include #include @@ -62,8 +50,10 @@ #include #include #include +#include #include "mini.h" +#include "seq-points.h" #include "image-writer.h" #include "dwarfwriter.h" #include "mini-gc.h" @@ -82,18 +72,6 @@ #define TV_GETTIME(tv) tv = mono_100ns_ticks () #define TV_ELAPSED(start,end) (((end) - (start)) / 10) -#ifdef TARGET_WIN32 -#define SHARED_EXT ".dll" -#elif defined(__ppc__) && defined(TARGET_MACH) -#define SHARED_EXT ".dylib" -#elif defined(TARGET_MACH) && defined(TARGET_X86) && !defined(__native_client_codegen__) -#define SHARED_EXT ".dylib" -#elif defined(TARGET_MACH) && defined(TARGET_AMD64) && !defined(__native_client_codegen__) -#define SHARED_EXT ".dylib" -#else -#define SHARED_EXT ".so" -#endif - #define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1)) #define ALIGN_PTR_TO(ptr,align) (gpointer)((((gssize)(ptr)) + (align - 1)) & (~(align - 1))) #define ROUND_DOWN(VALUE,SIZE) ((VALUE) & ~((SIZE) - 1)) @@ -116,6 +94,7 @@ static ReadOnlyValue *readonly_values; typedef struct MonoAotOptions { char *outfile; + char *llvm_outfile; gboolean save_temps; gboolean write_symbols; gboolean metadata_only; @@ -146,11 +125,13 @@ typedef struct MonoAotOptions { gboolean print_skipped_methods; gboolean stats; char *tool_prefix; + char *ld_flags; gboolean autoreg; char *mtriple; char *llvm_path; char *instances_logfile_path; char *logfile; + gboolean dump_json; } MonoAotOptions; typedef struct MonoAotStats { @@ -163,6 +144,12 @@ typedef struct MonoAotStats { int jit_time, gen_time, link_time; } MonoAotStats; +typedef struct GotInfo { + GHashTable *patch_to_got_offset; + GHashTable **patch_to_got_offset_by_type; + GPtrArray *got_patches; +} GotInfo; + typedef struct MonoAotCompile { MonoImage *image; GPtrArray *methods; @@ -172,9 +159,10 @@ typedef struct MonoAotCompile { int cfgs_size; GHashTable **patch_to_plt_entry; GHashTable *plt_offset_to_entry; - GHashTable *patch_to_got_offset; - GHashTable **patch_to_got_offset_by_type; - GPtrArray *got_patches; + //GHashTable *patch_to_got_offset; + //GHashTable **patch_to_got_offset_by_type; + //GPtrArray *got_patches; + GotInfo got_info, llvm_got_info; GHashTable *image_hash; GHashTable *method_to_cfg; GHashTable *token_info_hash; @@ -189,8 +177,7 @@ typedef struct MonoAotCompile { /* Maps MonoMethod* -> blob offset */ GHashTable *method_blob_hash; guint32 *plt_got_info_offsets; - guint32 got_offset, plt_offset, plt_got_offset_base; - guint32 final_got_size; + guint32 got_offset, llvm_got_offset, plt_offset, plt_got_offset_base; /* Number of GOT entries reserved for trampolines */ guint32 num_trampoline_got_entries; guint32 tramp_page_size; @@ -211,24 +198,34 @@ typedef struct MonoAotCompile { mono_mutex_t mutex; gboolean use_bin_writer; gboolean gas_line_numbers; + /* Whenever to emit LLVM code into a separate object file */ + gboolean llvm_separate; + /* Whenever to emit an object file directly from llc */ + gboolean llvm_owriter; MonoImageWriter *w; MonoDwarfWriter *dwarf; FILE *fp; char *tmpbasename; char *tmpfname; + char *llvm_sfile; + char *llvm_ofile; GSList *cie_program; GHashTable *unwind_info_offsets; GPtrArray *unwind_ops; guint32 unwind_info_offset; char *got_symbol_base; + char *llvm_got_symbol_base; char *got_symbol; + char *llvm_got_symbol; char *plt_symbol; char *methods_symbol; + char *llvm_eh_frame_symbol; GHashTable *method_label_hash; const char *temp_prefix; const char *user_symbol_prefix; const char *llvm_label_prefix; const char *inst_directive; + int align_pad_value; guint32 label_generator; gboolean llvm; MonoAotFileFlags flags; @@ -242,7 +239,6 @@ typedef struct MonoAotCompile { GHashTable *ginst_hash; GHashTable *dwarf_ln_filenames; gboolean global_symbols; - gboolean direct_method_addresses; int objc_selector_index, objc_selector_index_2; GPtrArray *objc_selectors; GHashTable *objc_selector_to_index; @@ -389,9 +385,39 @@ emit_line (MonoAotCompile *acfg) } static inline void -emit_alignment (MonoAotCompile *acfg, int size) +emit_alignment (MonoAotCompile *acfg, int size) { - img_writer_emit_alignment (acfg->w, size); + img_writer_emit_alignment (acfg->w, size); +} + +static inline void +emit_alignment_code (MonoAotCompile *acfg, int size) +{ + if (acfg->align_pad_value) + img_writer_emit_alignment_fill (acfg->w, size, acfg->align_pad_value); + else + img_writer_emit_alignment (acfg->w, size); +} + +static inline void +emit_padding (MonoAotCompile *acfg, int size) +{ + int i; + guint8 buf [16]; + + if (acfg->align_pad_value) { + for (i = 0; i < 16; ++i) + buf [i] = acfg->align_pad_value; + } else { + memset (buf, 0, sizeof (buf)); + } + + for (i = 0; i < size; i += 16) { + if (size - i < 16) + emit_bytes (acfg, buf, size - i); + else + emit_bytes (acfg, buf, 16); + } } static inline void @@ -615,7 +641,7 @@ emit_code_bytes (MonoAotCompile *acfg, const guint8* buf, int size) /* ARCHITECTURE SPECIFIC CODE */ -#if defined(TARGET_X86) || defined(TARGET_AMD64) || defined(TARGET_ARM) || defined(TARGET_POWERPC) +#if defined(TARGET_X86) || defined(TARGET_AMD64) || defined(TARGET_ARM) || defined(TARGET_POWERPC) || defined(TARGET_ARM64) #define EMIT_DWARF_INFO 1 #endif @@ -708,6 +734,8 @@ arch_init (MonoAotCompile *acfg) #if defined(TARGET_AMD64) g_string_append (acfg->llc_args, " -march=x86-64 -mattr=sse4.1"); + /* NOP */ + acfg->align_pad_value = 0x90; #endif #ifdef TARGET_ARM @@ -747,7 +775,6 @@ arch_init (MonoAotCompile *acfg) #endif #ifdef MONOTOUCH - acfg->direct_method_addresses = TRUE; acfg->global_symbols = TRUE; #endif } @@ -770,7 +797,7 @@ arch_emit_direct_call (MonoAotCompile *acfg, const char *target, gboolean extern { #if defined(TARGET_X86) || defined(TARGET_AMD64) /* Need to make sure this is exactly 5 bytes long */ - if (external && !acfg->use_bin_writer) { + if (!acfg->use_bin_writer) { emit_unset_mode (acfg); fprintf (acfg->fp, "call %s\n", target); } else { @@ -896,26 +923,46 @@ arch_emit_got_offset (MonoAotCompile *acfg, guint8 *code, int *code_size) static void arch_emit_got_access (MonoAotCompile *acfg, guint8 *code, int got_slot, int *code_size) { - /* Emit beginning of instruction */ - emit_bytes (acfg, code, mono_arch_get_patch_offset (code)); + /* This needs to emit the same code as OP_AOTCONST */ - /* Emit the offset */ #ifdef TARGET_AMD64 - emit_symbol_diff (acfg, acfg->got_symbol, ".", (unsigned int) ((got_slot * sizeof (gpointer)) - 4)); - *code_size = mono_arch_get_patch_offset (code) + 4; + /* mov reg, got+offset(%rip) */ + if (acfg->llvm_separate) { + /* The GOT symbol is in the LLVM module, the clang assembler has problems emitting symbol diffs for it */ + int dreg; + int rex_r; + + /* Decode reg, see amd64_mov_reg_membase () */ + rex_r = code [0] & AMD64_REX_R; + g_assert (code [0] == 0x49 + rex_r); + g_assert (code [1] == 0x8b); + dreg = ((code [2] >> 3) & 0x7) + (rex_r ? 8 : 0); + + emit_unset_mode (acfg); + fprintf (acfg->fp, "mov %s+%d(%%rip), %s\n", acfg->got_symbol, (unsigned int) ((got_slot * sizeof (gpointer))), mono_arch_regname (dreg)); + *code_size = 7; + } else { + emit_bytes (acfg, code, mono_arch_get_patch_offset (code)); + emit_symbol_diff (acfg, acfg->got_symbol, ".", (unsigned int) ((got_slot * sizeof (gpointer)) - 4)); + *code_size = mono_arch_get_patch_offset (code) + 4; + } #elif defined(TARGET_X86) + emit_bytes (acfg, code, mono_arch_get_patch_offset (code)); emit_int32 (acfg, (unsigned int) ((got_slot * sizeof (gpointer)))); *code_size = mono_arch_get_patch_offset (code) + 4; #elif defined(TARGET_ARM) + emit_bytes (acfg, code, mono_arch_get_patch_offset (code)); emit_symbol_diff (acfg, acfg->got_symbol, ".", (unsigned int) ((got_slot * sizeof (gpointer))) - 12); *code_size = mono_arch_get_patch_offset (code) + 4; #elif defined(TARGET_ARM64) + emit_bytes (acfg, code, mono_arch_get_patch_offset (code)); arm64_emit_got_access (acfg, code, got_slot, code_size); #elif defined(TARGET_POWERPC) { guint8 buf [32]; guint8 *code; + emit_bytes (acfg, code, mono_arch_get_patch_offset (code)); code = buf; ppc_load32 (code, ppc_r0, got_slot * sizeof (gpointer)); g_assert (code - buf == 8); @@ -994,15 +1041,14 @@ arch_emit_plt_entry (MonoAotCompile *acfg, int index) #endif /*__native_client_codegen__*/ #elif defined(TARGET_AMD64) #if defined(__default_codegen__) - /* - * We can't emit jumps because they are 32 bits only so they can't be patched. - * So we make indirect calls through GOT entries which are patched by the AOT - * loader to point to .Lpd entries. - */ - /* jmpq *(%rip) */ - emit_byte (acfg, '\xff'); - emit_byte (acfg, '\x25'); - emit_symbol_diff (acfg, acfg->got_symbol, ".", ((acfg->plt_got_offset_base + index) * sizeof (gpointer)) -4); + if (acfg->use_bin_writer) { + emit_byte (acfg, '\xff'); + emit_byte (acfg, '\x25'); + emit_symbol_diff (acfg, acfg->got_symbol, ".", ((acfg->plt_got_offset_base + index) * sizeof (gpointer)) -4); + } else { + emit_unset_mode (acfg); + fprintf (acfg->fp, "jmp *%s+%d(%%rip)\n", acfg->got_symbol, (int)((acfg->plt_got_offset_base + index) * sizeof (gpointer))); + } /* Used by mono_aot_get_plt_info_offset */ emit_int32 (acfg, acfg->plt_got_info_offsets [index]); acfg->stats.plt_size += 10; @@ -1274,6 +1320,11 @@ arch_emit_specific_trampoline_pages (MonoAotCompile *acfg) g_assert (code - buf == 8); emit_bytes (acfg, buf, code - buf); } + + acfg->tramp_page_code_offsets [MONO_AOT_TRAMP_SPECIFIC] = 16; + acfg->tramp_page_code_offsets [MONO_AOT_TRAMP_STATIC_RGCTX] = 16; + acfg->tramp_page_code_offsets [MONO_AOT_TRAMP_IMT_THUNK] = 72; + acfg->tramp_page_code_offsets [MONO_AOT_TRAMP_GSHAREDVT_ARG] = 16; #elif defined(TARGET_ARM64) arm64_emit_specific_trampoline_pages (acfg); #endif @@ -1303,16 +1354,20 @@ arch_emit_specific_trampoline (MonoAotCompile *acfg, int offset, int *tramp_size */ #if defined(TARGET_AMD64) #if defined(__default_codegen__) - /* This should be exactly 16 bytes long */ - *tramp_size = 16; + /* This should be exactly 8 bytes long */ + *tramp_size = 8; /* call *(%rip) */ - emit_byte (acfg, '\x41'); - emit_byte (acfg, '\xff'); - emit_byte (acfg, '\x15'); - emit_symbol_diff (acfg, acfg->got_symbol, ".", (offset * sizeof (gpointer)) - 4); - /* This should be relative to the start of the trampoline */ - emit_symbol_diff (acfg, acfg->got_symbol, ".", ((offset+1) * sizeof (gpointer)) + 7); - emit_zero_bytes (acfg, 5); + if (acfg->llvm_separate) { + emit_unset_mode (acfg); + fprintf (acfg->fp, "call *%s+%d(%%rip)\n", acfg->got_symbol, (int)(offset * sizeof (gpointer))); + emit_zero_bytes (acfg, 2); + } else { + emit_byte (acfg, '\x41'); + emit_byte (acfg, '\xff'); + emit_byte (acfg, '\x15'); + emit_symbol_diff (acfg, acfg->got_symbol, ".", (offset * sizeof (gpointer)) - 4); + emit_zero_bytes (acfg, 1); + } #elif defined(__native_client_codegen__) guint8 buf [256]; guint8 *buf_aligned = ALIGN_TO(buf, kNaClAlignment); @@ -1442,6 +1497,9 @@ arch_emit_specific_trampoline (MonoAotCompile *acfg, int offset, int *tramp_size /* We clobber ECX, since EAX is used as MONO_ARCH_MONITOR_OBJECT_REG */ #ifdef MONO_ARCH_MONITOR_OBJECT_REG g_assert (MONO_ARCH_MONITOR_OBJECT_REG != X86_ECX); +#ifdef MONO_ARCH_MONITOR_LOCK_TAKEN_REG + g_assert (MONO_ARCH_MONITOR_LOCK_TAKEN_REG != X86_ECX); +#endif #endif code = buf; @@ -1490,8 +1548,13 @@ arch_emit_unbox_trampoline (MonoAotCompile *acfg, MonoCompile *cfg, MonoMethod * emit_bytes (acfg, buf, code - buf); /* jump */ - emit_byte (acfg, '\xe9'); - emit_symbol_diff (acfg, call_target, ".", -4); + if (acfg->llvm_separate) { + emit_unset_mode (acfg); + fprintf (acfg->fp, "jmp %s\n", call_target); + } else { + emit_byte (acfg, '\xe9'); + emit_symbol_diff (acfg, call_target, ".", -4); + } #elif defined(TARGET_X86) guint8 buf [32]; guint8 *code; @@ -1571,16 +1634,22 @@ arch_emit_static_rgctx_trampoline (MonoAotCompile *acfg, int offset, int *tramp_ /* This should be exactly 13 bytes long */ *tramp_size = 13; - /* mov (%rip), %r10 */ - emit_byte (acfg, '\x4d'); - emit_byte (acfg, '\x8b'); - emit_byte (acfg, '\x15'); - emit_symbol_diff (acfg, acfg->got_symbol, ".", (offset * sizeof (gpointer)) - 4); + if (acfg->llvm_separate) { + emit_unset_mode (acfg); + fprintf (acfg->fp, "mov %s+%d(%%rip), %%r10\n", acfg->got_symbol, (int)(offset * sizeof (gpointer))); + fprintf (acfg->fp, "jmp *%s+%d(%%rip)\n", acfg->got_symbol, (int)((offset + 1) * sizeof (gpointer))); + } else { + /* mov (%rip), %r10 */ + emit_byte (acfg, '\x4d'); + emit_byte (acfg, '\x8b'); + emit_byte (acfg, '\x15'); + emit_symbol_diff (acfg, acfg->got_symbol, ".", (offset * sizeof (gpointer)) - 4); - /* jmp *(%rip) */ - emit_byte (acfg, '\xff'); - emit_byte (acfg, '\x25'); - emit_symbol_diff (acfg, acfg->got_symbol, ".", ((offset + 1) * sizeof (gpointer)) - 4); + /* jmp *(%rip) */ + emit_byte (acfg, '\xff'); + emit_byte (acfg, '\x25'); + emit_symbol_diff (acfg, acfg->got_symbol, ".", ((offset + 1) * sizeof (gpointer)) - 4); + } #elif defined(__native_client_codegen__) guint8 buf [128]; guint8 *buf_aligned = ALIGN_TO(buf, kNaClAlignment); @@ -1740,6 +1809,11 @@ arch_emit_imt_thunk (MonoAotCompile *acfg, int offset, int *tramp_size) /* MONO_ARCH_IMT_SCRATCH_REG is a free register */ + if (acfg->llvm_separate) { + emit_unset_mode (acfg); + fprintf (acfg->fp, "mov %s+%d(%%rip), %s\n", acfg->got_symbol, (int)(offset * sizeof (gpointer)), mono_arch_regname (MONO_ARCH_IMT_SCRATCH_REG)); + } + labels [0] = code; amd64_alu_membase_imm (code, X86_CMP, MONO_ARCH_IMT_SCRATCH_REG, 0, 0); labels [1] = code; @@ -1774,15 +1848,16 @@ arch_emit_imt_thunk (MonoAotCompile *acfg, int offset, int *tramp_size) mono_amd64_patch (labels [3], code); x86_breakpoint (code); - /* mov (%rip), MONO_ARCH_IMT_SCRATCH_REG */ - amd64_emit_rex (mov_buf_ptr, sizeof(gpointer), MONO_ARCH_IMT_SCRATCH_REG, 0, AMD64_RIP); - *(mov_buf_ptr)++ = (unsigned char)0x8b; /* mov opcode */ - x86_address_byte (mov_buf_ptr, 0, MONO_ARCH_IMT_SCRATCH_REG & 0x7, 5); - emit_bytes (acfg, mov_buf, mov_buf_ptr - mov_buf); - emit_symbol_diff (acfg, acfg->got_symbol, ".", (offset * sizeof (gpointer)) - 4); - + if (!acfg->llvm_separate) { + /* mov (%rip), MONO_ARCH_IMT_SCRATCH_REG */ + amd64_emit_rex (mov_buf_ptr, sizeof(gpointer), MONO_ARCH_IMT_SCRATCH_REG, 0, AMD64_RIP); + *(mov_buf_ptr)++ = (unsigned char)0x8b; /* mov opcode */ + x86_address_byte (mov_buf_ptr, 0, MONO_ARCH_IMT_SCRATCH_REG & 0x7, 5); + emit_bytes (acfg, mov_buf, mov_buf_ptr - mov_buf); + emit_symbol_diff (acfg, acfg->got_symbol, ".", (offset * sizeof (gpointer)) - 4); + } emit_bytes (acfg, buf, code - buf); - + *tramp_size = code - buf + kSizeOfMove; #if defined(__native_client_codegen__) /* The tramp will be padded to the next kNaClAlignment bundle. */ @@ -1941,14 +2016,14 @@ arch_emit_imt_thunk (MonoAotCompile *acfg, int offset, int *tramp_size) code = buf; /* Load the mscorlib got address */ - ppc_ldptr (code, ppc_r11, sizeof (gpointer), ppc_r30); + ppc_ldptr (code, ppc_r12, sizeof (gpointer), ppc_r30); /* Load the parameter from the GOT */ ppc_load (code, ppc_r0, offset * sizeof (gpointer)); - ppc_ldptr_indexed (code, ppc_r11, ppc_r11, ppc_r0); + ppc_ldptr_indexed (code, ppc_r12, ppc_r12, ppc_r0); /* Load and check key */ labels [1] = code; - ppc_ldptr (code, ppc_r0, 0, ppc_r11); + ppc_ldptr (code, ppc_r0, 0, ppc_r12); ppc_cmp (code, 0, sizeof (gpointer) == 8 ? 1 : 0, ppc_r0, MONO_ARCH_IMT_REG); labels [2] = code; ppc_bc (code, PPC_BR_TRUE, PPC_BR_EQ, 0); @@ -1959,18 +2034,18 @@ arch_emit_imt_thunk (MonoAotCompile *acfg, int offset, int *tramp_size) ppc_bc (code, PPC_BR_TRUE, PPC_BR_EQ, 0); /* Loop footer */ - ppc_addi (code, ppc_r11, ppc_r11, 2 * sizeof (gpointer)); + ppc_addi (code, ppc_r12, ppc_r12, 2 * sizeof (gpointer)); labels [4] = code; ppc_b (code, 0); mono_ppc_patch (labels [4], labels [1]); /* Match */ mono_ppc_patch (labels [2], code); - ppc_ldptr (code, ppc_r11, sizeof (gpointer), ppc_r11); - /* r11 now contains the value of the vtable slot */ + ppc_ldptr (code, ppc_r12, sizeof (gpointer), ppc_r12); + /* r12 now contains the value of the vtable slot */ /* this is not a function descriptor on ppc64 */ - ppc_ldptr (code, ppc_r11, 0, ppc_r11); - ppc_mtctr (code, ppc_r11); + ppc_ldptr (code, ppc_r12, 0, ppc_r12); + ppc_mtctr (code, ppc_r12); ppc_bcctr (code, PPC_BR_ALWAYS, 0); /* Fail */ @@ -2978,6 +3053,7 @@ is_plt_patch (MonoJumpInfo *patch_info) case MONO_PATCH_INFO_RGCTX_FETCH: case MONO_PATCH_INFO_GENERIC_CLASS_INIT: case MONO_PATCH_INFO_MONITOR_ENTER: + case MONO_PATCH_INFO_MONITOR_ENTER_V4: case MONO_PATCH_INFO_MONITOR_EXIT: case MONO_PATCH_INFO_LLVM_IMT_TRAMPOLINE: return TRUE; @@ -3022,7 +3098,6 @@ get_plt_entry (MonoAotCompile *acfg, MonoJumpInfo *patch_info) acfg->patch_to_plt_entry [patch_info->type] = g_hash_table_new (mono_patch_info_hash, mono_patch_info_equal); res = g_hash_table_lookup (acfg->patch_to_plt_entry [patch_info->type], patch_info); - // FIXME: This breaks the calculation of final_got_size if (!acfg->llvm && patch_info->type == MONO_PATCH_INFO_METHOD && (patch_info->data.method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED)) { /* * Allocate a separate PLT slot for each such patch, since some plt @@ -3035,8 +3110,6 @@ get_plt_entry (MonoAotCompile *acfg, MonoJumpInfo *patch_info) if (!res) { MonoJumpInfo *new_ji; - g_assert (!acfg->final_got_size); - new_ji = mono_patch_info_dup_mp (acfg->mempool, patch_info); res = mono_mempool_alloc0 (acfg->mempool, sizeof (MonoPltEntry)); @@ -3071,26 +3144,29 @@ get_plt_entry (MonoAotCompile *acfg, MonoJumpInfo *patch_info) * JI could be found if it exists, otherwise allocates a new one. */ static guint32 -get_got_offset (MonoAotCompile *acfg, MonoJumpInfo *ji) +get_got_offset (MonoAotCompile *acfg, gboolean llvm, MonoJumpInfo *ji) { guint32 got_offset; + GotInfo *info = llvm ? &acfg->llvm_got_info : &acfg->got_info; - got_offset = GPOINTER_TO_UINT (g_hash_table_lookup (acfg->patch_to_got_offset_by_type [ji->type], ji)); + got_offset = GPOINTER_TO_UINT (g_hash_table_lookup (info->patch_to_got_offset_by_type [ji->type], ji)); if (got_offset) return got_offset - 1; - got_offset = acfg->got_offset; - acfg->got_offset ++; - - if (acfg->final_got_size) - g_assert (got_offset < acfg->final_got_size); + if (llvm) { + got_offset = acfg->llvm_got_offset; + acfg->llvm_got_offset ++; + } else { + got_offset = acfg->got_offset; + acfg->got_offset ++; + } acfg->stats.got_slots ++; acfg->stats.got_slot_types [ji->type] ++; - g_hash_table_insert (acfg->patch_to_got_offset, ji, GUINT_TO_POINTER (got_offset + 1)); - g_hash_table_insert (acfg->patch_to_got_offset_by_type [ji->type], ji, GUINT_TO_POINTER (got_offset + 1)); - g_ptr_array_add (acfg->got_patches, ji); + g_hash_table_insert (info->patch_to_got_offset, ji, GUINT_TO_POINTER (got_offset + 1)); + g_hash_table_insert (info->patch_to_got_offset_by_type [ji->type], ji, GUINT_TO_POINTER (got_offset + 1)); + g_ptr_array_add (info->got_patches, ji); return got_offset; } @@ -3384,8 +3460,6 @@ add_wrappers (MonoAotCompile *acfg) } if (strcmp (acfg->image->assembly->aname.name, "mscorlib") == 0) { - MonoMethodDesc *desc; - MonoMethod *orig_method; int nallocators; /* Runtime invoke wrappers */ @@ -3462,25 +3536,6 @@ add_wrappers (MonoAotCompile *acfg) if (m) add_method (acfg, m); } - - /* Monitor Enter/Exit */ - desc = mono_method_desc_new ("Monitor:Enter(object,bool&)", FALSE); - orig_method = mono_method_desc_search_in_class (desc, mono_defaults.monitor_class); - /* This is a v4 method */ - if (orig_method) { - method = mono_monitor_get_fast_path (orig_method); - if (method) - add_method (acfg, method); - } - mono_method_desc_free (desc); - - desc = mono_method_desc_new ("Monitor:Exit(object)", FALSE); - orig_method = mono_method_desc_search_in_class (desc, mono_defaults.monitor_class); - g_assert (orig_method); - mono_method_desc_free (desc); - method = mono_monitor_get_fast_path (orig_method); - if (method) - add_method (acfg, method); } /* Stelemref wrappers */ @@ -3499,22 +3554,6 @@ add_wrappers (MonoAotCompile *acfg) /* isinst_with_check wrapper */ add_method (acfg, mono_marshal_get_isinst_with_cache ()); -#if defined(MONO_ARCH_ENABLE_MONITOR_IL_FASTPATH) - { - MonoMethodDesc *desc; - MonoMethod *m; - - desc = mono_method_desc_new ("Monitor:Enter(object,bool&)", FALSE); - m = mono_method_desc_search_in_class (desc, mono_defaults.monitor_class); - mono_method_desc_free (desc); - if (m) { - m = mono_monitor_get_fast_path (m); - if (m) - add_method (acfg, m); - } - } -#endif - /* JIT icall wrappers */ /* FIXME: locking - this is "safe" as full-AOT threads don't mutate the icall hash*/ g_hash_table_foreach (mono_get_jit_icall_info (), add_jit_icall_wrapper, acfg); @@ -3587,6 +3626,7 @@ add_wrappers (MonoAotCompile *acfg) add_method (acfg, mono_marshal_get_native_func_wrapper_aot (klass)); } } else if ((acfg->opts & MONO_OPT_GSHAREDVT) && klass->generic_container) { + MonoError error; MonoGenericContext ctx; MonoMethod *inst, *gshared; @@ -3597,7 +3637,8 @@ add_wrappers (MonoAotCompile *acfg) method = mono_get_delegate_invoke (klass); create_gsharedvt_inst (acfg, method, &ctx); - inst = mono_class_inflate_generic_method (method, &ctx); + inst = mono_class_inflate_generic_method_checked (method, &ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ m = mono_marshal_get_delegate_invoke (inst, NULL); g_assert (m->is_inflated); @@ -3609,7 +3650,8 @@ add_wrappers (MonoAotCompile *acfg) method = mono_get_delegate_begin_invoke (klass); create_gsharedvt_inst (acfg, method, &ctx); - inst = mono_class_inflate_generic_method (method, &ctx); + inst = mono_class_inflate_generic_method_checked (method, &ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ m = mono_marshal_get_delegate_begin_invoke (inst); g_assert (m->is_inflated); @@ -3621,7 +3663,8 @@ add_wrappers (MonoAotCompile *acfg) method = mono_get_delegate_end_invoke (klass); create_gsharedvt_inst (acfg, method, &ctx); - inst = mono_class_inflate_generic_method (method, &ctx); + inst = mono_class_inflate_generic_method_checked (method, &ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ m = mono_marshal_get_delegate_end_invoke (inst); g_assert (m->is_inflated); @@ -3672,7 +3715,8 @@ add_wrappers (MonoAotCompile *acfg) if (method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED) { if (method->is_generic) { // FIXME: - } else if (method->klass->generic_container) { + } else if ((acfg->opts & MONO_OPT_GSHAREDVT) && method->klass->generic_container) { + MonoError error; MonoGenericContext ctx; MonoMethod *inst, *gshared, *m; @@ -3680,7 +3724,8 @@ add_wrappers (MonoAotCompile *acfg) * Create a generic wrapper for a generic instance, and AOT that. */ create_gsharedvt_inst (acfg, method, &ctx); - inst = mono_class_inflate_generic_method (method, &ctx); + inst = mono_class_inflate_generic_method_checked (method, &ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ m = mono_marshal_get_synchronized_wrapper (inst); g_assert (m->is_inflated); gshared = mini_get_shared_method_full (m, FALSE, TRUE); @@ -4201,6 +4246,7 @@ add_generic_instances (MonoAotCompile *acfg) * FIXME: Handle class_inst as well. */ if (context && context->method_inst && context->method_inst->is_open) { + MonoError error; MonoGenericContext shared_context; MonoGenericInst *inst; MonoType **type_argv; @@ -4266,7 +4312,8 @@ add_generic_instances (MonoAotCompile *acfg) else declaring_method = mono_method_get_declaring_generic_method (method); - method = mono_class_inflate_generic_method (declaring_method, &shared_context); + method = mono_class_inflate_generic_method_checked (declaring_method, &shared_context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } /* @@ -4355,10 +4402,12 @@ add_generic_instances (MonoAotCompile *acfg) get_method = mono_class_get_method_from_name (array_klass, "GetGenericValueImpl", 2); if (get_method) { + MonoError error; memset (&ctx, 0, sizeof (ctx)); args [0] = &mono_defaults.object_class->byval_arg; ctx.method_inst = mono_metadata_get_generic_inst (1, args); - add_extra_method (acfg, mono_marshal_get_native_wrapper (mono_class_inflate_generic_method (get_method, &ctx), TRUE, TRUE)); + add_extra_method (acfg, mono_marshal_get_native_wrapper (mono_class_inflate_generic_method_checked (get_method, &ctx, &error), TRUE, TRUE)); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } } @@ -4372,10 +4421,12 @@ add_generic_instances (MonoAotCompile *acfg) while ((m = mono_class_get_methods (interlocked_klass, &iter))) { if ((!strcmp (m->name, "CompareExchange") || !strcmp (m->name, "Exchange")) && m->is_generic) { + MonoError error; memset (&ctx, 0, sizeof (ctx)); args [0] = &mono_defaults.object_class->byval_arg; ctx.method_inst = mono_metadata_get_generic_inst (1, args); - add_extra_method (acfg, mono_marshal_get_native_wrapper (mono_class_inflate_generic_method (m, &ctx), TRUE, TRUE)); + add_extra_method (acfg, mono_marshal_get_native_wrapper (mono_class_inflate_generic_method_checked (m, &ctx, &error), TRUE, TRUE)); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } } } @@ -4391,10 +4442,12 @@ add_generic_instances (MonoAotCompile *acfg) if (volatile_klass) { while ((m = mono_class_get_methods (volatile_klass, &iter))) { if ((!strcmp (m->name, "Read") || !strcmp (m->name, "Write")) && m->is_generic) { + MonoError error; memset (&ctx, 0, sizeof (ctx)); args [0] = &mono_defaults.object_class->byval_arg; ctx.method_inst = mono_metadata_get_generic_inst (1, args); - add_extra_method (acfg, mono_marshal_get_native_wrapper (mono_class_inflate_generic_method (m, &ctx), TRUE, TRUE)); + add_extra_method (acfg, mono_marshal_get_native_wrapper (mono_class_inflate_generic_method_checked (m, &ctx, &error), TRUE, TRUE)); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } } } @@ -4783,7 +4836,7 @@ emit_and_reloc_code (MonoAotCompile *acfg, MonoMethod *method, guint8 *code, gui } else { int code_size; - got_slot = get_got_offset (acfg, patch_info); + got_slot = get_got_offset (acfg, FALSE, patch_info); arch_emit_got_access (acfg, code + i, got_slot, &code_size); i += code_size - INST_LEN; @@ -4878,14 +4931,16 @@ get_debug_sym (MonoMethod *method, const char *prefix, GHashTable *cache) { char *name1, *name2, *cached; int i, j, len, count; + MonoMethod *cached_method; + + name1 = mono_method_full_name (method, TRUE); #ifdef TARGET_MACH // This is so that we don't accidentally create a local symbol (which starts with 'L') - if (!prefix || !*prefix) + if ((!prefix || !*prefix) && name1 [0] == 'L') prefix = "_"; #endif - name1 = mono_method_full_name (method, TRUE); len = strlen (name1); name2 = malloc (strlen (prefix) + len + 16); memcpy (name2, prefix, strlen (prefix)); @@ -4907,13 +4962,16 @@ get_debug_sym (MonoMethod *method, const char *prefix, GHashTable *cache) g_free (name1); count = 0; - while (g_hash_table_lookup (cache, name2)) { + while (TRUE) { + cached_method = g_hash_table_lookup (cache, name2); + if (!(cached_method && cached_method != method)) + break; sprintf (name2 + j, "_%d", count); count ++; } cached = g_strdup (name2); - g_hash_table_insert (cache, cached, cached); + g_hash_table_insert (cache, cached, method); return name2; } @@ -4937,17 +4995,16 @@ emit_method_code (MonoAotCompile *acfg, MonoCompile *cfg) method_index = get_method_index (acfg, method); symbol = g_strdup_printf ("%sme_%x", acfg->temp_prefix, method_index); - /* Make the labels local */ emit_section_change (acfg, ".text", 0); - emit_alignment (acfg, func_alignment); + emit_alignment_code (acfg, func_alignment); if (acfg->global_symbols && acfg->need_no_dead_strip) fprintf (acfg->fp, " .no_dead_strip %s\n", cfg->asm_symbol); emit_label (acfg, cfg->asm_symbol); - if (acfg->aot_opts.write_symbols && !acfg->global_symbols) { + if (acfg->aot_opts.write_symbols && !acfg->global_symbols && !acfg->llvm_separate) { /* * Write a C style symbol for every method, this has two uses: * - it works on platforms where the dwarf debugging info is not @@ -4955,6 +5012,7 @@ emit_method_code (MonoAotCompile *acfg, MonoCompile *cfg) * - it allows the setting of breakpoints of aot-ed methods. */ debug_sym = get_debug_sym (method, "", acfg->method_label_hash); + cfg->asm_debug_symbol = g_strdup (debug_sym); if (acfg->need_no_dead_strip) fprintf (acfg->fp, " .no_dead_strip %s\n", debug_sym); @@ -4981,7 +5039,10 @@ emit_method_code (MonoAotCompile *acfg, MonoCompile *cfg) emit_line (acfg); if (acfg->aot_opts.write_symbols) { - emit_symbol_size (acfg, debug_sym, "."); + if (debug_sym) + emit_symbol_size (acfg, debug_sym, "."); + else + emit_symbol_size (acfg, cfg->asm_symbol, "."); g_free (debug_sym); } @@ -5135,6 +5196,7 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint } case MONO_PATCH_INFO_GENERIC_CLASS_INIT: case MONO_PATCH_INFO_MONITOR_ENTER: + case MONO_PATCH_INFO_MONITOR_ENTER_V4: case MONO_PATCH_INFO_MONITOR_EXIT: case MONO_PATCH_INFO_SEQ_POINT_INFO: break; @@ -5176,6 +5238,15 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint } break; } + case MONO_PATCH_INFO_LDSTR_LIT: { + const char *s = patch_info->data.target; + int len = strlen (s); + + encode_value (len, p, &p); + memcpy (p, s, len + 1); + p += len + 1; + break; + } default: g_warning ("unable to handle jump info %d", patch_info->type); g_assert_not_reached (); @@ -5185,7 +5256,7 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint } static void -encode_patch_list (MonoAotCompile *acfg, GPtrArray *patches, int n_patches, int first_got_offset, guint8 *buf, guint8 **endbuf) +encode_patch_list (MonoAotCompile *acfg, GPtrArray *patches, int n_patches, gboolean llvm, int first_got_offset, guint8 *buf, guint8 **endbuf) { guint8 *p = buf; guint32 pindex, offset; @@ -5200,7 +5271,7 @@ encode_patch_list (MonoAotCompile *acfg, GPtrArray *patches, int n_patches, int /* Nothing to do */ continue; - offset = get_got_offset (acfg, patch_info); + offset = get_got_offset (acfg, llvm, patch_info); encode_value (offset, p, &p); } @@ -5292,7 +5363,7 @@ emit_method_info (MonoAotCompile *acfg, MonoCompile *cfg) if (n_patches) g_assert (cfg->has_got_slots); - encode_patch_list (acfg, patches, n_patches, first_got_offset, p, &p); + encode_patch_list (acfg, patches, n_patches, cfg->compile_llvm, first_got_offset, p, &p); acfg->stats.info_size += p - buf; @@ -5340,7 +5411,7 @@ emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg) { MonoMethod *method; int i, k, buf_size, method_index; - guint32 debug_info_size; + guint32 debug_info_size, seq_points_size; guint8 *code; MonoMethodHeader *header; guint8 *p, *buf, *debug_info; @@ -5364,7 +5435,9 @@ emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg) seq_points = cfg->seq_point_info; - buf_size = header->num_clauses * 256 + debug_info_size + 2048 + (seq_points ? (seq_points->len * 128) : 0) + cfg->gc_map_size; + seq_points_size = (cfg->gen_seq_points)? seq_point_info_get_write_size (seq_points) : 0; + + buf_size = header->num_clauses * 256 + debug_info_size + 2048 + seq_points_size + cfg->gc_map_size; p = buf = g_malloc (buf_size); use_unwind_ops = cfg->unwind_ops != NULL; @@ -5570,27 +5643,9 @@ emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg) } } - if (seq_points) { - int il_offset, native_offset, last_il_offset, last_native_offset, j; + if (seq_points) + p += seq_point_info_write (seq_points, p); - encode_value (seq_points->len, p, &p); - last_il_offset = last_native_offset = 0; - for (i = 0; i < seq_points->len; ++i) { - SeqPoint *sp = &seq_points->seq_points [i]; - il_offset = sp->il_offset; - native_offset = sp->native_offset; - encode_value (il_offset - last_il_offset, p, &p); - encode_value (native_offset - last_native_offset, p, &p); - last_il_offset = il_offset; - last_native_offset = native_offset; - - encode_value (sp->flags, p, &p); - encode_value (sp->next_len, p, &p); - for (j = 0; j < sp->next_len; ++j) - encode_value (sp->next [j], p, &p); - } - } - g_assert (debug_info_size < buf_size); encode_value (debug_info_size, p, &p); @@ -5716,39 +5771,49 @@ get_plt_entry_debug_sym (MonoAotCompile *acfg, MonoJumpInfo *ji, GHashTable *cac { char *debug_sym = NULL; char *s; + char *prefix; + + if (acfg->llvm_separate && llvm_acfg->aot_opts.static_link) { + /* Need to add a prefix to create unique symbols */ + prefix = g_strdup_printf ("plt_%s_", acfg->assembly_name_sym); + } else { + prefix = g_strdup ("plt_"); + } switch (ji->type) { case MONO_PATCH_INFO_METHOD: - debug_sym = get_debug_sym (ji->data.method, "plt_", cache); + debug_sym = get_debug_sym (ji->data.method, prefix, cache); break; case MONO_PATCH_INFO_INTERNAL_METHOD: - debug_sym = g_strdup_printf ("plt__jit_icall_%s", ji->data.name); + debug_sym = g_strdup_printf ("%s_jit_icall_%s", prefix, ji->data.name); break; case MONO_PATCH_INFO_CLASS_INIT: s = mono_type_get_name (&ji->data.klass->byval_arg); - debug_sym = g_strdup_printf ("plt__class_init_%s", s); + debug_sym = g_strdup_printf ("%s__class_init_%s", prefix, s); g_free (s); break; case MONO_PATCH_INFO_RGCTX_FETCH: - debug_sym = g_strdup_printf ("plt__rgctx_fetch_%d", acfg->label_generator ++); + debug_sym = g_strdup_printf ("%s_rgctx_fetch_%d", prefix, acfg->label_generator ++); break; case MONO_PATCH_INFO_ICALL_ADDR: { char *s = get_debug_sym (ji->data.method, "", cache); - debug_sym = g_strdup_printf ("plt__icall_native_%s", s); + debug_sym = g_strdup_printf ("%s_icall_native_%s", prefix, s); g_free (s); break; } case MONO_PATCH_INFO_JIT_ICALL_ADDR: - debug_sym = g_strdup_printf ("plt__jit_icall_native_%s", ji->data.name); + debug_sym = g_strdup_printf ("%s_jit_icall_native_%s", prefix, ji->data.name); break; case MONO_PATCH_INFO_GENERIC_CLASS_INIT: - debug_sym = g_strdup_printf ("plt__generic_class_init"); + debug_sym = g_strdup_printf ("%s_generic_class_init", prefix); break; default: break; } + g_free (prefix); + return sanitize_symbol (acfg, debug_sym); } @@ -5767,7 +5832,7 @@ emit_plt (MonoAotCompile *acfg) sprintf (symbol, "plt"); emit_section_change (acfg, ".text", 0); - emit_alignment (acfg, NACL_SIZE(16, kNaClAlignment)); + emit_alignment_code (acfg, NACL_SIZE(16, kNaClAlignment)); emit_label (acfg, symbol); emit_label (acfg, acfg->plt_symbol); @@ -5795,8 +5860,15 @@ emit_plt (MonoAotCompile *acfg) if (!plt_entry->jit_used && !plt_entry->llvm_used) continue; - if (acfg->llvm && !acfg->thumb_mixed) + if (acfg->llvm && !acfg->thumb_mixed) { emit_label (acfg, plt_entry->llvm_symbol); + if (acfg->llvm_separate) { + emit_global_inner (acfg, plt_entry->llvm_symbol, TRUE); +#if defined(TARGET_MACH) + fprintf (acfg->fp, ".private_extern %s\n", plt_entry->llvm_symbol); +#endif + } + } if (debug_sym) { if (acfg->need_no_dead_strip) { @@ -5855,6 +5927,9 @@ emit_plt (MonoAotCompile *acfg) emit_label (acfg, plt_entry->llvm_symbol); + if (acfg->llvm_separate) + emit_global_inner (acfg, plt_entry->llvm_symbol, TRUE); + arch_emit_llvm_plt_entry (acfg, i); if (debug_sym) { @@ -5910,7 +5985,7 @@ emit_trampoline_full (MonoAotCompile *acfg, int got_offset, MonoTrampInfo *info, emit_section_change (acfg, ".text", 0); emit_global (acfg, start_symbol, TRUE); - emit_alignment (acfg, AOT_FUNC_ALIGNMENT); + emit_alignment_code (acfg, AOT_FUNC_ALIGNMENT); emit_label (acfg, start_symbol); sprintf (symbol, "%snamed_%s", acfg->temp_prefix, name); @@ -5942,7 +6017,7 @@ emit_trampoline_full (MonoAotCompile *acfg, int got_offset, MonoTrampInfo *info, buf = g_malloc (buf_size); p = buf; - encode_patch_list (acfg, patches, patches->len, got_offset, p, &p); + encode_patch_list (acfg, patches, patches->len, FALSE, got_offset, p, &p); g_assert (p - buf < buf_size); sprintf (symbol, "%s%s_p", acfg->user_symbol_prefix, name); @@ -6034,8 +6109,12 @@ emit_trampolines (MonoAotCompile *acfg) mono_arch_get_nullified_class_init_trampoline (&info); emit_trampoline (acfg, acfg->got_offset, info); #if defined(MONO_ARCH_MONITOR_OBJECT_REG) - mono_arch_create_monitor_enter_trampoline (&info, TRUE); + mono_arch_create_monitor_enter_trampoline (&info, FALSE, TRUE); emit_trampoline (acfg, acfg->got_offset, info); +#if defined(MONO_ARCH_MONITOR_LOCK_TAKEN_REG) + mono_arch_create_monitor_enter_trampoline (&info, TRUE, TRUE); + emit_trampoline (acfg, acfg->got_offset, info); +#endif mono_arch_create_monitor_exit_trampoline (&info, TRUE); emit_trampoline (acfg, acfg->got_offset, info); #endif @@ -6168,7 +6247,7 @@ emit_trampolines (MonoAotCompile *acfg) if (acfg->aot_opts.write_symbols) emit_local_symbol (acfg, symbol, end_symbol, TRUE); - emit_alignment (acfg, AOT_FUNC_ALIGNMENT); + emit_alignment_code (acfg, AOT_FUNC_ALIGNMENT); emit_label (acfg, symbol); acfg->trampoline_got_offset_base [ntype] = tramp_got_offset; @@ -6315,6 +6394,8 @@ mono_aot_parse_options (const char *aot_options, MonoAotOptions *opts) if (str_begins_with (arg, "outfile=")) { opts->outfile = g_strdup (arg + strlen ("outfile=")); + } else if (str_begins_with (arg, "llvm-outfile=")) { + opts->llvm_outfile = g_strdup (arg + strlen ("llvm-outfile=")); } else if (str_begins_with (arg, "save-temps")) { opts->save_temps = TRUE; } else if (str_begins_with (arg, "keep-temps")) { @@ -6356,6 +6437,8 @@ mono_aot_parse_options (const char *aot_options, MonoAotOptions *opts) opts->autoreg = TRUE; } else if (str_begins_with (arg, "tool-prefix=")) { opts->tool_prefix = g_strdup (arg + strlen ("tool-prefix=")); + } else if (str_begins_with (arg, "ld-flags=")) { + opts->ld_flags = g_strdup (arg + strlen ("ld-flags=")); } else if (str_begins_with (arg, "soft-debug")) { opts->soft_debug = TRUE; } else if (str_begins_with (arg, "direct-pinvoke")) { @@ -6387,6 +6470,11 @@ mono_aot_parse_options (const char *aot_options, MonoAotOptions *opts) opts->mtriple = g_strdup (arg + strlen ("mtriple=")); } else if (str_begins_with (arg, "llvm-path=")) { opts->llvm_path = g_strdup (arg + strlen ("llvm-path=")); + if (!g_str_has_suffix (opts->llvm_path, G_DIR_SEPARATOR_S)) { + gchar *old = opts->llvm_path; + opts->llvm_path = g_strconcat (opts->llvm_path, G_DIR_SEPARATOR_S, NULL); + g_free (old); + } } else if (!strcmp (arg, "llvm")) { opts->llvm = TRUE; } else if (str_begins_with (arg, "readonly-value=")) { @@ -6396,9 +6484,12 @@ mono_aot_parse_options (const char *aot_options, MonoAotOptions *opts) exit (0); } else if (str_begins_with (arg, "gc-maps")) { mini_gc_enable_gc_maps_for_aot (); + } else if (str_begins_with (arg, "dump")) { + opts->dump_json = TRUE; } else if (str_begins_with (arg, "help") || str_begins_with (arg, "?")) { printf ("Supported options for --aot:\n"); printf (" outfile=\n"); + printf (" llvm-outfile=\n"); printf (" save-temps\n"); printf (" keep-temps\n"); printf (" write-symbols\n"); @@ -6423,6 +6514,7 @@ mono_aot_parse_options (const char *aot_options, MonoAotOptions *opts) printf (" print-skipped\n"); printf (" no-instances\n"); printf (" stats\n"); + printf (" dump\n"); printf (" info\n"); printf (" help/?\n"); exit (0); @@ -6627,6 +6719,8 @@ compile_method (MonoAotCompile *acfg, MonoMethod *method) flags |= JIT_FLAG_FULL_AOT; if (acfg->llvm) flags |= JIT_FLAG_LLVM; + if (acfg->aot_opts.no_direct_calls) + flags |= JIT_FLAG_NO_DIRECT_ICALLS; cfg = mini_method_compile (method, acfg->opts, mono_get_root_domain (), flags, 0); mono_loader_clear_error (); @@ -6747,8 +6841,12 @@ compile_method (MonoAotCompile *acfg, MonoMethod *method) } add_generic_class_with_depth (acfg, m->klass, depth + 5, "method"); } - if (m->wrapper_type == MONO_WRAPPER_MANAGED_TO_MANAGED && !strcmp (m->name, "ElementAddr")) - add_extra_method_with_depth (acfg, m, depth + 1); + if (m->wrapper_type == MONO_WRAPPER_MANAGED_TO_MANAGED) { + WrapperInfo *info = mono_marshal_get_wrapper_info (m); + + if (info && info->subtype == WRAPPER_SUBTYPE_ELEMENT_ADDR) + add_extra_method_with_depth (acfg, m, depth + 1); + } break; } case MONO_PATCH_INFO_VTABLE: { @@ -6995,7 +7093,7 @@ load_profile_files (MonoAotCompile *acfg) guint32 mono_aot_get_got_offset (MonoJumpInfo *ji) { - return get_got_offset (llvm_acfg, ji); + return get_got_offset (llvm_acfg, TRUE, ji); } char* @@ -7028,6 +7126,7 @@ mono_aot_get_plt_symbol (MonoJumpInfoType type, gconstpointer data) { MonoJumpInfo *ji = mono_mempool_alloc (llvm_acfg->mempool, sizeof (MonoJumpInfo)); MonoPltEntry *plt_entry; + const char *sym = NULL; ji->type = type; ji->data.target = data; @@ -7035,6 +7134,19 @@ mono_aot_get_plt_symbol (MonoJumpInfoType type, gconstpointer data) if (!can_encode_patch (llvm_acfg, ji)) return NULL; + if (llvm_acfg->aot_opts.direct_icalls) { + if (type == MONO_PATCH_INFO_JIT_ICALL_ADDR) { + /* Call to a C function implementing a jit icall */ + sym = mono_lookup_jit_icall_symbol (data); + } else if (type == MONO_PATCH_INFO_ICALL_ADDR) { + MonoMethod *method = (gpointer)data; + if (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)) + sym = mono_lookup_icall_symbol (method); + } + if (sym) + return g_strdup (sym); + } + plt_entry = get_plt_entry (llvm_acfg, ji); plt_entry->llvm_used = TRUE; @@ -7064,6 +7176,30 @@ mono_aot_patch_info_dup (MonoJumpInfo* ji) return res; } +static int +execute_system (const char * command) +{ + int status; + +#if _WIN32 + // We need an extra set of quotes around the whole command to properly handle commands + // with spaces since internally the command is called through "cmd /c. + command = g_strdup_printf ("\"%s\"", command); + + int size = MultiByteToWideChar (CP_UTF8, 0 , command , -1, NULL , 0); + wchar_t* wstr = g_malloc (sizeof (wchar_t) * size); + MultiByteToWideChar (CP_UTF8, 0, command, -1, wstr , size); + status = _wsystem (wstr); + g_free (wstr); + + g_free (command); +#else + status = system (command); +#endif + + return status; +} + #ifdef ENABLE_LLVM /* @@ -7075,50 +7211,10 @@ mono_aot_patch_info_dup (MonoJumpInfo* ji) static gboolean emit_llvm_file (MonoAotCompile *acfg) { - char *command, *opts, *tempbc; - int i; - MonoJumpInfo *patch_info; - - /* - * When using LLVM, we let llvm emit the got since the LLVM IL needs to refer - * to it. - */ - - /* Compute the final size of the got */ - for (i = 0; i < acfg->nmethods; ++i) { - if (acfg->cfgs [i]) { - for (patch_info = acfg->cfgs [i]->patch_info; patch_info; patch_info = patch_info->next) { - if (patch_info->type != MONO_PATCH_INFO_NONE) { - if (!is_plt_patch (patch_info)) - get_got_offset (acfg, patch_info); - else - get_plt_entry (acfg, patch_info); - } - } - } - } - - acfg->final_got_size = acfg->got_offset + acfg->plt_offset; - - if (acfg->aot_opts.full_aot) { - int ntype; - - /* - * Need to add the got entries used by the trampolines. - * This is only a conservative approximation. - */ - if (strcmp (acfg->image->assembly->aname.name, "mscorlib") == 0) { - /* For the generic + rgctx trampolines */ - acfg->final_got_size += 400; - /* For the specific trampolines */ - for (ntype = 0; ntype < MONO_AOT_TRAMP_NUM; ++ntype) - acfg->final_got_size += acfg->num_trampolines [ntype] * 2; - } - } - + char *command, *opts, *tempbc, *output_fname; tempbc = g_strdup_printf ("%s.bc", acfg->tmpbasename); - mono_llvm_emit_aot_module (tempbc, acfg->final_got_size); + mono_llvm_emit_aot_module (tempbc, g_path_get_basename (acfg->image->name)); g_free (tempbc); /* @@ -7149,11 +7245,11 @@ emit_llvm_file (MonoAotCompile *acfg) * return OverwriteComplete; * Here, if 'Earlier' refers to a memset, and Later has no size info, it mistakenly thinks the memset is redundant. */ - opts = g_strdup ("-targetlibinfo -no-aa -basicaa -notti -instcombine -simplifycfg -sroa -domtree -early-cse -lazy-value-info -correlated-propagation -simplifycfg -instcombine -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -gvn -memdep -memcpyopt -sccp -instcombine -lazy-value-info -correlated-propagation -domtree -memdep -adce -simplifycfg -instcombine -strip-dead-prototypes -domtree -verify"); + opts = g_strdup ("-targetlibinfo -no-aa -basicaa -notti -instcombine -simplifycfg -inline-cost -inline -sroa -domtree -early-cse -lazy-value-info -correlated-propagation -simplifycfg -instcombine -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -gvn -memdep -memcpyopt -sccp -instcombine -lazy-value-info -correlated-propagation -domtree -memdep -adce -simplifycfg -instcombine -strip-dead-prototypes -domtree -verify"); #if 1 - command = g_strdup_printf ("%sopt -f %s -o \"%s.opt.bc\" \"%s.bc\"", acfg->aot_opts.llvm_path, opts, acfg->tmpbasename, acfg->tmpbasename); + command = g_strdup_printf ("\"%sopt\" -f %s -o \"%s.opt.bc\" \"%s.bc\"", acfg->aot_opts.llvm_path, opts, acfg->tmpbasename, acfg->tmpbasename); aot_printf (acfg, "Executing opt: %s\n", command); - if (system (command) != 0) + if (execute_system (command) != 0) return FALSE; #endif g_free (opts); @@ -7164,9 +7260,14 @@ emit_llvm_file (MonoAotCompile *acfg) /* Verbose asm slows down llc greatly */ g_string_append (acfg->llc_args, " -asm-verbose=false"); + g_string_append (acfg->llc_args, " -disable-gnu-eh-frame -enable-mono-eh-frame"); + if (acfg->aot_opts.mtriple) g_string_append_printf (acfg->llc_args, " -mtriple=%s", acfg->aot_opts.mtriple); + if (acfg->llvm_separate) + g_string_append_printf (acfg->llc_args, " -mono-eh-frame-symbol=%s", acfg->llvm_eh_frame_symbol); + #if defined(TARGET_MACH) && defined(TARGET_ARM) /* ios requires PIC code now */ g_string_append_printf (acfg->llc_args, " -relocation-model=pic"); @@ -7178,11 +7279,22 @@ emit_llvm_file (MonoAotCompile *acfg) #endif unlink (acfg->tmpfname); - command = g_strdup_printf ("%sllc %s -disable-gnu-eh-frame -enable-mono-eh-frame -o \"%s\" \"%s.opt.bc\"", acfg->aot_opts.llvm_path, acfg->llc_args->str, acfg->tmpfname, acfg->tmpbasename); + if (acfg->llvm_separate) { + if (acfg->llvm_owriter) { + /* Emit an object file directly */ + output_fname = g_strdup_printf ("%s", acfg->llvm_ofile); + g_string_append_printf (acfg->llc_args, " -filetype=obj"); + } else { + output_fname = g_strdup_printf ("%s", acfg->llvm_sfile); + } + } else { + output_fname = g_strdup (acfg->tmpfname); + } + command = g_strdup_printf ("\"%sllc\" %s -o \"%s\" \"%s.opt.bc\"", acfg->aot_opts.llvm_path, acfg->llc_args->str, output_fname, acfg->tmpbasename); aot_printf (acfg, "Executing llc: %s\n", command); - if (system (command) != 0) + if (execute_system (command) != 0) return FALSE; return TRUE; } @@ -7208,7 +7320,7 @@ emit_code (MonoAotCompile *acfg) * AOT code, so it must be equal to the address of the first emitted method. */ emit_section_change (acfg, ".text", 0); - emit_alignment (acfg, 8); + emit_alignment_code (acfg, 8); if (acfg->llvm) { for (i = 0; i < acfg->nmethods; ++i) { if (acfg->cfgs [i] && acfg->cfgs [i]->compile_llvm) { @@ -7222,13 +7334,14 @@ emit_code (MonoAotCompile *acfg) emit_label (acfg, symbol); acfg->methods_symbol = g_strdup (symbol); } + emit_label (acfg, "jit_code_start"); /* * Emit some padding so the local symbol for the first method doesn't have the * same address as 'methods'. */ #if defined(__default_codegen__) - emit_zero_bytes (acfg, 16); + emit_padding (acfg, 16); #elif defined(__native_client_codegen__) { const int kPaddingSize = 16; @@ -7269,9 +7382,8 @@ emit_code (MonoAotCompile *acfg) arch_emit_unbox_trampoline (acfg, cfg, cfg->orig_method, cfg->asm_symbol); - if (acfg->thumb_mixed && cfg->compile_llvm) { + if (acfg->thumb_mixed && cfg->compile_llvm) emit_set_arm_mode (acfg); - } } if (cfg->compile_llvm) @@ -7280,12 +7392,12 @@ emit_code (MonoAotCompile *acfg) emit_method_code (acfg, cfg); } - sprintf (symbol, "methods_end"); emit_section_change (acfg, ".text", 0); - emit_alignment (acfg, 8); - emit_label (acfg, symbol); + emit_alignment_code (acfg, 8); + emit_label (acfg, "jit_code_end"); + /* To distinguish it from the next symbol */ - emit_int32 (acfg, 0); + emit_padding (acfg, 4); /* * Add .no_dead_strip directives for all LLVM methods to prevent the OSX linker @@ -7302,66 +7414,37 @@ emit_code (MonoAotCompile *acfg) } } - if (acfg->direct_method_addresses) { - acfg->flags |= MONO_AOT_FILE_FLAG_DIRECT_METHOD_ADDRESSES; + /* + * To work around linker issues, we emit a table of branches, and disassemble them at runtime. + * This is PIE code, and the linker can update it if needed. + */ + sprintf (symbol, "method_addresses"); + emit_section_change (acfg, ".text", 1); + emit_alignment_code (acfg, 8); + emit_label (acfg, symbol); + emit_local_symbol (acfg, symbol, "method_addresses_end", TRUE); + emit_unset_mode (acfg); + if (acfg->need_no_dead_strip) + fprintf (acfg->fp, " .no_dead_strip %s\n", symbol); - /* - * To work around linker issues, we emit a table of branches, and disassemble them at runtime. - * This is PIE code, and the linker can update it if needed. - */ - sprintf (symbol, "method_addresses"); - emit_section_change (acfg, ".text", 1); - emit_alignment (acfg, 8); - emit_label (acfg, symbol); - emit_local_symbol (acfg, symbol, "method_addresses_end", TRUE); - emit_unset_mode (acfg); - if (acfg->need_no_dead_strip) - fprintf (acfg->fp, " .no_dead_strip %s\n", symbol); - - for (i = 0; i < acfg->nmethods; ++i) { + for (i = 0; i < acfg->nmethods; ++i) { #ifdef MONO_ARCH_AOT_SUPPORTED - int call_size; + int call_size; - if (acfg->cfgs [i]) - arch_emit_direct_call (acfg, acfg->cfgs [i]->asm_symbol, FALSE, acfg->thumb_mixed && acfg->cfgs [i]->compile_llvm, NULL, &call_size); - else - arch_emit_direct_call (acfg, "method_addresses", FALSE, FALSE, NULL, &call_size); + if (acfg->cfgs [i]) + arch_emit_direct_call (acfg, acfg->cfgs [i]->asm_symbol, FALSE, acfg->thumb_mixed && acfg->cfgs [i]->compile_llvm, NULL, &call_size); + else + arch_emit_direct_call (acfg, "method_addresses", FALSE, FALSE, NULL, &call_size); #endif - } - - sprintf (symbol, "method_addresses_end"); - emit_label (acfg, symbol); - - /* Empty */ - sprintf (symbol, "code_offsets"); - emit_section_change (acfg, RODATA_SECT, 1); - emit_alignment (acfg, 8); - emit_label (acfg, symbol); - emit_int32 (acfg, 0); - } else { - sprintf (symbol, "code_offsets"); - emit_section_change (acfg, RODATA_SECT, 1); - emit_alignment (acfg, 8); - emit_label (acfg, symbol); - - acfg->stats.offsets_size += acfg->nmethods * 4; - - for (i = 0; i < acfg->nmethods; ++i) { - if (acfg->cfgs [i]) { - emit_symbol_diff (acfg, acfg->cfgs [i]->asm_symbol, acfg->methods_symbol, 0); - } else { - emit_int32 (acfg, 0xffffffff); - } - } } + + sprintf (symbol, "method_addresses_end"); + emit_label (acfg, symbol); emit_line (acfg); - /* Emit a sorted table mapping methods to their unbox trampolines */ + /* Emit a sorted table mapping methods to the index of their unbox trampolines */ sprintf (symbol, "unbox_trampolines"); - if (acfg->direct_method_addresses) - emit_section_change (acfg, ".text", 0); - else - emit_section_change (acfg, RODATA_SECT, 0); + emit_section_change (acfg, RODATA_SECT, 0); emit_alignment (acfg, 8); emit_label (acfg, symbol); @@ -7378,21 +7461,9 @@ emit_code (MonoAotCompile *acfg) method = cfg->orig_method; if (acfg->aot_opts.full_aot && cfg->orig_method->klass->valuetype) { -#ifdef MONO_ARCH_AOT_SUPPORTED - int call_size; -#endif - index = get_method_index (acfg, method); - sprintf (symbol, "ut_%d", index); emit_int32 (acfg, index); - if (acfg->direct_method_addresses) { -#ifdef MONO_ARCH_AOT_SUPPORTED - arch_emit_direct_call (acfg, symbol, FALSE, acfg->thumb_mixed && cfg->compile_llvm, NULL, &call_size); -#endif - } else { - emit_symbol_diff (acfg, symbol, acfg->methods_symbol, 0); - } /* Make sure the table is sorted by index */ g_assert (index > prev_index); prev_index = index; @@ -7401,6 +7472,36 @@ emit_code (MonoAotCompile *acfg) sprintf (symbol, "unbox_trampolines_end"); emit_label (acfg, symbol); emit_int32 (acfg, 0); + + /* Emit a separate table with the trampoline addresses/offsets */ + sprintf (symbol, "unbox_trampoline_addresses"); + emit_section_change (acfg, ".text", 0); + emit_alignment_code (acfg, 8); + emit_label (acfg, symbol); + + for (i = 0; i < acfg->nmethods; ++i) { + MonoCompile *cfg; + MonoMethod *method; + int index; + + cfg = acfg->cfgs [i]; + if (!cfg) + continue; + + method = cfg->orig_method; + + if (acfg->aot_opts.full_aot && cfg->orig_method->klass->valuetype) { +#ifdef MONO_ARCH_AOT_SUPPORTED + int call_size; + + index = get_method_index (acfg, method); + sprintf (symbol, "ut_%d", index); + + arch_emit_direct_call (acfg, symbol, FALSE, acfg->thumb_mixed && cfg->compile_llvm, NULL, &call_size); +#endif + } + } + emit_int32 (acfg, 0); } static void @@ -7602,10 +7703,12 @@ mono_aot_get_array_helper_from_wrapper (MonoMethod *method) g_free (s); if (m->is_generic) { + MonoError error; memset (&ctx, 0, sizeof (ctx)); args [0] = &method->klass->element_class->byval_arg; ctx.method_inst = mono_metadata_get_generic_inst (1, args); - m = mono_class_inflate_generic_method (m, &ctx); + m = mono_class_inflate_generic_method_checked (m, &ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } return m; @@ -7951,26 +8054,29 @@ emit_image_table (MonoAotCompile *acfg) } static void -emit_got_info (MonoAotCompile *acfg) +emit_got_info (MonoAotCompile *acfg, gboolean llvm) { char symbol [256]; - int i, first_plt_got_patch, buf_size; + int i, first_plt_got_patch = 0, buf_size; guint8 *p, *buf; guint32 *got_info_offsets; + GotInfo *info = llvm ? &acfg->llvm_got_info : &acfg->got_info; /* Add the patches needed by the PLT to the GOT */ - acfg->plt_got_offset_base = acfg->got_offset; - first_plt_got_patch = acfg->got_patches->len; - for (i = 1; i < acfg->plt_offset; ++i) { - MonoPltEntry *plt_entry = g_hash_table_lookup (acfg->plt_offset_to_entry, GUINT_TO_POINTER (i)); + if (!llvm) { + acfg->plt_got_offset_base = acfg->got_offset; + first_plt_got_patch = info->got_patches->len; + for (i = 1; i < acfg->plt_offset; ++i) { + MonoPltEntry *plt_entry = g_hash_table_lookup (acfg->plt_offset_to_entry, GUINT_TO_POINTER (i)); - g_ptr_array_add (acfg->got_patches, plt_entry->ji); + g_ptr_array_add (info->got_patches, plt_entry->ji); - acfg->stats.got_slot_types [plt_entry->ji->type] ++; + acfg->stats.got_slot_types [plt_entry->ji->type] ++; + } + + acfg->got_offset += acfg->plt_offset; } - acfg->got_offset += acfg->plt_offset; - /** * FIXME: * - optimize offsets table. @@ -7983,15 +8089,17 @@ emit_got_info (MonoAotCompile *acfg) */ /* Encode info required to decode shared GOT entries */ - buf_size = acfg->got_patches->len * 128; + buf_size = info->got_patches->len * 128; p = buf = mono_mempool_alloc (acfg->mempool, buf_size); - got_info_offsets = mono_mempool_alloc (acfg->mempool, acfg->got_patches->len * sizeof (guint32)); - acfg->plt_got_info_offsets = mono_mempool_alloc (acfg->mempool, acfg->plt_offset * sizeof (guint32)); - /* Unused */ - if (acfg->plt_offset) - acfg->plt_got_info_offsets [0] = 0; - for (i = 0; i < acfg->got_patches->len; ++i) { - MonoJumpInfo *ji = g_ptr_array_index (acfg->got_patches, i); + got_info_offsets = mono_mempool_alloc (acfg->mempool, info->got_patches->len * sizeof (guint32)); + if (!llvm) { + acfg->plt_got_info_offsets = mono_mempool_alloc (acfg->mempool, acfg->plt_offset * sizeof (guint32)); + /* Unused */ + if (acfg->plt_offset) + acfg->plt_got_info_offsets [0] = 0; + } + for (i = 0; i < info->got_patches->len; ++i) { + MonoJumpInfo *ji = g_ptr_array_index (info->got_patches, i); guint8 *p2; p = buf; @@ -8003,19 +8111,22 @@ emit_got_info (MonoAotCompile *acfg) g_assert (p - buf <= buf_size); got_info_offsets [i] = add_to_blob (acfg, buf, p - buf); - if (i >= first_plt_got_patch) + if (!llvm && i >= first_plt_got_patch) acfg->plt_got_info_offsets [i - first_plt_got_patch + 1] = got_info_offsets [i]; acfg->stats.got_info_size += p - buf; } /* Emit got_info_offsets table */ - sprintf (symbol, "got_info_offsets"); + if (llvm) + sprintf (symbol, "llvm_got_info_offsets"); + else + sprintf (symbol, "got_info_offsets"); emit_section_change (acfg, RODATA_SECT, 1); emit_alignment (acfg, 8); emit_label (acfg, symbol); /* No need to emit offsets for the got plt entries, the plt embeds them directly */ - acfg->stats.offsets_size += emit_offset_table (acfg, first_plt_got_patch, 10, (gint32*)got_info_offsets); + acfg->stats.offsets_size += emit_offset_table (acfg, llvm ? acfg->llvm_got_offset : first_plt_got_patch, 10, (gint32*)got_info_offsets); } static void @@ -8023,19 +8134,17 @@ emit_got (MonoAotCompile *acfg) { char symbol [256]; - if (!acfg->llvm) { - /* Don't make GOT global so accesses to it don't need relocations */ - sprintf (symbol, "%s", acfg->got_symbol); - emit_section_change (acfg, ".bss", 0); - emit_alignment (acfg, 8); - emit_local_symbol (acfg, symbol, "got_end", FALSE); - emit_label (acfg, symbol); - if (acfg->got_offset > 0) - emit_zero_bytes (acfg, (int)(acfg->got_offset * sizeof (gpointer))); + /* Don't make GOT global so accesses to it don't need relocations */ + sprintf (symbol, "%s", acfg->got_symbol); + emit_section_change (acfg, ".bss", 0); + emit_alignment (acfg, 8); + emit_local_symbol (acfg, symbol, "got_end", FALSE); + emit_label (acfg, symbol); + if (acfg->got_offset > 0) + emit_zero_bytes (acfg, (int)(acfg->got_offset * sizeof (gpointer))); - sprintf (symbol, "got_end"); - emit_label (acfg, symbol); - } + sprintf (symbol, "got_end"); + emit_label (acfg, symbol); } typedef struct GlobalsTableEntry { @@ -8049,7 +8158,7 @@ emit_globals (MonoAotCompile *acfg) int i, table_size; guint32 hash; GPtrArray *table; - char symbol [256]; + char symbol [1024]; GlobalsTableEntry *entry, *new_entry; if (!acfg->aot_opts.static_link) @@ -8143,6 +8252,7 @@ emit_globals (MonoAotCompile *acfg) sprintf (symbol, "name_%d", i); emit_pointer (acfg, symbol); + g_assert (strlen (name) < sizeof (symbol)); sprintf (symbol, "%s", name); emit_pointer (acfg, symbol); } @@ -8177,7 +8287,7 @@ emit_mem_end (MonoAotCompile *acfg) sprintf (symbol, "mem_end"); emit_section_change (acfg, ".text", 1); - emit_alignment (acfg, 8); + emit_alignment_code (acfg, 8); emit_label (acfg, symbol); } @@ -8231,12 +8341,18 @@ emit_file_info (MonoAotCompile *acfg) * various problems (i.e. arm/thumb). */ emit_pointer (acfg, acfg->got_symbol); + if (acfg->llvm) + emit_pointer (acfg, acfg->llvm_got_symbol); + else + emit_pointer (acfg, NULL); emit_pointer (acfg, acfg->methods_symbol); + emit_pointer (acfg, "jit_code_start"); + emit_pointer (acfg, "jit_code_end"); if (acfg->llvm) { /* * Emit a reference to the mono_eh_frame table created by our modified LLVM compiler. */ - emit_pointer (acfg, "mono_eh_frame"); + emit_pointer (acfg, acfg->llvm_eh_frame_symbol); } else { emit_pointer (acfg, NULL); } @@ -8245,15 +8361,14 @@ emit_file_info (MonoAotCompile *acfg) emit_pointer (acfg, "class_info_offsets"); emit_pointer (acfg, "method_info_offsets"); emit_pointer (acfg, "ex_info_offsets"); - emit_pointer (acfg, "code_offsets"); - if (acfg->direct_method_addresses) - emit_pointer (acfg, "method_addresses"); - else - emit_pointer (acfg, NULL); + emit_pointer (acfg, "method_addresses"); emit_pointer (acfg, "extra_method_info_offsets"); emit_pointer (acfg, "extra_method_table"); emit_pointer (acfg, "got_info_offsets"); - emit_pointer (acfg, "methods_end"); + if (acfg->llvm) + emit_pointer (acfg, "llvm_got_info_offsets"); + else + emit_pointer (acfg, NULL); emit_pointer (acfg, "unwind_info"); emit_pointer (acfg, "mem_end"); emit_pointer (acfg, "image_table"); @@ -8285,6 +8400,7 @@ emit_file_info (MonoAotCompile *acfg) emit_pointer (acfg, "assembly_name"); emit_pointer (acfg, "unbox_trampolines"); emit_pointer (acfg, "unbox_trampolines_end"); + emit_pointer (acfg, "unbox_trampoline_addresses"); emit_int32 (acfg, acfg->plt_got_offset_base); emit_int32 (acfg, (int)(acfg->got_offset * sizeof (gpointer))); @@ -8424,7 +8540,7 @@ emit_dwarf_info (MonoAotCompile *acfg) sprintf (symbol2, "%sme_%x", acfg->temp_prefix, i); - mono_dwarf_writer_emit_method (acfg->dwarf, cfg, cfg->method, cfg->asm_symbol, symbol2, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, mono_debug_find_method (cfg->jit_info->d.method, mono_domain_get ())); + mono_dwarf_writer_emit_method (acfg->dwarf, cfg, cfg->method, cfg->asm_symbol, symbol2, cfg->asm_debug_symbol, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, mono_debug_find_method (cfg->jit_info->d.method, mono_domain_get ())); } #endif } @@ -8577,8 +8693,9 @@ static int compile_asm (MonoAotCompile *acfg) { char *command, *objfile; - char *outfile_name, *tmp_outfile_name; + char *outfile_name, *tmp_outfile_name, *llvm_ofile; const char *tool_prefix = acfg->aot_opts.tool_prefix ? acfg->aot_opts.tool_prefix : ""; + char *ld_flags = acfg->aot_opts.ld_flags ? acfg->aot_opts.ld_flags : g_strdup(""); #if defined(TARGET_AMD64) && !defined(TARGET_MACH) #define AS_OPTIONS "--64" @@ -8600,7 +8717,7 @@ compile_asm (MonoAotCompile *acfg) #define AS_NAME "nacl-as" #endif #elif defined(TARGET_OSX) -#define AS_NAME "clang -c -x assembler" +#define AS_NAME "clang" #else #define AS_NAME "as" #endif @@ -8615,7 +8732,7 @@ compile_asm (MonoAotCompile *acfg) #define LD_NAME "gcc -dynamiclib" #elif defined(TARGET_AMD64) && defined(TARGET_MACH) #define LD_NAME "clang --shared" -#elif defined(HOST_WIN32) +#elif defined(TARGET_WIN32) && !defined(TARGET_ANDROID) #define LD_NAME "gcc -shared --dll" #elif defined(TARGET_X86) && defined(TARGET_MACH) && !defined(__native_client_codegen__) #define LD_NAME "clang -m32 -dynamiclib" @@ -8625,6 +8742,8 @@ compile_asm (MonoAotCompile *acfg) aot_printf (acfg, "Output file: '%s'.\n", acfg->tmpfname); if (acfg->aot_opts.static_link) aot_printf (acfg, "Linking symbol: '%s'.\n", acfg->static_linking_symbol); + if (acfg->llvm_separate) + aot_printf (acfg, "LLVM output file: '%s'.\n", acfg->llvm_sfile); return 0; } @@ -8636,14 +8755,29 @@ compile_asm (MonoAotCompile *acfg) } else { objfile = g_strdup_printf ("%s.o", acfg->tmpfname); } - command = g_strdup_printf ("%s%s %s %s -o %s %s", tool_prefix, AS_NAME, AS_OPTIONS, acfg->as_args ? acfg->as_args->str : "", objfile, acfg->tmpfname); + +#ifdef TARGET_OSX + g_string_append (acfg->as_args, "-c -x assembler"); +#endif + + command = g_strdup_printf ("\"%s%s\" %s %s -o %s %s", tool_prefix, AS_NAME, AS_OPTIONS, acfg->as_args ? acfg->as_args->str : "", objfile, acfg->tmpfname); aot_printf (acfg, "Executing the native assembler: %s\n", command); - if (system (command) != 0) { + if (execute_system (command) != 0) { g_free (command); g_free (objfile); return 1; } + if (acfg->llvm_separate && !acfg->llvm_owriter) { + command = g_strdup_printf ("\"%s%s\" %s %s -o %s %s", tool_prefix, AS_NAME, AS_OPTIONS, acfg->as_args ? acfg->as_args->str : "", acfg->llvm_ofile, acfg->llvm_sfile); + aot_printf (acfg, "Executing the native assembler: %s\n", command); + if (execute_system (command) != 0) { + g_free (command); + g_free (objfile); + return 1; + } + } + g_free (command); if (acfg->aot_opts.static_link) { @@ -8656,29 +8790,40 @@ compile_asm (MonoAotCompile *acfg) if (acfg->aot_opts.outfile) outfile_name = g_strdup_printf ("%s", acfg->aot_opts.outfile); else - outfile_name = g_strdup_printf ("%s%s", acfg->image->name, SHARED_EXT); + outfile_name = g_strdup_printf ("%s%s", acfg->image->name, MONO_SOLIB_EXT); tmp_outfile_name = g_strdup_printf ("%s.tmp", outfile_name); + if (acfg->llvm_separate) { + llvm_ofile = g_strdup (acfg->llvm_ofile); + } else { + llvm_ofile = g_strdup (""); + } + + /* replace the ; flags separators with spaces */ + g_strdelimit (ld_flags, ";", ' '); + #ifdef LD_NAME - command = g_strdup_printf ("%s -o %s %s.o", LD_NAME, tmp_outfile_name, acfg->tmpfname); + command = g_strdup_printf ("%s -o %s %s %s.o %s", LD_NAME, tmp_outfile_name, llvm_ofile, acfg->tmpfname, ld_flags); #else - command = g_strdup_printf ("%sld %s -shared -o %s %s.o", tool_prefix, LD_OPTIONS, tmp_outfile_name, acfg->tmpfname); + command = g_strdup_printf ("\"%sld\" %s -shared -o %s %s %s.o %s", tool_prefix, LD_OPTIONS, tmp_outfile_name, llvm_ofile, + acfg->tmpfname, ld_flags); #endif aot_printf (acfg, "Executing the native linker: %s\n", command); - if (system (command) != 0) { + if (execute_system (command) != 0) { g_free (tmp_outfile_name); g_free (outfile_name); g_free (command); g_free (objfile); + g_free (ld_flags); return 1; } g_free (command); - /*com = g_strdup_printf ("strip --strip-unneeded %s%s", acfg->image->name, SHARED_EXT); + /*com = g_strdup_printf ("strip --strip-unneeded %s%s", acfg->image->name, MONO_SOLIB_EXT); printf ("Stripping the binary: %s\n", com); - system (com); + execute_system (com); g_free (com);*/ #if defined(TARGET_ARM) && !defined(TARGET_MACH) @@ -8688,7 +8833,7 @@ compile_asm (MonoAotCompile *acfg) */ command = g_strdup_printf ("%sstrip --strip-symbol=\\$a --strip-symbol=\\$d %s", tool_prefix, tmp_outfile_name); aot_printf (acfg, "Stripping the binary: %s\n", command); - if (system (command) != 0) { + if (execute_system (command) != 0) { g_free (tmp_outfile_name); g_free (outfile_name); g_free (command); @@ -8702,7 +8847,7 @@ compile_asm (MonoAotCompile *acfg) #if defined(TARGET_MACH) command = g_strdup_printf ("dsymutil %s", outfile_name); aot_printf (acfg, "Executing dsymutil: %s\n", command); - if (system (command) != 0) { + if (execute_system (command) != 0) { return 1; } #endif @@ -8722,12 +8867,22 @@ compile_asm (MonoAotCompile *acfg) return 0; } +static void init_got_info (GotInfo *info) +{ + int i; + + info->patch_to_got_offset = g_hash_table_new (mono_patch_info_hash, mono_patch_info_equal); + info->patch_to_got_offset_by_type = g_new0 (GHashTable*, MONO_PATCH_INFO_NUM); + for (i = 0; i < MONO_PATCH_INFO_NUM; ++i) + info->patch_to_got_offset_by_type [i] = g_hash_table_new (mono_patch_info_hash, mono_patch_info_equal); + info->got_patches = g_ptr_array_new (); +} + static MonoAotCompile* acfg_create (MonoAssembly *ass, guint32 opts) { MonoImage *image = ass->image; MonoAotCompile *acfg; - int i; acfg = g_new0 (MonoAotCompile, 1); acfg->methods = g_ptr_array_new (); @@ -8735,11 +8890,6 @@ acfg_create (MonoAssembly *ass, guint32 opts) acfg->method_depth = g_hash_table_new (NULL, NULL); acfg->plt_offset_to_entry = g_hash_table_new (NULL, NULL); acfg->patch_to_plt_entry = g_new0 (GHashTable*, MONO_PATCH_INFO_NUM); - acfg->patch_to_got_offset = g_hash_table_new (mono_patch_info_hash, mono_patch_info_equal); - acfg->patch_to_got_offset_by_type = g_new0 (GHashTable*, MONO_PATCH_INFO_NUM); - for (i = 0; i < MONO_PATCH_INFO_NUM; ++i) - acfg->patch_to_got_offset_by_type [i] = g_hash_table_new (mono_patch_info_hash, mono_patch_info_equal); - acfg->got_patches = g_ptr_array_new (); acfg->method_to_cfg = g_hash_table_new (NULL, NULL); acfg->token_info_hash = g_hash_table_new_full (NULL, NULL, NULL, NULL); acfg->method_to_pinvoke_import = g_hash_table_new_full (NULL, NULL, NULL, g_free); @@ -8762,9 +8912,24 @@ acfg_create (MonoAssembly *ass, guint32 opts) acfg->plt_entry_debug_sym_cache = g_hash_table_new (g_str_hash, g_str_equal); mono_mutex_init_recursive (&acfg->mutex); + init_got_info (&acfg->got_info); + init_got_info (&acfg->llvm_got_info); + return acfg; } +static void +got_info_free (GotInfo *info) +{ + int i; + + for (i = 0; i < MONO_PATCH_INFO_NUM; ++i) + g_hash_table_destroy (info->patch_to_got_offset_by_type [i]); + g_free (info->patch_to_got_offset_by_type); + g_hash_table_destroy (info->patch_to_got_offset); + g_ptr_array_free (info->got_patches, TRUE); +} + static void acfg_free (MonoAotCompile *acfg) { @@ -8779,7 +8944,6 @@ acfg_free (MonoAotCompile *acfg) g_free (acfg->got_symbol); g_free (acfg->plt_symbol); g_ptr_array_free (acfg->methods, TRUE); - g_ptr_array_free (acfg->got_patches, TRUE); g_ptr_array_free (acfg->image_table, TRUE); g_ptr_array_free (acfg->globals, TRUE); g_ptr_array_free (acfg->unwind_ops, TRUE); @@ -8791,7 +8955,6 @@ acfg_free (MonoAotCompile *acfg) g_hash_table_destroy (acfg->patch_to_plt_entry [i]); } g_free (acfg->patch_to_plt_entry); - g_hash_table_destroy (acfg->patch_to_got_offset); g_hash_table_destroy (acfg->method_to_cfg); g_hash_table_destroy (acfg->token_info_hash); g_hash_table_destroy (acfg->method_to_pinvoke_import); @@ -8802,13 +8965,165 @@ acfg_free (MonoAotCompile *acfg) g_hash_table_destroy (acfg->plt_entry_debug_sym_cache); g_hash_table_destroy (acfg->klass_blob_hash); g_hash_table_destroy (acfg->method_blob_hash); - for (i = 0; i < MONO_PATCH_INFO_NUM; ++i) - g_hash_table_destroy (acfg->patch_to_got_offset_by_type [i]); - g_free (acfg->patch_to_got_offset_by_type); + got_info_free (&acfg->got_info); + got_info_free (&acfg->llvm_got_info); mono_mempool_destroy (acfg->mempool); g_free (acfg); } +#define WRAPPER(e,n) n, +static const char* const +wrapper_type_names [MONO_WRAPPER_NUM + 1] = { +#include "mono/metadata/wrapper-types.h" + NULL +}; + +static G_GNUC_UNUSED const char* +get_wrapper_type_name (int type) +{ + return wrapper_type_names [type]; +} + +//#define DUMP_PLT +//#define DUMP_GOT + +static void aot_dump (MonoAotCompile *acfg) +{ + FILE *dumpfile; + char * dumpname; + + JsonWriter writer; + json_writer_init (&writer); + + json_writer_object_begin(&writer); + + // Methods + json_writer_indent (&writer); + json_writer_object_key(&writer, "methods"); + json_writer_array_begin (&writer); + + int i; + for (i = 0; i < acfg->nmethods; ++i) { + MonoCompile *cfg; + MonoMethod *method; + MonoClass *klass; + + cfg = acfg->cfgs [i]; + if (!cfg) + continue; + + method = cfg->orig_method; + + json_writer_indent (&writer); + json_writer_object_begin(&writer); + + json_writer_indent (&writer); + json_writer_object_key(&writer, "name"); + json_writer_printf (&writer, "\"%s\",\n", method->name); + + json_writer_indent (&writer); + json_writer_object_key(&writer, "signature"); + json_writer_printf (&writer, "\"%s\",\n", mono_method_full_name (method, + /*signature=*/TRUE)); + + json_writer_indent (&writer); + json_writer_object_key(&writer, "code_size"); + json_writer_printf (&writer, "\"%d\",\n", cfg->code_size); + + klass = method->klass; + + json_writer_indent (&writer); + json_writer_object_key(&writer, "class"); + json_writer_printf (&writer, "\"%s\",\n", klass->name); + + json_writer_indent (&writer); + json_writer_object_key(&writer, "namespace"); + json_writer_printf (&writer, "\"%s\",\n", klass->name_space); + + json_writer_indent (&writer); + json_writer_object_key(&writer, "wrapper_type"); + json_writer_printf (&writer, "\"%s\",\n", get_wrapper_type_name(method->wrapper_type)); + + json_writer_indent_pop (&writer); + json_writer_indent (&writer); + json_writer_object_end (&writer); + json_writer_printf (&writer, ",\n"); + } + + json_writer_indent_pop (&writer); + json_writer_indent (&writer); + json_writer_array_end (&writer); + json_writer_printf (&writer, ",\n"); + + // PLT entries +#ifdef DUMP_PLT + json_writer_indent_push (&writer); + json_writer_indent (&writer); + json_writer_object_key(&writer, "plt"); + json_writer_array_begin (&writer); + + for (i = 0; i < acfg->plt_offset; ++i) { + MonoPltEntry *plt_entry = NULL; + MonoJumpInfo *ji; + + if (i == 0) + /* + * The first plt entry is unused. + */ + continue; + + plt_entry = g_hash_table_lookup (acfg->plt_offset_to_entry, GUINT_TO_POINTER (i)); + ji = plt_entry->ji; + + json_writer_indent (&writer); + json_writer_printf (&writer, "{ "); + json_writer_object_key(&writer, "symbol"); + json_writer_printf (&writer, "\"%s\" },\n", plt_entry->symbol); + } + + json_writer_indent_pop (&writer); + json_writer_indent (&writer); + json_writer_array_end (&writer); + json_writer_printf (&writer, ",\n"); +#endif + + // GOT entries +#ifdef DUMP_GOT + json_writer_indent_push (&writer); + json_writer_indent (&writer); + json_writer_object_key(&writer, "got"); + json_writer_array_begin (&writer); + + json_writer_indent_push (&writer); + for (i = 0; i < acfg->got_info.got_patches->len; ++i) { + MonoJumpInfo *ji = g_ptr_array_index (acfg->got_info.got_patches, i); + + json_writer_indent (&writer); + json_writer_printf (&writer, "{ "); + json_writer_object_key(&writer, "patch_name"); + json_writer_printf (&writer, "\"%s\" },\n", get_patch_name (ji->type)); + } + + json_writer_indent_pop (&writer); + json_writer_indent (&writer); + json_writer_array_end (&writer); + json_writer_printf (&writer, ",\n"); +#endif + + json_writer_indent_pop (&writer); + json_writer_indent (&writer); + json_writer_object_end (&writer); + + dumpname = g_strdup_printf ("%s.json", g_path_get_basename (acfg->image->name)); + dumpfile = fopen (dumpname, "w+"); + g_free (dumpname); + + fprintf (dumpfile, "%s", writer.text->str); + fclose (dumpfile); + + json_writer_destroy (&writer); +} + int mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) { @@ -8873,7 +9188,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) MonoDebugOptions *opt = mini_get_debug_options (); opt->mdb_optimizations = TRUE; - opt->gen_seq_points = TRUE; + opt->gen_seq_points_debug_data = TRUE; if (!mono_debug_enabled ()) { aot_printerrf (acfg, "The soft-debug AOT option requires the --debug option.\n"); @@ -8893,6 +9208,22 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) } mini_llvm_init (); + + if (!acfg->aot_opts.asm_only || acfg->aot_opts.llvm_outfile) { + /* + * Emit all LLVM code into a separate assembly/object file and link with it + * normally. + */ +#if LLVM_API_VERSION >= 3 + acfg->llvm_separate = TRUE; + if (!acfg->aot_opts.asm_only) + acfg->llvm_owriter = TRUE; +#endif + } + if (acfg->aot_opts.llvm_outfile && !acfg->llvm_separate) { + aot_printerrf (acfg, "The llvm-outputfile= option is not supported on this platform.\n"); + return 1; + } } if (acfg->aot_opts.full_aot) @@ -8922,24 +9253,26 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) arch_init (acfg); - acfg->got_symbol_base = g_strdup_printf ("mono_aot_%s_got", acfg->image->assembly->aname.name); - acfg->plt_symbol = g_strdup_printf ("%smono_aot_%s_plt", acfg->llvm_label_prefix, acfg->image->assembly->aname.name); acfg->assembly_name_sym = g_strdup (acfg->image->assembly->aname.name); - /* Get rid of characters which cannot occur in symbols */ - for (p = acfg->got_symbol_base; *p; ++p) { - if (!(isalnum (*p) || *p == '_')) - *p = '_'; - } - for (p = acfg->plt_symbol; *p; ++p) { - if (!(isalnum (*p) || *p == '_')) - *p = '_'; - } for (p = acfg->assembly_name_sym; *p; ++p) { if (!(isalnum (*p) || *p == '_')) *p = '_'; } + acfg->got_symbol_base = g_strdup_printf ("mono_aot_%s_got", acfg->assembly_name_sym); + acfg->llvm_got_symbol_base = g_strdup_printf ("mono_aot_%s_llvm_got", acfg->assembly_name_sym); + acfg->plt_symbol = g_strdup_printf ("%smono_aot_%s_plt", acfg->llvm_label_prefix, acfg->assembly_name_sym); + + acfg->got_symbol = g_strdup_printf ("%s%s", acfg->llvm_label_prefix, acfg->got_symbol_base); + if (acfg->llvm) { + acfg->llvm_got_symbol = g_strdup_printf ("%s%s", acfg->llvm_label_prefix, acfg->llvm_got_symbol_base); + if (acfg->llvm_separate) + acfg->llvm_eh_frame_symbol = g_strdup_printf ("mono_aot_%s_eh_frame", acfg->assembly_name_sym); + else + acfg->llvm_eh_frame_symbol = g_strdup ("mono_eh_frame"); + } + acfg->method_index = 1; // FIXME: @@ -8961,7 +9294,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) #ifdef ENABLE_LLVM if (acfg->llvm) { llvm_acfg = acfg; - mono_llvm_create_aot_module (acfg->got_symbol_base); + mono_llvm_create_aot_module (acfg->llvm_got_symbol_base, acfg->llvm_separate, acfg->llvm_separate); } #endif @@ -8973,21 +9306,25 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) ji->type = MONO_PATCH_INFO_IMAGE; ji->data.image = acfg->image; - get_got_offset (acfg, ji); + get_got_offset (acfg, FALSE, ji); + get_got_offset (acfg, TRUE, ji); /* Slot 1 is reserved for the mscorlib got addr */ ji = mono_mempool_alloc0 (acfg->mempool, sizeof (MonoAotCompile)); ji->type = MONO_PATCH_INFO_MSCORLIB_GOT_ADDR; - get_got_offset (acfg, ji); + get_got_offset (acfg, FALSE, ji); + get_got_offset (acfg, TRUE, ji); /* This is very common */ ji = mono_mempool_alloc0 (acfg->mempool, sizeof (MonoAotCompile)); ji->type = MONO_PATCH_INFO_GC_CARD_TABLE_ADDR; - get_got_offset (acfg, ji); + get_got_offset (acfg, FALSE, ji); + get_got_offset (acfg, TRUE, ji); ji = mono_mempool_alloc0 (acfg->mempool, sizeof (MonoAotCompile)); ji->type = MONO_PATCH_INFO_JIT_TLS_ID; - get_got_offset (acfg, ji); + get_got_offset (acfg, FALSE, ji); + get_got_offset (acfg, TRUE, ji); } TV_GETTIME (atv); @@ -9012,9 +9349,15 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) acfg->tmpbasename = g_strdup_printf ("%s", acfg->image->name); acfg->tmpfname = g_strdup_printf ("%s.s", acfg->tmpbasename); } + if (acfg->llvm_separate) { + g_assert (acfg->aot_opts.llvm_outfile); + acfg->llvm_sfile = g_strdup (acfg->aot_opts.llvm_outfile); + } } else { acfg->tmpbasename = g_strdup_printf ("%s", "temp"); acfg->tmpfname = g_strdup_printf ("%s.s", acfg->tmpbasename); + acfg->llvm_sfile = g_strdup ("temp-llvm.s"); + acfg->llvm_ofile = g_strdup ("temp-llvm.o"); } res = emit_llvm_file (acfg); @@ -9027,7 +9370,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) if (acfg->aot_opts.outfile) outfile_name = g_strdup_printf ("%s", acfg->aot_opts.outfile); else - outfile_name = g_strdup_printf ("%s%s", acfg->image->name, SHARED_EXT); + outfile_name = g_strdup_printf ("%s%s", acfg->image->name, MONO_SOLIB_EXT); /* * Can't use g_file_open_tmp () as it will be deleted at exit, and @@ -9044,7 +9387,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) acfg->w = img_writer_create (acfg->fp, TRUE); acfg->use_bin_writer = TRUE; } else { - if (acfg->llvm) { + if (acfg->llvm && !acfg->llvm_separate) { /* Append to the .s file created by llvm */ /* FIXME: Use multiple files instead */ acfg->fp = fopen (acfg->tmpfname, "a+"); @@ -9070,8 +9413,6 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) outfile_name = NULL; } - acfg->got_symbol = g_strdup_printf ("%s%s", acfg->llvm_label_prefix, acfg->got_symbol_base); - /* Compute symbols for methods */ for (i = 0; i < acfg->nmethods; ++i) { if (acfg->cfgs [i]) { @@ -9080,10 +9421,11 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) if (COMPILE_LLVM (cfg)) cfg->asm_symbol = g_strdup_printf ("%s%s", acfg->llvm_label_prefix, cfg->llvm_method_name); - else if (acfg->global_symbols) - cfg->asm_symbol = get_debug_sym (cfg->method, "", acfg->method_label_hash); + else if (acfg->global_symbols || acfg->llvm_separate) + cfg->asm_symbol = get_debug_sym (cfg->orig_method, "", acfg->method_label_hash); else cfg->asm_symbol = g_strdup_printf ("%s%sm_%x", acfg->temp_prefix, acfg->llvm_label_prefix, method_index); + cfg->asm_debug_symbol = cfg->asm_symbol; } } @@ -9117,7 +9459,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) */ sprintf (symbol, "thumb_end"); emit_section_change (acfg, ".text", 0); - emit_alignment (acfg, 8); + emit_alignment_code (acfg, 8); emit_label (acfg, symbol); emit_zero_bytes (acfg, 16); @@ -9134,7 +9476,9 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) emit_class_name_table (acfg); - emit_got_info (acfg); + emit_got_info (acfg, FALSE); + if (acfg->llvm) + emit_got_info (acfg, TRUE); emit_exception_info (acfg); @@ -9176,9 +9520,6 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) acfg->stats.gen_time = TV_ELAPSED (atv, btv); - if (acfg->llvm) - g_assert (acfg->got_offset <= acfg->final_got_size); - if (acfg->llvm) sprintf (llvm_stats_msg, ", LLVM: %d (%d%%)", acfg->stats.llvm_count, acfg->stats.mcount ? (acfg->stats.llvm_count * 100) / acfg->stats.mcount : 100); else @@ -9244,6 +9585,9 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) aot_printf (acfg, "JIT time: %d ms, Generation time: %d ms, Assembly+Link time: %d ms.\n", acfg->stats.jit_time / 1000, acfg->stats.gen_time / 1000, acfg->stats.link_time / 1000); + if (acfg->aot_opts.dump_json) + aot_dump (acfg); + acfg_free (acfg); return 0; diff --git a/mta-mono/vendor/mono/mini/aot-runtime.c b/mta-mono/vendor/mono/mini/aot-runtime.c index 63b62da..6c2ad4f 100644 --- a/mta-mono/vendor/mono/mini/aot-runtime.c +++ b/mta-mono/vendor/mono/mini/aot-runtime.c @@ -58,6 +58,7 @@ #include #include "mini.h" +#include "seq-points.h" #include "version.h" #ifndef DISABLE_AOT @@ -66,16 +67,6 @@ #define ENABLE_AOT_CACHE #endif -#ifdef TARGET_WIN32 -#define SHARED_EXT ".dll" -#elif ((defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__)) || defined(__MACH__)) && !defined(__linux__) -#define SHARED_EXT ".dylib" -#elif defined(__APPLE__) && defined(TARGET_X86) && !defined(__native_client_codegen__) -#define SHARED_EXT ".dylib" -#else -#define SHARED_EXT ".so" -#endif - #define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1)) #define ALIGN_PTR_TO(ptr,align) (gpointer)((((gssize)(ptr)) + (align - 1)) & (~(align - 1))) #define ROUND_DOWN(VALUE,SIZE) ((VALUE) & ~((SIZE) - 1)) @@ -89,6 +80,7 @@ typedef struct MonoAotModule { char *aot_name; /* Pointer to the Global Offset Table */ gpointer *got; + gpointer *llvm_got; GHashTable *name_cache; GHashTable *extra_methods; /* Maps methods to their code */ @@ -104,8 +96,12 @@ typedef struct MonoAotModule { gboolean plt_inited; guint8 *mem_begin; guint8 *mem_end; + /* Points to either the start of JIT compiler or LLVM compiled code */ guint8 *code; - guint8 *code_end; + guint8 *jit_code_start; + guint8 *jit_code_end; + guint8 *llvm_code_start; + guint8 *llvm_code_end; guint8 *plt; guint8 *plt_end; guint8 *blob; @@ -116,7 +112,6 @@ typedef struct MonoAotModule { gint32 *sorted_code_offsets; gint32 sorted_code_offsets_len; guint32 *method_info_offsets; - guint32 *got_info_offsets; guint32 *ex_info_offsets; guint32 *class_info_offsets; guint32 *methods_loaded; @@ -125,6 +120,7 @@ typedef struct MonoAotModule { guint32 *extra_method_info_offsets; guint32 *unbox_trampolines; guint32 *unbox_trampolines_end; + guint32 *unbox_trampoline_addresses; guint8 *unwind_info; guint8 *thumb_end; @@ -207,6 +203,9 @@ static mono_mutex_t aot_page_mutex; static void init_plt (MonoAotModule *info); +static void +compute_llvm_code_range (MonoAotModule *amodule, guint8 **code_start, guint8 **code_end); + /*****************************************************/ /* AOT RUNTIME */ /*****************************************************/ @@ -905,8 +904,6 @@ decode_method_ref_with_target (MonoAotModule *module, MethodRef *ref, MonoMethod break; } case MONO_WRAPPER_UNKNOWN: { - MonoMethodDesc *desc; - MonoMethod *orig_method; int subtype = decode_value (p, &p); if (subtype == WRAPPER_SUBTYPE_PTR_TO_STRUCTURE || subtype == WRAPPER_SUBTYPE_STRUCTURE_TO_PTR) { @@ -946,18 +943,7 @@ decode_method_ref_with_target (MonoAotModule *module, MethodRef *ref, MonoMethod } else if (subtype == WRAPPER_SUBTYPE_GSHAREDVT_OUT) { ref->method = mono_marshal_get_gsharedvt_out_wrapper (); } else { - if (subtype == WRAPPER_SUBTYPE_FAST_MONITOR_ENTER) - desc = mono_method_desc_new ("Monitor:Enter", FALSE); - else if (subtype == WRAPPER_SUBTYPE_FAST_MONITOR_EXIT) - desc = mono_method_desc_new ("Monitor:Exit", FALSE); - else if (subtype == WRAPPER_SUBTYPE_FAST_MONITOR_ENTER_V4) - desc = mono_method_desc_new ("Monitor:Enter(object,bool&)", FALSE); - else - g_assert_not_reached (); - orig_method = mono_method_desc_search_in_class (desc, mono_defaults.monitor_class); - g_assert (orig_method); - mono_method_desc_free (desc); - ref->method = mono_monitor_get_fast_path (orig_method); + g_assert_not_reached (); } break; } @@ -1157,6 +1143,7 @@ decode_method_ref_with_target (MonoAotModule *module, MethodRef *ref, MonoMethod if (!image) return FALSE; } else if (image_index == MONO_AOT_METHODREF_GINST) { + MonoError error; MonoClass *klass; MonoGenericContext ctx; @@ -1188,7 +1175,8 @@ decode_method_ref_with_target (MonoAotModule *module, MethodRef *ref, MonoMethod ctx.class_inst = klass->generic_class->context.class_inst; ctx.method_inst = NULL; - ref->method = mono_class_inflate_generic_method_full (ref->method, klass, &ctx); + ref->method = mono_class_inflate_generic_method_full_checked (ref->method, klass, &ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } memset (&ctx, 0, sizeof (ctx)); @@ -1196,7 +1184,8 @@ decode_method_ref_with_target (MonoAotModule *module, MethodRef *ref, MonoMethod if (!decode_generic_context (module, &ctx, p, &p)) return FALSE; - ref->method = mono_class_inflate_generic_method_full (ref->method, klass, &ctx); + ref->method = mono_class_inflate_generic_method_full_checked (ref->method, klass, &ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } else if (image_index == MONO_AOT_METHODREF_ARRAY) { MonoClass *klass; int method_type; @@ -1444,7 +1433,7 @@ aot_cache_load_module (MonoAssembly *assembly, char **aot_name) */ hash = get_aot_config_hash (assembly); - tmp2 = g_strdup_printf ("%s-%s%s", assembly->image->assembly_name, hash, SHARED_EXT); + tmp2 = g_strdup_printf ("%s-%s%s", assembly->image->assembly_name, hash, MONO_SOLIB_EXT); fname = g_build_filename (cache_dir, tmp2, NULL); *aot_name = fname; g_free (tmp2); @@ -1697,14 +1686,19 @@ check_usable (MonoAssembly *assembly, MonoAotFileInfo *info, char **out_msg) return usable; } -/* This returns an interop address */ +/* + * TABLE should point to a table of call instructions. Return the address called by the INDEXth entry. + */ static void* -get_arm_bl_target (guint32 *ins_addr) +get_call_table_entry (void *table, int index) { -#ifdef TARGET_ARM - guint32 ins = *ins_addr; +#if defined(TARGET_ARM) + guint32 *ins_addr; + guint32 ins; gint32 offset; + ins_addr = (guint32*)table + index; + ins = *ins_addr; if ((ins >> ARMCOND_SHIFT) == ARMCOND_NV) { /* blx */ offset = (((int)(((ins & 0xffffff) << 1) | ((ins >> 24) & 0x1))) << 7) >> 7; @@ -1714,7 +1708,10 @@ get_arm_bl_target (guint32 *ins_addr) return (char*)ins_addr + (offset * 4) + 8; } #elif defined(TARGET_ARM64) - return mono_arch_get_call_target (((guint8*)ins_addr) + 4); + return mono_arch_get_call_target ((guint8*)table + (index * 4) + 4); +#elif defined(TARGET_X86) || defined(TARGET_AMD64) + /* The callee expects an ip which points after the call */ + return mono_arch_get_call_target ((guint8*)table + (index * 5) + 5); #else g_assert_not_reached (); return NULL; @@ -1772,13 +1769,21 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data) sofile = aot_cache_load_module (assembly, &aot_name); if (!sofile) { char *err; - aot_name = g_strdup_printf ("%s%s", assembly->image->name, SHARED_EXT); + aot_name = g_strdup_printf ("%s%s", assembly->image->name, MONO_SOLIB_EXT); sofile = mono_dl_open (aot_name, MONO_DL_LAZY, &err); if (!sofile) { mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_AOT, "AOT module '%s' not found: %s\n", aot_name, err); g_free (err); + + aot_name = g_strdup_printf ("%s/mono/aot-cache/%s/%s%s", mono_assembly_getrootdir(), ARCHITECTURE, g_path_get_basename (assembly->image->name), MONO_SOLIB_EXT); + sofile = mono_dl_open (aot_name, MONO_DL_LAZY, &err); + if (!sofile) { + mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_AOT, "AOT module '%s' not found: %s\n", aot_name, err); + g_free (err); + } + } } } @@ -1860,7 +1865,7 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data) memcpy (&amodule->info, info, sizeof (*info)); amodule->got = amodule->info.got; - amodule->got [0] = assembly->image; + amodule->llvm_got = amodule->info.llvm_got; amodule->globals = globals; amodule->sofile = sofile; amodule->method_to_code = g_hash_table_new (mono_aligned_addr_hash, NULL); @@ -1909,14 +1914,14 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data) } } - amodule->code_offsets = info->code_offsets; amodule->method_addresses = info->method_addresses; amodule->code = info->methods; #ifdef TARGET_ARM /* Mask out thumb interop bit */ amodule->code = (void*)((mgreg_t)amodule->code & ~1); #endif - amodule->code_end = info->methods_end; + amodule->jit_code_start = info->jit_code_start; + amodule->jit_code_end = info->jit_code_end; amodule->method_info_offsets = info->method_info_offsets; amodule->ex_info_offsets = info->ex_info_offsets; amodule->class_info_offsets = info->class_info_offsets; @@ -1925,7 +1930,7 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data) amodule->extra_method_info_offsets = info->extra_method_info_offsets; amodule->unbox_trampolines = info->unbox_trampolines; amodule->unbox_trampolines_end = info->unbox_trampolines_end; - amodule->got_info_offsets = info->got_info_offsets; + amodule->unbox_trampoline_addresses = info->unbox_trampoline_addresses; amodule->unwind_info = info->unwind_info; amodule->mem_end = info->mem_end; amodule->mem_begin = amodule->code; @@ -1938,26 +1943,18 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data) amodule->trampolines [MONO_AOT_TRAMP_GSHAREDVT_ARG] = info->gsharedvt_arg_trampolines; amodule->thumb_end = info->thumb_end; - if (info->flags & MONO_AOT_FILE_FLAG_DIRECT_METHOD_ADDRESSES) { - /* Compute code_offsets from the method addresses */ - amodule->code_offsets = g_malloc0 (amodule->info.nmethods * sizeof (gint32)); - for (i = 0; i < amodule->info.nmethods; ++i) { - /* method_addresses () contains a table of branches, since the ios linker can update those correctly */ - void *addr = NULL; + /* Compute code_offsets from the method addresses */ + amodule->code_offsets = g_malloc0 (amodule->info.nmethods * sizeof (gint32)); + for (i = 0; i < amodule->info.nmethods; ++i) { + /* method_addresses () contains a table of branches, since the ios linker can update those correctly */ + void *addr; -#if defined(TARGET_ARM) || defined(TARGET_ARM64) - addr = get_arm_bl_target ((guint32*)amodule->method_addresses + i); -#elif defined(TARGET_X86) || defined(TARGET_AMD64) - addr = mono_arch_get_call_target ((guint8*)amodule->method_addresses + (i * 5) + 5); -#else - g_assert_not_reached (); -#endif - g_assert (addr); - if (addr == amodule->method_addresses) - amodule->code_offsets [i] = 0xffffffff; - else - amodule->code_offsets [i] = (char*)addr - (char*)amodule->code; - } + addr = get_call_table_entry (amodule->method_addresses, i); + g_assert (addr); + if (addr == amodule->method_addresses) + amodule->code_offsets [i] = 0xffffffff; + else + amodule->code_offsets [i] = (char*)addr - (char*)amodule->code; } if (make_unreadable) { @@ -1979,18 +1976,30 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data) #endif } + /* Compute the boundaries of LLVM code */ + if (info->flags & MONO_AOT_FILE_FLAG_WITH_LLVM) + compute_llvm_code_range (amodule, &amodule->llvm_code_start, &amodule->llvm_code_end); + mono_aot_lock (); - aot_code_low_addr = MIN (aot_code_low_addr, (gsize)amodule->code); - aot_code_high_addr = MAX (aot_code_high_addr, (gsize)amodule->code_end); + aot_code_low_addr = MIN (aot_code_low_addr, (gsize)amodule->jit_code_start); + aot_code_high_addr = MAX (aot_code_high_addr, (gsize)amodule->jit_code_end); + if (amodule->llvm_code_start) { + aot_code_low_addr = MIN (aot_code_low_addr, (gsize)amodule->llvm_code_start); + aot_code_high_addr = MAX (aot_code_high_addr, (gsize)amodule->llvm_code_end); + } g_hash_table_insert (aot_modules, assembly, amodule); mono_aot_unlock (); - mono_jit_info_add_aot_module (assembly->image, amodule->code, amodule->code_end); + mono_jit_info_add_aot_module (assembly->image, amodule->jit_code_start, amodule->jit_code_end); + if (amodule->llvm_code_start) + mono_jit_info_add_aot_module (assembly->image, amodule->llvm_code_start, amodule->llvm_code_end); assembly->image->aot_module = amodule; + amodule->got [0] = assembly->image; + if (mono_aot_only) { char *code; find_symbol (amodule->sofile, amodule->globals, "specific_trampolines_page", (gpointer *)&code); @@ -2015,6 +2024,12 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data) amodule->got [2] = mono_resolve_patch_target (NULL, mono_get_root_domain (), NULL, &ji, FALSE); } + if (amodule->llvm_got) { + amodule->llvm_got [0] = amodule->got [0]; + amodule->llvm_got [1] = amodule->got [1]; + amodule->llvm_got [2] = amodule->got [2]; + } + /* * Since we store methoddef and classdef tokens when referring to methods/classes in * referenced assemblies, we depend on the exact versions of the referenced assemblies. @@ -2333,6 +2348,42 @@ mono_aot_get_class_from_name (MonoImage *image, const char *name_space, const ch return TRUE; } +/* Compute the boundaries of the LLVM code for AMODULE. */ +static void +compute_llvm_code_range (MonoAotModule *amodule, guint8 **code_start, guint8 **code_end) +{ + guint8 *p; + int version, fde_count; + gint32 *table; + + g_assert (amodule->mono_eh_frame); + + p = amodule->mono_eh_frame; + + /* p points to data emitted by LLVM in DwarfException::EmitMonoEHFrame () */ + + /* Header */ + version = *p; + g_assert (version == 3); + p ++; + p ++; + p = ALIGN_PTR_TO (p, 4); + + fde_count = *(guint32*)p; + p += 4; + table = (gint32*)p; + + if (fde_count > 1) { + /* mono_aot_personality () */ + g_assert (table [0] == -1); + *code_start = amodule->code + amodule->code_offsets [table [2]]; + *code_end = amodule->code + amodule->code_offsets [table [(fde_count - 1) * 2]] + table [fde_count * 2]; + } else { + *code_start = NULL; + *code_end = NULL; + } +} + /* * decode_mono_eh_frame: * @@ -2391,7 +2442,7 @@ decode_llvm_mono_eh_frame (MonoAotModule *amodule, MonoDomain *domain, g_assert (table [(pos * 2)] != -1); offset1 = amodule->code_offsets [table [(pos * 2)]]; if (pos + 1 == fde_count) { - offset2 = amodule->code_end - amodule->code; + offset2 = amodule->llvm_code_end - amodule->llvm_code_start; } else { g_assert (table [(pos + 1) * 2] != -1); offset2 = amodule->code_offsets [table [(pos + 1) * 2]]; @@ -2731,6 +2782,7 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain, entry->from = decode_value (p, &p); entry->to = decode_value (p, &p); } + gi->has_this = 1; } else { if (from_llvm) { gi->has_this = this_reg != -1; @@ -2772,30 +2824,8 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain, if (method && has_seq_points) { MonoSeqPointInfo *seq_points; - int il_offset, native_offset, last_il_offset, last_native_offset, j; - int len = decode_value (p, &p); - - seq_points = g_malloc0 (sizeof (MonoSeqPointInfo) + (len - MONO_ZERO_LEN_ARRAY) * sizeof (SeqPoint)); - seq_points->len = len; - last_il_offset = last_native_offset = 0; - for (i = 0; i < len; ++i) { - SeqPoint *sp = &seq_points->seq_points [i]; - il_offset = last_il_offset + decode_value (p, &p); - native_offset = last_native_offset + decode_value (p, &p); - - sp->il_offset = il_offset; - sp->native_offset = native_offset; - - sp->flags = decode_value (p, &p); - sp->next_len = decode_value (p, &p); - sp->next = g_new (int, sp->next_len); - for (j = 0; j < sp->next_len; ++j) - sp->next [j] = decode_value (p, &p); - - last_il_offset = il_offset; - last_native_offset = native_offset; - } + p += seq_point_info_read (&seq_points, p, FALSE); mono_domain_lock (domain); g_hash_table_insert (domain_jit_info (domain)->seq_points, method, seq_points); @@ -2828,6 +2858,13 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain, return jinfo; } +static gboolean +amodule_contains_code_addr (MonoAotModule *amodule, guint8 *code) +{ + return (code >= amodule->jit_code_start && code <= amodule->jit_code_end) || + (code >= amodule->llvm_code_start && code <= amodule->llvm_code_end); +} + /* * mono_aot_get_unwind_info: * @@ -2847,13 +2884,13 @@ mono_aot_get_unwind_info (MonoJitInfo *ji, guint32 *unwind_info_len) g_assert (amodule); g_assert (ji->from_aot); - if (!(code >= amodule->code && code <= amodule->code_end)) { + if (!amodule_contains_code_addr (amodule, code)) { /* ji belongs to a different aot module than amodule */ mono_aot_lock (); g_assert (ji_to_amodule); amodule = g_hash_table_lookup (ji_to_amodule, ji); g_assert (amodule); - g_assert (code >= amodule->code && code <= amodule->code_end); + g_assert (amodule_contains_code_addr (amodule, code)); mono_aot_unlock (); } @@ -2938,7 +2975,7 @@ mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr) MonoAotModule *amodule = image->aot_module; MonoMethod *method = NULL; MonoJitInfo *jinfo; - guint8 *code, *ex_info, *p; + guint8 *code, *code_end, *ex_info, *p; guint32 *table; int nmethods; gint32 *code_offsets; @@ -2954,6 +2991,9 @@ mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr) /* FIXME: */ return NULL; + if (!amodule_contains_code_addr (amodule, addr)) + return NULL; + async = mono_thread_info_is_async_context (); offset = (guint8*)addr - amodule->code; @@ -2987,8 +3027,7 @@ mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr) code_offsets = amodule->sorted_code_offsets; offsets_len = amodule->sorted_code_offsets_len; - if (offsets_len > 0 && (offset < code_offsets [0] || offset >= (amodule->code_end - amodule->code))) - return NULL; + code_end = amodule->jit_code_end > amodule->llvm_code_end ? amodule->jit_code_end : amodule->llvm_code_end; /* Binary search in the sorted_code_offsets table */ left = 0; @@ -2997,10 +3036,14 @@ mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr) pos = (left + right) / 2; offset1 = code_offsets [(pos * 2)]; - if (pos + 1 == offsets_len) - offset2 = amodule->code_end - amodule->code; - else + if (pos + 1 == offsets_len) { + if (amodule->code + offset1 >= amodule->jit_code_start && amodule->code + offset1 < amodule->jit_code_end) + offset2 = amodule->jit_code_end - amodule->code; + else + offset2 = amodule->llvm_code_end - amodule->code; + } else { offset2 = code_offsets [(pos + 1) * 2]; + } if (offset < offset1) right = pos; @@ -3032,10 +3075,14 @@ mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr) code = &amodule->code [amodule->code_offsets [method_index]]; ex_info = &amodule->blob [mono_aot_get_offset (amodule->ex_info_offsets, method_index)]; - if (pos == offsets_len - 1) - code_len = amodule->code_end - code; - else + if (pos == offsets_len - 1) { + if (code >= amodule->jit_code_start && code < amodule->jit_code_end) + code_len = amodule->jit_code_end - code; + else + code_len = amodule->llvm_code_end - code; + } else { code_len = code_offsets [(pos + 1) * 2] - code_offsets [pos * 2]; + } g_assert ((guint8*)code <= (guint8*)addr && (guint8*)addr < (guint8*)code + code_len); @@ -3276,6 +3323,7 @@ decode_patch (MonoAotModule *aot_module, MonoMemPool *mp, MonoJumpInfo *ji, guin case MONO_PATCH_INFO_INTERRUPTION_REQUEST_FLAG: case MONO_PATCH_INFO_GENERIC_CLASS_INIT: case MONO_PATCH_INFO_MONITOR_ENTER: + case MONO_PATCH_INFO_MONITOR_ENTER_V4: case MONO_PATCH_INFO_MONITOR_EXIT: case MONO_PATCH_INFO_GC_CARD_TABLE_ADDR: case MONO_PATCH_INFO_JIT_TLS_ID: @@ -3367,6 +3415,17 @@ decode_patch (MonoAotModule *aot_module, MonoMemPool *mp, MonoJumpInfo *ji, guin ji->data.target = info; break; } + case MONO_PATCH_INFO_LDSTR_LIT: { + int len = decode_value (p, &p); + char *s; + + s = mono_mempool_alloc0 (mp, len + 1); + memcpy (s, p, len + 1); + p += len + 1; + + ji->data.target = s; + break; + } default: g_warning ("unhandled type %d", ji->type); g_assert_not_reached (); @@ -3381,16 +3440,26 @@ decode_patch (MonoAotModule *aot_module, MonoMemPool *mp, MonoJumpInfo *ji, guin } static MonoJumpInfo* -load_patch_info (MonoAotModule *aot_module, MonoMemPool *mp, int n_patches, - guint32 **got_slots, +load_patch_info (MonoAotModule *aot_module, MonoMemPool *mp, int n_patches, + gboolean llvm, guint32 **got_slots, guint8 *buf, guint8 **endbuf) { MonoJumpInfo *patches; int pindex; guint8 *p; + gpointer *got; + guint32 *got_offsets; p = buf; + if (llvm) { + got = aot_module->llvm_got; + got_offsets = aot_module->info.llvm_got_info_offsets; + } else { + got = aot_module->got; + got_offsets = aot_module->info.got_info_offsets; + } + patches = mono_mempool_alloc0 (mp, sizeof (MonoJumpInfo) * n_patches); *got_slots = g_malloc (sizeof (guint32) * n_patches); @@ -3403,12 +3472,12 @@ load_patch_info (MonoAotModule *aot_module, MonoMemPool *mp, int n_patches, got_offset = decode_value (p, &p); - shared_p = aot_module->blob + mono_aot_get_offset (aot_module->got_info_offsets, got_offset); + shared_p = aot_module->blob + mono_aot_get_offset (got_offsets, got_offset); ji->type = decode_value (shared_p, &shared_p); /* See load_method () for SFLDA */ - if (aot_module->got [got_offset] && ji->type != MONO_PATCH_INFO_SFLDA) { + if (got [got_offset] && ji->type != MONO_PATCH_INFO_SFLDA) { /* Already loaded */ } else { res = decode_patch (aot_module, mp, ji, shared_p, &shared_p); @@ -3500,12 +3569,6 @@ load_method (MonoDomain *domain, MonoAotModule *amodule, MonoImage *image, MonoM info = &amodule->blob [mono_aot_get_offset (amodule->method_info_offsets, method_index)]; - if (amodule->thumb_end && code < amodule->thumb_end && ((amodule->info.flags & MONO_AOT_FILE_FLAG_DIRECT_METHOD_ADDRESSES) == 0)) { - /* Convert this into a thumb address */ - g_assert ((amodule->code_offsets [method_index] & 0x1) == 0); - code = &amodule->code [amodule->code_offsets [method_index] + 1]; - } - if (!amodule->methods_loaded) { amodule_lock (amodule); if (!amodule->methods_loaded) { @@ -3566,13 +3629,24 @@ load_method (MonoDomain *domain, MonoAotModule *amodule, MonoImage *image, MonoM if (n_patches) { MonoJumpInfo *patches; guint32 *got_slots; + gboolean llvm; + gpointer *got; if (keep_patches) mp = domain->mp; else mp = mono_mempool_new (); - patches = load_patch_info (amodule, mp, n_patches, &got_slots, p, &p); + if ((gpointer)code >= amodule->info.jit_code_start && (gpointer)code <= amodule->info.jit_code_end) { + llvm = FALSE; + got = amodule->got; + } else { + llvm = TRUE; + got = amodule->llvm_got; + g_assert (got); + } + + patches = load_patch_info (amodule, mp, n_patches, llvm, &got_slots, p, &p); if (patches == NULL) goto cleanup; @@ -3585,14 +3659,14 @@ load_method (MonoDomain *domain, MonoAotModule *amodule, MonoImage *image, MonoM * been initialized by load_method () for a static cctor before the cctor has * finished executing (#23242). */ - if (!amodule->got [got_slots [pindex]] || ji->type == MONO_PATCH_INFO_SFLDA) { + if (!got [got_slots [pindex]] || ji->type == MONO_PATCH_INFO_SFLDA) { addr = mono_resolve_patch_target (method, domain, code, ji, TRUE); if (ji->type == MONO_PATCH_INFO_METHOD_JUMP) addr = mono_create_ftnptr (domain, addr); mono_memory_barrier (); - amodule->got [got_slots [pindex]] = addr; + got [got_slots [pindex]] = addr; if (ji->type == MONO_PATCH_INFO_METHOD_JUMP) - register_jump_target_got_slot (domain, ji->data.method, &(amodule->got [got_slots [pindex]])); + register_jump_target_got_slot (domain, ji->data.method, &(got [got_slots [pindex]])); } ji->type = MONO_PATCH_INFO_NONE; } @@ -3881,6 +3955,7 @@ mono_aot_get_method (MonoDomain *domain, MonoMethod *method) * an out parameter, so the managed-to-native wrappers can share the same code. */ if (method_index == 0xffffff && method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE && method->klass == mono_defaults.array_class && !strcmp (method->name, "GetGenericValueImpl")) { + MonoError error; MonoMethod *m; MonoGenericContext ctx; MonoType *args [16]; @@ -3896,7 +3971,8 @@ mono_aot_get_method (MonoDomain *domain, MonoMethod *method) args [0] = &mono_defaults.object_class->byval_arg; ctx.method_inst = mono_metadata_get_generic_inst (1, args); - m = mono_marshal_get_native_wrapper (mono_class_inflate_generic_method (m, &ctx), TRUE, TRUE); + m = mono_marshal_get_native_wrapper (mono_class_inflate_generic_method_checked (m, &ctx, &error), TRUE, TRUE); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ /* * Get the code for the instantiation which should be emitted into @@ -3913,6 +3989,7 @@ mono_aot_get_method (MonoDomain *domain, MonoMethod *method) ((!strcmp (method->klass->name_space, "System.Threading") && !strcmp (method->klass->name, "Interlocked") && (!strcmp (method->name, "CompareExchange") || !strcmp (method->name, "Exchange")) && MONO_TYPE_IS_REFERENCE (mono_method_signature (method)->params [1])) || (!strcmp (method->klass->name_space, "System.Threading") && !strcmp (method->klass->name, "Volatile") && (!strcmp (method->name, "Read") && MONO_TYPE_IS_REFERENCE (mono_method_signature (method)->ret))) || (!strcmp (method->klass->name_space, "System.Threading") && !strcmp (method->klass->name, "Volatile") && (!strcmp (method->name, "Write") && MONO_TYPE_IS_REFERENCE (mono_method_signature (method)->params [1]))))) { + MonoError error; MonoMethod *m; MonoGenericContext ctx; MonoType *args [16]; @@ -3928,7 +4005,8 @@ mono_aot_get_method (MonoDomain *domain, MonoMethod *method) args [0] = &mono_defaults.object_class->byval_arg; ctx.method_inst = mono_metadata_get_generic_inst (1, args); - m = mono_marshal_get_native_wrapper (mono_class_inflate_generic_method (m, &ctx), TRUE, TRUE); + m = mono_marshal_get_native_wrapper (mono_class_inflate_generic_method_checked (m, &ctx, &error), TRUE, TRUE); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ /* Avoid recursion */ if (method == m) @@ -4050,7 +4128,7 @@ find_aot_module_cb (gpointer key, gpointer value, gpointer user_data) FindAotModuleUserData *data = (FindAotModuleUserData*)user_data; MonoAotModule *aot_module = (MonoAotModule*)value; - if ((data->addr >= (guint8*)(aot_module->code)) && (data->addr < (guint8*)(aot_module->code_end))) + if (amodule_contains_code_addr (aot_module, data->addr)) data->module = aot_module; } @@ -4227,8 +4305,9 @@ mono_aot_get_plt_entry (guint8 *code) return NULL; #ifdef TARGET_ARM - if (amodule->thumb_end && code < amodule->thumb_end) { - return mono_arm_get_thumb_plt_entry (code); + if (amodule->thumb_end) { + if (code >= amodule->llvm_code_start && code < amodule->llvm_code_end) + return mono_arm_get_thumb_plt_entry (code); } #endif @@ -4378,7 +4457,7 @@ load_function_full (MonoAotModule *amodule, const char *name, MonoTrampInfo **ou mp = mono_mempool_new (); - patches = load_patch_info (amodule, mp, n_patches, &got_slots, p, &p); + patches = load_patch_info (amodule, mp, n_patches, FALSE, &got_slots, p, &p); g_assert (patches); for (pindex = 0; pindex < n_patches; ++pindex) { @@ -4416,6 +4495,9 @@ load_function_full (MonoAotModule *amodule, const char *name, MonoTrampInfo **ou } else if (!strcmp (ji->data.name, "specific_trampoline_monitor_enter")) { target = mono_create_specific_trampoline (NULL, MONO_TRAMPOLINE_MONITOR_ENTER, mono_get_root_domain (), NULL); target = mono_create_ftnptr_malloc (target); + } else if (!strcmp (ji->data.name, "specific_trampoline_monitor_enter_v4")) { + target = mono_create_specific_trampoline (NULL, MONO_TRAMPOLINE_MONITOR_ENTER_V4, mono_get_root_domain (), NULL); + target = mono_create_ftnptr_malloc (target); } else if (!strcmp (ji->data.name, "specific_trampoline_monitor_exit")) { target = mono_create_specific_trampoline (NULL, MONO_TRAMPOLINE_MONITOR_EXIT, mono_get_root_domain (), NULL); target = mono_create_ftnptr_malloc (target); @@ -4488,13 +4570,6 @@ mono_aot_get_trampoline (const char *name) #include static TrampolinePage* trampoline_pages [MONO_AOT_TRAMP_NUM]; -/* these sizes are for ARM code, parametrize if porting to other architectures (see arch_emit_specific_trampoline_pages) - * trampoline size is assumed to be 8 bytes below as well (8 is the minimum for 32 bit archs, since we need to store - * two pointers for trampoline in the data page). - * the minimum for the common code must be at least sizeof(TrampolinePage), since we store the page info at the - * beginning of the data page. - */ -static const int trampolines_pages_code_offsets [MONO_AOT_TRAMP_NUM] = {16, 16, 72, 16}; static unsigned char* get_new_trampoline_from_page (int tramp_type) @@ -4583,11 +4658,7 @@ get_new_trampoline_from_page (int tramp_type) page = (TrampolinePage*)addr; page->next = trampoline_pages [tramp_type]; trampoline_pages [tramp_type] = page; -#ifdef TARGET_ARM64 page->trampolines = (void*)(taddr + amodule->info.tramp_page_code_offsets [tramp_type]); -#else - page->trampolines = (void*)(taddr + trampolines_pages_code_offsets [tramp_type]); -#endif page->trampolines_end = (void*)(taddr + psize - 64); code = page->trampolines; page->trampolines += specific_trampoline_size; @@ -4792,7 +4863,7 @@ mono_aot_get_unbox_trampoline (MonoMethod *method) MonoAotModule *amodule; gpointer code; guint32 *ut, *ut_end, *entry; - int low, high, entry_index; + int low, high, entry_index = 0; if (method->is_inflated && !mono_method_is_generic_sharable_full (method, FALSE, FALSE, FALSE)) { method_index = find_extra_method (method, &amodule); @@ -4812,22 +4883,20 @@ mono_aot_get_unbox_trampoline (MonoMethod *method) /* Do a binary search in the sorted table */ code = NULL; low = 0; - high = (ut_end - ut) / 2; + high = (ut_end - ut); while (low < high) { entry_index = (low + high) / 2; - entry = &ut [(entry_index * 2)]; + entry = &ut [entry_index]; if (entry [0] < method_index) { low = entry_index + 1; } else if (entry [0] > method_index) { high = entry_index; } else { - if (amodule->info.flags & MONO_AOT_FILE_FLAG_DIRECT_METHOD_ADDRESSES) - code = get_arm_bl_target (entry + 1); - else - code = amodule->code + entry [1]; break; } } + + code = get_call_table_entry (amodule->unbox_trampoline_addresses, entry_index); g_assert (code); /* The caller expects an ftnptr */ diff --git a/mta-mono/vendor/mono/mini/aot-tests.cs b/mta-mono/vendor/mono/mini/aot-tests.cs index 9c8e933..82dba43 100644 --- a/mta-mono/vendor/mono/mini/aot-tests.cs +++ b/mta-mono/vendor/mono/mini/aot-tests.cs @@ -8,11 +8,17 @@ using System.Runtime.CompilerServices; * Regression tests for the AOT/FULL-AOT code. */ -class Tests { - - static int Main () { - return TestDriver.RunTests (typeof (Tests)); +#if MOBILE +class AotTests +#else +class Tests +#endif +{ +#if !MOBILE + static int Main (String[] args) { + return TestDriver.RunTests (typeof (Tests), args); } +#endif public delegate void ArrayDelegate (int[,] arr); @@ -23,4 +29,163 @@ class Tests { d.BeginInvoke (a, null, null); return 0; } + + struct Struct1 { + public double a, b; + } + + struct Struct2 { + public float a, b; + } + + class Foo { + /* The 'd' argument is used to shift the register indexes so 't' doesn't start at the first reg */ + public static T Get_T (double d, T t) { + return t; + } + } + + class Foo2 { + public static T Get_T (double d, T t) { + return t; + } + } + + class Foo3 { + public static T Get_T (double d, T t) { + return Foo2.Get_T (d, t); + } + } + + [Category ("DYNCALL")] + static int test_0_arm64_dyncall_double () { + double arg1 = 1.0f; + double s = 2.0f; + var res = (double)typeof (Foo).GetMethod ("Get_T").Invoke (null, new object [] { arg1, s }); + if (res != 2.0f) + return 1; + return 0; + } + + [Category ("DYNCALL")] + static int test_0_arm64_dyncall_float () { + double arg1 = 1.0f; + float s = 2.0f; + var res = (float)typeof (Foo).GetMethod ("Get_T").Invoke (null, new object [] { arg1, s }); + if (res != 2.0f) + return 1; + return 0; + } + + [Category ("DYNCALL")] + static int test_0_arm64_dyncall_hfa_double () { + double arg1 = 1.0f; + // HFA with double members + var s = new Struct1 (); + s.a = 1.0f; + s.b = 2.0f; + var s_res = (Struct1)typeof (Foo).GetMethod ("Get_T").Invoke (null, new object [] { arg1, s }); + if (s_res.a != 1.0f || s_res.b != 2.0f) + return 1; + return 0; + } + + [Category ("DYNCALL")] + static int test_0_arm64_dyncall_hfa_float () { + double arg1 = 1.0f; + var s = new Struct2 (); + s.a = 1.0f; + s.b = 2.0f; + var s_res = (Struct2)typeof (Foo).GetMethod ("Get_T").Invoke (null, new object [] { arg1, s }); + if (s_res.a != 1.0f || s_res.b != 2.0f) + return 1; + return 0; + } + + [Category ("GSHAREDVT")] + static int test_0_arm64_dyncall_gsharedvt_out_hfa_double () { + /* gsharedvt out trampoline with double hfa argument */ + double arg1 = 1.0f; + + var s = new Struct1 (); + s.a = 1.0f; + s.b = 2.0f; + // Call Foo2.Get_T directly, so its gets an instance + Foo2.Get_T (arg1, s); + Type t = typeof (Foo3<>).MakeGenericType (new Type [] { typeof (Struct1) }); + // Call Foo3.Get_T, this will call the gsharedvt instance, which will call the non-gsharedvt instance + var s_res = (Struct1)t.GetMethod ("Get_T").Invoke (null, new object [] { arg1, s }); + if (s_res.a != 1.0f || s_res.b != 2.0f) + return 1; + return 0; + } + + [Category ("GSHAREDVT")] + static int test_0_arm64_dyncall_gsharedvt_out_hfa_float () { + /* gsharedvt out trampoline with double hfa argument */ + double arg1 = 1.0f; + + var s = new Struct2 (); + s.a = 1.0f; + s.b = 2.0f; + // Call Foo2.Get_T directly, so its gets an instance + Foo2.Get_T (arg1, s); + Type t = typeof (Foo3<>).MakeGenericType (new Type [] { typeof (Struct2) }); + // Call Foo3.Get_T, this will call the gsharedvt instance, which will call the non-gsharedvt instance + var s_res = (Struct2)t.GetMethod ("Get_T").Invoke (null, new object [] { arg1, s }); + if (s_res.a != 1.0f || s_res.b != 2.0f) + return 1; + return 0; + } + + interface IFaceFoo4 { + T Get_T (double d, T t); + } + + class Foo4 : IFaceFoo4 { + public T Get_T (double d, T t) { + return Foo2.Get_T (d, t); + } + } + + struct VTypeByRefStruct { + public long o1, o2, o3; + } + + [Category ("GSHAREDVT")] + public static int test_0_arm64_gsharedvt_out_vtypebyref () { + /* gsharedvt out trampoline with vtypebyref argument */ + var s = new VTypeByRefStruct () { o1 = 1, o2 = 2, o3 = 3 }; + + // Call Foo2.Get_T directly, so its gets an instance + Foo2.Get_T (1.0f, s); + var o = (IFaceFoo4)Activator.CreateInstance (typeof (Foo4<>).MakeGenericType (new Type [] { typeof (VTypeByRefStruct) })); + // Call Foo4.Get_T, this will call the gsharedvt instance, which will call the non-gsharedvt instance + var s_res = o.Get_T (1.0f, s); + if (s_res.o1 != 1 || s_res.o2 != 2 || s_res.o3 != 3) + return 1; + return 0; + } + + class Foo5 { + public static T Get_T (object o) { + return (T)o; + } + } + + [Category ("DYNCALL")] + static int test_0_arm64_dyncall_vtypebyref_ret () { + var s = new VTypeByRefStruct () { o1 = 1, o2 = 2, o3 = 3 }; + Type t = typeof (Foo5<>).MakeGenericType (new Type [] { typeof (VTypeByRefStruct) }); + var o = Activator.CreateInstance (t); + try { + var s_res = (VTypeByRefStruct)t.GetMethod ("Get_T").Invoke (o, new object [] { s }); + if (s_res.o1 != 1 || s_res.o2 != 2 || s_res.o3 != 3) + return 1; + } catch (TargetInvocationException) { + return 2; + } + return 0; + } + } diff --git a/mta-mono/vendor/mono/mini/basic-calls.cs b/mta-mono/vendor/mono/mini/basic-calls.cs index bc3a617..ba03516 100644 --- a/mta-mono/vendor/mono/mini/basic-calls.cs +++ b/mta-mono/vendor/mono/mini/basic-calls.cs @@ -317,5 +317,29 @@ class Tests return 2; return 0; } -} + public static bool arm64_stack_arg_reg_bool (object o1, object o2, object o3, object o4, object o5, object o6, object o7, + bool foo, bool bar) { + bool res1 = bar || foo; + bool res2 = bar || foo; + return res1 | res2; + } + + public static int arm64_stack_arg_reg_sbyte (object o1, object o2, object o3, object o4, object o5, object o6, object o7, + sbyte foo, sbyte bar) { + int res1 = bar + foo; + int res2 = bar + foo; + return res1 + res2; + } + + // bool argument passed on the stack and promoted to a register + public static int test_0_arm64_stack_arg_reg_bool () { + bool res = arm64_stack_arg_reg_bool (null, null, null, null, null, null, null, false, false); + return res ? 1 : 0; + } + + public static int test_0_arm64_stack_arg_reg_sbyte () { + int res = arm64_stack_arg_reg_sbyte (null, null, null, null, null, null, null, -4, -7); + return res == -22 ? 0 : 1; + } +} diff --git a/mta-mono/vendor/mono/mini/basic-float.cs b/mta-mono/vendor/mono/mini/basic-float.cs index 694a1d3..ed62046 100644 --- a/mta-mono/vendor/mono/mini/basic-float.cs +++ b/mta-mono/vendor/mono/mini/basic-float.cs @@ -93,6 +93,13 @@ class Tests ui = (uint)d; if (ui != 0) return 9; + /* FIXME: This fails with llvm and with gcc -O2 on osx/linux */ + /* + d = Double.MaxValue; + i = (int)d; + if (i != -2147483648) + return 10; + */ return 0; } @@ -672,5 +679,132 @@ class Tests return 1; return 0; } + + public static int test_5_r4_fadd () { + float f1 = 3.0f; + float f2 = 2.0f; + return (int)(f1 + f2); + } + + public static int test_1_r4_fsub () { + float f1 = 3.0f; + float f2 = 2.0f; + return (int)(f1 - f2); + } + + public static int test_6_fmul_r4 () { + float f1 = 2.0f; + float f2 = 3.0f; + return (int)(f1 * f2); + } + + public static int test_3_fdiv_r4 () { + float f1 = 6.0f; + float f2 = 2.0f; + return (int)(f1 / f2); + } + + public static int test_0_fcmp_eq_r4 () { + float f1 = 1.0f; + float f2 = 1.0f; + return f1 == f2 ? 0 : 1; + } + + public static int test_0_fcmp_eq_2_r4 () { + float f1 = 1.0f; + float f2 = 2.0f; + return f1 == f2 ? 1 : 0; + } + + public static int test_0_fcmp_eq_r4_mixed () { + float f1 = 1.0f; + double f2 = 1.0; + return f1 == f2 ? 0 : 1; + } + + public static int test_3_iconv_to_r4 () { + int i = 3; + float f = (float)i; + return (int)f; + } + + public static int test_2_neg_r4 () { + float a = -2.0f; + return (int)(-a); + } + + public static int test_0_fceq_r4 () { + float f1 = 1.0f; + float f2 = 1.0f; + bool res = f1 == f2; + return res ? 0 : 1; + } + + public static int test_0_fcgt_r4 () { + float f1 = 2.0f; + float f2 = 1.0f; + bool res = f1 > f2; + bool res2 = f2 > f1; + return res && !res2 ? 0 : 1; + } + + public static int test_0_fclt_r4 () { + float f1 = 1.0f; + float f2 = 2.0f; + bool res = f1 < f2; + bool res2 = f2 < f1; + return res && !res2 ? 0 : 1; + } + + public static int test_0_fclt_un_r4 () { + float f1 = 2.0f; + float f2 = 1.0f; + bool res = f1 >= f2; + bool res2 = f2 >= f1; + return res && !res2 ? 0 : 1; + } + + public static int test_0_fcgt_un_r4 () { + float f1 = 1.0f; + float f2 = 2.0f; + bool res = f1 <= f2; + bool res2 = f2 <= f1; + return res && !res2 ? 0 : 1; + } + + public static int test_0_fconv_to_u4_r4 () { + float a = 10.0f; + + uint b = (uint)a; + return b == 10 ? 0 : 1; + } + + public static int test_0_fconv_to_u1_r4 () { + float a = 10.0f; + + byte b = (byte)a; + return b == 10 ? 0 : 1; + } + + public static int test_0_fconv_to_i1_r4 () { + float a = 127.0f; + + sbyte b = (sbyte)a; + return b == 127 ? 0 : 1; + } + + public static int test_0_fconv_to_u2_r4 () { + float a = 10.0f; + + ushort b = (ushort)a; + return b == 10 ? 0 : 1; + } + + public static int test_0_fconv_to_i2_r4 () { + float a = 127.0f; + + short b = (short)a; + return b == 127 ? 0 : 1; + } } diff --git a/mta-mono/vendor/mono/mini/branch-opts.c b/mta-mono/vendor/mono/mini/branch-opts.c index 2be95e7..904db01 100644 --- a/mta-mono/vendor/mono/mini/branch-opts.c +++ b/mta-mono/vendor/mono/mini/branch-opts.c @@ -278,6 +278,7 @@ mono_if_conversion (MonoCompile *cfg) #ifdef MONO_ARCH_HAVE_CMOV_OPS MonoBasicBlock *bb; gboolean changed = FALSE; + int filter = FILTER_NOP | FILTER_IL_SEQ_POINT; if (!(cfg->opt & MONO_OPT_CMOV)) return; @@ -317,14 +318,15 @@ mono_if_conversion (MonoCompile *cfg) int dreg, tmp_reg; CompType comp_type; - if (bb->last_ins && (bb->last_ins->opcode == OP_BR_REG || bb->last_ins->opcode == OP_BR)) + branch = mono_bb_last_inst (bb, filter); + + if (!branch || branch->opcode == OP_BR_REG || branch->opcode == OP_BR) continue; /* Find the compare instruction */ - if (!bb->last_ins || !bb->last_ins->prev) + compare = mono_inst_prev (branch, filter); + if (!compare) continue; - branch = bb->last_ins; - compare = branch->prev; if (!MONO_IS_COND_BRANCH_OP (branch)) /* This can happen if a cond branch is optimized away */ @@ -338,22 +340,19 @@ mono_if_conversion (MonoCompile *cfg) * variable. */ /* FIXME: Get rid of the nops earlier */ - ins1 = true_bb->code; - while (ins1 && ins1->opcode == OP_NOP) - ins1 = ins1->next; - ins2 = false_bb->code; - while (ins2 && ins2->opcode == OP_NOP) - ins2 = ins2->next; + ins1 = mono_bb_first_inst (true_bb, filter); + ins2 = mono_bb_first_inst (false_bb, filter); + if (!(ins1 && ins2 && ins1->dreg == ins2->dreg && ins1->dreg != -1)) continue; simple = TRUE; for (tmp = ins1->next; tmp; tmp = tmp->next) - if (!((tmp->opcode == OP_NOP) || (tmp->opcode == OP_BR))) + if (!((tmp->opcode == OP_NOP) || (tmp->opcode == OP_IL_SEQ_POINT) || (tmp->opcode == OP_BR))) simple = FALSE; for (tmp = ins2->next; tmp; tmp = tmp->next) - if (!((tmp->opcode == OP_NOP) || (tmp->opcode == OP_BR))) + if (!((tmp->opcode == OP_NOP) || (tmp->opcode == OP_IL_SEQ_POINT) || (tmp->opcode == OP_BR))) simple = FALSE; if (!simple) @@ -381,7 +380,7 @@ mono_if_conversion (MonoCompile *cfg) if (cfg->verbose_level > 2) { printf ("\tBranch -> CMove optimization in BB%d on\n", bb->block_num); printf ("\t\t"); mono_print_ins (compare); - printf ("\t\t"); mono_print_ins (compare->next); + printf ("\t\t"); mono_print_ins (mono_inst_next (compare, filter)); printf ("\t\t"); mono_print_ins (ins1); printf ("\t\t"); mono_print_ins (ins2); } @@ -489,15 +488,15 @@ mono_if_conversion (MonoCompile *cfg) next_bb = bb2; } - ins1 = code_bb->code; + ins1 = mono_bb_first_inst (code_bb, filter); if (!ins1) continue; /* Check that code_bb is simple */ simple = TRUE; - for (tmp = ins1->next; tmp; tmp = tmp->next) - if (!((tmp->opcode == OP_NOP) || (tmp->opcode == OP_BR))) + for (tmp = ins1; tmp; tmp = tmp->next) + if (!((tmp->opcode == OP_NOP) || (tmp->opcode == OP_IL_SEQ_POINT) || (tmp->opcode == OP_BR))) simple = FALSE; if (!simple) @@ -507,15 +506,15 @@ mono_if_conversion (MonoCompile *cfg) if (!MONO_INS_HAS_NO_SIDE_EFFECT (ins1)) continue; - if (bb->last_ins && bb->last_ins->opcode == OP_BR_REG) + branch = mono_bb_last_inst (bb, filter); + + if (!branch || branch->opcode == OP_BR_REG) continue; /* Find the compare instruction */ - - if (!bb->last_ins || !bb->last_ins->prev) + compare = mono_inst_prev (branch, filter); + if (!compare) continue; - branch = bb->last_ins; - compare = branch->prev; if (!MONO_IS_COND_BRANCH_OP (branch)) /* This can happen if a cond branch is optimized away */ @@ -545,7 +544,7 @@ mono_if_conversion (MonoCompile *cfg) if (cfg->verbose_level > 2) { printf ("\tBranch -> CMove optimization (2) in BB%d on\n", bb->block_num); printf ("\t\t"); mono_print_ins (compare); - printf ("\t\t"); mono_print_ins (compare->next); + printf ("\t\t"); mono_print_ins (mono_inst_next (compare, filter)); printf ("\t\t"); mono_print_ins (ins1); } @@ -628,7 +627,7 @@ mono_if_conversion (MonoCompile *cfg) */ for (bb = cfg->bb_entry; bb; bb = bb->next_bb) { MonoBasicBlock *bb1, *bb2, *true_bb, *false_bb, *next_bb; - MonoInst *branch1, *branch2, *compare1, *ins; + MonoInst *branch1, *branch2, *compare1, *ins, *next; /* Look for the IR code generated from if ( < 0 || v > ) * after branch opts which is: @@ -654,14 +653,14 @@ mono_if_conversion (MonoCompile *cfg) next_bb = bb2; /* Check first branch */ - branch1 = bb->last_ins; + branch1 = mono_bb_last_inst (bb, filter); if (!(branch1 && ((branch1->opcode == OP_IBLT) || (branch1->opcode == OP_LBLT)) && (branch1->inst_false_bb == next_bb))) continue; true_bb = branch1->inst_true_bb; /* Check second branch */ - branch2 = next_bb->last_ins; + branch2 = mono_bb_last_inst (next_bb, filter); if (!branch2) continue; @@ -674,19 +673,20 @@ mono_if_conversion (MonoCompile *cfg) continue; /* Check first compare */ - compare1 = bb->last_ins->prev; + compare1 = mono_inst_prev (mono_bb_last_inst (bb, filter), filter); if (!(compare1 && ((compare1->opcode == OP_ICOMPARE_IMM) || (compare1->opcode == OP_LCOMPARE_IMM)) && compare1->inst_imm == 0)) continue; /* Check second bblock */ - ins = next_bb->code; + ins = mono_bb_first_inst (next_bb, filter); if (!ins) continue; - if (((ins->opcode == OP_ICOMPARE_IMM) || (ins->opcode == OP_LCOMPARE_IMM)) && ins->sreg1 == compare1->sreg1 && ins->next == branch2) { + next = mono_inst_next (ins, filter); + if (((ins->opcode == OP_ICOMPARE_IMM) || (ins->opcode == OP_LCOMPARE_IMM)) && ins->sreg1 == compare1->sreg1 && next == branch2) { /* The second arg must be positive */ if (ins->inst_imm < 0) continue; - } else if (((ins->opcode == OP_LDLEN) || (ins->opcode == OP_STRLEN)) && ins->dreg != compare1->sreg1 && ins->next && ins->next->opcode == OP_ICOMPARE && ins->next->sreg1 == compare1->sreg1 && ins->next->sreg2 == ins->dreg && ins->next->next == branch2) { + } else if (((ins->opcode == OP_LDLEN) || (ins->opcode == OP_STRLEN)) && ins->dreg != compare1->sreg1 && next && next->opcode == OP_ICOMPARE && next->sreg1 == compare1->sreg1 && next->sreg2 == ins->dreg && mono_inst_next (next, filter) == branch2) { /* Another common case: if (index < 0 || index > arr.Length) */ } else { continue; @@ -695,7 +695,7 @@ mono_if_conversion (MonoCompile *cfg) if (cfg->verbose_level > 2) { printf ("\tSigned->unsigned compare optimization in BB%d on\n", bb->block_num); printf ("\t\t"); mono_print_ins (compare1); - printf ("\t\t"); mono_print_ins (compare1->next); + printf ("\t\t"); mono_print_ins (mono_inst_next (compare1, filter)); printf ("\t\t"); mono_print_ins (ins); } @@ -885,6 +885,7 @@ remove_block_if_useless (MonoCompile *cfg, MonoBasicBlock *bb, MonoBasicBlock *p MONO_BB_FOR_EACH_INS (bb, inst) { switch (inst->opcode) { case OP_NOP: + case OP_IL_SEQ_POINT: break; case OP_BR: target_bb = inst->inst_target_bb; @@ -1242,6 +1243,8 @@ mono_optimize_branches (MonoCompile *cfg) int i, changed = FALSE; MonoBasicBlock *bb, *bbn; guint32 niterations; + MonoInst *bbn_first_inst; + int filter = FILTER_IL_SEQ_POINT; /* * Some crazy loops could cause the code below to go into an infinite @@ -1338,17 +1341,18 @@ mono_optimize_branches (MonoCompile *cfg) if (bb->last_ins && bb->last_ins->opcode == OP_BR) { bbn = bb->last_ins->inst_target_bb; - if (bb->region == bbn->region && bbn->code && bbn->code->opcode == OP_BR && - bbn->code->inst_target_bb != bbn && - bbn->code->inst_target_bb->region == bb->region) { + bbn_first_inst = mono_bb_first_inst (bbn, filter); + if (bb->region == bbn->region && bbn_first_inst && bbn_first_inst->opcode == OP_BR && + bbn_first_inst->inst_target_bb != bbn && + bbn_first_inst->inst_target_bb->region == bb->region) { if (cfg->verbose_level > 2) - g_print ("branch to branch triggered %d -> %d -> %d\n", bb->block_num, bbn->block_num, bbn->code->inst_target_bb->block_num); + g_print ("branch to branch triggered %d -> %d -> %d\n", bb->block_num, bbn->block_num, bbn_first_inst->inst_target_bb->block_num); replace_in_block (bbn, bb, NULL); - replace_out_block (bb, bbn, bbn->code->inst_target_bb); - mono_link_bblock (cfg, bb, bbn->code->inst_target_bb); - bb->last_ins->inst_target_bb = bbn->code->inst_target_bb; + replace_out_block (bb, bbn, bbn_first_inst->inst_target_bb); + mono_link_bblock (cfg, bb, bbn_first_inst->inst_target_bb); + bb->last_ins->inst_target_bb = bbn_first_inst->inst_target_bb; changed = TRUE; continue; } @@ -1384,12 +1388,13 @@ mono_optimize_branches (MonoCompile *cfg) continue; } bbn = bb->last_ins->inst_true_bb; - if (bb->region == bbn->region && bbn->code && bbn->code->opcode == OP_BR && - bbn->code->inst_target_bb->region == bb->region) { + bbn_first_inst = mono_bb_first_inst (bbn, filter); + if (bb->region == bbn->region && bbn_first_inst && bbn_first_inst->opcode == OP_BR && + bbn_first_inst->inst_target_bb->region == bb->region) { if (cfg->verbose_level > 2) g_print ("cbranch1 to branch triggered %d -> (%d) %d (0x%02x)\n", - bb->block_num, bbn->block_num, bbn->code->inst_target_bb->block_num, - bbn->code->opcode); + bb->block_num, bbn->block_num, bbn_first_inst->inst_target_bb->block_num, + bbn_first_inst->opcode); /* * Unlink, then relink bblocks to avoid various @@ -1399,7 +1404,7 @@ mono_optimize_branches (MonoCompile *cfg) mono_unlink_bblock (cfg, bb, bb->last_ins->inst_true_bb); mono_unlink_bblock (cfg, bb, bb->last_ins->inst_false_bb); - bb->last_ins->inst_true_bb = bbn->code->inst_target_bb; + bb->last_ins->inst_true_bb = bbn_first_inst->inst_target_bb; mono_link_bblock (cfg, bb, bb->last_ins->inst_true_bb); mono_link_bblock (cfg, bb, bb->last_ins->inst_false_bb); @@ -1409,17 +1414,18 @@ mono_optimize_branches (MonoCompile *cfg) } bbn = bb->last_ins->inst_false_bb; - if (bbn && bb->region == bbn->region && bbn->code && bbn->code->opcode == OP_BR && - bbn->code->inst_target_bb->region == bb->region) { + bbn_first_inst = mono_bb_first_inst (bbn, filter); + if (bbn && bb->region == bbn->region && bbn_first_inst && bbn_first_inst->opcode == OP_BR && + bbn_first_inst->inst_target_bb->region == bb->region) { if (cfg->verbose_level > 2) g_print ("cbranch2 to branch triggered %d -> (%d) %d (0x%02x)\n", - bb->block_num, bbn->block_num, bbn->code->inst_target_bb->block_num, - bbn->code->opcode); + bb->block_num, bbn->block_num, bbn_first_inst->inst_target_bb->block_num, + bbn_first_inst->opcode); mono_unlink_bblock (cfg, bb, bb->last_ins->inst_true_bb); mono_unlink_bblock (cfg, bb, bb->last_ins->inst_false_bb); - bb->last_ins->inst_false_bb = bbn->code->inst_target_bb; + bb->last_ins->inst_false_bb = bbn_first_inst->inst_target_bb; mono_link_bblock (cfg, bb, bb->last_ins->inst_true_bb); mono_link_bblock (cfg, bb, bb->last_ins->inst_false_bb); diff --git a/mta-mono/vendor/mono/mini/cpu-amd64.md b/mta-mono/vendor/mono/mini/cpu-amd64.md index be53521..b24b0e5 100644 --- a/mta-mono/vendor/mono/mini/cpu-amd64.md +++ b/mta-mono/vendor/mono/mini/cpu-amd64.md @@ -66,6 +66,7 @@ tailcall: len:120 clob:c br: len:6 label: len:0 seq_point: len:31 clob:c +il_seq_point: len:0 long_add: dest:i src1:i src2:i len:3 clob:1 nacl:6 long_sub: dest:i src1:i src2:i len:3 clob:1 nacl:6 @@ -121,6 +122,7 @@ icompare: src1:i src2:i len:3 compare_imm: src1:i len:13 icompare_imm: src1:i len:8 fcompare: src1:f src2:f clob:a len:13 +rcompare: src1:f src2:f clob:a len:13 oparglist: src1:b len:11 checkthis: src1:b len:5 nacl:8 call: dest:a clob:c len:32 nacl:64 @@ -130,6 +132,9 @@ voidcall_membase: src1:b clob:c len:32 nacl:64 fcall: dest:f len:64 clob:c fcall_reg: dest:f src1:i len:64 clob:c fcall_membase: dest:f src1:b len:64 clob:c +rcall: dest:f len:64 clob:c +rcall_reg: dest:f src1:i len:64 clob:c +rcall_membase: dest:f src1:b len:64 clob:c lcall: dest:a len:64 clob:c lcall_reg: dest:a src1:i len:64 clob:c lcall_membase: dest:a src1:b len:64 clob:c @@ -255,7 +260,37 @@ float_cgt_un_membase: dest:i src1:f src2:b len:48 float_clt_membase: dest:i src1:f src2:b len:35 float_clt_un_membase: dest:i src1:f src2:b len:42 float_conv_to_u: dest:i src1:f len:46 + +# R4 opcodes +r4_conv_to_i1: dest:i src1:f len:32 +r4_conv_to_u1: dest:i src1:f len:32 +r4_conv_to_i2: dest:i src1:f len:32 +r4_conv_to_u2: dest:i src1:f len:32 +r4_conv_to_i4: dest:i src1:f len:16 +r4_conv_to_u4: dest:i src1:f len:32 +r4_conv_to_i8: dest:i src1:f len:32 +r4_conv_to_r8: dest:f src1:f len:17 +r4_conv_to_r4: dest:f src1:f len:17 +r4_add: dest:f src1:f src2:f clob:1 len:5 +r4_sub: dest:f src1:f src2:f clob:1 len:5 +r4_mul: dest:f src1:f src2:f clob:1 len:5 +r4_div: dest:f src1:f src2:f clob:1 len:5 +r4_neg: dest:f src1:f clob:1 len:23 +r4_ceq: dest:i src1:f src2:f len:35 +r4_cgt: dest:i src1:f src2:f len:35 +r4_cgt_un: dest:i src1:f src2:f len:48 +r4_clt: dest:i src1:f src2:f len:35 +r4_clt_un: dest:i src1:f src2:f len:42 +r4_cneq: dest:i src1:f src2:f len:42 +r4_cge: dest:i src1:f src2:f len:35 +r4_cle: dest:i src1:f src2:f len:35 + fmove: dest:f src1:f len:8 +rmove: dest:f src1:f len:8 +move_f_to_i4: dest:i src1:f len:16 +move_i4_to_f: dest:f src1:i len:16 +move_f_to_i8: dest:i src1:f len:5 +move_i8_to_f: dest:f src1:i len:5 call_handler: len:14 clob:c nacl:52 aot_const: dest:i len:10 nacl_gc_safe_point: clob:c @@ -299,11 +334,31 @@ tls_set: src1:i len:16 tls_set_reg: src1:i src2:i len:32 atomic_add_i4: src1:b src2:i dest:i len:32 atomic_add_i8: src1:b src2:i dest:i len:32 -atomic_exchange_i4: src1:b src2:i dest:a len:32 -atomic_exchange_i8: src1:b src2:i dest:a len:32 +atomic_exchange_i4: src1:b src2:i dest:i len:12 +atomic_exchange_i8: src1:b src2:i dest:i len:12 atomic_cas_i4: src1:b src2:i src3:a dest:a len:24 atomic_cas_i8: src1:b src2:i src3:a dest:a len:24 -memory_barrier: len:16 +memory_barrier: len:3 +atomic_load_i1: dest:c src1:b len:9 +atomic_load_u1: dest:c src1:b len:9 +atomic_load_i2: dest:i src1:b len:9 +atomic_load_u2: dest:i src1:b len:9 +atomic_load_i4: dest:i src1:b len:9 +atomic_load_u4: dest:i src1:b len:9 +atomic_load_i8: dest:i src1:b len:9 +atomic_load_u8: dest:i src1:b len:9 +atomic_load_r4: dest:f src1:b len:16 +atomic_load_r8: dest:f src1:b len:16 +atomic_store_i1: dest:b src1:c len:12 +atomic_store_u1: dest:b src1:c len:12 +atomic_store_i2: dest:b src1:i len:12 +atomic_store_u2: dest:b src1:i len:12 +atomic_store_i4: dest:b src1:i len:12 +atomic_store_u4: dest:b src1:i len:12 +atomic_store_i8: dest:b src1:i len:12 +atomic_store_u8: dest:b src1:i len:12 +atomic_store_r4: dest:b src1:f len:18 +atomic_store_r8: dest:b src1:f len:13 adc: dest:i src1:i src2:i len:3 clob:1 addcc: dest:i src1:i src2:i len:3 clob:1 subcc: dest:i src1:i src2:i len:3 clob:1 @@ -701,7 +756,7 @@ extract_i1: dest:i src1:x len:13 extract_u1: dest:i src1:x len:13 extract_r8: dest:f src1:x len:5 -iconv_to_r8_raw: dest:f src1:i len:10 +iconv_to_r4_raw: dest:f src1:i len:10 insert_i2: dest:x src1:x src2:i len:6 clob:1 diff --git a/mta-mono/vendor/mono/mini/cpu-arm.md b/mta-mono/vendor/mono/mini/cpu-arm.md index b31b368..9501ea5 100644 --- a/mta-mono/vendor/mono/mini/cpu-arm.md +++ b/mta-mono/vendor/mono/mini/cpu-arm.md @@ -48,7 +48,6 @@ # # See the code in mini-x86.c for more details on how the specifiers are used. # -memory_barrier: len:8 clob:a nop: len:4 relaxed_nop: len:4 break: len:4 @@ -58,6 +57,7 @@ switch: src1:i len:12 # See the comment in resume_from_signal_handler, we can't copy the fp regs from sigctx to MonoContext on linux, # since the corresponding sigctx structures are not well defined. seq_point: len:38 clob:c +il_seq_point: len:0 throw: src1:i len:24 rethrow: src1:i len:20 @@ -76,6 +76,7 @@ localloc: dest:i src1:i len:60 compare: src1:i src2:i len:4 compare_imm: src1:i len:12 fcompare: src1:f src2:f len:12 +rcompare: src1:f src2:f len:12 oparglist: src1:i len:12 setlret: src1:i src2:i len:12 checkthis: src1:b len:4 @@ -88,6 +89,9 @@ voidcall_membase: src1:b len:16 clob:c fcall: dest:g len:28 clob:c fcall_reg: dest:g src1:i len:16 clob:c fcall_membase: dest:g src1:b len:24 clob:c +rcall: dest:g len:28 clob:c +rcall_reg: dest:g src1:i len:16 clob:c +rcall_membase: dest:g src1:b len:24 clob:c lcall: dest:l len:20 clob:c lcall_reg: dest:l src1:i len:8 clob:c lcall_membase: dest:l src1:b len:16 clob:c @@ -135,6 +139,8 @@ loadu4_memindex: dest:i src1:b src2:i len:4 loadu4_mem: dest:i len:8 move: dest:i src1:i len:4 fmove: dest:f src1:f len:4 +move_f_to_i4: dest:i src1:f len:28 +move_i4_to_f: dest:f src1:i len:8 add_imm: dest:i src1:i len:12 sub_imm: dest:i src1:i len:12 mul_imm: dest:i src1:i len:12 @@ -196,6 +202,31 @@ float_cneq: dest:y src1:f src2:f len:20 float_cge: dest:y src1:f src2:f len:20 float_cle: dest:y src1:f src2:f len:20 float_conv_to_u: dest:i src1:f len:36 + +# R4 opcodes +r4_conv_to_i1: dest:i src1:f len:88 +r4_conv_to_i2: dest:i src1:f len:88 +r4_conv_to_i4: dest:i src1:f len:88 +r4_conv_to_u1: dest:i src1:f len:88 +r4_conv_to_u2: dest:i src1:f len:88 +r4_conv_to_u4: dest:i src1:f len:88 +r4_conv_to_r4: dest:f src1:f len:16 +r4_conv_to_r8: dest:f src1:f len:16 +r4_add: dest:f src1:f src2:f len:4 +r4_sub: dest:f src1:f src2:f len:4 +r4_mul: dest:f src1:f src2:f len:4 +r4_div: dest:f src1:f src2:f len:4 +r4_rem: dest:f src1:f src2:f len:16 +r4_neg: dest:f src1:f len:4 +r4_ceq: dest:i src1:f src2:f len:16 +r4_cgt: dest:i src1:f src2:f len:16 +r4_cgt_un: dest:i src1:f src2:f len:20 +r4_clt: dest:i src1:f src2:f len:16 +r4_clt_un: dest:i src1:f src2:f len:20 +r4_cneq: dest:y src1:f src2:f len:20 +r4_cge: dest:y src1:f src2:f len:20 +r4_cle: dest:y src1:f src2:f len:20 + setfret: src1:f len:12 aot_const: dest:i len:16 objc_get_selector: dest:i len:32 @@ -350,3 +381,20 @@ gc_param_slot_liveness_def: len:0 atomic_add_i4: dest:i src1:i src2:i len:64 atomic_exchange_i4: dest:i src1:i src2:i len:64 atomic_cas_i4: dest:i src1:i src2:i src3:i len:64 +memory_barrier: len:8 clob:a +atomic_load_i1: dest:i src1:b len:28 +atomic_load_u1: dest:i src1:b len:28 +atomic_load_i2: dest:i src1:b len:28 +atomic_load_u2: dest:i src1:b len:28 +atomic_load_i4: dest:i src1:b len:28 +atomic_load_u4: dest:i src1:b len:28 +atomic_load_r4: dest:f src1:b len:80 +atomic_load_r8: dest:f src1:b len:32 +atomic_store_i1: dest:b src1:i len:28 +atomic_store_u1: dest:b src1:i len:28 +atomic_store_i2: dest:b src1:i len:28 +atomic_store_u2: dest:b src1:i len:28 +atomic_store_i4: dest:b src1:i len:28 +atomic_store_u4: dest:b src1:i len:28 +atomic_store_r4: dest:b src1:f len:80 +atomic_store_r8: dest:b src1:f len:32 diff --git a/mta-mono/vendor/mono/mini/cpu-arm64.md b/mta-mono/vendor/mono/mini/cpu-arm64.md index bab0001..9fdca59 100644 --- a/mta-mono/vendor/mono/mini/cpu-arm64.md +++ b/mta-mono/vendor/mono/mini/cpu-arm64.md @@ -48,7 +48,6 @@ # # See the code in mini-x86.c for more details on how the specifiers are used. # -memory_barrier: len:8 clob:a nop: len:4 relaxed_nop: len:4 break: len:20 @@ -58,6 +57,7 @@ switch: src1:i len:12 # See the comment in resume_from_signal_handler, we can't copy the fp regs from sigctx to MonoContext on linux, # since the corresponding sigctx structures are not well defined. seq_point: len:38 clob:c +il_seq_point: len:0 throw: src1:i len:24 rethrow: src1:i len:20 @@ -76,6 +76,7 @@ localloc: dest:i src1:i len:96 compare: src1:i src2:i len:4 compare_imm: src1:i len:20 fcompare: src1:f src2:f len:12 +rcompare: src1:f src2:f len:12 oparglist: src1:i len:12 setlret: src1:i src2:i len:12 checkthis: src1:b len:4 @@ -88,13 +89,16 @@ voidcall_membase: src1:b len:32 clob:c fcall: dest:f len:32 clob:c fcall_reg: dest:f src1:i len:32 clob:c fcall_membase: dest:f src1:b len:32 clob:c +rcall: dest:f len:32 clob:c +rcall_reg: dest:f src1:i len:32 clob:c +rcall_membase: dest:f src1:b len:32 clob:c lcall: dest:l len:32 clob:c lcall_reg: dest:l src1:i len:32 clob:c lcall_membase: dest:l src1:b len:32 clob:c vcall: len:32 clob:c vcall_reg: src1:i len:32 clob:c vcall_membase: src1:b len:32 clob:c -tailcall: len:64 +tailcall: len:64 clob:c iconst: dest:i len:16 r4const: dest:f len:24 r8const: dest:f len:20 @@ -132,6 +136,11 @@ loadu4_memindex: dest:i src1:b src2:i len:4 loadu4_mem: dest:i len:8 move: dest:i src1:i len:4 fmove: dest:f src1:f len:4 +rmove: dest:f src1:f len:4 +move_f_to_i4: dest:i src1:f len:8 +move_i4_to_f: dest:f src1:i len:8 +move_f_to_i8: dest:i src1:f len:4 +move_i8_to_f: dest:f src1:i len:4 add_imm: dest:i src1:i len:12 sub_imm: dest:i src1:i len:12 mul_imm: dest:i src1:i len:12 @@ -194,6 +203,33 @@ float_cge: dest:i src1:f src2:f len:20 float_cle: dest:i src1:f src2:f len:20 float_conv_to_u: dest:i src1:f len:36 setfret: src1:f len:12 + +# R4 opcodes +r4_conv_to_i1: dest:i src1:f len:8 +r4_conv_to_u1: dest:i src1:f len:8 +r4_conv_to_i2: dest:i src1:f len:8 +r4_conv_to_u2: dest:i src1:f len:8 +r4_conv_to_i4: dest:i src1:f len:8 +r4_conv_to_u4: dest:i src1:f len:8 +r4_conv_to_i8: dest:l src1:f len:8 +r4_conv_to_u8: dest:l src1:f len:8 +r4_conv_to_r4: dest:f src1:f len:4 +r4_conv_to_r8: dest:f src1:f len:4 +r4_add: dest:f src1:f src2:f len:4 +r4_sub: dest:f src1:f src2:f len:4 +r4_mul: dest:f src1:f src2:f len:4 +r4_div: dest:f src1:f src2:f len:4 +r4_rem: dest:f src1:f src2:f len:16 +r4_neg: dest:f src1:f len:4 +r4_ceq: dest:i src1:f src2:f len:16 +r4_cgt: dest:i src1:f src2:f len:16 +r4_cgt_un: dest:i src1:f src2:f len:20 +r4_clt: dest:i src1:f src2:f len:16 +r4_clt_un: dest:i src1:f src2:f len:20 +r4_cneq: dest:i src1:f src2:f len:20 +r4_cge: dest:i src1:f src2:f len:20 +r4_cle: dest:i src1:f src2:f len:20 + aot_const: dest:i len:16 objc_get_selector: dest:i len:32 sqrt: dest:f src1:f len:4 @@ -420,5 +456,24 @@ atomic_exchange_i4: dest:i src1:i src2:i len:32 atomic_exchange_i8: dest:i src1:i src2:i len:32 atomic_cas_i4: dest:i src1:i src2:i src3:i len:32 atomic_cas_i8: dest:i src1:i src2:i src3:i len:32 - - +memory_barrier: len:8 clob:a +atomic_load_i1: dest:i src1:b len:20 +atomic_load_u1: dest:i src1:b len:20 +atomic_load_i2: dest:i src1:b len:20 +atomic_load_u2: dest:i src1:b len:20 +atomic_load_i4: dest:i src1:b len:16 +atomic_load_u4: dest:i src1:b len:16 +atomic_load_i8: dest:i src1:b len:12 +atomic_load_u8: dest:i src1:b len:12 +atomic_load_r4: dest:f src1:b len:24 +atomic_load_r8: dest:f src1:b len:20 +atomic_store_i1: dest:b src1:i len:16 +atomic_store_u1: dest:b src1:i len:16 +atomic_store_i2: dest:b src1:i len:16 +atomic_store_u2: dest:b src1:i len:16 +atomic_store_i4: dest:b src1:i len:16 +atomic_store_u4: dest:b src1:i len:16 +atomic_store_i8: dest:b src1:i len:12 +atomic_store_u8: dest:b src1:i len:12 +atomic_store_r4: dest:b src1:f len:24 +atomic_store_r8: dest:b src1:f len:20 diff --git a/mta-mono/vendor/mono/mini/cpu-mips.md b/mta-mono/vendor/mono/mini/cpu-mips.md index 0fd87c8..d6047aa 100644 --- a/mta-mono/vendor/mono/mini/cpu-mips.md +++ b/mta-mono/vendor/mono/mini/cpu-mips.md @@ -60,6 +60,7 @@ call: dest:v clob:c len:20 br: len:16 switch: src1:i len:40 seq_point: len:24 +il_seq_point: len:0 int_conv_to_r_un: dest:f src1:i len:32 throw: src1:i len:24 @@ -150,6 +151,8 @@ storer8_memindex: dest:b src1:f src2:i len:12 loadu4_mem: dest:i len:8 move: dest:i src1:i len:4 fmove: dest:f src1:f len:8 +move_f_to_i4: dest:i src1:f len:4 +move_i4_to_f: dest:f src1:i len:4 add_imm: dest:i src1:i len:12 sub_imm: dest:i src1:i len:12 mul_imm: dest:i src1:i len:20 diff --git a/mta-mono/vendor/mono/mini/cpu-ppc.md b/mta-mono/vendor/mono/mini/cpu-ppc.md index 44a482a..ba2ec60 100644 --- a/mta-mono/vendor/mono/mini/cpu-ppc.md +++ b/mta-mono/vendor/mono/mini/cpu-ppc.md @@ -50,6 +50,7 @@ nop: len:4 relaxed_nop: len:4 break: len:32 seq_point: len:24 +il_seq_point: len:0 jmp: len:108 tailcall: len:120 clob:c call: dest:a clob:c len:16 diff --git a/mta-mono/vendor/mono/mini/cpu-ppc64.md b/mta-mono/vendor/mono/mini/cpu-ppc64.md index 114bc3c..dc6ac72 100644 --- a/mta-mono/vendor/mono/mini/cpu-ppc64.md +++ b/mta-mono/vendor/mono/mini/cpu-ppc64.md @@ -50,6 +50,7 @@ nop: len:4 relaxed_nop: len:4 break: len:40 seq_point: len:48 +il_seq_point: len:0 jmp: len:96 call: dest:a clob:c len:36 br: len:4 @@ -380,7 +381,7 @@ vcall2_membase: src1:b len:16 clob:c jump_table: dest:i len:20 -atomic_add_i4: src1:b src2:i dest:i len:20 -atomic_add_i8: src1:b src2:i dest:i len:20 +atomic_add_i4: src1:b src2:i dest:i len:28 +atomic_add_i8: src1:b src2:i dest:i len:28 atomic_cas_i4: src1:b src2:i src3:i dest:i len:38 atomic_cas_i8: src1:b src2:i src3:i dest:i len:38 diff --git a/mta-mono/vendor/mono/mini/cpu-s390x.md b/mta-mono/vendor/mono/mini/cpu-s390x.md index 2eee2e4..d940b73 100644 --- a/mta-mono/vendor/mono/mini/cpu-s390x.md +++ b/mta-mono/vendor/mono/mini/cpu-s390x.md @@ -131,6 +131,10 @@ float_rem: dest:f src1:f src2:f len:16 float_rem_un: dest:f src1:f src2:f len:16 float_sub: dest:f src1:f src2:f len:6 fmove: dest:f src1:f len:4 +move_f_to_i4: dest:i src1:f len:4 +move_i4_to_f: dest:f src1:i len:4 +move_f_to_i8: dest:i src1:f len:4 +move_i8_to_f: dest:f src1:i len:4 i8const: dest:i len:20 icompare: src1:i src2:i len:4 icompare_imm: src1:i len:18 @@ -174,6 +178,7 @@ s390_setf4ret: dest:f src1:f len:4 sbb: dest:i src1:i src2:i len:6 sbb_imm: dest:i src1:i len:14 seq_point: len:54 +il_seq_point: len:0 sext_i4: dest:i src1:i len:4 zext_i4: dest:i src1:i len:4 shl_imm: dest:i src1:i len:10 diff --git a/mta-mono/vendor/mono/mini/cpu-x86.md b/mta-mono/vendor/mono/mini/cpu-x86.md index ca87f2f..8319bb2 100644 --- a/mta-mono/vendor/mono/mini/cpu-x86.md +++ b/mta-mono/vendor/mono/mini/cpu-x86.md @@ -67,6 +67,7 @@ call: dest:a clob:c len:17 tailcall: len:120 clob:c br: len:5 seq_point: len:17 +il_seq_point: len:0 int_beq: len:6 int_bge: len:6 @@ -309,6 +310,22 @@ atomic_add_i4: src1:b src2:i dest:i len:16 atomic_exchange_i4: src1:b src2:i dest:a len:24 atomic_cas_i4: src1:b src2:i src3:a dest:a len:24 memory_barrier: len:16 +atomic_load_i1: dest:y src1:b len:7 +atomic_load_u1: dest:y src1:b len:7 +atomic_load_i2: dest:i src1:b len:7 +atomic_load_u2: dest:i src1:b len:7 +atomic_load_i4: dest:i src1:b len:7 +atomic_load_u4: dest:i src1:b len:7 +atomic_load_r4: dest:f src1:b len:10 +atomic_load_r8: dest:f src1:b len:10 +atomic_store_i1: dest:b src1:y len:10 +atomic_store_u1: dest:b src1:y len:10 +atomic_store_i2: dest:b src1:i len:10 +atomic_store_u2: dest:b src1:i len:10 +atomic_store_i4: dest:b src1:i len:10 +atomic_store_u4: dest:b src1:i len:10 +atomic_store_r4: dest:b src1:f len:10 +atomic_store_r8: dest:b src1:f len:10 card_table_wbarrier: src1:a src2:i clob:d len:34 @@ -394,6 +411,8 @@ long_conv_to_r4_2: dest:f src1:i src2:i len:14 long_conv_to_r_un_2: dest:f src1:i src2:i len:40 fmove: dest:f src1:f +move_f_to_i4: dest:i src1:f len:17 +move_i4_to_f: dest:f src1:i len:17 float_conv_to_r4: dest:f src1:f len:12 load_mem: dest:i len:9 @@ -597,8 +616,6 @@ extract_i1: dest:i src1:x len:10 extract_u1: dest:i src1:x len:10 extract_r8: dest:f src1:x len:8 -iconv_to_r8_raw: dest:f src1:i len:17 - insert_i2: dest:x src1:x src2:i len:5 clob:1 extractx_u2: dest:i src1:x len:5 diff --git a/mta-mono/vendor/mono/mini/debug-mini.c b/mta-mono/vendor/mono/mini/debug-mini.c index 742b6e9..1565a86 100644 --- a/mta-mono/vendor/mono/mini/debug-mini.c +++ b/mta-mono/vendor/mono/mini/debug-mini.c @@ -16,7 +16,6 @@ #include #include -#define _IN_THE_MONO_DEBUGGER #include #include diff --git a/mta-mono/vendor/mono/mini/debugger-agent.c b/mta-mono/vendor/mono/mini/debugger-agent.c index c01cb0f..9573009 100644 --- a/mta-mono/vendor/mono/mini/debugger-agent.c +++ b/mta-mono/vendor/mono/mini/debugger-agent.c @@ -27,9 +27,6 @@ #ifdef HAVE_NETINET_IN_H #include #endif -#ifdef HAVE_NETDB_H -#include -#endif #ifdef HAVE_UNISTD_H #include #endif @@ -50,14 +47,6 @@ #include #endif #include -#ifdef __GNUC__ -/* cygwin's headers do not seem to define these */ -void WSAAPI freeaddrinfo (struct addrinfo*); -int WSAAPI getaddrinfo (const char*,const char*,const struct addrinfo*, - struct addrinfo**); -int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD, - char*,DWORD,int); -#endif #endif #ifdef PLATFORM_ANDROID @@ -82,8 +71,10 @@ int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD, #include #include #include +#include #include "debugger-agent.h" #include "mini.h" +#include "seq-points.h" /* On iOS we can't use System.Environment.Exit () as it will do the wrong @@ -267,7 +258,10 @@ typedef struct { * event. This is the same as the ctx at step/breakpoint site, but includes changes * to caller saved registers done by set_var (). */ - MonoContext restore_ctx; + MonoThreadUnwindState restore_state; + /* Frames computed from restore_state */ + int restore_frame_count; + StackFrame **restore_frames; /* The currently unloading appdomain */ MonoDomain *domain_unloading; @@ -289,7 +283,7 @@ typedef struct { #define HEADER_LENGTH 11 #define MAJOR_VERSION 2 -#define MINOR_VERSION 38 +#define MINOR_VERSION 40 typedef enum { CMD_SET_VM = 1, @@ -574,6 +568,7 @@ typedef struct { StepFilter filter; gpointer last_sp; gpointer start_sp; + MonoMethod *start_method; MonoMethod *last_method; int last_line; /* Whenever single stepping is performed using start/stop_single_stepping () */ @@ -616,6 +611,12 @@ typedef struct ReplyPacket { #define DEBUG(level,s) do { if (G_UNLIKELY ((level) <= log_level)) { s; fflush (log_file); } } while (0) +#ifdef PLATFORM_ANDROID +#define DEBUG_PRINTF(level, ...) do { if (G_UNLIKELY ((level) <= log_level)) { g_print (__VA_ARGS__); } } while (0) +#else +#define DEBUG_PRINTF(level, ...) do { if (G_UNLIKELY ((level) <= log_level)) { fprintf (log_file, __VA_ARGS__); fflush (log_file); } } while (0) +#endif + #ifdef HOST_WIN32 #define get_last_sock_error() WSAGetLastError() #define MONO_EWOULDBLOCK WSAEWOULDBLOCK @@ -798,8 +799,9 @@ static void ids_cleanup (void); static void suspend_init (void); -static void ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint *sp, MonoSeqPointInfo *info, MonoContext *ctx, DebuggerTlsData *tls, gboolean step_to_catch); -static ErrorCode ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, EventRequest *req); +static void ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint *sp, MonoSeqPointInfo *info, MonoContext *ctx, DebuggerTlsData *tls, gboolean step_to_catch, + StackFrame **frames, int nframes); +static ErrorCode ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, StepFilter filter, EventRequest *req); static void ss_destroy (SingleStepReq *req); static void start_debugger_thread (void); @@ -995,6 +997,9 @@ mono_debugger_agent_init (void) mono_native_tls_alloc (&debugger_tls_id, NULL); + /* Needed by the hash_table_new_type () call below */ + mono_gc_base_init (); + thread_to_tls = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_KEY_GC); MONO_GC_REGISTER_ROOT_FIXED (thread_to_tls); @@ -1027,7 +1032,7 @@ mono_debugger_agent_init (void) breakpoints_init (); suspend_init (); - mini_get_debug_options ()->gen_seq_points = TRUE; + mini_get_debug_options ()->gen_seq_points_debug_data = TRUE; /* * This is needed because currently we don't handle liveness info. */ @@ -1159,10 +1164,6 @@ socket_transport_recv (void *buf, int len) } while ((res > 0 && total < len) || (res == -1 && get_last_sock_error () == MONO_EINTR)); return total; } - -#ifndef TARGET_PS3 -#define HAVE_GETADDRINFO 1 -#endif static void set_keepalive (void) @@ -1187,7 +1188,7 @@ socket_transport_accept (int socket_fd) if (conn_fd == -1) { fprintf (stderr, "debugger-agent: Unable to listen on %d\n", socket_fd); } else { - DEBUG (1, fprintf (log_file, "Accepted connection from client, connection fd=%d.\n", conn_fd)); + DEBUG_PRINTF (1, "Accepted connection from client, connection fd=%d.\n", conn_fd); } return conn_fd; @@ -1215,14 +1216,9 @@ socket_transport_send (void *data, int len) static void socket_transport_connect (const char *address) { -#ifdef HAVE_GETADDRINFO - struct addrinfo hints; - struct addrinfo *result, *rp; -#else - struct hostent *result; -#endif + MonoAddressInfo *result; + MonoAddressEntry *rp; int sfd = -1, s, res; - char port_string [128]; char *host; int port; @@ -1238,34 +1234,18 @@ socket_transport_connect (const char *address) listen_fd = -1; if (host) { - sprintf (port_string, "%d", port); mono_network_init (); /* Obtain address(es) matching host/port */ -#ifdef HAVE_GETADDRINFO - memset (&hints, 0, sizeof (struct addrinfo)); - hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ - hints.ai_socktype = SOCK_STREAM; /* Datagram socket */ - hints.ai_flags = 0; - hints.ai_protocol = 0; /* Any protocol */ - - s = getaddrinfo (host, port_string, &hints, &result); + s = mono_get_address_info (host, port, MONO_HINT_UNSPECIFIED, &result); if (s != 0) { - fprintf (stderr, "debugger-agent: Unable to resolve %s:%d: %s\n", host, port, gai_strerror (s)); + fprintf (stderr, "debugger-agent: Unable to resolve %s:%d: %d\n", host, port, s); // FIXME add portable error conversion functions exit (1); } -#else - /* The PS3 doesn't even have _r or hstrerror () */ - result = gethostbyname (host); - if (!result) { - fprintf (stderr, "debugger-agent: Unable to resolve %s:%d: %d\n", host, port, h_errno); - } -#endif } if (agent_config.server) { -#ifdef HAVE_GETADDRINFO /* Wait for a connection */ if (!host) { struct sockaddr_in addr; @@ -1296,18 +1276,22 @@ socket_transport_connect (const char *address) printf ("%s:%d\n", host, port); } else { /* Listen on the provided address */ - for (rp = result; rp != NULL; rp = rp->ai_next) { + for (rp = result->entries; rp != NULL; rp = rp->next) { + MonoSocketAddress sockaddr; + socklen_t sock_len; int n = 1; - sfd = socket (rp->ai_family, rp->ai_socktype, - rp->ai_protocol); + mono_socket_address_init (&sockaddr, &sock_len, rp->family, &rp->address, port); + + sfd = socket (rp->family, rp->socktype, + rp->protocol); if (sfd == -1) continue; if (setsockopt (sfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n)) == -1) continue; - res = bind (sfd, rp->ai_addr, rp->ai_addrlen); + res = bind (sfd, &sockaddr.addr, sock_len); if (res == -1) continue; @@ -1318,23 +1302,13 @@ socket_transport_connect (const char *address) break; } -#ifndef HOST_WIN32 - /* - * this function is not present on win2000 which we still support, and the - * workaround described here: - * http://msdn.microsoft.com/en-us/library/ms737931(VS.85).aspx - * only works with MSVC. - */ -#ifdef HAVE_GETADDRINFO - freeaddrinfo (result); -#endif -#endif + mono_free_address_info (result); } if (agent_config.defer) return; - DEBUG (1, fprintf (log_file, "Listening on %s:%d (timeout=%d ms)...\n", host, port, agent_config.timeout)); + DEBUG_PRINTF (1, "Listening on %s:%d (timeout=%d ms)...\n", host, port, agent_config.timeout); if (agent_config.timeout) { fd_set readfds; @@ -1355,21 +1329,22 @@ socket_transport_connect (const char *address) if (conn_fd == -1) exit (1); - DEBUG (1, fprintf (log_file, "Accepted connection from client, socket fd=%d.\n", conn_fd)); -#else - NOT_IMPLEMENTED; -#endif /* HAVE_GETADDRINFO */ + DEBUG_PRINTF (1, "Accepted connection from client, socket fd=%d.\n", conn_fd); } else { /* Connect to the specified address */ -#ifdef HAVE_GETADDRINFO /* FIXME: Respect the timeout */ - for (rp = result; rp != NULL; rp = rp->ai_next) { - sfd = socket (rp->ai_family, rp->ai_socktype, - rp->ai_protocol); + for (rp = result->entries; rp != NULL; rp = rp->next) { + MonoSocketAddress sockaddr; + socklen_t sock_len; + + mono_socket_address_init (&sockaddr, &sock_len, rp->family, &rp->address, port); + + sfd = socket (rp->family, rp->socktype, + rp->protocol); if (sfd == -1) continue; - if (connect (sfd, rp->ai_addr, rp->ai_addrlen) != -1) + if (connect (sfd, &sockaddr.addr, sock_len) != -1) break; /* Success */ close (sfd); @@ -1379,23 +1354,10 @@ socket_transport_connect (const char *address) fprintf (stderr, "debugger-agent: Unable to connect to %s:%d\n", host, port); exit (1); } -#else - sfd = socket (result->h_addrtype, SOCK_STREAM, 0); - if (sfd == -1) - g_assert_not_reached (); - res = connect (sfd, (void*)result->h_addr_list [0], result->h_length); - if (res == -1) - g_assert_not_reached (); -#endif conn_fd = sfd; -#ifndef HOST_WIN32 - /* See the comment above */ -#ifdef HAVE_GETADDRINFO - freeaddrinfo (result); -#endif -#endif + mono_free_address_info (result); } if (!transport_handshake ()) @@ -1908,7 +1870,7 @@ send_buffered_reply_packets (void) send_reply_packets (nreply_packets, reply_packets); for (i = 0; i < nreply_packets; ++i) buffer_free (reply_packets [i].data); - DEBUG (1, fprintf (log_file, "[dbg] Sent %d buffered reply packets [at=%lx].\n", nreply_packets, (long)mono_100ns_ticks () / 10000)); + DEBUG_PRINTF (1, "[dbg] Sent %d buffered reply packets [at=%lx].\n", nreply_packets, (long)mono_100ns_ticks () / 10000); nreply_packets = 0; } @@ -2347,7 +2309,7 @@ decode_ptr_id (guint8 *buf, guint8 **endbuf, guint8 *limit, IdType type, MonoDom dbg_unlock (); if (res->domain == NULL) { - DEBUG (0, fprintf (log_file, "ERR_UNLOADED, id=%d, type=%d.\n", id, type)); + DEBUG_PRINTF (0, "ERR_UNLOADED, id=%d, type=%d.\n", id, type); *err = ERR_UNLOADED; return NULL; } @@ -2377,7 +2339,7 @@ decode_typeid (guint8 *buf, guint8 **endbuf, guint8 *limit, MonoDomain **domain, char *s; s = mono_type_full_name (&klass->byval_arg); - DEBUG(2, fprintf (log_file, "[dbg] recv class [%s]\n", s)); + DEBUG_PRINTF (2, "[dbg] recv class [%s]\n", s); g_free (s); } return klass; @@ -2405,7 +2367,7 @@ decode_methodid (guint8 *buf, guint8 **endbuf, guint8 *limit, MonoDomain **domai char *s; s = mono_method_full_name (m, TRUE); - DEBUG(2, fprintf (log_file, "[dbg] recv method [%s]\n", s)); + DEBUG_PRINTF (2, "[dbg] recv method [%s]\n", s); g_free (s); } return m; @@ -2438,9 +2400,9 @@ buffer_add_typeid (Buffer *buf, MonoDomain *domain, MonoClass *klass) s = mono_type_full_name (&klass->byval_arg); if (GetCurrentThreadId () == debugger_thread_id) - DEBUG(2, fprintf (log_file, "[dbg] send class [%s]\n", s)); + DEBUG_PRINTF (2, "[dbg] send class [%s]\n", s); else - DEBUG(2, fprintf (log_file, "[%p] send class [%s]\n", (gpointer)GetCurrentThreadId (), s)); + DEBUG_PRINTF (2, "[%p] send class [%s]\n", (gpointer)GetCurrentThreadId (), s); g_free (s); } } @@ -2453,7 +2415,7 @@ buffer_add_methodid (Buffer *buf, MonoDomain *domain, MonoMethod *method) char *s; s = mono_method_full_name (method, 1); - DEBUG(2, fprintf (log_file, "[dbg] send method [%s]\n", s)); + DEBUG_PRINTF (2, "[dbg] send method [%s]\n", s); g_free (s); } } @@ -2465,7 +2427,7 @@ buffer_add_assemblyid (Buffer *buf, MonoDomain *domain, MonoAssembly *assembly) id = buffer_add_ptr_id (buf, domain, ID_ASSEMBLY, assembly); if (G_UNLIKELY (log_level >= 2) && assembly) - DEBUG(2, fprintf (log_file, "[dbg] send assembly [%s][%s][%d]\n", assembly->aname.name, domain->friendly_name, id)); + DEBUG_PRINTF (2, "[dbg] send assembly [%s][%s][%d]\n", assembly->aname.name, domain->friendly_name, id); } static inline void @@ -2624,7 +2586,7 @@ thread_interrupt (DebuggerTlsData *tls, MonoThreadInfo *info, void *sigctx, Mono if (ji) { /* Running managed code, will be suspended by the single step code */ - DEBUG (1, fprintf (log_file, "[%p] Received interrupt while at %s(%p), continuing.\n", (gpointer)(gsize)tid, jinfo_get_method (ji)->name, ip)); + DEBUG_PRINTF (1, "[%p] Received interrupt while at %s(%p), continuing.\n", (gpointer)(gsize)tid, jinfo_get_method (ji)->name, ip); return TRUE; } else { /* @@ -2640,7 +2602,7 @@ thread_interrupt (DebuggerTlsData *tls, MonoThreadInfo *info, void *sigctx, Mono // FIXME: printf is not signal safe, but this is only used during // debugger debugging if (ip) - DEBUG (1, fprintf (log_file, "[%p] Received interrupt while at %p, treating as suspended.\n", (gpointer)(gsize)tid, ip)); + DEBUG_PRINTF (1, "[%p] Received interrupt while at %p, treating as suspended.\n", (gpointer)(gsize)tid, ip); //save_thread_context (&ctx); if (!tls->thread) @@ -2659,7 +2621,7 @@ thread_interrupt (DebuggerTlsData *tls, MonoThreadInfo *info, void *sigctx, Mono */ data.last_frame_set = FALSE; if (sigctx) { - mono_arch_sigctx_to_monoctx (sigctx, &ctx); + mono_sigctx_to_monoctx (sigctx, &ctx); /* * Don't pass MONO_UNWIND_ACTUAL_METHOD, its not signal safe, and * get_last_frame () doesn't need it, the last frame cannot be a ginst @@ -2708,7 +2670,7 @@ mono_debugger_agent_thread_interrupt (void *sigctx, MonoJitInfo *ji) tls = mono_native_tls_get_value (debugger_tls_id); if (!tls) { - DEBUG (1, fprintf (log_file, "[%p] Received interrupt with no TLS, continuing.\n", (gpointer)GetCurrentThreadId ())); + DEBUG_PRINTF (1, "[%p] Received interrupt with no TLS, continuing.\n", (gpointer)GetCurrentThreadId ()); return FALSE; } @@ -2763,7 +2725,7 @@ notify_thread (gpointer key, gpointer value, gpointer user_data) if (GetCurrentThreadId () == tid || tls->terminated) return; - DEBUG(1, fprintf (log_file, "[%p] Interrupting %p...\n", (gpointer)GetCurrentThreadId (), (gpointer)tid)); + DEBUG_PRINTF (1, "[%p] Interrupting %p...\n", (gpointer)GetCurrentThreadId (), (gpointer)tid); /* * OSX can (and will) coalesce signals, so sending multiple pthread_kills does not @@ -2790,7 +2752,7 @@ notify_thread (gpointer key, gpointer value, gpointer user_data) info = mono_thread_info_safe_suspend_sync ((MonoNativeThreadId)(gpointer)(gsize)thread->tid, FALSE); if (!info) { - DEBUG(1, fprintf (log_file, "[%p] mono_thread_info_suspend_sync () failed for %p...\n", (gpointer)GetCurrentThreadId (), (gpointer)tid)); + DEBUG_PRINTF (1, "[%p] mono_thread_info_suspend_sync () failed for %p...\n", (gpointer)GetCurrentThreadId (), (gpointer)tid); /* * Attached thread which died without detaching. */ @@ -2809,7 +2771,7 @@ notify_thread (gpointer key, gpointer value, gpointer user_data) #else res = mono_thread_kill (thread, mono_thread_get_abort_signal ()); if (res) { - DEBUG(1, fprintf (log_file, "[%p] mono_thread_kill () failed for %p: %d...\n", (gpointer)GetCurrentThreadId (), (gpointer)tid, res)); + DEBUG_PRINTF (1, "[%p] mono_thread_kill () failed for %p: %d...\n", (gpointer)GetCurrentThreadId (), (gpointer)tid, res); /* * Attached thread which died without detaching. */ @@ -2842,7 +2804,7 @@ process_suspend (DebuggerTlsData *tls, MonoContext *ctx) if (suspend_count - tls->resume_count > 0) tls->suspending = TRUE; - DEBUG(1, fprintf (log_file, "[%p] Received single step event for suspending.\n", (gpointer)GetCurrentThreadId ())); + DEBUG_PRINTF (1, "[%p] Received single step event for suspending.\n", (gpointer)GetCurrentThreadId ()); if (suspend_count - tls->resume_count == 0) { /* @@ -2850,7 +2812,7 @@ process_suspend (DebuggerTlsData *tls, MonoContext *ctx) * suspending is still active. * FIXME: This slows down single threaded invokes. */ - DEBUG(1, fprintf (log_file, "[%p] Ignored during single threaded invoke.\n", (gpointer)GetCurrentThreadId ())); + DEBUG_PRINTF (1, "[%p] Ignored during single threaded invoke.\n", (gpointer)GetCurrentThreadId ()); return; } @@ -2881,7 +2843,7 @@ suspend_vm (void) suspend_count ++; - DEBUG(1, fprintf (log_file, "[%p] Suspending vm...\n", (gpointer)GetCurrentThreadId ())); + DEBUG_PRINTF (1, "[%p] Suspending vm...\n", (gpointer)GetCurrentThreadId ()); if (suspend_count == 1) { // FIXME: Is it safe to call this inside the lock ? @@ -2920,7 +2882,7 @@ resume_vm (void) g_assert (suspend_count > 0); suspend_count --; - DEBUG(1, fprintf (log_file, "[%p] Resuming vm, suspend count=%d...\n", (gpointer)GetCurrentThreadId (), suspend_count)); + DEBUG_PRINTF (1, "[%p] Resuming vm, suspend count=%d...\n", (gpointer)GetCurrentThreadId (), suspend_count); if (suspend_count == 0) { // FIXME: Is it safe to call this inside the lock ? @@ -2963,7 +2925,7 @@ resume_thread (MonoInternalThread *thread) g_assert (suspend_count > 0); - DEBUG(1, fprintf (log_file, "[sdb] Resuming thread %p...\n", (gpointer)(gssize)thread->tid)); + DEBUG_PRINTF (1, "[sdb] Resuming thread %p...\n", (gpointer)(gssize)thread->tid); tls->resume_count += suspend_count; @@ -2981,22 +2943,32 @@ resume_thread (MonoInternalThread *thread) } static void -invalidate_frames (DebuggerTlsData *tls) +free_frames (StackFrame **frames, int nframes) { int i; + for (i = 0; i < nframes; ++i) { + if (frames [i]->jit) + mono_debug_free_method_jit_info (frames [i]->jit); + g_free (frames [i]); + } + g_free (frames); +} + +static void +invalidate_frames (DebuggerTlsData *tls) +{ if (!tls) tls = mono_native_tls_get_value (debugger_tls_id); g_assert (tls); - for (i = 0; i < tls->frame_count; ++i) { - if (tls->frames [i]->jit) - mono_debug_free_method_jit_info (tls->frames [i]->jit); - g_free (tls->frames [i]); - } - g_free (tls->frames); + free_frames (tls->frames, tls->frame_count); tls->frame_count = 0; tls->frames = NULL; + + free_frames (tls->restore_frames, tls->restore_frame_count); + tls->restore_frame_count = 0; + tls->restore_frames = NULL; } /* @@ -3036,7 +3008,7 @@ suspend_current (void) MONO_SEM_POST (&suspend_sem); } - DEBUG(1, fprintf (log_file, "[%p] Suspended.\n", (gpointer)GetCurrentThreadId ())); + DEBUG_PRINTF (1, "[%p] Suspended.\n", (gpointer)GetCurrentThreadId ()); while (suspend_count - tls->resume_count > 0) { #ifdef HOST_WIN32 @@ -3062,7 +3034,7 @@ suspend_current (void) mono_mutex_unlock (&suspend_mutex); - DEBUG(1, fprintf (log_file, "[%p] Resumed.\n", (gpointer)GetCurrentThreadId ())); + DEBUG_PRINTF (1, "[%p] Resumed.\n", (gpointer)GetCurrentThreadId ()); if (tls->pending_invoke) { /* Save the original context */ @@ -3118,7 +3090,7 @@ wait_for_suspend (void) while (TRUE) { nwait = count_threads_to_wait_for (); if (nwait) { - DEBUG(1, fprintf (log_file, "Waiting for %d(%d) threads to suspend...\n", nwait, nthreads)); + DEBUG_PRINTF (1, "Waiting for %d(%d) threads to suspend...\n", nwait, nthreads); err = MONO_SEM_WAIT (&suspend_sem); g_assert (err == 0); waited = TRUE; @@ -3128,7 +3100,7 @@ wait_for_suspend (void) } if (waited) - DEBUG(1, fprintf (log_file, "%d threads suspended.\n", nthreads)); + DEBUG_PRINTF (1, "%d threads suspended.\n", nthreads); } /* @@ -3142,24 +3114,6 @@ is_suspended (void) return count_threads_to_wait_for () == 0; } -static MonoSeqPointInfo* -get_seq_points (MonoDomain *domain, MonoMethod *method) -{ - MonoSeqPointInfo *seq_points; - - mono_domain_lock (domain); - seq_points = g_hash_table_lookup (domain_jit_info (domain)->seq_points, method); - if (!seq_points && method->is_inflated) { - /* generic sharing + aot */ - seq_points = g_hash_table_lookup (domain_jit_info (domain)->seq_points, mono_method_get_declaring_generic_method (method)); - if (!seq_points) - seq_points = g_hash_table_lookup (domain_jit_info (domain)->seq_points, mini_get_shared_method (method)); - } - mono_domain_unlock (domain); - - return seq_points; -} - static void no_seq_points_found (MonoMethod *method) { @@ -3169,87 +3123,6 @@ no_seq_points_found (MonoMethod *method) printf ("Unable to find seq points for method '%s'.\n", mono_method_full_name (method, TRUE)); } -/* - * find_next_seq_point_for_native_offset: - * - * Find the first sequence point after NATIVE_OFFSET. - */ -static SeqPoint* -find_next_seq_point_for_native_offset (MonoDomain *domain, MonoMethod *method, gint32 native_offset, MonoSeqPointInfo **info) -{ - MonoSeqPointInfo *seq_points; - int i; - - seq_points = get_seq_points (domain, method); - if (!seq_points) { - if (info) - *info = NULL; - return NULL; - } - g_assert (seq_points); - if (info) - *info = seq_points; - - for (i = 0; i < seq_points->len; ++i) { - if (seq_points->seq_points [i].native_offset >= native_offset) - return &seq_points->seq_points [i]; - } - - return NULL; -} - -/* - * find_prev_seq_point_for_native_offset: - * - * Find the first sequence point before NATIVE_OFFSET. - */ -static SeqPoint* -find_prev_seq_point_for_native_offset (MonoDomain *domain, MonoMethod *method, gint32 native_offset, MonoSeqPointInfo **info) -{ - MonoSeqPointInfo *seq_points; - int i; - - seq_points = get_seq_points (domain, method); - if (info) - *info = seq_points; - if (!seq_points) - return NULL; - - for (i = seq_points->len - 1; i >= 0; --i) { - if (seq_points->seq_points [i].native_offset <= native_offset) - return &seq_points->seq_points [i]; - } - - return NULL; -} - -/* - * find_seq_point: - * - * Find the sequence point corresponding to the IL offset IL_OFFSET, which - * should be the location of a sequence point. - */ -static G_GNUC_UNUSED SeqPoint* -find_seq_point (MonoDomain *domain, MonoMethod *method, gint32 il_offset, MonoSeqPointInfo **info) -{ - MonoSeqPointInfo *seq_points; - int i; - - *info = NULL; - - seq_points = get_seq_points (domain, method); - if (!seq_points) - return NULL; - *info = seq_points; - - for (i = 0; i < seq_points->len; ++i) { - if (seq_points->seq_points [i].il_offset == il_offset) - return &seq_points->seq_points [i]; - } - - return NULL; -} - typedef struct { DebuggerTlsData *tls; GSList *frames; @@ -3261,7 +3134,7 @@ process_frame (StackFrameInfo *info, MonoContext *ctx, gpointer user_data) ComputeFramesUserData *ud = user_data; StackFrame *frame; MonoMethod *method, *actual_method, *api_method; - SeqPoint *sp; + SeqPoint sp; int flags = 0; if (info->type != FRAME_TYPE_MANAGED) { @@ -3289,15 +3162,14 @@ process_frame (StackFrameInfo *info, MonoContext *ctx, gpointer user_data) if (info->il_offset == -1) { /* mono_debug_il_offset_from_address () doesn't seem to be precise enough (#2092) */ if (ud->frames == NULL) { - sp = find_prev_seq_point_for_native_offset (info->domain, method, info->native_offset, NULL); - if (sp) - info->il_offset = sp->il_offset; + if (find_prev_seq_point_for_native_offset (info->domain, method, info->native_offset, NULL, &sp)) + info->il_offset = sp.il_offset; } if (info->il_offset == -1) info->il_offset = mono_debug_il_offset_from_address (method, info->domain, info->native_offset); } - DEBUG (1, fprintf (log_file, "\tFrame: %s:%x(%x) %d\n", mono_method_full_name (method, TRUE), info->il_offset, info->native_offset, info->managed)); + DEBUG_PRINTF (1, "\tFrame: %s:%x(%x) %d\n", mono_method_full_name (method, TRUE), info->il_offset, info->native_offset, info->managed); if (method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) { if (!CHECK_PROTOCOL_VERSION (2, 17)) @@ -3350,6 +3222,35 @@ process_filter_frame (StackFrameInfo *info, MonoContext *ctx, gpointer user_data return process_frame (info, ctx, user_data); } +/* + * Return a malloc-ed list of StackFrame structures. + */ +static StackFrame** +compute_frame_info_from (MonoInternalThread *thread, DebuggerTlsData *tls, MonoThreadUnwindState *state, int *out_nframes) +{ + ComputeFramesUserData user_data; + MonoUnwindOptions opts = MONO_UNWIND_DEFAULT|MONO_UNWIND_REG_LOCATIONS; + StackFrame **res; + int i, nframes; + GSList *l; + + user_data.tls = tls; + user_data.frames = NULL; + + mono_walk_stack_with_state (process_frame, state, opts, &user_data); + + nframes = g_slist_length (user_data.frames); + res = g_new0 (StackFrame*, nframes); + l = user_data.frames; + for (i = 0; i < nframes; ++i) { + res [i] = l->data; + l = l->next; + } + *out_nframes = nframes; + + return res; +} + static void compute_frame_info (MonoInternalThread *thread, DebuggerTlsData *tls) { @@ -3363,7 +3264,7 @@ compute_frame_info (MonoInternalThread *thread, DebuggerTlsData *tls) if (tls->frames && tls->frames_up_to_date) return; - DEBUG(1, fprintf (log_file, "Frames for %p(tid=%lx):\n", thread, (glong)thread->tid)); + DEBUG_PRINTF (1, "Frames for %p(tid=%lx):\n", thread, (glong)thread->tid); user_data.tls = tls; user_data.frames = NULL; @@ -3485,6 +3386,89 @@ strdup_tolower (char *s) return s2; } +/* + * Same as g_path_get_basename () but handles windows paths as well, + * which can occur in .mdb files created by pdb2mdb. + */ +static char* +dbg_path_get_basename (const char *filename) +{ + char *r; + + if (!filename || strchr (filename, '/') || !strchr (filename, '\\')) + return g_path_get_basename (filename); + + /* From gpath.c */ + + /* No separator -> filename */ + r = strrchr (filename, '\\'); + if (r == NULL) + return g_strdup (filename); + + /* Trailing slash, remove component */ + if (r [1] == 0){ + char *copy = g_strdup (filename); + copy [r-filename] = 0; + r = strrchr (copy, '\\'); + + if (r == NULL){ + g_free (copy); + return g_strdup ("/"); + } + r = g_strdup (&r[1]); + g_free (copy); + return r; + } + + return g_strdup (&r[1]); +} + +static void +init_jit_info_dbg_attrs (MonoJitInfo *ji) +{ + static MonoClass *hidden_klass, *step_through_klass, *non_user_klass; + MonoCustomAttrInfo *ainfo; + + if (ji->dbg_attrs_inited) + return; + + if (!hidden_klass) { + hidden_klass = mono_class_from_name (mono_defaults.corlib, "System.Diagnostics", "DebuggerHiddenAttribute"); + g_assert (hidden_klass); + } + if (!step_through_klass) { + step_through_klass = mono_class_from_name (mono_defaults.corlib, "System.Diagnostics", "DebuggerStepThroughAttribute"); + g_assert (step_through_klass); + } + if (!non_user_klass) { + non_user_klass = mono_class_from_name (mono_defaults.corlib, "System.Diagnostics", "DebuggerNonUserCodeAttribute"); + g_assert (non_user_klass); + } + + ainfo = mono_custom_attrs_from_method (jinfo_get_method (ji)); + if (ainfo) { + if (mono_custom_attrs_has_attr (ainfo, hidden_klass)) + ji->dbg_hidden = TRUE; + if (mono_custom_attrs_has_attr (ainfo, step_through_klass)) + ji->dbg_step_through = TRUE; + if (mono_custom_attrs_has_attr (ainfo, non_user_klass)) + ji->dbg_non_user_code = TRUE; + mono_custom_attrs_free (ainfo); + } + + ainfo = mono_custom_attrs_from_class (jinfo_get_method (ji)->klass); + if (ainfo) { + if (mono_custom_attrs_has_attr (ainfo, step_through_klass)) + ji->dbg_step_through = TRUE; + if (mono_custom_attrs_has_attr (ainfo, non_user_klass)) + ji->dbg_non_user_code = TRUE; + mono_custom_attrs_free (ainfo); + } + + mono_memory_barrier (); + ji->dbg_attrs_inited = TRUE; +} + /* * EVENT HANDLING */ @@ -3579,7 +3563,7 @@ create_event_list (EventKind event, GPtrArray *reqs, MonoJitInfo *ji, EventInfo if (g_hash_table_lookup (mod->data.source_files, s)) found = TRUE; else { - char *s2 = g_path_get_basename (sinfo->source_file); + char *s2 = dbg_path_get_basename (sinfo->source_file); char *s3 = strdup_tolower (s2); if (g_hash_table_lookup (mod->data.source_files, s3)) @@ -3604,77 +3588,21 @@ create_event_list (EventKind event, GPtrArray *reqs, MonoJitInfo *ji, EventInfo } else if (mod->kind == MOD_KIND_STEP) { if ((mod->data.filter & STEP_FILTER_STATIC_CTOR) && ji && (jinfo_get_method (ji)->flags & METHOD_ATTRIBUTE_SPECIAL_NAME) && - !strcmp (jinfo_get_method (ji)->name, ".cctor")) + !strcmp (jinfo_get_method (ji)->name, ".cctor") && + (jinfo_get_method (ji) != ((SingleStepReq*)req->info)->start_method)) filtered = TRUE; if ((mod->data.filter & STEP_FILTER_DEBUGGER_HIDDEN) && ji) { - MonoCustomAttrInfo *ainfo; - static MonoClass *klass; - - if (!klass) { - klass = mono_class_from_name (mono_defaults.corlib, "System.Diagnostics", "DebuggerHiddenAttribute"); - g_assert (klass); - } - if (!ji->dbg_hidden_inited) { - ainfo = mono_custom_attrs_from_method (jinfo_get_method (ji)); - if (ainfo) { - if (mono_custom_attrs_has_attr (ainfo, klass)) - ji->dbg_hidden = TRUE; - mono_custom_attrs_free (ainfo); - } - ji->dbg_hidden_inited = TRUE; - } + init_jit_info_dbg_attrs (ji); if (ji->dbg_hidden) filtered = TRUE; } if ((mod->data.filter & STEP_FILTER_DEBUGGER_STEP_THROUGH) && ji) { - MonoCustomAttrInfo *ainfo; - static MonoClass *klass; - - if (!klass) { - klass = mono_class_from_name (mono_defaults.corlib, "System.Diagnostics", "DebuggerStepThroughAttribute"); - g_assert (klass); - } - if (!ji->dbg_step_through_inited) { - ainfo = mono_custom_attrs_from_method (jinfo_get_method (ji)); - if (ainfo) { - if (mono_custom_attrs_has_attr (ainfo, klass)) - ji->dbg_step_through = TRUE; - mono_custom_attrs_free (ainfo); - } - ainfo = mono_custom_attrs_from_class (jinfo_get_method (ji)->klass); - if (ainfo) { - if (mono_custom_attrs_has_attr (ainfo, klass)) - ji->dbg_step_through = TRUE; - mono_custom_attrs_free (ainfo); - } - ji->dbg_step_through_inited = TRUE; - } + init_jit_info_dbg_attrs (ji); if (ji->dbg_step_through) filtered = TRUE; } if ((mod->data.filter & STEP_FILTER_DEBUGGER_NON_USER_CODE) && ji) { - MonoCustomAttrInfo *ainfo; - static MonoClass *klass; - - if (!klass) { - klass = mono_class_from_name (mono_defaults.corlib, "System.Diagnostics", "DebuggerNonUserCodeAttribute"); - g_assert (klass); - } - if (!ji->dbg_non_user_code_inited) { - ainfo = mono_custom_attrs_from_method (jinfo_get_method (ji)); - if (ainfo) { - if (mono_custom_attrs_has_attr (ainfo, klass)) - ji->dbg_non_user_code = TRUE; - mono_custom_attrs_free (ainfo); - } - ainfo = mono_custom_attrs_from_class (jinfo_get_method (ji)->klass); - if (ainfo) { - if (mono_custom_attrs_has_attr (ainfo, klass)) - ji->dbg_non_user_code = TRUE; - mono_custom_attrs_free (ainfo); - } - ji->dbg_non_user_code_inited = TRUE; - } + init_jit_info_dbg_attrs (ji); if (ji->dbg_non_user_code) filtered = TRUE; } @@ -3745,28 +3673,28 @@ process_event (EventKind event, gpointer arg, gint32 il_offset, MonoContext *ctx int nevents; if (!inited) { - DEBUG (2, fprintf (log_file, "Debugger agent not initialized yet: dropping %s\n", event_to_string (event))); + DEBUG_PRINTF (2, "Debugger agent not initialized yet: dropping %s\n", event_to_string (event)); return; } if (!vm_start_event_sent && event != EVENT_KIND_VM_START) { // FIXME: We miss those events - DEBUG (2, fprintf (log_file, "VM start event not sent yet: dropping %s\n", event_to_string (event))); + DEBUG_PRINTF (2, "VM start event not sent yet: dropping %s\n", event_to_string (event)); return; } if (vm_death_event_sent) { - DEBUG (2, fprintf (log_file, "VM death event has been sent: dropping %s\n", event_to_string (event))); + DEBUG_PRINTF (2, "VM death event has been sent: dropping %s\n", event_to_string (event)); return; } if (mono_runtime_is_shutting_down () && event != EVENT_KIND_VM_DEATH) { - DEBUG (2, fprintf (log_file, "Mono runtime is shutting down: dropping %s\n", event_to_string (event))); + DEBUG_PRINTF (2, "Mono runtime is shutting down: dropping %s\n", event_to_string (event)); return; } if (disconnected) { - DEBUG (2, fprintf (log_file, "Debugger client is not connected: dropping %s\n", event_to_string (event))); + DEBUG_PRINTF (2, "Debugger client is not connected: dropping %s\n", event_to_string (event)); return; } @@ -3914,7 +3842,7 @@ process_event (EventKind event, gpointer arg, gint32 il_offset, MonoContext *ctx events = NULL; if (!send_success) { - DEBUG (2, fprintf (log_file, "Sending command %s failed.\n", event_to_string (event))); + DEBUG_PRINTF (2, "Sending command %s failed.\n", event_to_string (event)); return; } @@ -3922,7 +3850,7 @@ process_event (EventKind event, gpointer arg, gint32 il_offset, MonoContext *ctx vm_start_event_sent = TRUE; } - DEBUG (1, fprintf (log_file, "[%p] Sent %d events %s(%d), suspend=%d.\n", (gpointer)GetCurrentThreadId (), nevents, event_to_string (event), ecount, suspend_policy)); + DEBUG_PRINTF (1, "[%p] Sent %d events %s(%d), suspend=%d.\n", (gpointer)GetCurrentThreadId (), nevents, event_to_string (event), ecount, suspend_policy); switch (suspend_policy) { case SUSPEND_POLICY_NONE: @@ -3994,14 +3922,14 @@ thread_startup (MonoProfiler *prof, uintptr_t tid) * For some reason, thread_startup () might be called for the same thread * multiple times (attach ?). */ - DEBUG (1, fprintf (log_file, "[%p] thread_start () called multiple times for %p, ignored.\n", (gpointer)tid, (gpointer)tid)); + DEBUG_PRINTF (1, "[%p] thread_start () called multiple times for %p, ignored.\n", (gpointer)tid, (gpointer)tid); return; } else { /* * thread_end () might not be called for some threads, and the tid could * get reused. */ - DEBUG (1, fprintf (log_file, "[%p] Removing stale data for tid %p.\n", (gpointer)tid, (gpointer)tid)); + DEBUG_PRINTF (1, "[%p] Removing stale data for tid %p.\n", (gpointer)tid, (gpointer)tid); mono_loader_lock (); mono_g_hash_table_remove (thread_to_tls, old_thread); mono_g_hash_table_remove (tid_to_thread, (gpointer)tid); @@ -4018,7 +3946,7 @@ thread_startup (MonoProfiler *prof, uintptr_t tid) tls->thread = thread; mono_native_tls_set_value (debugger_tls_id, tls); - DEBUG (1, fprintf (log_file, "[%p] Thread started, obj=%p, tls=%p.\n", (gpointer)tid, thread, tls)); + DEBUG_PRINTF (1, "[%p] Thread started, obj=%p, tls=%p.\n", (gpointer)tid, thread, tls); mono_loader_lock (); mono_g_hash_table_insert (thread_to_tls, thread, tls); @@ -4057,7 +3985,16 @@ thread_end (MonoProfiler *prof, uintptr_t tid) /* We might be called for threads started before we registered the start callback */ if (thread) { - DEBUG (1, fprintf (log_file, "[%p] Thread terminated, obj=%p, tls=%p.\n", (gpointer)tid, thread, tls)); + DEBUG_PRINTF (1, "[%p] Thread terminated, obj=%p, tls=%p.\n", (gpointer)tid, thread, tls); + + if (GetCurrentThreadId () == tid && !mono_native_tls_get_value (debugger_tls_id)) { + /* + * This can happen on darwin since we deregister threads using pthread dtors. + * process_profiler_event () and the code it calls cannot handle a null TLS value. + */ + return; + } + process_profiler_event (EVENT_KIND_THREAD_DEATH, thread); } } @@ -4286,7 +4223,6 @@ typedef struct { guint8 *ip; MonoJitInfo *ji; MonoDomain *domain; - SeqPoint *sp; } BreakpointInstance; /* @@ -4331,38 +4267,44 @@ breakpoints_init (void) static void insert_breakpoint (MonoSeqPointInfo *seq_points, MonoDomain *domain, MonoJitInfo *ji, MonoBreakpoint *bp, MonoError *error) { - int i, count; + int count; BreakpointInstance *inst; - SeqPoint *sp = NULL; + SeqPointIterator it; + gboolean it_has_sp = FALSE; if (error) mono_error_init (error); - for (i = 0; i < seq_points->len; ++i) { - sp = &seq_points->seq_points [i]; - - if (sp->il_offset == bp->il_offset) + seq_point_iterator_init (&it, seq_points); + while (seq_point_iterator_next (&it)) { + if (it.seq_point.il_offset == bp->il_offset) { + it_has_sp = TRUE; break; + } } - if (i == seq_points->len) { + if (!it_has_sp) { /* * The set of IL offsets with seq points doesn't completely match the * info returned by CMD_METHOD_GET_DEBUG_INFO (#407). */ - for (i = 0; i < seq_points->len; ++i) { - sp = &seq_points->seq_points [i]; - - if (sp->il_offset != METHOD_ENTRY_IL_OFFSET && sp->il_offset != METHOD_EXIT_IL_OFFSET && sp->il_offset + 1 == bp->il_offset) + seq_point_iterator_init (&it, seq_points); + while (seq_point_iterator_next (&it)) { + if (it.seq_point.il_offset != METHOD_ENTRY_IL_OFFSET && + it.seq_point.il_offset != METHOD_EXIT_IL_OFFSET && + it.seq_point.il_offset + 1 == bp->il_offset) { + it_has_sp = TRUE; break; + } } } - if (i == seq_points->len) { - char *s = g_strdup_printf ("Unable to insert breakpoint at %s:%d, seq_points=%d\n", mono_method_full_name (jinfo_get_method (ji), TRUE), bp->il_offset, seq_points->len); + if (!it_has_sp) { + char *s = g_strdup_printf ("Unable to insert breakpoint at %s:%d", mono_method_full_name (jinfo_get_method (ji), TRUE), bp->il_offset); - for (i = 0; i < seq_points->len; ++i) - DEBUG (1, fprintf (log_file, "%d\n", seq_points->seq_points [i].il_offset)); + seq_point_iterator_init (&it, seq_points); + while (seq_point_iterator_next (&it)) + DEBUG_PRINTF (1, "%d\n", it.seq_point.il_offset); if (error) { mono_error_set_error (error, MONO_ERROR_GENERIC, "%s", s); @@ -4377,9 +4319,9 @@ insert_breakpoint (MonoSeqPointInfo *seq_points, MonoDomain *domain, MonoJitInfo } inst = g_new0 (BreakpointInstance, 1); - inst->sp = sp; - inst->native_offset = sp->native_offset; - inst->ip = (guint8*)ji->code_start + sp->native_offset; + inst->il_offset = it.seq_point.il_offset; + inst->native_offset = it.seq_point.native_offset; + inst->ip = (guint8*)ji->code_start + it.seq_point.native_offset; inst->ji = ji; inst->domain = domain; @@ -4394,8 +4336,8 @@ insert_breakpoint (MonoSeqPointInfo *seq_points, MonoDomain *domain, MonoJitInfo g_hash_table_insert (bp_locs, inst->ip, GINT_TO_POINTER (count + 1)); dbg_unlock (); - if (sp->native_offset == SEQ_POINT_NATIVE_OFFSET_DEAD_CODE) { - DEBUG (1, fprintf (log_file, "[dbg] Attempting to insert seq point at dead IL offset %d, ignoring.\n", (int)bp->il_offset)); + if (it.seq_point.native_offset == SEQ_POINT_NATIVE_OFFSET_DEAD_CODE) { + DEBUG_PRINTF (1, "[dbg] Attempting to insert seq point at dead IL offset %d, ignoring.\n", (int)bp->il_offset); } else if (count == 0) { #ifdef MONO_ARCH_SOFT_DEBUG_SUPPORTED mono_arch_set_breakpoint (ji, inst->ip); @@ -4404,7 +4346,7 @@ insert_breakpoint (MonoSeqPointInfo *seq_points, MonoDomain *domain, MonoJitInfo #endif } - DEBUG(1, fprintf (log_file, "[dbg] Inserted breakpoint at %s:0x%x [%p](%d).\n", mono_method_full_name (jinfo_get_method (ji), TRUE), (int)sp->il_offset, inst->ip, count)); + DEBUG_PRINTF (1, "[dbg] Inserted breakpoint at %s:0x%x [%p](%d).\n", mono_method_full_name (jinfo_get_method (ji), TRUE), (int)it.seq_point.il_offset, inst->ip, count); } static void @@ -4424,7 +4366,7 @@ remove_breakpoint (BreakpointInstance *inst) if (count == 1 && inst->native_offset != SEQ_POINT_NATIVE_OFFSET_DEAD_CODE) { mono_arch_clear_breakpoint (ji, ip); - DEBUG(1, fprintf (log_file, "[dbg] Clear breakpoint at %s [%p].\n", mono_method_full_name (jinfo_get_method (ji), TRUE), ip)); + DEBUG_PRINTF (1, "[dbg] Clear breakpoint at %s [%p].\n", mono_method_full_name (jinfo_get_method (ji), TRUE), ip); } #else NOT_IMPLEMENTED; @@ -4575,7 +4517,7 @@ set_breakpoint (MonoMethod *method, long il_offset, EventRequest *req, MonoError bp->req = req; bp->children = g_ptr_array_new (); - DEBUG(1, fprintf (log_file, "[dbg] Setting %sbreakpoint at %s:0x%x.\n", (req->event_kind == EVENT_KIND_STEP) ? "single step " : "", method ? mono_method_full_name (method, TRUE) : "", (int)il_offset)); + DEBUG_PRINTF (1, "[dbg] Setting %sbreakpoint at %s:0x%x.\n", (req->event_kind == EVENT_KIND_STEP) ? "single step " : "", method ? mono_method_full_name (method, TRUE) : "", (int)il_offset); mono_loader_lock (); @@ -4712,7 +4654,7 @@ ss_update (SingleStepReq *req, MonoJitInfo *ji, SeqPoint *sp, DebuggerTlsData *t /* * These seq points are inserted by the JIT after calls, step over needs to skip them. */ - DEBUG (1, fprintf (log_file, "[%p] Seq point at nonempty stack %x while stepping over, continuing single stepping.\n", (gpointer)GetCurrentThreadId (), sp->il_offset)); + DEBUG_PRINTF (1, "[%p] Seq point at nonempty stack %x while stepping over, continuing single stepping.\n", (gpointer)GetCurrentThreadId (), sp->il_offset); return FALSE; } @@ -4722,7 +4664,18 @@ ss_update (SingleStepReq *req, MonoJitInfo *ji, SeqPoint *sp, DebuggerTlsData *t compute_frame_info (tls->thread, tls); if (req->nframes && tls->frame_count && tls->frame_count > req->nframes) { /* Hit the breakpoint in a recursive call */ - DEBUG (1, fprintf (log_file, "[%p] Breakpoint at lower frame while stepping over, continuing single stepping.\n", (gpointer)GetCurrentThreadId ())); + DEBUG_PRINTF (1, "[%p] Breakpoint at lower frame while stepping over, continuing single stepping.\n", (gpointer)GetCurrentThreadId ()); + return FALSE; + } + } + + if (req->depth == STEP_DEPTH_INTO && req->size == STEP_SIZE_MIN && (sp->flags & MONO_SEQ_POINT_FLAG_NONEMPTY_STACK) && ss_req->start_method){ + method = jinfo_get_method (ji); + if (!tls->context.valid) + mono_thread_state_init_from_monoctx (&tls->context, ctx); + compute_frame_info (tls->thread, tls); + if (ss_req->start_method == method && req->nframes && tls->frame_count == req->nframes) {//Check also frame count(could be recursion) + DEBUG_PRINTF (1, "[%p] Seq point at nonempty stack %x while stepping in, continuing single stepping.\n", (gpointer)GetCurrentThreadId (), sp->il_offset); return FALSE; } } @@ -4737,12 +4690,12 @@ ss_update (SingleStepReq *req, MonoJitInfo *ji, SeqPoint *sp, DebuggerTlsData *t if (minfo) loc = mono_debug_symfile_lookup_location (minfo, sp->il_offset); - if (!loc || (loc && method == ss_req->last_method && loc->row == ss_req->last_line)) { - /* Have to continue single stepping */ - if (!loc) - DEBUG(1, fprintf (log_file, "[%p] No line number info for il offset %x, continuing single stepping.\n", (gpointer)GetCurrentThreadId (), sp->il_offset)); - else - DEBUG(1, fprintf (log_file, "[%p] Same source line (%d), continuing single stepping.\n", (gpointer)GetCurrentThreadId (), loc->row)); + if (!loc) { + DEBUG_PRINTF (1, "[%p] No line number info for il offset %x, continuing single stepping.\n", (gpointer)GetCurrentThreadId (), sp->il_offset); + ss_req->last_method = method; + hit = FALSE; + } else if (loc && method == ss_req->last_method && loc->row == ss_req->last_line) { + DEBUG_PRINTF (1, "[%p] Same source line (%d), continuing single stepping.\n", (gpointer)GetCurrentThreadId (), loc->row); hit = FALSE; } @@ -4773,10 +4726,11 @@ process_breakpoint_inner (DebuggerTlsData *tls) GPtrArray *bp_reqs, *ss_reqs_orig, *ss_reqs; GSList *bp_events = NULL, *ss_events = NULL, *enter_leave_events = NULL; EventKind kind = EVENT_KIND_BREAKPOINT; - MonoContext *ctx = &tls->restore_ctx; + MonoContext *ctx = &tls->restore_state.ctx; MonoMethod *method; MonoSeqPointInfo *info; - SeqPoint *sp; + SeqPoint sp; + gboolean found_sp; // FIXME: Speed this up @@ -4806,12 +4760,14 @@ process_breakpoint_inner (DebuggerTlsData *tls) * The ip points to the instruction causing the breakpoint event, which is after * the offset recorded in the seq point map, so find the prev seq point before ip. */ - sp = find_prev_seq_point_for_native_offset (mono_domain_get (), method, native_offset, &info); - if (!sp) - no_seq_points_found (method); - g_assert (sp); + found_sp = find_prev_seq_point_for_native_offset (mono_domain_get (), method, native_offset, &info, &sp); - DEBUG(1, fprintf (log_file, "[%p] Breakpoint hit, method=%s, ip=%p, offset=0x%x, sp il offset=0x%x.\n", (gpointer)GetCurrentThreadId (), method->name, ip, native_offset, sp ? sp->il_offset : -1)); + if (!found_sp) + no_seq_points_found (method); + + g_assert (found_sp); + + DEBUG_PRINTF (1, "[%p] Breakpoint hit, method=%s, ip=%p, offset=0x%x, sp il offset=0x%x.\n", (gpointer)GetCurrentThreadId (), method->name, ip, native_offset, sp.il_offset); bp = NULL; for (i = 0; i < breakpoints->len; ++i) { @@ -4822,7 +4778,7 @@ process_breakpoint_inner (DebuggerTlsData *tls) for (j = 0; j < bp->children->len; ++j) { inst = g_ptr_array_index (bp->children, j); - if (inst->ji == ji && inst->sp == sp) { + if (inst->ji == ji && inst->il_offset == sp.il_offset && inst->native_offset == sp.native_offset) { if (bp->req->event_kind == EVENT_KIND_STEP) { g_ptr_array_add (ss_reqs_orig, bp->req); } else { @@ -4833,9 +4789,9 @@ process_breakpoint_inner (DebuggerTlsData *tls) } if (bp_reqs->len == 0 && ss_reqs_orig->len == 0) { /* Maybe a method entry/exit event */ - if (sp->il_offset == METHOD_ENTRY_IL_OFFSET) + if (sp.il_offset == METHOD_ENTRY_IL_OFFSET) kind = EVENT_KIND_METHOD_ENTRY; - else if (sp->il_offset == METHOD_EXIT_IL_OFFSET) + else if (sp.il_offset == METHOD_EXIT_IL_OFFSET) kind = EVENT_KIND_METHOD_EXIT; } @@ -4848,12 +4804,12 @@ process_breakpoint_inner (DebuggerTlsData *tls) if (mono_thread_internal_current () != ss_req->thread) continue; - hit = ss_update (ss_req, ji, sp, tls, ctx); + hit = ss_update (ss_req, ji, &sp, tls, ctx); if (hit) g_ptr_array_add (ss_reqs, req); /* Start single stepping again from the current sequence point */ - ss_start (ss_req, method, sp, info, ctx, tls, FALSE); + ss_start (ss_req, method, &sp, info, ctx, tls, FALSE, NULL, 0); } if (ss_reqs->len > 0) @@ -4885,18 +4841,19 @@ static void process_signal_event (void (*func) (DebuggerTlsData*)) { DebuggerTlsData *tls; - MonoContext orig_restore_ctx, ctx; + MonoThreadUnwindState orig_restore_state; + MonoContext ctx; tls = mono_native_tls_get_value (debugger_tls_id); /* Have to save/restore the restore_ctx as we can be called recursively during invokes etc. */ - memcpy (&orig_restore_ctx, &tls->restore_ctx, sizeof (MonoContext)); - memcpy (&tls->restore_ctx, &tls->handler_ctx, sizeof (MonoContext)); + memcpy (&orig_restore_state, &tls->restore_state, sizeof (MonoThreadUnwindState)); + mono_thread_state_init_from_monoctx (&tls->restore_state, &tls->handler_ctx); func (tls); /* This is called when resuming from a signal handler, so it shouldn't return */ - memcpy (&ctx, &tls->restore_ctx, sizeof (MonoContext)); - memcpy (&tls->restore_ctx, &orig_restore_ctx, sizeof (MonoContext)); + memcpy (&ctx, &tls->restore_state.ctx, sizeof (MonoContext)); + memcpy (&tls->restore_state, &orig_restore_state, sizeof (MonoThreadUnwindState)); mono_restore_context (&ctx); g_assert_not_reached (); } @@ -4924,14 +4881,14 @@ resume_from_signal_handler (void *sigctx, void *func) // clobbered by a single step/breakpoint event. If this turns out to be a problem, // clob:c could be added to op_seq_point. - mono_arch_sigctx_to_monoctx (sigctx, &ctx); + mono_sigctx_to_monoctx (sigctx, &ctx); memcpy (&tls->handler_ctx, &ctx, sizeof (MonoContext)); #ifdef MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX mono_arch_setup_resume_sighandler_ctx (&ctx, func); #else MONO_CONTEXT_SET_IP (&ctx, func); #endif - mono_arch_monoctx_to_sigctx (&ctx, sigctx); + mono_monoctx_to_sigctx (&ctx, sigctx); #ifdef PPC_USES_FUNCTION_DESCRIPTOR mono_ppc_set_func_into_sigctx (sigctx, func); @@ -5012,9 +4969,9 @@ process_single_step_inner (DebuggerTlsData *tls) int il_offset, suspend_policy; MonoDomain *domain; GSList *events; - MonoContext *ctx = &tls->restore_ctx; + MonoContext *ctx = &tls->restore_state.ctx; MonoMethod *method; - SeqPoint *sp; + SeqPoint sp; MonoSeqPointInfo *info; ip = MONO_CONTEXT_GET_IP (ctx); @@ -5037,7 +4994,7 @@ process_single_step_inner (DebuggerTlsData *tls) if (log_level > 0) { ji = mini_jit_info_table_find (mono_domain_get (), (char*)ip, &domain); - DEBUG (1, fprintf (log_file, "[%p] Single step event (depth=%s) at %s (%p), sp %p, last sp %p\n", (gpointer)GetCurrentThreadId (), ss_depth_to_string (ss_req->depth), mono_method_full_name (jinfo_get_method (ji), TRUE), MONO_CONTEXT_GET_IP (ctx), MONO_CONTEXT_GET_SP (ctx), ss_req->last_sp)); + DEBUG_PRINTF (1, "[%p] Single step event (depth=%s) at %s (%p)[0x%x], sp %p, last sp %p\n", (gpointer)GetCurrentThreadId (), ss_depth_to_string (ss_req->depth), mono_method_full_name (jinfo_get_method (ji), TRUE), MONO_CONTEXT_GET_IP (ctx), (int)((guint8*)MONO_CONTEXT_GET_IP (ctx) - (guint8*)ji->code_start), MONO_CONTEXT_GET_SP (ctx), ss_req->last_sp); } ji = mini_jit_info_table_find (mono_domain_get (), (char*)ip, &domain); @@ -5060,16 +5017,16 @@ process_single_step_inner (DebuggerTlsData *tls) * The ip points to the instruction causing the single step event, which is before * the offset recorded in the seq point map, so find the next seq point after ip. */ - sp = find_next_seq_point_for_native_offset (domain, method, (guint8*)ip - (guint8*)ji->code_start, &info); - if (!sp) + if (!find_next_seq_point_for_native_offset (domain, method, (guint8*)ip - (guint8*)ji->code_start, &info, &sp)) return; - il_offset = sp->il_offset; - if (!ss_update (ss_req, ji, sp, tls, ctx)) + il_offset = sp.il_offset; + + if (!ss_update (ss_req, ji, &sp, tls, ctx)) return; /* Start single stepping again from the current sequence point */ - ss_start (ss_req, method, sp, info, ctx, tls, FALSE); + ss_start (ss_req, method, &sp, info, ctx, tls, FALSE, NULL, 0); if ((ss_req->filter & STEP_FILTER_STATIC_CTOR) && (method->flags & METHOD_ATTRIBUTE_SPECIAL_NAME) && @@ -5121,9 +5078,9 @@ mono_debugger_agent_single_step_event (void *sigctx) */ MonoContext ctx; - mono_arch_sigctx_to_monoctx (sigctx, &ctx); + mono_sigctx_to_monoctx (sigctx, &ctx); mono_arch_skip_single_step (&ctx); - mono_arch_monoctx_to_sigctx (&ctx, sigctx); + mono_monoctx_to_sigctx (&ctx, sigctx); return; } @@ -5134,36 +5091,36 @@ void debugger_agent_single_step_from_context (MonoContext *ctx) { DebuggerTlsData *tls; - MonoContext orig_restore_ctx; + MonoThreadUnwindState orig_restore_state; tls = mono_native_tls_get_value (debugger_tls_id); g_assert (tls); /* Have to save/restore the restore_ctx as we can be called recursively during invokes etc. */ - memcpy (&orig_restore_ctx, &tls->restore_ctx, sizeof (MonoContext)); - memcpy (&tls->restore_ctx, ctx, sizeof (MonoContext)); + memcpy (&orig_restore_state, &tls->restore_state, sizeof (MonoThreadUnwindState)); + mono_thread_state_init_from_monoctx (&tls->restore_state, ctx); process_single_step_inner (tls); - memcpy (ctx, &tls->restore_ctx, sizeof (MonoContext)); - memcpy (&tls->restore_ctx, &orig_restore_ctx, sizeof (MonoContext)); + memcpy (ctx, &tls->restore_state.ctx, sizeof (MonoContext)); + memcpy (&tls->restore_state, &orig_restore_state, sizeof (MonoThreadUnwindState)); } void debugger_agent_breakpoint_from_context (MonoContext *ctx) { DebuggerTlsData *tls; - MonoContext orig_restore_ctx; + MonoThreadUnwindState orig_restore_state; tls = mono_native_tls_get_value (debugger_tls_id); g_assert (tls); - memcpy (&orig_restore_ctx, &tls->restore_ctx, sizeof (MonoContext)); - memcpy (&tls->restore_ctx, ctx, sizeof (MonoContext)); + memcpy (&orig_restore_state, &tls->restore_state, sizeof (MonoContext)); + mono_thread_state_init_from_monoctx (&tls->restore_state, ctx); process_breakpoint_inner (tls); - memcpy (ctx, &tls->restore_ctx, sizeof (MonoContext)); - memcpy (&tls->restore_ctx, &orig_restore_ctx, sizeof (MonoContext)); + memcpy (ctx, &tls->restore_state.ctx, sizeof (MonoContext)); + memcpy (&tls->restore_state, &orig_restore_state, sizeof (MonoThreadUnwindState)); } /* @@ -5241,13 +5198,19 @@ ss_stop (SingleStepReq *ss_req) * Start the single stepping operation given by SS_REQ from the sequence point SP. * If CTX is not set, then this can target any thread. If CTX is set, then TLS should * belong to the same thread as CTX. + * If FRAMES is not-null, use that instead of tls->frames for placing breakpoints etc. */ static void -ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint *sp, MonoSeqPointInfo *info, MonoContext *ctx, DebuggerTlsData *tls, gboolean step_to_catch) +ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint* sp, MonoSeqPointInfo *info, MonoContext *ctx, DebuggerTlsData *tls, + gboolean step_to_catch, StackFrame **frames, int nframes) { int i, j, frame_index; - SeqPoint *next_sp; + SeqPoint *next_sp, *parent_sp = NULL; + SeqPoint local_sp, local_parent_sp; + gboolean found_sp; MonoBreakpoint *bp; + MonoSeqPointInfo *parent_info; + MonoMethod *parent_sp_method = NULL; gboolean enable_global = FALSE; /* Stop the previous operation */ @@ -5262,11 +5225,13 @@ ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint *sp, MonoSeqPointI } else { frame_index = 1; - if ((!sp || sp->next_len == 0 || ss_req->depth == STEP_DEPTH_OUT || ss_req->depth == STEP_DEPTH_OVER) && ctx) { + if (ctx && !frames) { /* Need parent frames */ if (!tls->context.valid) mono_thread_state_init_from_monoctx (&tls->context, ctx); compute_frame_info (tls->thread, tls); + frames = tls->frames; + nframes = tls->frame_count; } /* @@ -5275,11 +5240,12 @@ ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint *sp, MonoSeqPointI */ if (ss_req->depth == STEP_DEPTH_OUT) { /* Ignore seq points in current method */ - while (frame_index < tls->frame_count) { - StackFrame *frame = tls->frames [frame_index]; + while (frame_index < nframes) { + StackFrame *frame = frames [frame_index]; method = frame->method; - sp = find_prev_seq_point_for_native_offset (frame->domain, frame->method, frame->native_offset, &info); + found_sp = find_prev_seq_point_for_native_offset (frame->domain, frame->method, frame->native_offset, &info, &local_sp); + sp = (found_sp)? &local_sp : NULL; frame_index ++; if (sp && sp->next_len != 0) break; @@ -5289,41 +5255,73 @@ ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint *sp, MonoSeqPointI } else { if (sp && sp->next_len == 0) { sp = NULL; - while (frame_index < tls->frame_count) { - StackFrame *frame = tls->frames [frame_index]; + while (frame_index < nframes) { + StackFrame *frame = frames [frame_index]; method = frame->method; - sp = find_prev_seq_point_for_native_offset (frame->domain, frame->method, frame->native_offset, &info); + found_sp = find_prev_seq_point_for_native_offset (frame->domain, frame->method, frame->native_offset, &info, &local_sp); + sp = (found_sp)? &local_sp : NULL; if (sp && sp->next_len != 0) break; sp = NULL; frame_index ++; } + } else { + /* Have to put a breakpoint into a parent frame since the seq points might not cover all control flow out of the method */ + while (frame_index < nframes) { + StackFrame *frame = frames [frame_index]; + + parent_sp_method = frame->method; + found_sp = find_prev_seq_point_for_native_offset (frame->domain, frame->method, frame->native_offset, &parent_info, &local_parent_sp); + parent_sp = found_sp ? &local_parent_sp : NULL; + if (found_sp && parent_sp->next_len != 0) + break; + parent_sp = NULL; + frame_index ++; + } } } if (sp && sp->next_len > 0) { - for (i = 0; i < sp->next_len; ++i) { - next_sp = &info->seq_points [sp->next [i]]; + SeqPoint* next = g_new(SeqPoint, sp->next_len); + + seq_point_init_next (info, *sp, next); + for (i = 0; i < sp->next_len; i++) { + next_sp = &next[i]; bp = set_breakpoint (method, next_sp->il_offset, ss_req->req, NULL); ss_req->bps = g_slist_append (ss_req->bps, bp); } + g_free (next); } + if (parent_sp) { + SeqPoint* next = g_new(SeqPoint, parent_sp->next_len); + + seq_point_init_next (parent_info, *parent_sp, next); + for (i = 0; i < parent_sp->next_len; i++) { + next_sp = &next[i]; + + bp = set_breakpoint (parent_sp_method, next_sp->il_offset, ss_req->req, NULL); + ss_req->bps = g_slist_append (ss_req->bps, bp); + } + g_free (next); + } + + if (ss_req->nframes == 0) + ss_req->nframes = nframes; if (ss_req->depth == STEP_DEPTH_OVER) { - if (ss_req->nframes == 0) - ss_req->nframes = tls->frame_count; /* Need to stop in catch clauses as well */ - for (i = 0; i < tls->frame_count; ++i) { - StackFrame *frame = tls->frames [i]; + for (i = 0; i < nframes; ++i) { + StackFrame *frame = frames [i]; if (frame->ji) { MonoJitInfo *jinfo = frame->ji; for (j = 0; j < jinfo->num_clauses; ++j) { MonoJitExceptionInfo *ei = &jinfo->clauses [j]; - sp = find_next_seq_point_for_native_offset (frame->domain, frame->method, (char*)ei->handler_start - (char*)jinfo->code_start, NULL); + found_sp = find_next_seq_point_for_native_offset (frame->domain, frame->method, (char*)ei->handler_start - (char*)jinfo->code_start, NULL, &local_sp); + sp = (found_sp)? &local_sp : NULL; if (sp) { bp = set_breakpoint (frame->method, sp->il_offset, ss_req->req, NULL); ss_req->bps = g_slist_append (ss_req->bps, bp); @@ -5333,7 +5331,6 @@ ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint *sp, MonoSeqPointI } } - if (ss_req->depth == STEP_DEPTH_INTO) { /* Enable global stepping so we stop at method entry too */ enable_global = TRUE; @@ -5348,11 +5345,11 @@ ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint *sp, MonoSeqPointI } if (enable_global) { - DEBUG (1, fprintf (log_file, "[dbg] Turning on global single stepping.\n")); + DEBUG_PRINTF (1, "[dbg] Turning on global single stepping.\n"); ss_req->global = TRUE; start_single_stepping (); } else if (!ss_req->bps) { - DEBUG (1, fprintf (log_file, "[dbg] Turning on global single stepping.\n")); + DEBUG_PRINTF (1, "[dbg] Turning on global single stepping.\n"); ss_req->global = TRUE; start_single_stepping (); } else { @@ -5364,14 +5361,19 @@ ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint *sp, MonoSeqPointI * Start single stepping of thread THREAD */ static ErrorCode -ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, EventRequest *req) +ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, StepFilter filter, EventRequest *req) { DebuggerTlsData *tls; MonoSeqPointInfo *info = NULL; SeqPoint *sp = NULL; + SeqPoint local_sp; + gboolean found_sp; MonoMethod *method = NULL; MonoDebugMethodInfo *minfo; gboolean step_to_catch = FALSE; + gboolean set_ip = FALSE; + StackFrame **frames = NULL; + int nframes = 0; if (suspend_count == 0) return ERR_NOT_SUSPENDED; @@ -5380,17 +5382,18 @@ ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, EventRequ // FIXME: Multiple requests if (ss_req) { - DEBUG (0, fprintf (log_file, "Received a single step request while the previous one was still active.\n")); + DEBUG_PRINTF (0, "Received a single step request while the previous one was still active.\n"); return ERR_NOT_IMPLEMENTED; } - DEBUG (1, fprintf (log_file, "[dbg] Starting single step of thread %p (depth=%s).\n", thread, ss_depth_to_string (depth))); + DEBUG_PRINTF (1, "[dbg] Starting single step of thread %p (depth=%s).\n", thread, ss_depth_to_string (depth)); ss_req = g_new0 (SingleStepReq, 1); ss_req->req = req; ss_req->thread = thread; ss_req->size = size; ss_req->depth = depth; + ss_req->filter = filter; req->info = ss_req; mono_loader_lock (); @@ -5398,6 +5401,15 @@ ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, EventRequ mono_loader_unlock (); g_assert (tls); g_assert (tls->context.valid); + + if (tls->restore_state.valid && MONO_CONTEXT_GET_IP (&tls->context.ctx) != MONO_CONTEXT_GET_IP (&tls->restore_state.ctx)) { + /* + * Need to start single stepping from restore_state and not from the current state + */ + set_ip = TRUE; + frames = compute_frame_info_from (thread, tls, &tls->restore_state, &nframes); + } + ss_req->start_sp = ss_req->last_sp = MONO_CONTEXT_GET_SP (&tls->context.ctx); if (tls->catch_state.valid) { @@ -5419,7 +5431,8 @@ ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, EventRequ * Find the seq point corresponding to the landing site ip, which is the first seq * point after ip. */ - sp = find_next_seq_point_for_native_offset (frame.domain, frame.method, frame.native_offset, &info); + found_sp = find_next_seq_point_for_native_offset (frame.domain, frame.method, frame.native_offset, &info, &local_sp); + sp = (found_sp)? &local_sp : NULL; if (!sp) no_seq_points_found (frame.method); g_assert (sp); @@ -5431,41 +5444,41 @@ ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, EventRequ ss_req->last_sp = NULL; } - if (!step_to_catch && ss_req->size == STEP_SIZE_LINE) { - StackFrame *frame; + if (!step_to_catch) { + StackFrame *frame = NULL; - /* Compute the initial line info */ - compute_frame_info (thread, tls); + if (set_ip) { + if (frames && nframes) + frame = frames [0]; + } else { + compute_frame_info (thread, tls); - if (tls->frame_count) { - frame = tls->frames [0]; + if (tls->frame_count) + frame = tls->frames [0]; + } - ss_req->last_method = frame->method; - ss_req->last_line = -1; + if (ss_req->size == STEP_SIZE_LINE) { + if (frame) { + ss_req->last_method = frame->method; + ss_req->last_line = -1; - minfo = mono_debug_lookup_method (frame->method); - if (minfo && frame->il_offset != -1) { - MonoDebugSourceLocation *loc = mono_debug_symfile_lookup_location (minfo, frame->il_offset); + minfo = mono_debug_lookup_method (frame->method); + if (minfo && frame->il_offset != -1) { + MonoDebugSourceLocation *loc = mono_debug_symfile_lookup_location (minfo, frame->il_offset); - if (loc) { - ss_req->last_line = loc->row; - g_free (loc); + if (loc) { + ss_req->last_line = loc->row; + g_free (loc); + } } } } - } - - if (!step_to_catch) { - StackFrame *frame; - - compute_frame_info (thread, tls); - - if (tls->frame_count) { - frame = tls->frames [0]; + if (frame) { if (!method && frame->il_offset != -1) { /* FIXME: Sort the table and use a binary search */ - sp = find_prev_seq_point_for_native_offset (frame->domain, frame->method, frame->native_offset, &info); + found_sp = find_prev_seq_point_for_native_offset (frame->domain, frame->method, frame->native_offset, &info, &local_sp); + sp = (found_sp)? &local_sp : NULL; if (!sp) no_seq_points_found (frame->method); g_assert (sp); @@ -5474,7 +5487,12 @@ ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, EventRequ } } - ss_start (ss_req, method, sp, info, &tls->context.ctx, tls, step_to_catch); + ss_req->start_method = method; + + ss_start (ss_req, method, sp, info, set_ip ? &tls->restore_state.ctx : &tls->context.ctx, tls, step_to_catch, frames, nframes); + + if (frames) + free_frames (frames, nframes); return 0; } @@ -5975,7 +5993,7 @@ decode_vtype (MonoType *t, MonoDomain *domain, guint8 *addr, guint8 *buf, guint8 if (t && klass != mono_class_from_mono_type (t)) { char *name = mono_type_full_name (t); char *name2 = mono_type_full_name (&klass->byval_arg); - DEBUG(1, fprintf (log_file, "[%p] Expected value of type %s, got %s.\n", (gpointer)GetCurrentThreadId (), name, name2)); + DEBUG_PRINTF (1, "[%p] Expected value of type %s, got %s.\n", (gpointer)GetCurrentThreadId (), name, name2); g_free (name); g_free (name2); return ERR_INVALID_ARGUMENT; @@ -6010,7 +6028,7 @@ decode_value_internal (MonoType *t, int type, MonoDomain *domain, guint8 *addr, !(t->type == MONO_TYPE_PTR && type == MONO_TYPE_I8) && !(t->type == MONO_TYPE_GENERICINST && type == MONO_TYPE_VALUETYPE)) { char *name = mono_type_full_name (t); - DEBUG(1, fprintf (log_file, "[%p] Expected value of type %s, got 0x%0x.\n", (gpointer)GetCurrentThreadId (), name, type)); + DEBUG_PRINTF (1, "[%p] Expected value of type %s, got 0x%0x.\n", (gpointer)GetCurrentThreadId (), name, type); g_free (name); return ERR_INVALID_ARGUMENT; } @@ -6090,7 +6108,7 @@ decode_value_internal (MonoType *t, int type, MonoDomain *domain, guint8 *addr, if (obj) { if (!obj_is_of_type (obj, t)) { - DEBUG (1, fprintf (log_file, "Expected type '%s', got '%s'\n", mono_type_full_name (t), obj->vtable->klass->name)); + DEBUG_PRINTF (1, "Expected type '%s', got '%s'\n", mono_type_full_name (t), obj->vtable->klass->name); return ERR_INVALID_ARGUMENT; } } @@ -6136,7 +6154,7 @@ decode_value_internal (MonoType *t, int type, MonoDomain *domain, guint8 *addr, g_free (vtype_buf); } else { char *name = mono_type_full_name (t); - DEBUG(1, fprintf (log_file, "[%p] Expected value of type %s, got 0x%0x.\n", (gpointer)GetCurrentThreadId (), name, type)); + DEBUG_PRINTF (1, "[%p] Expected value of type %s, got 0x%0x.\n", (gpointer)GetCurrentThreadId (), name, type); g_free (name); return ERR_INVALID_ARGUMENT; } @@ -6333,11 +6351,11 @@ set_var (MonoType *t, MonoDebugVarInfo *var, MonoContext *ctx, MonoDomain *domai /* Set value on the stack or in the return ctx */ if (reg_locations [reg]) { /* Saved on the stack */ - DEBUG (1, fprintf (log_file, "[dbg] Setting stack location %p for reg %x to %p.\n", reg_locations [reg], reg, (gpointer)v)); + DEBUG_PRINTF (1, "[dbg] Setting stack location %p for reg %x to %p.\n", reg_locations [reg], reg, (gpointer)v); *(reg_locations [reg]) = v; } else { /* Not saved yet */ - DEBUG (1, fprintf (log_file, "[dbg] Setting context location for reg %x to %p.\n", reg, (gpointer)v)); + DEBUG_PRINTF (1, "[dbg] Setting context location for reg %x to %p.\n", reg, (gpointer)v); mono_arch_context_set_int_reg (restore_ctx, reg, v); } @@ -6548,7 +6566,7 @@ do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, guint8 * Invoke this method directly, currently only Environment.Exit () is supported. */ this = NULL; - DEBUG (1, fprintf (log_file, "[%p] Invoking method '%s' on receiver '%s'.\n", (gpointer)GetCurrentThreadId (), mono_method_full_name (invoke->method, TRUE), this ? this->vtable->klass->name : "")); + DEBUG_PRINTF (1, "[%p] Invoking method '%s' on receiver '%s'.\n", (gpointer)GetCurrentThreadId (), mono_method_full_name (invoke->method, TRUE), this ? this->vtable->klass->name : ""); mono_runtime_invoke (invoke->method, NULL, invoke->args, &exc); g_assert_not_reached (); } @@ -6566,7 +6584,7 @@ do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, guint8 /* Should be null */ int type = decode_byte (p, &p, end); if (type != VALUE_TYPE_ID_NULL) { - DEBUG (1, fprintf (log_file, "[%p] Error: Static vtype method invoked with this argument.\n", (gpointer)GetCurrentThreadId ())); + DEBUG_PRINTF (1, "[%p] Error: Static vtype method invoked with this argument.\n", (gpointer)GetCurrentThreadId ()); return ERR_INVALID_ARGUMENT; } memset (this_buf, 0, mono_class_instance_size (m->klass)); @@ -6583,19 +6601,19 @@ do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, guint8 if (MONO_CLASS_IS_INTERFACE (m->klass)) { if (!this) { - DEBUG (1, fprintf (log_file, "[%p] Error: Interface method invoked without this argument.\n", (gpointer)GetCurrentThreadId ())); + DEBUG_PRINTF (1, "[%p] Error: Interface method invoked without this argument.\n", (gpointer)GetCurrentThreadId ()); return ERR_INVALID_ARGUMENT; } m = mono_object_get_virtual_method (this, m); - } else if (invoke->flags & INVOKE_FLAG_VIRTUAL) { + } else if ((m->flags & METHOD_ATTRIBUTE_VIRTUAL) && !m->klass->valuetype && invoke->flags & INVOKE_FLAG_VIRTUAL) { if (!this) { - DEBUG (1, fprintf (log_file, "[%p] Error: invoke with INVOKE_FLAG_VIRTUAL flag set without this argument.\n", (gpointer)GetCurrentThreadId ())); + DEBUG_PRINTF (1, "[%p] Error: invoke with INVOKE_FLAG_VIRTUAL flag set without this argument.\n", (gpointer)GetCurrentThreadId ()); return ERR_INVALID_ARGUMENT; } m = mono_object_get_virtual_method (this, m); } - DEBUG (1, fprintf (log_file, "[%p] Invoking method '%s' on receiver '%s'.\n", (gpointer)GetCurrentThreadId (), mono_method_full_name (m, TRUE), this ? this->vtable->klass->name : "")); + DEBUG_PRINTF (1, "[%p] Invoking method '%s' on receiver '%s'.\n", (gpointer)GetCurrentThreadId (), mono_method_full_name (m, TRUE), this ? this->vtable->klass->name : ""); if (this && this->vtable->domain != domain) NOT_IMPLEMENTED; @@ -6677,7 +6695,7 @@ do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, guint8 else res = mono_runtime_invoke (m, this, args, &exc); mono_stopwatch_stop (&watch); - DEBUG (1, fprintf (log_file, "[%p] Invoke result: %p, exc: %s, time: %ld ms.\n", (gpointer)GetCurrentThreadId (), res, exc ? exc->vtable->klass->name : NULL, (long)mono_stopwatch_elapsed_ms (&watch))); + DEBUG_PRINTF (1, "[%p] Invoke result: %p, exc: %s, time: %ld ms.\n", (gpointer)GetCurrentThreadId (), res, exc ? exc->vtable->klass->name : NULL, (long)mono_stopwatch_elapsed_ms (&watch)); if (exc) { buffer_add_byte (buf, 0); buffer_add_value (buf, &mono_defaults.object_class->byval_arg, &exc, domain); @@ -6816,7 +6834,7 @@ invoke_method (void) tls->resume_count -= invoke->suspend_count; } - DEBUG (1, fprintf (log_file, "[%p] Invoke finished (%d), resume_count = %d.\n", (gpointer)GetCurrentThreadId (), err, tls->resume_count)); + DEBUG_PRINTF (1, "[%p] Invoke finished (%d), resume_count = %d.\n", (gpointer)GetCurrentThreadId (), err, tls->resume_count); /* * Take the loader lock to avoid race conditions with CMD_VM_ABORT_INVOKE: @@ -6911,7 +6929,7 @@ vm_commands (int command, int id, guint8 *p, guint8 *end, Buffer *buf) major_version = decode_int (p, &p, end); minor_version = decode_int (p, &p, end); protocol_version_set = TRUE; - DEBUG(1, fprintf (log_file, "[dbg] Protocol version %d.%d, client protocol version %d.%d.\n", MAJOR_VERSION, MINOR_VERSION, major_version, minor_version)); + DEBUG_PRINTF (1, "[dbg] Protocol version %d.%d, client protocol version %d.%d.\n", MAJOR_VERSION, MINOR_VERSION, major_version, minor_version); break; } case CMD_VM_ALL_THREADS: { @@ -7023,12 +7041,12 @@ vm_commands (int command, int id, guint8 *p, guint8 *end, Buffer *buf) mono_environment_exitcode_set (exit_code); /* Suspend all managed threads since the runtime is going away */ - DEBUG(1, fprintf (log_file, "Suspending all threads...\n")); + DEBUG_PRINTF (1, "Suspending all threads...\n"); mono_thread_suspend_all_other_threads (); - DEBUG(1, fprintf (log_file, "Shutting down the runtime...\n")); + DEBUG_PRINTF (1, "Shutting down the runtime...\n"); mono_runtime_quit (); transport_close2 (); - DEBUG(1, fprintf (log_file, "Exiting...\n")); + DEBUG_PRINTF (1, "Exiting...\n"); exit (exit_code); } @@ -7160,7 +7178,7 @@ vm_commands (int command, int id, guint8 *p, guint8 *end, Buffer *buf) fname = decode_string (p, &p, end); ignore_case = decode_byte (p, &p, end); - basename = g_path_get_basename (fname); + basename = dbg_path_get_basename (fname); res_classes = g_ptr_array_new (); res_domains = g_ptr_array_new (); @@ -7179,7 +7197,7 @@ vm_commands (int command, int id, guint8 *p, guint8 *end, Buffer *buf) for (i = 0; i < files->len; ++i) { char *s = g_ptr_array_index (files, i); - char *s2 = g_path_get_basename (s); + char *s2 = dbg_path_get_basename (s); char *s3; class_list = g_hash_table_lookup (info->source_file_to_class, s2); @@ -7372,7 +7390,7 @@ event_commands (int command, guint8 *p, guint8 *end, Buffer *buf) req->modifiers [i].subclasses = decode_byte (p, &p, end); else req->modifiers [i].subclasses = TRUE; - DEBUG(1, fprintf (log_file, "[dbg] \tEXCEPTION_ONLY filter (%s%s%s%s).\n", exc_class ? exc_class->name : "all", req->modifiers [i].caught ? ", caught" : "", req->modifiers [i].uncaught ? ", uncaught" : "", req->modifiers [i].subclasses ? ", include-subclasses" : "")); + DEBUG_PRINTF (1, "[dbg] \tEXCEPTION_ONLY filter (%s%s%s%s).\n", exc_class ? exc_class->name : "all", req->modifiers [i].caught ? ", caught" : "", req->modifiers [i].uncaught ? ", uncaught" : "", req->modifiers [i].subclasses ? ", include-subclasses" : ""); if (exc_class) { req->modifiers [i].data.exc_class = exc_class; @@ -7433,7 +7451,7 @@ event_commands (int command, guint8 *p, guint8 *end, Buffer *buf) req->info = set_breakpoint (method, location, req, &error); if (!mono_error_ok (&error)) { g_free (req); - DEBUG(1, fprintf (log_file, "[dbg] Failed to set breakpoint: %s\n", mono_error_get_message (&error))); + DEBUG_PRINTF (1, "[dbg] Failed to set breakpoint: %s\n", mono_error_get_message (&error)); mono_error_cleanup (&error); return ERR_NO_SEQ_POINT_AT_IL_OFFSET; } @@ -7446,7 +7464,7 @@ event_commands (int command, guint8 *p, guint8 *end, Buffer *buf) return err; } - err = ss_create (THREAD_TO_INTERNAL (step_thread), size, depth, req); + err = ss_create (THREAD_TO_INTERNAL (step_thread), size, depth, filter, req); if (err) { g_free (req); return err; @@ -7814,7 +7832,7 @@ buffer_add_cattrs (Buffer *buf, MonoDomain *domain, MonoImage *image, MonoClass mono_reflection_create_custom_attr_data_args (image, attr->ctor, attr->data, attr->data_size, &typed_args, &named_args, &arginfo, &error); if (!mono_error_ok (&error)) { - DEBUG(2, fprintf (log_file, "[dbg] mono_reflection_create_custom_attr_data_args () failed with: '%s'\n", mono_error_get_message (&error))); + DEBUG_PRINTF (2, "[dbg] mono_reflection_create_custom_attr_data_args () failed with: '%s'\n", mono_error_get_message (&error)); mono_error_cleanup (&error); return ERR_LOADER_ERROR; } @@ -8209,7 +8227,7 @@ type_commands_internal (int command, MonoClass *klass, MonoDomain *domain, guint if (command == CMD_TYPE_GET_SOURCE_FILES_2) { buffer_add_string (buf, source_file); } else { - base = g_path_get_basename (source_file); + base = dbg_path_get_basename (source_file); buffer_add_string (buf, base); g_free (base); } @@ -8411,7 +8429,7 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g buffer_add_string (buf, source_file); } buffer_add_int (buf, n_il_offsets); - DEBUG (10, fprintf (log_file, "Line number table for method %s:\n", mono_method_full_name (method, TRUE))); + DEBUG_PRINTF (10, "Line number table for method %s:\n", mono_method_full_name (method, TRUE)); for (i = 0; i < n_il_offsets; ++i) { const char *srcfile = ""; @@ -8419,7 +8437,7 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g MonoDebugSourceInfo *sinfo = g_ptr_array_index (source_file_list, source_files [i]); srcfile = sinfo->source_file; } - DEBUG (10, fprintf (log_file, "IL%x -> %s:%d %d\n", il_offsets [i], srcfile, line_numbers [i], column_numbers ? column_numbers [i] : -1)); + DEBUG_PRINTF (10, "IL%x -> %s:%d %d %d %d\n", il_offsets [i], srcfile, line_numbers [i], column_numbers ? column_numbers [i] : -1, end_line_numbers ? end_line_numbers [i] : -1, end_column_numbers ? end_column_numbers [i] : -1); buffer_add_int (buf, il_offsets [i]); buffer_add_int (buf, line_numbers [i]); if (CHECK_PROTOCOL_VERSION (2, 13)) @@ -8541,8 +8559,11 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g if (imethod->context.class_inst) { MonoClass *klass = ((MonoMethod *) imethod)->klass; /*Generic methods gets the context of the GTD.*/ - if (mono_class_get_context (klass)) - result = mono_class_inflate_generic_method_full (result, klass, mono_class_get_context (klass)); + if (mono_class_get_context (klass)) { + MonoError error; + result = mono_class_inflate_generic_method_full_checked (result, klass, mono_class_get_context (klass), &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + } } } @@ -8653,8 +8674,10 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g break; } } else { - val = mono_ldtoken (method->klass->image, token, &handle_class, NULL); - g_assert (val); + MonoError error; + val = mono_ldtoken_checked (method->klass->image, token, &handle_class, NULL, &error); + if (!val) + g_error ("Could not load token due to %s", mono_error_get_message (&error)); } if (handle_class == mono_defaults.typehandle_class) { @@ -8701,6 +8724,7 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g break; } case CMD_METHOD_MAKE_GENERIC_METHOD: { + MonoError error; MonoType **type_argv; int i, type_argc; MonoDomain *d; @@ -8728,7 +8752,8 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g tmp_context.class_inst = method->klass->generic_class ? method->klass->generic_class->context.class_inst : NULL; tmp_context.method_inst = ginst; - inflated = mono_class_inflate_generic_method (method, &tmp_context); + inflated = mono_class_inflate_generic_method_checked (method, &tmp_context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ if (!mono_verifier_is_method_valid_generic_instantiation (inflated)) return ERR_INVALID_ARGUMENT; buffer_add_methodid (buf, domain, inflated); @@ -8860,9 +8885,9 @@ thread_commands (int command, guint8 *p, guint8 *end, Buffer *buf) MonoMethod *method; MonoDomain *domain; MonoSeqPointInfo *seq_points; - SeqPoint *sp = NULL; + SeqPoint sp; + gboolean found_sp; gint64 il_offset; - int i; method = decode_methodid (p, &p, end, &domain, &err); if (err) @@ -8883,22 +8908,17 @@ thread_commands (int command, guint8 *p, guint8 *end, Buffer *buf) if (tls->frame_count == 0 || tls->frames [0]->actual_method != method) return ERR_INVALID_ARGUMENT; - seq_points = get_seq_points (domain, method); + found_sp = find_seq_point (domain, method, il_offset, &seq_points, &sp); + g_assert (seq_points); - for (i = 0; i < seq_points->len; ++i) { - sp = &seq_points->seq_points [i]; - - if (sp->il_offset == il_offset) - break; - } - if (i == seq_points->len) + if (!found_sp) return ERR_INVALID_ARGUMENT; // FIXME: Check that the ip change is safe - DEBUG (1, fprintf (log_file, "[dbg] Setting IP to %s:0x%0x(0x%0x)\n", tls->frames [0]->actual_method->name, (int)sp->il_offset, (int)sp->native_offset)); - MONO_CONTEXT_SET_IP (&tls->restore_ctx, (guint8*)tls->frames [0]->ji->code_start + sp->native_offset); + DEBUG_PRINTF (1, "[dbg] Setting IP to %s:0x%0x(0x%0x)\n", tls->frames [0]->actual_method->name, (int)sp.il_offset, (int)sp.native_offset); + MONO_CONTEXT_SET_IP (&tls->restore_state.ctx, (guint8*)tls->frames [0]->ji->code_start + sp.native_offset); break; } default: @@ -8948,6 +8968,13 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf) frame_idx = i; frame = tls->frames [frame_idx]; + /* This is supported for frames without has_ctx etc. set */ + if (command == CMD_STACK_FRAME_GET_DOMAIN) { + if (CHECK_PROTOCOL_VERSION (2, 38)) + buffer_add_domainid (buf, frame->domain); + return ERR_NONE; + } + if (!frame->has_ctx) return ERR_ABSENT_INFORMATION; @@ -8960,7 +8987,7 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf) /* This could happen for aot images with no jit debug info */ s = mono_method_full_name (frame->api_method, TRUE); - DEBUG (1, fprintf (log_file, "[dbg] No debug information found for '%s'.\n", s)); + DEBUG_PRINTF (1, "[dbg] No debug information found for '%s'.\n", s); g_free (s); return ERR_ABSENT_INFORMATION; } @@ -9053,7 +9080,7 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf) if (err) return err; - set_var (t, var, &frame->ctx, frame->domain, val_buf, frame->reg_locations, &tls->restore_ctx); + set_var (t, var, &frame->ctx, frame->domain, val_buf, frame->reg_locations, &tls->restore_state.ctx); } mono_metadata_free_mh (header); break; @@ -9534,15 +9561,15 @@ wait_for_attach (void) { #ifndef DISABLE_SOCKET_TRANSPORT if (listen_fd == -1) { - DEBUG (1, fprintf (log_file, "[dbg] Invalid listening socket\n")); + DEBUG_PRINTF (1, "[dbg] Invalid listening socket\n"); return FALSE; } /* Block and wait for client connection */ conn_fd = socket_transport_accept (listen_fd); - DEBUG (1, fprintf (log_file, "Accepted connection on %d\n", conn_fd)); + DEBUG_PRINTF (1, "Accepted connection on %d\n", conn_fd); if (conn_fd == -1) { - DEBUG (1, fprintf (log_file, "[dbg] Bad client connection\n")); + DEBUG_PRINTF (1, "[dbg] Bad client connection\n"); return FALSE; } #else @@ -9552,7 +9579,7 @@ wait_for_attach (void) /* Handshake */ disconnected = !transport_handshake (); if (disconnected) { - DEBUG (1, fprintf (log_file, "Transport handshake failed!\n")); + DEBUG_PRINTF (1, "Transport handshake failed!\n"); return FALSE; } @@ -9576,7 +9603,7 @@ debugger_thread (void *arg) gboolean no_reply; gboolean attach_failed = FALSE; - DEBUG (1, fprintf (log_file, "[dbg] Agent thread started, pid=%p\n", (gpointer)GetCurrentThreadId ())); + DEBUG_PRINTF (1, "[dbg] Agent thread started, pid=%p\n", (gpointer)GetCurrentThreadId ()); debugger_thread_id = GetCurrentThreadId (); @@ -9588,7 +9615,7 @@ debugger_thread (void *arg) if (agent_config.defer) { if (!wait_for_attach ()) { - DEBUG (1, fprintf (log_file, "[dbg] Can't attach, aborting debugger thread.\n")); + DEBUG_PRINTF (1, "[dbg] Can't attach, aborting debugger thread.\n"); attach_failed = TRUE; // Don't abort process when we can't listen } else { /* Send start event to client */ @@ -9601,7 +9628,7 @@ debugger_thread (void *arg) /* This will break if the socket is closed during shutdown too */ if (res != HEADER_LENGTH) { - DEBUG (1, fprintf (log_file, "[dbg] transport_recv () returned %d, expected %d.\n", res, HEADER_LENGTH)); + DEBUG_PRINTF (1, "[dbg] transport_recv () returned %d, expected %d.\n", res, HEADER_LENGTH); break; } @@ -9626,7 +9653,7 @@ debugger_thread (void *arg) cmd_str = cmd_num; } - DEBUG (1, fprintf (log_file, "[dbg] Command %s(%s) [%d][at=%lx].\n", command_set_to_string (command_set), cmd_str, id, (long)mono_100ns_ticks () / 10000)); + DEBUG_PRINTF (1, "[dbg] Command %s(%s) [%d][at=%lx].\n", command_set_to_string (command_set), cmd_str, id, (long)mono_100ns_ticks () / 10000); } data = g_malloc (len - HEADER_LENGTH); @@ -9634,7 +9661,7 @@ debugger_thread (void *arg) { res = transport_recv (data, len - HEADER_LENGTH); if (res != len - HEADER_LENGTH) { - DEBUG (1, fprintf (log_file, "[dbg] transport_recv () returned %d, expected %d.\n", res, len - HEADER_LENGTH)); + DEBUG_PRINTF (1, "[dbg] transport_recv () returned %d, expected %d.\n", res, len - HEADER_LENGTH); break; } } @@ -9704,7 +9731,7 @@ debugger_thread (void *arg) buffer_reply_packet (id, err, &buf); } else { send_reply_packet (id, err, &buf); - //DEBUG (1, fprintf (log_file, "[dbg] Sent reply to %d [at=%lx].\n", id, (long)mono_100ns_ticks () / 10000)); + //DEBUG_PRINTF (1, "[dbg] Sent reply to %d [at=%lx].\n", id, (long)mono_100ns_ticks () / 10000); } } @@ -9727,10 +9754,10 @@ debugger_thread (void *arg) mono_cond_signal (&debugger_thread_exited_cond); mono_mutex_unlock (&debugger_thread_exited_mutex); - DEBUG (1, fprintf (log_file, "[dbg] Debugger thread exited.\n")); + DEBUG_PRINTF (1, "[dbg] Debugger thread exited.\n"); if (!attach_failed && command_set == CMD_SET_VM && command == CMD_VM_DISPOSE && !(vm_death_event_sent || mono_runtime_is_shutting_down ())) { - DEBUG (2, fprintf (log_file, "[dbg] Detached - restarting clean debugger thread.\n")); + DEBUG_PRINTF (2, "[dbg] Detached - restarting clean debugger thread.\n"); start_debugger_thread (); } @@ -9811,4 +9838,3 @@ mono_debugger_agent_unhandled_exception (MonoException *exc) } #endif - diff --git a/mta-mono/vendor/mono/mini/debugger-agent.h b/mta-mono/vendor/mono/mini/debugger-agent.h index 02853d0..63129c2 100644 --- a/mta-mono/vendor/mono/mini/debugger-agent.h +++ b/mta-mono/vendor/mono/mini/debugger-agent.h @@ -3,13 +3,6 @@ #include "mini.h" -/* IL offsets used to mark the sequence points belonging to method entry/exit events */ -#define METHOD_ENTRY_IL_OFFSET -1 -#define METHOD_EXIT_IL_OFFSET 0xffffff - -/* Native offset used to mark seq points in dead code */ -#define SEQ_POINT_NATIVE_OFFSET_DEAD_CODE -1 - void mono_debugger_agent_parse_options (char *options) MONO_INTERNAL; diff --git a/mta-mono/vendor/mono/mini/decompose.c b/mta-mono/vendor/mono/mini/decompose.c index f29e913..25dd97d 100644 --- a/mta-mono/vendor/mono/mini/decompose.c +++ b/mta-mono/vendor/mono/mini/decompose.c @@ -299,7 +299,7 @@ decompose_long_opcode (MonoCompile *cfg, MonoInst *ins, MonoInst **repl_ins) * Sets the cfg exception if an opcode is not supported. */ MonoInst* -mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins) +mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins, MonoBasicBlock **out_cbb) { MonoInst *repl = NULL; int type = ins->type; @@ -466,7 +466,7 @@ mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins) MONO_EMIT_NEW_UNALU (cfg, OP_ICEQ, reg2, -1); MONO_EMIT_NEW_BIALU (cfg, OP_IAND, reg1, reg1, reg2); MONO_EMIT_NEW_ICOMPARE_IMM (cfg, reg1, 1); - MONO_EMIT_NEW_COND_EXC (cfg, IEQ, "DivideByZeroException"); + MONO_EMIT_NEW_COND_EXC (cfg, IEQ, "OverflowException"); } #endif MONO_EMIT_NEW_BIALU (cfg, ins->opcode, ins->dreg, ins->sreg1, ins->sreg2); @@ -556,7 +556,7 @@ mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins) } } - call = mono_emit_native_call (cfg, mono_icall_get_wrapper (info), info->sig, args); + call = mono_emit_jit_icall_by_info (cfg, info, args, out_cbb); call->dreg = ins->dreg; NULLIFY_INS (ins); @@ -629,14 +629,13 @@ mono_decompose_long_opts (MonoCompile *cfg) first_bb = cfg->cbb; for (bb = cfg->bb_entry; bb; bb = bb->next_bb) { - MonoInst *tree = bb->code; + MonoInst *tree = mono_bb_first_inst(bb, FILTER_IL_SEQ_POINT); MonoInst *prev = NULL; /* mono_print_bb (bb, "BEFORE LOWER_LONG_OPTS"); */ - tree = bb->code; cfg->cbb->code = cfg->cbb->last_ins = NULL; while (tree) { @@ -967,7 +966,7 @@ mono_decompose_long_opts (MonoCompile *cfg) break; case OP_LCOMPARE: { - MonoInst *next = tree->next; + MonoInst *next = mono_inst_next (tree, FILTER_IL_SEQ_POINT); g_assert (next); @@ -1049,7 +1048,7 @@ mono_decompose_long_opts (MonoCompile *cfg) /* Not yet used, since lcompare is decomposed before local cprop */ case OP_LCOMPARE_IMM: { - MonoInst *next = tree->next; + MonoInst *next = mono_inst_next (tree, FILTER_IL_SEQ_POINT); guint32 low_imm = tree->inst_ls_word; guint32 high_imm = tree->inst_ms_word; int low_reg = tree->sreg1 + 1; @@ -1149,9 +1148,9 @@ mono_decompose_long_opts (MonoCompile *cfg) /* Process the newly added ops again since they can be long ops too */ if (prev) - tree = prev->next; + tree = mono_inst_next (prev, FILTER_IL_SEQ_POINT); else - tree = bb->code; + tree = mono_bb_first_inst (bb, FILTER_IL_SEQ_POINT); first_bb->code = first_bb->last_ins = NULL; first_bb->in_count = first_bb->out_count = 0; @@ -1159,7 +1158,7 @@ mono_decompose_long_opts (MonoCompile *cfg) } else { prev = tree; - tree = tree->next; + tree = mono_inst_next (tree, FILTER_IL_SEQ_POINT); } } } diff --git a/mta-mono/vendor/mono/mini/driver.c b/mta-mono/vendor/mono/mini/driver.c index c6c8e20..b4e3e85 100644 --- a/mta-mono/vendor/mono/mini/driver.c +++ b/mta-mono/vendor/mono/mini/driver.c @@ -10,7 +10,9 @@ */ #include +#ifdef HAVE_SIGNAL_H #include +#endif #if HAVE_SCHED_SETAFFINITY #include #endif @@ -140,7 +142,7 @@ extern char *nacl_mono_path; MONO_OPT_ALIAS_ANALYSIS | \ MONO_OPT_AOT) -#define EXCLUDED_FROM_ALL (MONO_OPT_SHARED | MONO_OPT_PRECOMP | MONO_OPT_UNSAFE | MONO_OPT_GSHAREDVT) +#define EXCLUDED_FROM_ALL (MONO_OPT_SHARED | MONO_OPT_PRECOMP | MONO_OPT_UNSAFE | MONO_OPT_GSHAREDVT | MONO_OPT_FLOAT32) static guint32 parse_optimizations (const char* p) @@ -1858,8 +1860,11 @@ mono_main (int argc, char* argv[]) fprintf (stderr, "This mono runtime is compiled for cross-compiling. Only the --aot option is supported.\n"); exit (1); } -#if SIZEOF_VOID_P == 8 && defined(TARGET_ARM) - fprintf (stderr, "Can't cross-compile on 64 bit platforms to arm.\n"); +#if SIZEOF_VOID_P == 8 && (defined(TARGET_ARM) || defined(TARGET_X86)) + fprintf (stderr, "Can't cross-compile on 64-bit platforms to 32-bit architecture.\n"); + exit (1); +#elif SIZEOF_VOID_P == 4 && (defined(TARGET_ARM64) || defined(TARGET_AMD64)) + fprintf (stderr, "Can't cross-compile on 32-bit platforms to 64-bit architecture.\n"); exit (1); #endif #endif @@ -1868,6 +1873,8 @@ mono_main (int argc, char* argv[]) g_set_prgname (argv[i]); } + mono_counters_init (); + if (enable_profile) mono_profiler_load (profile_options); @@ -2000,7 +2007,7 @@ mono_main (int argc, char* argv[]) fprintf (stderr, "Corlib not in sync with this runtime: %s\n", error); fprintf (stderr, "Loaded from: %s\n", mono_defaults.corlib? mono_image_get_filename (mono_defaults.corlib): "unknown"); - fprintf (stderr, "Download a newer corlib or a newer runtime at http://www.go-mono.com/daily.\n"); + fprintf (stderr, "Download a newer corlib or a newer runtime at http://www.mono-project.com/download.\n"); exit (1); } diff --git a/mta-mono/vendor/mono/mini/dwarfwriter.c b/mta-mono/vendor/mono/mini/dwarfwriter.c index 6758576..c9c3b12 100644 --- a/mta-mono/vendor/mono/mini/dwarfwriter.c +++ b/mta-mono/vendor/mono/mini/dwarfwriter.c @@ -30,6 +30,9 @@ #include +#define DW_AT_MIPS_linkage_name 0x2007 +#define DW_LNE_set_prologue_end 0x0a + typedef struct { MonoMethod *method; char *start_symbol, *end_symbol; @@ -455,6 +458,9 @@ static int compile_unit_attr [] = { static int subprogram_attr [] = { DW_AT_name , DW_FORM_string, + DW_AT_MIPS_linkage_name, DW_FORM_string, + DW_AT_decl_file , DW_FORM_udata, + DW_AT_decl_line , DW_FORM_udata, #ifndef TARGET_IOS DW_AT_description , DW_FORM_string, #endif @@ -1422,10 +1428,12 @@ token_handler (MonoDisHelper *dh, MonoMethod *method, guint32 token) case CEE_LDSFLD: case CEE_STFLD: case CEE_STSFLD: - if (method->wrapper_type) + if (method->wrapper_type) { field = data; - else - field = mono_field_from_token (method->klass->image, token, &klass, NULL); + } else { + field = mono_field_from_token_checked (method->klass->image, token, &klass, NULL, &error); + g_assert (mono_error_ok (&error)); /* FIXME error handling */ + } desc = mono_field_full_name (field); res = g_strdup_printf ("<%s>", desc); g_free (desc); @@ -1664,14 +1672,6 @@ emit_line_number_info (MonoDwarfWriter *w, MonoMethod *method, emit_pointer_unaligned (w, start_symbol); else emit_pointer_value (w, code); - - /* - * The prolog+initlocals region does not have a line number, this - * makes them belong to the first line of the method. - */ - emit_byte (w, DW_LNS_advance_line); - //printf ("FIRST: %d %d %d\n", prev_line, loc->row, il_offset); - emit_sleb128 (w, (gint32)loc->row - (gint32)prev_line); first = FALSE; } @@ -1695,7 +1695,10 @@ emit_line_number_info (MonoDwarfWriter *w, MonoMethod *method, } } - if (loc->row != prev_line && !first) { + if (loc->row != prev_line) { + if (prev_native_offset == 0) + emit_byte (w, DW_LNE_set_prologue_end); + //printf ("X: %p(+0x%x) %d %s:%d(+%d)\n", code + i, addr_diff, loc->il_offset, loc->source_file, loc->row, line_diff); emit_advance_op (w, line_diff, addr_diff); @@ -1822,13 +1825,16 @@ find_vmv (MonoCompile *cfg, MonoInst *ins) } void -mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod *method, char *start_symbol, char *end_symbol, guint8 *code, guint32 code_size, MonoInst **args, MonoInst **locals, GSList *unwind_info, MonoDebugMethodJitInfo *debug_info) +mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod *method, char *start_symbol, char *end_symbol, char *linkage_name, + guint8 *code, guint32 code_size, MonoInst **args, MonoInst **locals, GSList *unwind_info, MonoDebugMethodJitInfo *debug_info) { char *name; MonoMethodSignature *sig; MonoMethodHeader *header; char **names; MonoDebugLocalsInfo *locals_info; + MonoDebugMethodInfo *minfo; + MonoDebugSourceLocation *loc = NULL; int i; guint8 buf [128]; guint8 *p; @@ -1860,13 +1866,32 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod emit_type (w, header->locals [i]); } + minfo = mono_debug_lookup_method (method); + if (minfo) + loc = mono_debug_symfile_lookup_location (minfo, 0); + /* Subprogram */ names = g_new0 (char *, sig->param_count); mono_method_get_param_names (method, (const char **) names); emit_uleb128 (w, ABBREV_SUBPROGRAM); + /* DW_AT_name */ name = mono_method_full_name (method, FALSE); emit_string (w, name); + /* DW_AT_MIPS_linkage_name */ + if (linkage_name) + emit_string (w, linkage_name); + else + emit_string (w, ""); + /* DW_AT_decl_file/DW_AT_decl_line */ + if (loc) { + int file_index = add_line_number_file_name (w, loc->source_file, 0, 0); + emit_uleb128 (w, file_index + 1); + emit_uleb128 (w, loc->row); + } else { + emit_uleb128 (w, 0); + emit_uleb128 (w, 0); + } #ifndef TARGET_IOS emit_string (w, name); #endif diff --git a/mta-mono/vendor/mono/mini/dwarfwriter.h b/mta-mono/vendor/mono/mini/dwarfwriter.h index c10bbfe..0d8573f 100644 --- a/mta-mono/vendor/mono/mini/dwarfwriter.h +++ b/mta-mono/vendor/mono/mini/dwarfwriter.h @@ -33,7 +33,8 @@ int mono_dwarf_writer_get_il_file_line_index (MonoDwarfWriter *w) MONO_INTERNAL; void mono_dwarf_writer_emit_trampoline (MonoDwarfWriter *w, const char *tramp_name, char *start_symbol, char *end_symbol, guint8 *code, guint32 code_size, GSList *unwind_info) MONO_INTERNAL; void -mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod *method, char *start_symbol, char *end_symbol, guint8 *code, guint32 code_size, MonoInst **args, MonoInst **locals, GSList *unwind_info, MonoDebugMethodJitInfo *debug_info) MONO_INTERNAL; +mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod *method, char *start_symbol, char *end_symbol, char *linkage_name, + guint8 *code, guint32 code_size, MonoInst **args, MonoInst **locals, GSList *unwind_info, MonoDebugMethodJitInfo *debug_info) MONO_INTERNAL; char * mono_dwarf_escape_path (const char *name); diff --git a/mta-mono/vendor/mono/mini/emitnunit.pl b/mta-mono/vendor/mono/mini/emitnunit.pl new file mode 100644 index 0000000..b511e7d --- /dev/null +++ b/mta-mono/vendor/mono/mini/emitnunit.pl @@ -0,0 +1,76 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Cwd; +use POSIX qw(strftime uname locale_h); +use Net::Domain qw(hostname hostfqdn); +use locale; + +my $line; +foreach $line () { + chomp ($line); + print "$line\n"; + if ($line =~ /^Overall results:/) { + # do magic nunit emission here + # failures look like: + # Overall results: tests: 19992, failed: 48, opt combinations: 24 (pass: 99.76%) + # passes look like: + # Overall results: tests: 20928, 100% pass, opt combinations: 24 + my @words = split (/ /, $line); + my $failed; + my $successbool; + my $total = $words[3]; + my $mylocale = setlocale (LC_CTYPE); + $mylocale = substr($mylocale, 0, index($mylocale, '.')); + $mylocale =~ s/_/-/; + if ($line =~ /failed:/) { + $failed = $words[5]; + } else { + $failed = "0,"; + } + chop ($failed); + chop ($total); + if ($failed > 0) { + $successbool = "False"; + } else { + $successbool = "True"; + } + open (my $nunitxml, '>', 'TestResults_regression.xml') or die "Could not write to 'TestResults_regression.xml' $!"; + print $nunitxml "\n"; + print $nunitxml "\n"; + print $nunitxml "\n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " 0) { + print $nunitxml ">\n"; + print $nunitxml " \n"; + print $nunitxml " ) { + chomp ($line); + print "$line\n"; + } + print $nunitxml "]]>\n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + } else { + print $nunitxml " />\n"; + } + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml " \n"; + print $nunitxml "\n"; + close $nunitxml; + } +} diff --git a/mta-mono/vendor/mono/mini/exceptions-amd64.c b/mta-mono/vendor/mono/mini/exceptions-amd64.c index a0865b7..5df8f2f 100644 --- a/mta-mono/vendor/mono/mini/exceptions-amd64.c +++ b/mta-mono/vendor/mono/mini/exceptions-amd64.c @@ -11,9 +11,11 @@ #include #include -#include #include +#ifdef HAVE_SIGNAL_H +#include +#endif #ifdef HAVE_UCONTEXT_H #include #endif @@ -55,7 +57,7 @@ static LONG CALLBACK seh_unhandled_exception_filter(EXCEPTION_POINTERS* ep) } #endif - mono_handle_native_sigsegv (SIGSEGV, NULL); + mono_handle_native_sigsegv (SIGSEGV, NULL, NULL); return EXCEPTION_CONTINUE_SEARCH; } @@ -759,7 +761,7 @@ mono_arch_handle_exception (void *sigctx, gpointer obj) MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); /* Pass the ctx parameter in TLS */ - mono_arch_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); + mono_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); mctx = jit_tls->ex_ctx; mono_arch_setup_async_callback (&mctx, handle_signal_exception, obj); @@ -769,28 +771,16 @@ mono_arch_handle_exception (void *sigctx, gpointer obj) #else MonoContext mctx; - mono_arch_sigctx_to_monoctx (sigctx, &mctx); + mono_sigctx_to_monoctx (sigctx, &mctx); mono_handle_exception (&mctx, obj); - mono_arch_monoctx_to_sigctx (&mctx, sigctx); + mono_monoctx_to_sigctx (&mctx, sigctx); return TRUE; #endif } -void -mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) -{ - mono_sigctx_to_monoctx (sigctx, mctx); -} - -void -mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) -{ - mono_monoctx_to_sigctx (mctx, sigctx); -} - gpointer mono_arch_ip_from_context (void *sigctx) { @@ -846,7 +836,7 @@ altstack_handle_and_restore (MonoContext *ctx, gpointer obj, gboolean stack_ovf) } void -mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean stack_ovf) +mono_arch_handle_altstack_exception (void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *siginfo, gpointer fault_addr, gboolean stack_ovf) { #if defined(MONO_ARCH_USE_SIGACTION) MonoException *exc = NULL; @@ -858,7 +848,7 @@ mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean if (stack_ovf) exc = mono_domain_get ()->stack_overflow_ex; if (!ji) - mono_handle_native_sigsegv (SIGSEGV, sigctx); + mono_handle_native_sigsegv (SIGSEGV, sigctx, siginfo); /* setup a call frame on the real stack so that control is returned there * and exception handling can continue. diff --git a/mta-mono/vendor/mono/mini/exceptions-arm.c b/mta-mono/vendor/mono/mini/exceptions-arm.c index e39248c..2c9e748 100644 --- a/mta-mono/vendor/mono/mini/exceptions-arm.c +++ b/mta-mono/vendor/mono/mini/exceptions-arm.c @@ -501,20 +501,6 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, return FALSE; } -#if MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX -void -mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) -{ - mono_sigctx_to_monoctx (sigctx, mctx); -} - -void -mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *ctx) -{ - mono_monoctx_to_sigctx (mctx, ctx); -} -#endif /* MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX */ - /* * handle_exception: * @@ -562,7 +548,7 @@ mono_arch_handle_exception (void *ctx, gpointer obj) guint64 sp = UCONTEXT_REG_SP (sigctx); /* Pass the ctx parameter in TLS */ - mono_arch_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); + mono_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); /* The others in registers */ UCONTEXT_REG_R0 (sigctx) = (gsize)obj; @@ -585,13 +571,13 @@ mono_arch_handle_exception (void *ctx, gpointer obj) MonoContext mctx; gboolean result; - mono_arch_sigctx_to_monoctx (ctx, &mctx); + mono_sigctx_to_monoctx (ctx, &mctx); result = mono_handle_exception (&mctx, obj); /* restore the context so that returning from the signal handler will invoke * the catch clause */ - mono_arch_monoctx_to_sigctx (&mctx, ctx); + mono_monoctx_to_sigctx (&mctx, ctx); return result; #endif } diff --git a/mta-mono/vendor/mono/mini/exceptions-mips.c b/mta-mono/vendor/mono/mini/exceptions-mips.c index 3419714..8ab97bf 100644 --- a/mta-mono/vendor/mono/mini/exceptions-mips.c +++ b/mta-mono/vendor/mono/mini/exceptions-mips.c @@ -478,18 +478,6 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, return FALSE; } -void -mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) -{ - mono_sigctx_to_monoctx (sigctx, mctx); -} - -void -mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) -{ - mono_monoctx_to_sigctx (mctx, sigctx); -} - gpointer mono_arch_ip_from_context (void *sigctx) { @@ -534,7 +522,7 @@ mono_arch_handle_exception (void *ctx, gpointer obj) guint64 sp = UCONTEXT_GREGS (sigctx) [mips_sp]; /* Pass the ctx parameter in TLS */ - mono_arch_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); + mono_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); /* The others in registers */ UCONTEXT_GREGS (sigctx)[mips_a0] = (gsize)obj; @@ -549,13 +537,13 @@ mono_arch_handle_exception (void *ctx, gpointer obj) MonoContext mctx; gboolean result; - mono_arch_sigctx_to_monoctx (ctx, &mctx); + mono_sigctx_to_monoctx (ctx, &mctx); result = mono_handle_exception (&mctx, obj); /* restore the context so that returning from the signal handler will invoke * the catch clause */ - mono_arch_monoctx_to_sigctx (&mctx, ctx); + mono_monoctx_to_sigctx (&mctx, ctx); return result; #endif } diff --git a/mta-mono/vendor/mono/mini/exceptions-ppc.c b/mta-mono/vendor/mono/mini/exceptions-ppc.c index 6c3878e..aa0b3f7 100644 --- a/mta-mono/vendor/mono/mini/exceptions-ppc.c +++ b/mta-mono/vendor/mono/mini/exceptions-ppc.c @@ -381,18 +381,18 @@ mono_arch_get_throw_exception_generic (int size, MonoTrampInfo **info, int corli if (aot) { code = mono_arch_emit_load_aotconst (start, code, &ji, MONO_PATCH_INFO_IMAGE, mono_defaults.corlib); - ppc_mr (code, ppc_r3, ppc_r11); + ppc_mr (code, ppc_r3, ppc_r12); code = mono_arch_emit_load_aotconst (start, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_exception_from_token"); #ifdef PPC_USES_FUNCTION_DESCRIPTOR - ppc_ldptr (code, ppc_r2, sizeof (gpointer), ppc_r11); - ppc_ldptr (code, ppc_r11, 0, ppc_r11); + ppc_ldptr (code, ppc_r2, sizeof (gpointer), ppc_r12); + ppc_ldptr (code, ppc_r12, 0, ppc_r12); #endif - ppc_mtctr (code, ppc_r11); + ppc_mtctr (code, ppc_r12); ppc_bcctrl (code, PPC_BR_ALWAYS, 0); } else { ppc_load (code, ppc_r3, (gulong)mono_defaults.corlib); - ppc_load_func (code, ppc_r0, mono_exception_from_token); - ppc_mtctr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, mono_exception_from_token); + ppc_mtctr (code, PPC_CALL_REG); ppc_bcctrl (code, PPC_BR_ALWAYS, 0); } } @@ -420,14 +420,14 @@ mono_arch_get_throw_exception_generic (int size, MonoTrampInfo **info, int corli code = mono_arch_emit_load_got_addr (start, code, NULL, &ji); code = mono_arch_emit_load_aotconst (start, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_ppc_throw_exception"); #ifdef PPC_USES_FUNCTION_DESCRIPTOR - ppc_ldptr (code, ppc_r2, sizeof (gpointer), ppc_r11); - ppc_ldptr (code, ppc_r11, 0, ppc_r11); + ppc_ldptr (code, ppc_r2, sizeof (gpointer), ppc_r12); + ppc_ldptr (code, ppc_r12, 0, ppc_r12); #endif - ppc_mtctr (code, ppc_r11); + ppc_mtctr (code, ppc_r12); ppc_bcctrl (code, PPC_BR_ALWAYS, 0); } else { - ppc_load_func (code, ppc_r0, mono_ppc_throw_exception); - ppc_mtctr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, mono_ppc_throw_exception); + ppc_mtctr (code, PPC_CALL_REG); ppc_bcctrl (code, PPC_BR_ALWAYS, 0); } /* we should never reach this breakpoint */ @@ -594,39 +594,6 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, return FALSE; } -/* - * This is the function called from the signal handler - */ -void -mono_arch_sigctx_to_monoctx (void *ctx, MonoContext *mctx) -{ -#ifdef MONO_CROSS_COMPILE - g_assert_not_reached (); -#else - os_ucontext *uc = ctx; - - mctx->sc_ir = UCONTEXT_REG_NIP(uc); - mctx->sc_sp = UCONTEXT_REG_Rn(uc, 1); - memcpy (&mctx->regs, &UCONTEXT_REG_Rn(uc, 13), sizeof (mgreg_t) * MONO_SAVED_GREGS); - memcpy (&mctx->fregs, &UCONTEXT_REG_FPRn(uc, 14), sizeof (double) * MONO_SAVED_FREGS); -#endif -} - -void -mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *ctx) -{ -#ifdef MONO_CROSS_COMPILE - g_assert_not_reached (); -#else - os_ucontext *uc = ctx; - - UCONTEXT_REG_NIP(uc) = mctx->sc_ir; - UCONTEXT_REG_Rn(uc, 1) = mctx->sc_sp; - memcpy (&UCONTEXT_REG_Rn(uc, 13), &mctx->regs, sizeof (mgreg_t) * MONO_SAVED_GREGS); - memcpy (&UCONTEXT_REG_FPRn(uc, 14), &mctx->fregs, sizeof (double) * MONO_SAVED_FREGS); -#endif -} - gpointer mono_arch_ip_from_context (void *sigctx) { @@ -659,13 +626,13 @@ altstack_handle_and_restore (void *sigctx, gpointer obj) { MonoContext mctx; - mono_arch_sigctx_to_monoctx (sigctx, &mctx); + mono_sigctx_to_monoctx (sigctx, &mctx); mono_handle_exception (&mctx, obj); mono_restore_context (&mctx); } void -mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean stack_ovf) +mono_arch_handle_altstack_exception (void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *siginfo, gpointer fault_addr, gboolean stack_ovf) { #ifdef MONO_CROSS_COMPILE g_assert_not_reached (); @@ -689,7 +656,7 @@ mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean abort (); } if (!ji) - mono_handle_native_sigsegv (SIGSEGV, sigctx); + mono_handle_native_sigsegv (SIGSEGV, sigctx, siginfo); /* setup a call frame on the real stack so that control is returned there * and exception handling can continue. * The frame looks like: @@ -782,7 +749,7 @@ mono_arch_handle_exception (void *ctx, gpointer obj) void *uc = sigctx; /* Pass the ctx parameter in TLS */ - mono_arch_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); + mono_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); /* The others in registers */ UCONTEXT_REG_Rn (sigctx, PPC_FIRST_ARG_REG) = (gsize)obj; @@ -801,13 +768,13 @@ mono_arch_handle_exception (void *ctx, gpointer obj) MonoContext mctx; gboolean result; - mono_arch_sigctx_to_monoctx (ctx, &mctx); + mono_sigctx_to_monoctx (ctx, &mctx); result = mono_handle_exception (&mctx, obj); /* restore the context so that returning from the signal handler will invoke * the catch clause */ - mono_arch_monoctx_to_sigctx (&mctx, ctx); + mono_monoctx_to_sigctx (&mctx, ctx); return result; #endif } diff --git a/mta-mono/vendor/mono/mini/exceptions-s390x.c b/mta-mono/vendor/mono/mini/exceptions-s390x.c index 74c8a0f..9c2cfc9 100644 --- a/mta-mono/vendor/mono/mini/exceptions-s390x.c +++ b/mta-mono/vendor/mono/mini/exceptions-s390x.c @@ -33,8 +33,6 @@ #define S390_THROWSTACK_ACCREGS (S390_THROWSTACK_FLTREGS+(16*sizeof(gdouble))) #define S390_THROWSTACK_SIZE (S390_THROWSTACK_ACCREGS+(16*sizeof(gint32))) -#define S390_REG_SAVE_R13 (S390_REG_SAVE_OFFSET+(7*sizeof(gulong))) - #define SZ_THROW 384 #define setup_context(ctx) @@ -361,8 +359,8 @@ mono_arch_get_throw_exception_generic (int size, MonoTrampInfo **info, if (info) *info = mono_tramp_info_create (corlib ? "throw_corlib_exception" - : (rethrow ? "rethrow_exception" - : "throw_exception"), + : (rethrow ? "rethrow_exception" + : "throw_exception"), start, code - start, ji, unwind_ops); return start; @@ -532,39 +530,6 @@ mono_arch_handle_exception (void *uc, gpointer obj) /*========================= End of Function ========================*/ -/*------------------------------------------------------------------*/ -/* */ -/* Name - mono_arch_sigctx_to_monoctx. */ -/* */ -/* Function - Called from the signal handler to convert signal */ -/* context to MonoContext. */ -/* */ -/*------------------------------------------------------------------*/ - -void -mono_arch_sigctx_to_monoctx (void *ctx, MonoContext *mctx) -{ - mono_sigctx_to_monoctx(ctx, mctx); -} - -/*========================= End of Function ========================*/ - -/*------------------------------------------------------------------*/ -/* */ -/* Name - mono_arch_monoctx_to_sigctx. */ -/* */ -/* Function - Convert MonoContext structure to signal context. */ -/* */ -/*------------------------------------------------------------------*/ - -void -mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *ctx) -{ - mono_monoctx_to_sigctx(mctx, ctx); -} - -/*========================= End of Function ========================*/ - /*------------------------------------------------------------------*/ /* */ /* Name - mono_arch_ip_from_context */ diff --git a/mta-mono/vendor/mono/mini/exceptions-x86.c b/mta-mono/vendor/mono/mini/exceptions-x86.c index cb21804..3ca3114 100644 --- a/mta-mono/vendor/mono/mini/exceptions-x86.c +++ b/mta-mono/vendor/mono/mini/exceptions-x86.c @@ -59,7 +59,7 @@ LONG CALLBACK seh_unhandled_exception_filter(EXCEPTION_POINTERS* ep) } #endif - mono_handle_native_sigsegv (SIGSEGV, NULL); + mono_handle_native_sigsegv (SIGSEGV, NULL, NULL); return EXCEPTION_CONTINUE_SEARCH; } @@ -96,7 +96,7 @@ mono_win32_get_handle_stackoverflow (void) x86_call_code (code, mono_domain_get); /* get stack overflow exception from domain object */ - x86_mov_reg_membase (code, X86_EAX, X86_EAX, MONO_STRUCT_OFFSET (MonoDomain, stack_overflow_ex), 4); + x86_mov_reg_membase (code, X86_EAX, X86_EAX, G_STRUCT_OFFSET (MonoDomain, stack_overflow_ex), 4); /* call mono_arch_handle_exception (sctx, stack_overflow_exception_obj) */ x86_push_reg (code, X86_EAX); @@ -139,8 +139,7 @@ win32_handle_stack_overflow (EXCEPTION_POINTERS* ep, struct sigcontext *sctx) guint32 free_stack = 0; StackFrameInfo frame; - /* convert sigcontext to MonoContext (due to reuse of stack walking helpers */ - mono_arch_sigctx_to_monoctx (sctx, &ctx); + mono_sigctx_to_monoctx (sctx, &ctx); /* get our os page size */ GetSystemInfo(&si); @@ -172,8 +171,7 @@ win32_handle_stack_overflow (EXCEPTION_POINTERS* ep, struct sigcontext *sctx) ctx = new_ctx; } while (free_stack < 64 * 1024 && frame.ji != (gpointer) -1); - /* convert into sigcontext to be used in mono_arch_handle_exception */ - mono_arch_monoctx_to_sigctx (&ctx, sctx); + mono_monoctx_to_sigctx (&ctx, sctx); /* todo: install new stack-guard page */ @@ -852,21 +850,6 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, if ((guint32)((*lmf)->previous_lmf) & 1) { /* lmf->esp is set by the trampoline code */ new_ctx->esp = (*lmf)->esp; - - /* Pop arguments off the stack */ - /* FIXME: Handle the delegate case too ((*lmf)->method == NULL) */ - /* FIXME: Handle the IMT/vtable case too */ -#if 0 -#ifndef ENABLE_LLVM - if ((*lmf)->method) { - MonoMethod *method = (*lmf)->method; - MonoJitArgumentInfo *arg_info = g_newa (MonoJitArgumentInfo, mono_method_signature (method)->param_count + 1); - - guint32 stack_to_pop = mono_arch_get_argument_info (NULL, mono_method_signature (method), mono_method_signature (method)->param_count, arg_info); - new_ctx->esp += stack_to_pop; - } -#endif -#endif } else /* the lmf is always stored on the stack, so the following @@ -881,18 +864,6 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, return FALSE; } -void -mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) -{ - mono_sigctx_to_monoctx (sigctx, mctx); -} - -void -mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) -{ - mono_monoctx_to_sigctx (mctx, sigctx); -} - gpointer mono_arch_ip_from_context (void *sigctx) { @@ -1009,7 +980,7 @@ mono_arch_handle_exception (void *sigctx, gpointer obj) MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); /* Pass the ctx parameter in TLS */ - mono_arch_sigctx_to_monoctx (ctx, &jit_tls->ex_ctx); + mono_sigctx_to_monoctx (ctx, &jit_tls->ex_ctx); mctx = jit_tls->ex_ctx; mono_setup_async_callback (&mctx, handle_signal_exception, obj); @@ -1021,7 +992,7 @@ mono_arch_handle_exception (void *sigctx, gpointer obj) MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); struct sigcontext *ctx = (struct sigcontext *)sigctx; - mono_arch_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); + mono_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); mctx = jit_tls->ex_ctx; mono_setup_async_callback (&mctx, handle_signal_exception, obj); @@ -1031,11 +1002,11 @@ mono_arch_handle_exception (void *sigctx, gpointer obj) #else MonoContext mctx; - mono_arch_sigctx_to_monoctx (sigctx, &mctx); + mono_sigctx_to_monoctx (sigctx, &mctx); mono_handle_exception (&mctx, obj); - mono_arch_monoctx_to_sigctx (&mctx, sigctx); + mono_monoctx_to_sigctx (&mctx, sigctx); return TRUE; #endif @@ -1081,7 +1052,7 @@ altstack_handle_and_restore (MonoContext *ctx, gpointer obj, gboolean stack_ovf) } void -mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean stack_ovf) +mono_arch_handle_altstack_exception (void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *siginfo, gpointer fault_addr, gboolean stack_ovf) { #ifdef MONO_ARCH_USE_SIGACTION MonoException *exc = NULL; @@ -1103,7 +1074,7 @@ mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean if (stack_ovf) exc = mono_domain_get ()->stack_overflow_ex; if (!ji) - mono_handle_native_sigsegv (SIGSEGV, sigctx); + mono_handle_native_sigsegv (SIGSEGV, sigctx, siginfo); /* setup a call frame on the real stack so that control is returned there * and exception handling can continue. * If this was a stack overflow the caller already ensured the stack pages diff --git a/mta-mono/vendor/mono/mini/gshared.cs b/mta-mono/vendor/mono/mini/gshared.cs index d0ee4fa..ea146bd 100644 --- a/mta-mono/vendor/mono/mini/gshared.cs +++ b/mta-mono/vendor/mono/mini/gshared.cs @@ -1575,6 +1575,124 @@ public class Tests return 1; return 0; } + + struct EmptyStruct { + } + + public struct BStruct { + public int a, b, c, d; + } + + interface IFoo3 { + int Bytes (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7, byte b8); + int SBytes (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + sbyte b1, sbyte b2, sbyte b3, sbyte b4); + int Shorts (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + short b1, short b2, short b3, short b4); + int UShorts (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + ushort b1, ushort b2, ushort b3, ushort b4); + int Ints (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + int i1, int i2, int i3, int i4); + int UInts (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + uint i1, uint i2, uint i3, uint i4); + int Structs (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + BStruct s); + } + + class Foo3 : IFoo3 { + public int Bytes (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7, byte b8) { + return b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8; + } + public int SBytes (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + sbyte b1, sbyte b2, sbyte b3, sbyte b4) { + return b1 + b2 + b3 + b4; + } + public int Shorts (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + short b1, short b2, short b3, short b4) { + return b1 + b2 + b3 + b4; + } + public int UShorts (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + ushort b1, ushort b2, ushort b3, ushort b4) { + return b1 + b2 + b3 + b4; + } + public int Ints (T t, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, + int i1, int i2, int i3, int i4) { + return i1 + i2 + i3 + i4; + } + public int UInts (T t, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, + uint i1, uint i2, uint i3, uint i4) { + return (int)(i1 + i2 + i3 + i4); + } + public int Structs (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8, + BStruct s) { + return s.a + s.b + s.c + s.d; + } + } + + // Passing small normal arguments on the stack + public static int test_0_arm64_small_stack_args () { + IFoo3 o = (IFoo3)Activator.CreateInstance (typeof (Foo3<>).MakeGenericType (new Type [] { typeof (EmptyStruct) })); + int res = o.Bytes (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8); + if (res != 36) + return 1; + int res2 = o.SBytes (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, -1, -2, -3, -4); + if (res2 != -10) + return 2; + int res3 = o.Shorts (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, -1, -2, -3, -4); + if (res3 != -10) + return 3; + int res4 = o.UShorts (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4); + if (res4 != 10) + return 4; + int res5 = o.Ints (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, -1, -2, -3, -4); + if (res5 != -10) + return 5; + int res6 = o.UInts (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4); + if (res6 != 10) + return 6; + return 0; + } + + // Passing vtype normal arguments on the stack + public static int test_0_arm64_vtype_stack_args () { + IFoo3 o = (IFoo3)Activator.CreateInstance (typeof (Foo3<>).MakeGenericType (new Type [] { typeof (EmptyStruct) })); + int res = o.Structs (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, new BStruct () { a = 1, b = 2, c = 3, d = 4 }); + if (res != 10) + return 1; + return 0; + } + + interface IFoo4 { + T Get(T[,] arr, T t); + } + + class Foo4 : IFoo4 { + public T Get(T[,] arr, T t) { + arr [1, 1] = t; + return arr [1, 1]; + } + } + + struct AStruct { + public int a, b; + } + + public static int test_0_multi_dim_arrays_2 () { + IFoo4 foo = new Foo4 (); + var arr = new int [10, 10]; + int res = foo.Get (arr, 10); + if (res != 10) + return 1; + + IFoo4 foo2 = new Foo4 (); + var arr2 = new AStruct [10, 10]; + var res2 = foo2.Get (arr2, new AStruct () { a = 1, b = 2 }); + if (res2.a != 1 || res2.b != 2) + return 2; + return 0; + } } // #13191 diff --git a/mta-mono/vendor/mono/mini/iltests.il.in b/mta-mono/vendor/mono/mini/iltests.il.in index b647928..8510917 100644 --- a/mta-mono/vendor/mono/mini/iltests.il.in +++ b/mta-mono/vendor/mono/mini/iltests.il.in @@ -2718,4 +2718,67 @@ END: ldc.i4.0 ret } + + .method public hidebysig static int32 test_5_r4_fadd_mixed() cil managed + { + // Code size 17 (0x11) + .maxstack 2 + .locals init (float32 V_0, + float64 V_1) + IL_0000: ldc.r4 3 + IL_0005: stloc.0 + IL_0006: ldc.r8 2 + IL_000b: stloc.1 + IL_000c: ldloc.0 + IL_000d: ldloc.1 + IL_000e: add + IL_000f: conv.i4 + IL_0010: ret + } + + .method public hidebysig static int32 test_0_fcmp_eq_r4_mixed() cil managed + { + // Code size 32 (0x20) + .maxstack 2 + .locals init (float32 V_0, + float64 V_1) + IL_0000: ldc.r4 1 + IL_0005: stloc.0 + IL_0006: ldc.r8 1 + IL_000f: stloc.1 + IL_0010: ldloc.0 + IL_0012: ldloc.1 + IL_0013: bne.un IL_001e + + IL_0018: ldc.i4.0 + IL_0019: br IL_001f + + IL_001e: ldc.i4.1 + IL_001f: ret + } // end of method Tests::test_0_fcmp_eq_r4_mixed + + .method public hidebysig static int32 test_0_fceq_r4_mixed() cil managed + { + // Code size 31 (0x1f) + .maxstack 2 + .locals init (float32 V_0, + float64 V_1, + bool V_2) + IL_0000: ldc.r4 1 + IL_0005: stloc.0 + IL_0006: ldc.r8 1 + IL_000b: stloc.1 + IL_000c: ldloc.0 + IL_000d: ldloc.1 + IL_000e: ceq + IL_0010: stloc.2 + IL_0011: ldloc.2 + IL_0012: brfalse IL_001d + + IL_0017: ldc.i4.0 + IL_0018: br IL_001e + + IL_001d: ldc.i4.1 + IL_001e: ret + } // end of method Tests::test_0_fceq_r4 } diff --git a/mta-mono/vendor/mono/mini/image-writer.c b/mta-mono/vendor/mono/mini/image-writer.c index 13c055b..819cfa3 100644 --- a/mta-mono/vendor/mono/mini/image-writer.c +++ b/mta-mono/vendor/mono/mini/image-writer.c @@ -1843,6 +1843,19 @@ asm_writer_emit_alignment (MonoImageWriter *acfg, int size) #endif } +#ifndef USE_BIN_WRITER +static void +asm_writer_emit_alignment_fill (MonoImageWriter *acfg, int size, int fill) +{ + asm_writer_emit_unset_mode (acfg); +#if defined(TARGET_ASM_APPLE) + fprintf (acfg->fp, "\t.align %d, 0x%0x\n", ilog2 (size), fill); +#else + asm_writer_emit_alignment (acfg, size); +#endif +} +#endif + #ifdef __native_client_codegen__ static void asm_writer_emit_nacl_call_alignment (MonoImageWriter *acfg) { @@ -2150,6 +2163,19 @@ img_writer_emit_alignment (MonoImageWriter *acfg, int size) #endif } +void +img_writer_emit_alignment_fill (MonoImageWriter *acfg, int size, int fill) +{ +#ifdef USE_BIN_WRITER + if (acfg->use_bin_writer) + bin_writer_emit_alignment (acfg, size); + else + asm_writer_emit_alignment (acfg, size); +#else + asm_writer_emit_alignment_fill (acfg, size, fill); +#endif +} + #ifdef __native_client_codegen__ void img_writer_emit_nacl_call_alignment (MonoImageWriter *acfg) { diff --git a/mta-mono/vendor/mono/mini/image-writer.h b/mta-mono/vendor/mono/mini/image-writer.h index 720b95f..812c154 100644 --- a/mta-mono/vendor/mono/mini/image-writer.h +++ b/mta-mono/vendor/mono/mini/image-writer.h @@ -62,6 +62,8 @@ void img_writer_emit_line (MonoImageWriter *w) MONO_INTERNAL; void img_writer_emit_alignment (MonoImageWriter *w, int size) MONO_INTERNAL; +void img_writer_emit_alignment_fill (MonoImageWriter *w, int size, int fill) MONO_INTERNAL; + #ifdef __native_client_codegen__ void img_writer_emit_nacl_call_alignment (MonoImageWriter *w) MONO_INTERNAL; #endif diff --git a/mta-mono/vendor/mono/mini/ir-emit.h b/mta-mono/vendor/mono/mini/ir-emit.h index c208c2a..67d0734 100644 --- a/mta-mono/vendor/mono/mini/ir-emit.h +++ b/mta-mono/vendor/mono/mini/ir-emit.h @@ -86,6 +86,7 @@ alloc_dreg (MonoCompile *cfg, MonoStackType stack_type) return alloc_ireg_mp (cfg); case STACK_OBJ: return alloc_ireg_ref (cfg); + case STACK_R4: case STACK_R8: return alloc_freg (cfg); case STACK_I8: @@ -259,6 +260,8 @@ alloc_dreg (MonoCompile *cfg, MonoStackType stack_type) #define NEW_LDSTRCONST(cfg,dest,image,token) NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_LDSTR, (image), (token), NULL, STACK_OBJ, mono_defaults.string_class) +#define NEW_LDSTRLITCONST(cfg,dest,val) NEW_AOTCONST ((cfg), (dest), MONO_PATCH_INFO_LDSTR_LIT, (val)) + #define NEW_TYPE_FROM_HANDLE_CONST(cfg,dest,image,token,generic_context) NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_TYPE_FROM_HANDLE, (image), (token), (generic_context), STACK_OBJ, mono_defaults.monotype_class) #define NEW_LDTOKENCONST(cfg,dest,image,token,generic_context) NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_LDTOKEN, (image), (token), (generic_context), STACK_PTR, NULL) @@ -302,8 +305,6 @@ alloc_dreg (MonoCompile *cfg, MonoStackType stack_type) #define NEW_JIT_ICALL_ADDRCONST(cfg,dest,name) NEW_AOTCONST ((cfg), (dest), MONO_PATCH_INFO_JIT_ICALL_ADDR, (name)) -#define GET_VARINFO_INST(cfg,num) ((cfg)->varinfo [(num)]->inst) - #define NEW_VARLOAD(cfg,dest,var,vartype) do { \ MONO_INST_NEW ((cfg), (dest), OP_MOVE); \ (dest)->opcode = mono_type_to_regmove ((cfg), (vartype)); \ @@ -407,7 +408,7 @@ handle_gsharedvt_ldaddr (MonoCompile *cfg) } while (0) #define NEW_SEQ_POINT(cfg,dest,il_offset,intr_loc) do { \ - MONO_INST_NEW ((cfg), (dest), OP_SEQ_POINT); \ + MONO_INST_NEW ((cfg), (dest), cfg->gen_seq_points_debug_data ? OP_SEQ_POINT : OP_IL_SEQ_POINT); \ (dest)->inst_imm = (il_offset); \ (dest)->flags = intr_loc ? MONO_INST_SINGLE_STEP_LOC : 0; \ } while (0) @@ -445,6 +446,8 @@ handle_gsharedvt_ldaddr (MonoCompile *cfg) #define EMIT_NEW_LDSTRCONST(cfg,dest,image,token) do { NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_LDSTR, (image), (token), NULL, STACK_OBJ, mono_defaults.string_class); MONO_ADD_INS ((cfg)->cbb, (dest)); } while (0) +#define EMIT_NEW_LDSTRLITCONST(cfg,dest,val) do { NEW_AOTCONST ((cfg), (dest), MONO_PATCH_INFO_LDSTR_LIT, (val)); MONO_ADD_INS ((cfg)->cbb, (dest)); } while (0) + #define EMIT_NEW_TYPE_FROM_HANDLE_CONST(cfg,dest,image,token,generic_context) do { NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_TYPE_FROM_HANDLE, (image), (token), (generic_context), STACK_OBJ, mono_defaults.monotype_class); MONO_ADD_INS ((cfg)->cbb, (dest)); } while (0) #define EMIT_NEW_LDTOKENCONST(cfg,dest,image,token,generic_context) do { NEW_AOTCONST_TOKEN ((cfg), (dest), MONO_PATCH_INFO_LDTOKEN, (image), (token), (generic_context), STACK_PTR, NULL); MONO_ADD_INS ((cfg)->cbb, (dest)); } while (0) diff --git a/mta-mono/vendor/mono/mini/jit-icalls.c b/mta-mono/vendor/mono/mini/jit-icalls.c index fcfcf4f..318bd06 100644 --- a/mta-mono/vendor/mono/mini/jit-icalls.c +++ b/mta-mono/vendor/mono/mini/jit-icalls.c @@ -23,8 +23,6 @@ mono_ldftn (MonoMethod *method) { gpointer addr; - MONO_ARCH_SAVE_REGS; - addr = mono_create_jump_trampoline (mono_domain_get (), method, FALSE); return mono_create_ftnptr (mono_domain_get (), addr); @@ -33,12 +31,13 @@ mono_ldftn (MonoMethod *method) static void* ldvirtfn_internal (MonoObject *obj, MonoMethod *method, gboolean gshared) { + MonoError error; MonoMethod *res; - MONO_ARCH_SAVE_REGS; - - if (obj == NULL) - mono_raise_exception (mono_get_exception_null_reference ()); + if (obj == NULL) { + mono_set_pending_exception (mono_get_exception_null_reference ()); + return NULL; + } res = mono_object_get_virtual_method (obj, method); @@ -51,7 +50,8 @@ ldvirtfn_internal (MonoObject *obj, MonoMethod *method, gboolean gshared) context.class_inst = res->klass->generic_container->context.class_inst; context.method_inst = mono_method_get_context (method)->method_inst; - res = mono_class_inflate_generic_method (res, &context); + res = mono_class_inflate_generic_method_checked (res, &context, &error); + mono_error_raise_exception (&error); } /* An rgctx wrapper is added by the trampolines no need to do it here */ @@ -74,12 +74,14 @@ mono_ldvirtfn_gshared (MonoObject *obj, MonoMethod *method) void mono_helper_stelem_ref_check (MonoArray *array, MonoObject *val) { - MONO_ARCH_SAVE_REGS; - - if (!array) - mono_raise_exception (mono_get_exception_null_reference ()); - if (val && !mono_object_isinst (val, array->obj.vtable->klass->element_class)) - mono_raise_exception (mono_get_exception_array_type_mismatch ()); + if (!array) { + mono_set_pending_exception (mono_get_exception_null_reference ()); + return; + } + if (val && !mono_object_isinst (val, array->obj.vtable->klass->element_class)) { + mono_set_pending_exception (mono_get_exception_array_type_mismatch ()); + return; + } } #if !defined(MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS) || defined(MONO_ARCH_EMULATE_LONG_MUL_OVF_OPTS) @@ -87,7 +89,6 @@ mono_helper_stelem_ref_check (MonoArray *array, MonoObject *val) gint64 mono_llmult (gint64 a, gint64 b) { - /* no need, no exceptions: MONO_ARCH_SAVE_REGS;*/ return a * b; } @@ -100,8 +101,6 @@ mono_llmult_ovf_un (guint64 a, guint64 b) guint32 bh = b >> 32; guint64 res, t1; - MONO_ARCH_SAVE_REGS; - // fixme: this is incredible slow if (ah && bh) @@ -119,7 +118,7 @@ mono_llmult_ovf_un (guint64 a, guint64 b) return res; raise_exception: - mono_raise_exception (mono_get_exception_overflow ()); + mono_set_pending_exception (mono_get_exception_overflow ()); return 0; } @@ -149,8 +148,6 @@ mono_llmult_ovf (gint64 a, gint64 b) gint64 res, t1; gint32 sign; - MONO_ARCH_SAVE_REGS; - /* need to work with absoulte values, so find out what the resulting sign will be and convert any negative numbers from two's complement @@ -230,20 +227,22 @@ mono_llmult_ovf (gint64 a, gint64 b) return res; raise_exception: - mono_raise_exception (mono_get_exception_overflow ()); + mono_set_pending_exception (mono_get_exception_overflow ()); return 0; } gint64 mono_lldiv (gint64 a, gint64 b) { - MONO_ARCH_SAVE_REGS; - #ifdef MONO_ARCH_NEED_DIV_CHECK - if (!b) - mono_raise_exception (mono_get_exception_divide_by_zero ()); - else if (b == -1 && a == (-9223372036854775807LL - 1LL)) - mono_raise_exception (mono_get_exception_arithmetic ()); + if (!b) { + mono_set_pending_exception (mono_get_exception_divide_by_zero ()); + return 0; + } + else if (b == -1 && a == (-9223372036854775807LL - 1LL)) { + mono_set_pending_exception (mono_get_exception_arithmetic ()); + return 0; + } #endif return a / b; } @@ -251,13 +250,15 @@ mono_lldiv (gint64 a, gint64 b) gint64 mono_llrem (gint64 a, gint64 b) { - MONO_ARCH_SAVE_REGS; - #ifdef MONO_ARCH_NEED_DIV_CHECK - if (!b) - mono_raise_exception (mono_get_exception_divide_by_zero ()); - else if (b == -1 && a == (-9223372036854775807LL - 1LL)) - mono_raise_exception (mono_get_exception_arithmetic ()); + if (!b) { + mono_set_pending_exception (mono_get_exception_divide_by_zero ()); + return 0; + } + else if (b == -1 && a == (-9223372036854775807LL - 1LL)) { + mono_set_pending_exception (mono_get_exception_arithmetic ()); + return 0; + } #endif return a % b; } @@ -265,11 +266,11 @@ mono_llrem (gint64 a, gint64 b) guint64 mono_lldiv_un (guint64 a, guint64 b) { - MONO_ARCH_SAVE_REGS; - #ifdef MONO_ARCH_NEED_DIV_CHECK - if (!b) - mono_raise_exception (mono_get_exception_divide_by_zero ()); + if (!b) { + mono_set_pending_exception (mono_get_exception_divide_by_zero ()); + return 0; + } #endif return a / b; } @@ -277,11 +278,11 @@ mono_lldiv_un (guint64 a, guint64 b) guint64 mono_llrem_un (guint64 a, guint64 b) { - MONO_ARCH_SAVE_REGS; - #ifdef MONO_ARCH_NEED_DIV_CHECK - if (!b) - mono_raise_exception (mono_get_exception_divide_by_zero ()); + if (!b) { + mono_set_pending_exception (mono_get_exception_divide_by_zero ()); + return 0; + } #endif return a % b; } @@ -295,7 +296,6 @@ mono_lshl (guint64 a, gint32 shamt) { guint64 res; - /* no need, no exceptions: MONO_ARCH_SAVE_REGS;*/ res = a << shamt; /*printf ("TESTL %lld << %d = %lld\n", a, shamt, res);*/ @@ -308,7 +308,6 @@ mono_lshr_un (guint64 a, gint32 shamt) { guint64 res; - /* no need, no exceptions: MONO_ARCH_SAVE_REGS;*/ res = a >> shamt; /*printf ("TESTR %lld >> %d = %lld\n", a, shamt, res);*/ @@ -321,7 +320,6 @@ mono_lshr (gint64 a, gint32 shamt) { gint64 res; - /* no need, no exceptions: MONO_ARCH_SAVE_REGS;*/ res = a >> shamt; /*printf ("TESTR %lld >> %d = %lld\n", a, shamt, res);*/ @@ -336,13 +334,15 @@ mono_lshr (gint64 a, gint32 shamt) gint32 mono_idiv (gint32 a, gint32 b) { - MONO_ARCH_SAVE_REGS; - #ifdef MONO_ARCH_NEED_DIV_CHECK - if (!b) - mono_raise_exception (mono_get_exception_divide_by_zero ()); - else if (b == -1 && a == (0x80000000)) - mono_raise_exception (mono_get_exception_overflow ()); + if (!b) { + mono_set_pending_exception (mono_get_exception_divide_by_zero ()); + return 0; + } + else if (b == -1 && a == (0x80000000)) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return 0; + } #endif return a / b; } @@ -350,11 +350,11 @@ mono_idiv (gint32 a, gint32 b) guint32 mono_idiv_un (guint32 a, guint32 b) { - MONO_ARCH_SAVE_REGS; - #ifdef MONO_ARCH_NEED_DIV_CHECK - if (!b) - mono_raise_exception (mono_get_exception_divide_by_zero ()); + if (!b) { + mono_set_pending_exception (mono_get_exception_divide_by_zero ()); + return 0; + } #endif return a / b; } @@ -362,26 +362,27 @@ mono_idiv_un (guint32 a, guint32 b) gint32 mono_irem (gint32 a, gint32 b) { - MONO_ARCH_SAVE_REGS; - #ifdef MONO_ARCH_NEED_DIV_CHECK - if (!b) - mono_raise_exception (mono_get_exception_divide_by_zero ()); - else if (b == -1 && a == (0x80000000)) - mono_raise_exception (mono_get_exception_overflow ()); + if (!b) { + mono_set_pending_exception (mono_get_exception_divide_by_zero ()); + return 0; + } + else if (b == -1 && a == (0x80000000)) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return 0; + } #endif - return a % b; } guint32 mono_irem_un (guint32 a, guint32 b) { - MONO_ARCH_SAVE_REGS; - #ifdef MONO_ARCH_NEED_DIV_CHECK - if (!b) - mono_raise_exception (mono_get_exception_divide_by_zero ()); + if (!b) { + mono_set_pending_exception (mono_get_exception_divide_by_zero ()); + return 0; + } #endif return a % b; } @@ -393,8 +394,6 @@ mono_irem_un (guint32 a, guint32 b) gint32 mono_imul (gint32 a, gint32 b) { - MONO_ARCH_SAVE_REGS; - return a * b; } @@ -403,12 +402,12 @@ mono_imul_ovf (gint32 a, gint32 b) { gint64 res; - MONO_ARCH_SAVE_REGS; - res = (gint64)a * (gint64)b; - if ((res > 0x7fffffffL) || (res < -2147483648LL)) - mono_raise_exception (mono_get_exception_overflow ()); + if ((res > 0x7fffffffL) || (res < -2147483648LL)) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return 0; + } return res; } @@ -418,12 +417,12 @@ mono_imul_ovf_un (guint32 a, guint32 b) { guint64 res; - MONO_ARCH_SAVE_REGS; - res = (guint64)a * (guint64)b; - if ((res >> 32)) - mono_raise_exception (mono_get_exception_overflow ()); + if (res >> 32) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return 0; + } return res; } @@ -433,8 +432,6 @@ mono_imul_ovf_un (guint32 a, guint32 b) double mono_fdiv (double a, double b) { - MONO_ARCH_SAVE_REGS; - return a / b; } #endif @@ -647,8 +644,6 @@ mono_array_new_va (MonoMethod *cm, ...) int rank; int i, d; - MONO_ARCH_SAVE_REGS; - pcount = mono_method_signature (cm)->param_count; rank = cm->klass->rank; @@ -687,8 +682,6 @@ mono_array_new_1 (MonoMethod *cm, guint32 length) int pcount; int rank; - MONO_ARCH_SAVE_REGS; - pcount = mono_method_signature (cm)->param_count; rank = cm->klass->rank; @@ -715,8 +708,6 @@ mono_array_new_2 (MonoMethod *cm, guint32 length1, guint32 length2) int pcount; int rank; - MONO_ARCH_SAVE_REGS; - pcount = mono_method_signature (cm)->param_count; rank = cm->klass->rank; @@ -744,8 +735,6 @@ mono_array_new_3 (MonoMethod *cm, guint32 length1, guint32 length2, guint32 leng int pcount; int rank; - MONO_ARCH_SAVE_REGS; - pcount = mono_method_signature (cm)->param_count; rank = cm->klass->rank; @@ -774,8 +763,6 @@ mono_array_new_4 (MonoMethod *cm, guint32 length1, guint32 length2, guint32 leng int pcount; int rank; - MONO_ARCH_SAVE_REGS; - pcount = mono_method_signature (cm)->param_count; rank = cm->klass->rank; @@ -802,8 +789,6 @@ mono_class_static_field_address (MonoDomain *domain, MonoClassField *field) MonoVTable *vtable; gpointer addr; - MONO_ARCH_SAVE_REGS; - //printf ("SFLDA0 %s.%s::%s %d\n", field->parent->name_space, field->parent->name, field->name, field->offset, field->parent->inited); mono_class_init (field->parent); @@ -825,11 +810,12 @@ mono_class_static_field_address (MonoDomain *domain, MonoClassField *field) gpointer mono_ldtoken_wrapper (MonoImage *image, int token, MonoGenericContext *context) { + MonoError error; MonoClass *handle_class; gpointer res; - MONO_ARCH_SAVE_REGS; - res = mono_ldtoken (image, token, &handle_class, context); + res = mono_ldtoken_checked (image, token, &handle_class, context, &error); + mono_error_raise_exception (&error); mono_class_init (handle_class); return res; @@ -862,7 +848,6 @@ mono_fconv_u8 (double v) gint64 mono_fconv_i8 (double v) { - /* no need, no exceptions: MONO_ARCH_SAVE_REGS;*/ return (gint64)v; } #endif @@ -870,8 +855,6 @@ mono_fconv_i8 (double v) guint32 mono_fconv_u4 (double v) { - /* no need, no exceptions: MONO_ARCH_SAVE_REGS;*/ - /* MS.NET behaves like this for some reason */ #ifdef HAVE_ISINF if (isinf (v) || isnan (v)) @@ -897,12 +880,11 @@ mono_fconv_ovf_i8 (double v) { gint64 res; - MONO_ARCH_SAVE_REGS; - res = (gint64)v; if (isnan(v) || trunc (v) != res) { - mono_raise_exception (mono_get_exception_overflow ()); + mono_set_pending_exception (mono_get_exception_overflow ()); + return 0; } return res; } @@ -912,7 +894,6 @@ mono_fconv_ovf_u8 (double v) { guint64 res; - MONO_ARCH_SAVE_REGS; /* * The soft-float implementation of some ARM devices have a buggy guin64 to double * conversion that it looses precision even when the integer if fully representable @@ -924,18 +905,55 @@ mono_fconv_ovf_u8 (double v) */ #if defined(__arm__) && defined(MONO_ARCH_SOFT_FLOAT_FALLBACK) if (isnan (v) || !(v >= -0.5 && v <= ULLONG_MAX+0.5)) { - mono_raise_exception (mono_get_exception_overflow ()); + mono_set_pending_exception (mono_get_exception_overflow ()); + return 0; } res = (guint64)v; #else res = (guint64)v; if (isnan(v) || trunc (v) != res) { - mono_raise_exception (mono_get_exception_overflow ()); + mono_set_pending_exception (mono_get_exception_overflow ()); + return 0; } #endif return res; } +#ifdef MONO_ARCH_EMULATE_FCONV_TO_I8 +gint64 +mono_rconv_i8 (float v) +{ + return (gint64)v; +} +#endif + +gint64 +mono_rconv_ovf_i8 (float v) +{ + gint64 res; + + res = (gint64)v; + + if (isnan(v) || trunc (v) != res) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return 0; + } + return res; +} + +guint64 +mono_rconv_ovf_u8 (float v) +{ + guint64 res; + + res = (guint64)v; + if (isnan(v) || trunc (v) != res) { + mono_set_pending_exception (mono_get_exception_overflow ()); + return 0; + } + return res; +} + #ifdef MONO_ARCH_EMULATE_LCONV_TO_R8 double mono_lconv_to_r8 (gint64 a) @@ -987,8 +1005,10 @@ mono_helper_compile_generic_method (MonoObject *obj, MonoMethod *method, gpointe mono_jit_stats.generic_virtual_invocations++; - if (obj == NULL) - mono_raise_exception (mono_get_exception_null_reference ()); + if (obj == NULL) { + mono_set_pending_exception (mono_get_exception_null_reference ()); + return NULL; + } vmethod = mono_object_get_virtual_method (obj, method); g_assert (!vmethod->klass->generic_container); g_assert (!vmethod->klass->generic_class || !vmethod->klass->generic_class->context.class_inst->is_open); @@ -1082,7 +1102,7 @@ mono_object_castclass_unbox (MonoObject *obj, MonoClass *klass) jit_tls->class_cast_to = klass; } - mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, + mono_set_pending_exception (mono_exception_from_name (mono_defaults.corlib, "System", "InvalidCastException")); return NULL; @@ -1118,7 +1138,7 @@ mono_object_castclass_with_cache (MonoObject *obj, MonoClass *klass, gpointer *c jit_tls->class_cast_to = klass; } - mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, + mono_set_pending_exception (mono_exception_from_name (mono_defaults.corlib, "System", "InvalidCastException")); return NULL; @@ -1170,8 +1190,10 @@ constrained_gsharedvt_call_setup (gpointer mp, MonoMethod *cmethod, MonoClass *k MonoMethod *m; int vt_slot; - if (klass->flags & TYPE_ATTRIBUTE_INTERFACE) - mono_raise_exception (mono_get_exception_execution_engine ("Not yet supported.")); + if (klass->flags & TYPE_ATTRIBUTE_INTERFACE) { + mono_set_pending_exception (mono_get_exception_execution_engine ("Not yet supported.")); + return NULL; + } if (mono_method_signature (cmethod)->pinvoke) { /* Object.GetType () */ @@ -1189,6 +1211,8 @@ constrained_gsharedvt_call_setup (gpointer mp, MonoMethod *cmethod, MonoClass *k vt_slot += iface_offset; } m = klass->vtable [vt_slot]; + if (cmethod->is_inflated) + m = mono_class_inflate_generic_method (m, mono_method_get_context (cmethod)); } if (klass->valuetype && (m->klass == mono_defaults.object_class || m->klass == mono_defaults.enum_class->parent || m->klass == mono_defaults.enum_class)) /* diff --git a/mta-mono/vendor/mono/mini/jit-icalls.h b/mta-mono/vendor/mono/mini/jit-icalls.h index dd99e7c..5991716 100644 --- a/mta-mono/vendor/mono/mini/jit-icalls.h +++ b/mta-mono/vendor/mono/mini/jit-icalls.h @@ -75,6 +75,12 @@ gint64 mono_fconv_ovf_i8 (double v) MONO_INTERNAL; guint64 mono_fconv_ovf_u8 (double v) MONO_INTERNAL; +gint64 mono_rconv_i8 (float v) MONO_INTERNAL; + +gint64 mono_rconv_ovf_i8 (float v) MONO_INTERNAL; + +guint64 mono_rconv_ovf_u8 (float v) MONO_INTERNAL; + double mono_lconv_to_r8 (gint64 a) MONO_INTERNAL; double mono_conv_to_r8 (gint32 a) MONO_INTERNAL; diff --git a/mta-mono/vendor/mono/mini/liveness.c b/mta-mono/vendor/mono/mini/liveness.c index 5f304b3..85b6ba0 100644 --- a/mta-mono/vendor/mono/mini/liveness.c +++ b/mta-mono/vendor/mono/mini/liveness.c @@ -20,6 +20,8 @@ #define BITS_PER_CHUNK MONO_BITSET_BITS_PER_CHUNK +#define BB_ID_SHIFT 18 + /* * The liveness2 pass can't handle long vars on 32 bit platforms because the component * vars have the same 'idx'. @@ -217,7 +219,7 @@ analyze_liveness_bb (MonoCompile *cfg, MonoBasicBlock *bb) MonoInst *ins; int sreg, inst_num; MonoMethodVar *vars = cfg->vars; - guint32 abs_pos = (bb->dfn << 16); + guint32 abs_pos = (bb->dfn << BB_ID_SHIFT); /* Start inst_num from > 0, so last_use.abs_pos is only 0 for dead variables */ for (inst_num = 2, ins = bb->code; ins; ins = ins->next, inst_num += 2) { @@ -492,7 +494,7 @@ mono_analyze_liveness (MonoCompile *cfg) for (i = 0; i < cfg->num_bblocks; ++i) { MonoBasicBlock *bb = cfg->bblocks [i]; guint32 max; - guint32 abs_pos = (bb->dfn << 16); + guint32 abs_pos = (bb->dfn << BB_ID_SHIFT); MonoMethodVar *vars = cfg->vars; if (!bb->live_out_set) @@ -512,7 +514,7 @@ mono_analyze_liveness (MonoCompile *cfg) if (bits_in & 1) update_live_range (&vars [k], abs_pos + 0); if (bits_out & 1) - update_live_range (&vars [k], abs_pos + 0xffff); + update_live_range (&vars [k], abs_pos + ((1 << BB_ID_SHIFT) - 1)); bits_in >>= 1; bits_out >>= 1; k ++; @@ -614,7 +616,7 @@ optimize_initlocals (MonoCompile *cfg) //printf ("DEAD: "); mono_print_ins (ins); if (cfg->disable_initlocals_opt_refs && var->type == STACK_OBJ) continue; - if ((ins->opcode == OP_ICONST) || (ins->opcode == OP_I8CONST) || (ins->opcode == OP_R8CONST)) { + if ((ins->opcode == OP_ICONST) || (ins->opcode == OP_I8CONST) || (ins->opcode == OP_R8CONST) || (ins->opcode == OP_R4CONST)) { NULLIFY_INS (ins); MONO_VARINFO (cfg, var->inst_c0)->spill_costs -= 1; /* @@ -788,7 +790,7 @@ update_liveness2 (MonoCompile *cfg, MonoInst *ins, gboolean set_volatile, int in LIVENESS_DEBUG (printf ("\t%x: ", inst_num); mono_print_ins (ins)); - if (ins->opcode == OP_NOP) + if (ins->opcode == OP_NOP || ins->opcode == OP_IL_SEQ_POINT) return; /* DREG */ @@ -814,10 +816,17 @@ update_liveness2 (MonoCompile *cfg, MonoInst *ins, gboolean set_volatile, int in LIVENESS_DEBUG (printf ("\tdead def of R%d, eliminated\n", ins->dreg)); NULLIFY_INS (ins); return; - } + } else { + int inst_num_add = 1; + MonoInst *next = ins->next; + while (next && next->opcode == OP_IL_SEQ_POINT) { + inst_num_add++; + next = next->next; + } - LIVENESS_DEBUG (printf ("\tdead def of R%d, add range to R%d: [%x, %x]\n", ins->dreg, ins->dreg, inst_num, inst_num + 1)); - mono_linterval_add_range (cfg, vi->interval, inst_num, inst_num + 1); + LIVENESS_DEBUG (printf ("\tdead def of R%d, add range to R%d: [%x, %x]\n", ins->dreg, ins->dreg, inst_num, inst_num + inst_num_add)); + mono_linterval_add_range (cfg, vi->interval, inst_num, inst_num + inst_num_add); + } } } } @@ -852,6 +861,23 @@ mono_analyze_liveness2 (MonoCompile *cfg) if (disabled) return; + if (cfg->num_bblocks >= (1 << (32 - BB_ID_SHIFT - 1))) + /* Ranges would overflow */ + return; + + for (bnum = cfg->num_bblocks - 1; bnum >= 0; --bnum) { + MonoBasicBlock *bb = cfg->bblocks [bnum]; + MonoInst *ins; + + nins = 0; + for (nins = 0, ins = bb->code; ins; ins = ins->next, ++nins) + nins ++; + + if (nins >= ((1 << BB_ID_SHIFT) - 1)) + /* Ranges would overflow */ + return; + } + LIVENESS_DEBUG (printf ("LIVENESS 2 %s\n", mono_method_full_name (cfg->method, TRUE))); /* @@ -879,12 +905,12 @@ mono_analyze_liveness2 (MonoCompile *cfg) MonoBasicBlock *bb = cfg->bblocks [bnum]; MonoInst *ins; - block_from = (bb->dfn << 16) + 1; /* so pos > 0 */ + block_from = (bb->dfn << BB_ID_SHIFT) + 1; /* so pos > 0 */ if (bnum < cfg->num_bblocks - 1) /* Beginning of the next bblock */ - block_to = (cfg->bblocks [bnum + 1]->dfn << 16) + 1; + block_to = (cfg->bblocks [bnum + 1]->dfn << BB_ID_SHIFT) + 1; else - block_to = (bb->dfn << 16) + 0xffff; + block_to = (bb->dfn << BB_ID_SHIFT) + ((1 << BB_ID_SHIFT) - 1); LIVENESS_DEBUG (printf ("LIVENESS BLOCK BB%d:\n", bb->block_num)); diff --git a/mta-mono/vendor/mono/mini/local-propagation.c b/mta-mono/vendor/mono/mini/local-propagation.c index 7bdb517..2926159 100644 --- a/mta-mono/vendor/mono/mini/local-propagation.c +++ b/mta-mono/vendor/mono/mini/local-propagation.c @@ -53,6 +53,7 @@ mono_local_cprop (MonoCompile *cfg) MonoInst **defs; gint32 *def_index; int max; + int filter = FILTER_IL_SEQ_POINT; restart: @@ -168,7 +169,7 @@ restart: !vreg_is_volatile (cfg, def->sreg1) && /* This avoids propagating local vregs across calls */ ((get_vreg_to_inst (cfg, def->sreg1) || !defs [def->sreg1] || (def_index [def->sreg1] >= last_call_index) || (def->opcode == OP_VMOVE))) && - !(defs [def->sreg1] && defs [def->sreg1]->next == def) && + !(defs [def->sreg1] && mono_inst_next (defs [def->sreg1], filter) == def) && (!MONO_ARCH_USE_FPSTACK || (def->opcode != OP_FMOVE)) && (def->opcode != OP_FMOVE)) { int vreg = def->sreg1; @@ -256,14 +257,14 @@ restart: * We have to guarantee that def->sreg1 haven't changed since def->dreg * was defined. cfg->frame_reg is assumed to remain constant. */ - if ((def->sreg1 == cfg->frame_reg) || ((def->next == ins) && (def->dreg != def->sreg1))) { + if ((def->sreg1 == cfg->frame_reg) || ((mono_inst_next (def, filter) == ins) && (def->dreg != def->sreg1))) { ins->inst_basereg = def->sreg1; ins->inst_offset += def->inst_imm; } - } else if ((ins->opcode == OP_ISUB_IMM) && (def->opcode == OP_IADD_IMM) && (def->next == ins) && (def->dreg != def->sreg1)) { + } else if ((ins->opcode == OP_ISUB_IMM) && (def->opcode == OP_IADD_IMM) && (mono_inst_next (def, filter) == ins) && (def->dreg != def->sreg1)) { ins->sreg1 = def->sreg1; ins->inst_imm -= def->inst_imm; - } else if ((ins->opcode == OP_IADD_IMM) && (def->opcode == OP_ISUB_IMM) && (def->next == ins) && (def->dreg != def->sreg1)) { + } else if ((ins->opcode == OP_IADD_IMM) && (def->opcode == OP_ISUB_IMM) && (mono_inst_next (def, filter) == ins) && (def->dreg != def->sreg1)) { ins->sreg1 = def->sreg1; ins->inst_imm -= def->inst_imm; } else if (ins->opcode == OP_STOREI1_MEMBASE_REG && @@ -512,6 +513,7 @@ mono_local_deadce (MonoCompile *cfg) const char *spec = INS_INFO (ins->opcode); int sregs [MONO_MAX_SRC_REGS]; int num_sregs, i; + MonoInst *prev_f = mono_inst_prev (ins, FILTER_NOP | FILTER_IL_SEQ_POINT); if (ins->opcode == OP_NOP) { MONO_DELETE_INS (bb, ins); @@ -520,13 +522,11 @@ mono_local_deadce (MonoCompile *cfg) g_assert (ins->opcode > MONO_CEE_LAST); - if (MONO_IS_NON_FP_MOVE (ins) && ins->prev) { + if (MONO_IS_NON_FP_MOVE (ins) && prev_f) { MonoInst *def; const char *spec2; - def = ins->prev; - while (def->prev && (def->opcode == OP_NOP)) - def = def->prev; + def = prev_f; spec2 = INS_INFO (def->opcode); /* @@ -557,8 +557,8 @@ mono_local_deadce (MonoCompile *cfg) (!get_vreg_to_inst (cfg, ins->dreg) || (!bb->extended && !vreg_is_volatile (cfg, ins->dreg) && mono_bitset_test_fast (defined, ins->dreg))) && MONO_INS_HAS_NO_SIDE_EFFECT (ins)) { /* Happens with CMOV instructions */ - if (ins->prev && ins->prev->opcode == OP_ICOMPARE_IMM) { - MonoInst *prev = ins->prev; + if (prev_f && prev_f->opcode == OP_ICOMPARE_IMM) { + MonoInst *prev = prev_f; /* * Can't use DELETE_INS since that would interfere with the * FOR_EACH_INS loop. diff --git a/mta-mono/vendor/mono/mini/method-to-ir.c b/mta-mono/vendor/mono/mini/method-to-ir.c index 47f1268..a7f2ce4 100644 --- a/mta-mono/vendor/mono/mini/method-to-ir.c +++ b/mta-mono/vendor/mono/mini/method-to-ir.c @@ -68,6 +68,7 @@ #include "jit-icalls.h" #include "jit.h" #include "debugger-agent.h" +#include "seq-points.h" #define BRANCH_COST 10 #define INLINE_LENGTH_LIMIT 20 @@ -123,6 +124,13 @@ LOAD_ERROR; \ } while (0) +#define CHECK_CFG_ERROR do {\ + if (!mono_error_ok (&cfg->error)) { \ + mono_cfg_set_exception (cfg, MONO_EXCEPTION_MONO_ERROR); \ + goto mono_error_exit; \ + } \ + } while (0) + /* Determine whenever 'ins' represents a load of the 'this' argument */ #define MONO_CHECK_THIS(ins) (mono_method_signature (cfg->method)->hasthis && ((ins)->opcode == OP_MOVE) && ((ins)->sreg1 == cfg->args [0]->dreg)) @@ -134,6 +142,9 @@ int mono_op_to_op_imm_noemul (int opcode); MONO_API MonoInst* mono_emit_native_call (MonoCompile *cfg, gconstpointer func, MonoMethodSignature *sig, MonoInst **args); +static int inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **sp, + guchar *ip, guint real_offset, gboolean inline_always, MonoBasicBlock **out_cbb); + /* helper methods signatures */ static MonoMethodSignature *helper_sig_class_init_trampoline; static MonoMethodSignature *helper_sig_domain_get; @@ -142,6 +153,7 @@ static MonoMethodSignature *helper_sig_generic_class_init_trampoline_llvm; static MonoMethodSignature *helper_sig_rgctx_lazy_fetch_trampoline; static MonoMethodSignature *helper_sig_monitor_enter_exit_trampoline; static MonoMethodSignature *helper_sig_monitor_enter_exit_trampoline_llvm; +static MonoMethodSignature *helper_sig_monitor_enter_v4_trampoline_llvm; /* * Instruction metadata @@ -297,7 +309,7 @@ handle_enum: return OP_LMOVE; #endif case MONO_TYPE_R4: - return OP_FMOVE; + return cfg->r4fp ? OP_RMOVE : OP_FMOVE; case MONO_TYPE_R8: return OP_FMOVE; case MONO_TYPE_VALUETYPE: @@ -353,6 +365,7 @@ mono_create_helper_signatures (void) helper_sig_rgctx_lazy_fetch_trampoline = mono_create_icall_signature ("ptr ptr"); helper_sig_monitor_enter_exit_trampoline = mono_create_icall_signature ("void"); helper_sig_monitor_enter_exit_trampoline_llvm = mono_create_icall_signature ("void object"); + helper_sig_monitor_enter_v4_trampoline_llvm = mono_create_icall_signature ("void object ptr"); } static MONO_NEVER_INLINE void @@ -446,43 +459,72 @@ gsharedvt_failure (MonoCompile *cfg, int opcode, const char *file, int line) } while (0) #endif +/* Emit conversions so both operands of a binary opcode are of the same type */ +static void +add_widen_op (MonoCompile *cfg, MonoInst *ins, MonoInst **arg1_ref, MonoInst **arg2_ref) +{ + MonoInst *arg1 = *arg1_ref; + MonoInst *arg2 = *arg2_ref; + + if (cfg->r4fp && + ((arg1->type == STACK_R4 && arg2->type == STACK_R8) || + (arg1->type == STACK_R8 && arg2->type == STACK_R4))) { + MonoInst *conv; + + /* Mixing r4/r8 is allowed by the spec */ + if (arg1->type == STACK_R4) { + int dreg = alloc_freg (cfg); + + EMIT_NEW_UNALU (cfg, conv, OP_RCONV_TO_R8, dreg, arg1->dreg); + conv->type = STACK_R8; + ins->sreg1 = dreg; + *arg1_ref = conv; + } + if (arg2->type == STACK_R4) { + int dreg = alloc_freg (cfg); + + EMIT_NEW_UNALU (cfg, conv, OP_RCONV_TO_R8, dreg, arg2->dreg); + conv->type = STACK_R8; + ins->sreg2 = dreg; + *arg2_ref = conv; + } + } + #if SIZEOF_REGISTER == 8 -#define ADD_WIDEN_OP(ins, arg1, arg2) do { \ - /* FIXME: Need to add many more cases */ \ - if ((arg1)->type == STACK_PTR && (arg2)->type == STACK_I4) { \ - MonoInst *widen; \ - int dr = alloc_preg (cfg); \ - EMIT_NEW_UNALU (cfg, widen, OP_SEXT_I4, dr, (arg2)->dreg); \ - (ins)->sreg2 = widen->dreg; \ - } \ - } while (0) -#else -#define ADD_WIDEN_OP(ins, arg1, arg2) + /* FIXME: Need to add many more cases */ + if ((arg1)->type == STACK_PTR && (arg2)->type == STACK_I4) { + MonoInst *widen; + + int dr = alloc_preg (cfg); + EMIT_NEW_UNALU (cfg, widen, OP_SEXT_I4, dr, (arg2)->dreg); + (ins)->sreg2 = widen->dreg; + } #endif +} #define ADD_BINOP(op) do { \ MONO_INST_NEW (cfg, ins, (op)); \ sp -= 2; \ ins->sreg1 = sp [0]->dreg; \ ins->sreg2 = sp [1]->dreg; \ - type_from_op (ins, sp [0], sp [1]); \ + type_from_op (cfg, ins, sp [0], sp [1]); \ CHECK_TYPE (ins); \ /* Have to insert a widening op */ \ - ADD_WIDEN_OP (ins, sp [0], sp [1]); \ + add_widen_op (cfg, ins, &sp [0], &sp [1]); \ ins->dreg = alloc_dreg ((cfg), (ins)->type); \ MONO_ADD_INS ((cfg)->cbb, (ins)); \ - *sp++ = mono_decompose_opcode ((cfg), (ins)); \ + *sp++ = mono_decompose_opcode ((cfg), (ins), &bblock); \ } while (0) #define ADD_UNOP(op) do { \ MONO_INST_NEW (cfg, ins, (op)); \ sp--; \ ins->sreg1 = sp [0]->dreg; \ - type_from_op (ins, sp [0], NULL); \ + type_from_op (cfg, ins, sp [0], NULL); \ CHECK_TYPE (ins); \ (ins)->dreg = alloc_dreg ((cfg), (ins)->type); \ MONO_ADD_INS ((cfg)->cbb, (ins)); \ - *sp++ = mono_decompose_opcode (cfg, ins); \ + *sp++ = mono_decompose_opcode (cfg, ins, &bblock); \ } while (0) #define ADD_BINCOND(next_block) do { \ @@ -491,9 +533,10 @@ gsharedvt_failure (MonoCompile *cfg, int opcode, const char *file, int line) MONO_INST_NEW(cfg, cmp, OP_COMPARE); \ cmp->sreg1 = sp [0]->dreg; \ cmp->sreg2 = sp [1]->dreg; \ - type_from_op (cmp, sp [0], sp [1]); \ + type_from_op (cfg, cmp, sp [0], sp [1]); \ CHECK_TYPE (cmp); \ - type_from_op (ins, sp [0], sp [1]); \ + add_widen_op (cfg, cmp, &sp [0], &sp [1]); \ + type_from_op (cfg, ins, sp [0], sp [1]); \ ins->inst_many_bb = mono_mempool_alloc (cfg->mempool, sizeof(gpointer)*2); \ GET_BBLOCK (cfg, tblock, target); \ link_bblock (cfg, bblock, tblock); \ @@ -735,6 +778,8 @@ handle_enum: inst->type = STACK_I8; return; case MONO_TYPE_R4: + inst->type = cfg->r4_stack_type; + break; case MONO_TYPE_R8: inst->type = STACK_R8; return; @@ -778,15 +823,16 @@ bin_num_table [STACK_MAX] [STACK_MAX] = { {STACK_INV, STACK_I4, STACK_INV, STACK_PTR, STACK_INV, STACK_MP, STACK_INV, STACK_INV}, {STACK_INV, STACK_INV, STACK_I8, STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV}, {STACK_INV, STACK_PTR, STACK_INV, STACK_PTR, STACK_INV, STACK_MP, STACK_INV, STACK_INV}, - {STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_R8, STACK_INV, STACK_INV, STACK_INV}, + {STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_R8, STACK_INV, STACK_INV, STACK_INV, STACK_R8}, {STACK_INV, STACK_MP, STACK_INV, STACK_MP, STACK_INV, STACK_PTR, STACK_INV, STACK_INV}, {STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV}, - {STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV} + {STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_INV}, + {STACK_INV, STACK_INV, STACK_INV, STACK_INV, STACK_R8, STACK_INV, STACK_INV, STACK_INV, STACK_R4} }; static const char neg_table [] = { - STACK_INV, STACK_I4, STACK_I8, STACK_PTR, STACK_R8, STACK_INV, STACK_INV, STACK_INV + STACK_INV, STACK_I4, STACK_I8, STACK_PTR, STACK_R8, STACK_INV, STACK_INV, STACK_INV, STACK_R4 }; /* reduce the size of this table */ @@ -804,15 +850,16 @@ bin_int_table [STACK_MAX] [STACK_MAX] = { static const char bin_comp_table [STACK_MAX] [STACK_MAX] = { -/* Inv i L p F & O vt */ +/* Inv i L p F & O vt r4 */ {0}, {0, 1, 0, 1, 0, 0, 0, 0}, /* i, int32 */ {0, 0, 1, 0, 0, 0, 0, 0}, /* L, int64 */ {0, 1, 0, 1, 0, 2, 4, 0}, /* p, ptr */ - {0, 0, 0, 0, 1, 0, 0, 0}, /* F, R8 */ + {0, 0, 0, 0, 1, 0, 0, 0, 1}, /* F, R8 */ {0, 0, 0, 2, 0, 1, 0, 0}, /* &, managed pointer */ {0, 0, 0, 4, 0, 0, 3, 0}, /* O, reference */ {0, 0, 0, 0, 0, 0, 0, 0}, /* vt value type */ + {0, 0, 0, 0, 1, 0, 0, 0, 1}, /* r, r4 */ }; /* reduce the size of this table */ @@ -835,43 +882,43 @@ shift_table [STACK_MAX] [STACK_MAX] = { /* handles from CEE_ADD to CEE_SHR_UN (CEE_REM_UN for floats) */ static const guint16 binops_op_map [STACK_MAX] = { - 0, OP_IADD-CEE_ADD, OP_LADD-CEE_ADD, OP_PADD-CEE_ADD, OP_FADD-CEE_ADD, OP_PADD-CEE_ADD + 0, OP_IADD-CEE_ADD, OP_LADD-CEE_ADD, OP_PADD-CEE_ADD, OP_FADD-CEE_ADD, OP_PADD-CEE_ADD, 0, 0, OP_RADD-CEE_ADD }; /* handles from CEE_NEG to CEE_CONV_U8 */ static const guint16 unops_op_map [STACK_MAX] = { - 0, OP_INEG-CEE_NEG, OP_LNEG-CEE_NEG, OP_PNEG-CEE_NEG, OP_FNEG-CEE_NEG, OP_PNEG-CEE_NEG + 0, OP_INEG-CEE_NEG, OP_LNEG-CEE_NEG, OP_PNEG-CEE_NEG, OP_FNEG-CEE_NEG, OP_PNEG-CEE_NEG, 0, 0, OP_RNEG-CEE_NEG }; /* handles from CEE_CONV_U2 to CEE_SUB_OVF_UN */ static const guint16 ovfops_op_map [STACK_MAX] = { - 0, OP_ICONV_TO_U2-CEE_CONV_U2, OP_LCONV_TO_U2-CEE_CONV_U2, OP_PCONV_TO_U2-CEE_CONV_U2, OP_FCONV_TO_U2-CEE_CONV_U2, OP_PCONV_TO_U2-CEE_CONV_U2, OP_PCONV_TO_U2-CEE_CONV_U2 + 0, OP_ICONV_TO_U2-CEE_CONV_U2, OP_LCONV_TO_U2-CEE_CONV_U2, OP_PCONV_TO_U2-CEE_CONV_U2, OP_FCONV_TO_U2-CEE_CONV_U2, OP_PCONV_TO_U2-CEE_CONV_U2, OP_PCONV_TO_U2-CEE_CONV_U2, 0, OP_RCONV_TO_U2-CEE_CONV_U2 }; /* handles from CEE_CONV_OVF_I1_UN to CEE_CONV_OVF_U_UN */ static const guint16 ovf2ops_op_map [STACK_MAX] = { - 0, OP_ICONV_TO_OVF_I1_UN-CEE_CONV_OVF_I1_UN, OP_LCONV_TO_OVF_I1_UN-CEE_CONV_OVF_I1_UN, OP_PCONV_TO_OVF_I1_UN-CEE_CONV_OVF_I1_UN, OP_FCONV_TO_OVF_I1_UN-CEE_CONV_OVF_I1_UN, OP_PCONV_TO_OVF_I1_UN-CEE_CONV_OVF_I1_UN + 0, OP_ICONV_TO_OVF_I1_UN-CEE_CONV_OVF_I1_UN, OP_LCONV_TO_OVF_I1_UN-CEE_CONV_OVF_I1_UN, OP_PCONV_TO_OVF_I1_UN-CEE_CONV_OVF_I1_UN, OP_FCONV_TO_OVF_I1_UN-CEE_CONV_OVF_I1_UN, OP_PCONV_TO_OVF_I1_UN-CEE_CONV_OVF_I1_UN, 0, 0, OP_RCONV_TO_OVF_I1_UN-CEE_CONV_OVF_I1_UN }; /* handles from CEE_CONV_OVF_I1 to CEE_CONV_OVF_U8 */ static const guint16 ovf3ops_op_map [STACK_MAX] = { - 0, OP_ICONV_TO_OVF_I1-CEE_CONV_OVF_I1, OP_LCONV_TO_OVF_I1-CEE_CONV_OVF_I1, OP_PCONV_TO_OVF_I1-CEE_CONV_OVF_I1, OP_FCONV_TO_OVF_I1-CEE_CONV_OVF_I1, OP_PCONV_TO_OVF_I1-CEE_CONV_OVF_I1 + 0, OP_ICONV_TO_OVF_I1-CEE_CONV_OVF_I1, OP_LCONV_TO_OVF_I1-CEE_CONV_OVF_I1, OP_PCONV_TO_OVF_I1-CEE_CONV_OVF_I1, OP_FCONV_TO_OVF_I1-CEE_CONV_OVF_I1, OP_PCONV_TO_OVF_I1-CEE_CONV_OVF_I1, 0, 0, OP_RCONV_TO_OVF_I1-CEE_CONV_OVF_I1 }; /* handles from CEE_BEQ to CEE_BLT_UN */ static const guint16 beqops_op_map [STACK_MAX] = { - 0, OP_IBEQ-CEE_BEQ, OP_LBEQ-CEE_BEQ, OP_PBEQ-CEE_BEQ, OP_FBEQ-CEE_BEQ, OP_PBEQ-CEE_BEQ, OP_PBEQ-CEE_BEQ + 0, OP_IBEQ-CEE_BEQ, OP_LBEQ-CEE_BEQ, OP_PBEQ-CEE_BEQ, OP_FBEQ-CEE_BEQ, OP_PBEQ-CEE_BEQ, OP_PBEQ-CEE_BEQ, 0, OP_FBEQ-CEE_BEQ }; /* handles from CEE_CEQ to CEE_CLT_UN */ static const guint16 ceqops_op_map [STACK_MAX] = { - 0, OP_ICEQ-OP_CEQ, OP_LCEQ-OP_CEQ, OP_PCEQ-OP_CEQ, OP_FCEQ-OP_CEQ, OP_PCEQ-OP_CEQ, OP_PCEQ-OP_CEQ + 0, OP_ICEQ-OP_CEQ, OP_LCEQ-OP_CEQ, OP_PCEQ-OP_CEQ, OP_FCEQ-OP_CEQ, OP_PCEQ-OP_CEQ, OP_PCEQ-OP_CEQ, 0, OP_RCEQ-OP_CEQ }; /* @@ -883,8 +930,8 @@ ceqops_op_map [STACK_MAX] = { * it should set it to invalid for some types (a conv.x on an object) */ static void -type_from_op (MonoInst *ins, MonoInst *src1, MonoInst *src2) { - +type_from_op (MonoCompile *cfg, MonoInst *ins, MonoInst *src1, MonoInst *src2) +{ switch (ins->opcode) { /* binops */ case CEE_ADD: @@ -916,6 +963,8 @@ type_from_op (MonoInst *ins, MonoInst *src1, MonoInst *src2) { ins->type = bin_comp_table [src1->type] [src2->type] ? STACK_I4: STACK_INV; if ((src1->type == STACK_I8) || ((SIZEOF_VOID_P == 8) && ((src1->type == STACK_PTR) || (src1->type == STACK_OBJ) || (src1->type == STACK_MP)))) ins->opcode = OP_LCOMPARE; + else if (src1->type == STACK_R4) + ins->opcode = OP_RCOMPARE; else if (src1->type == STACK_R8) ins->opcode = OP_FCOMPARE; else @@ -1041,6 +1090,9 @@ type_from_op (MonoInst *ins, MonoInst *src1, MonoInst *src2) { ins->opcode += ovf2ops_op_map [src1->type]; break; case CEE_CONV_R4: + ins->type = cfg->r4_stack_type; + ins->opcode += unops_op_map [src1->type]; + break; case CEE_CONV_R8: ins->type = STACK_R8; ins->opcode += unops_op_map [src1->type]; @@ -1085,6 +1137,8 @@ type_from_op (MonoInst *ins, MonoInst *src1, MonoInst *src2) { ins->type = STACK_I8; break; case OP_LOADR4_MEMBASE: + ins->type = cfg->r4_stack_type; + break; case OP_LOADR8_MEMBASE: ins->type = STACK_R8; break; @@ -1217,6 +1271,7 @@ type_from_stack_type (MonoInst *ins) { case STACK_I4: return &mono_defaults.int32_class->byval_arg; case STACK_I8: return &mono_defaults.int64_class->byval_arg; case STACK_PTR: return &mono_defaults.int_class->byval_arg; + case STACK_R4: return &mono_defaults.single_class->byval_arg; case STACK_R8: return &mono_defaults.double_class->byval_arg; case STACK_MP: return &ins->klass->this_arg; @@ -1229,7 +1284,7 @@ type_from_stack_type (MonoInst *ins) { } static G_GNUC_UNUSED int -type_to_stack_type (MonoType *t) +type_to_stack_type (MonoCompile *cfg, MonoType *t) { t = mono_type_get_underlying_type (t); switch (t->type) { @@ -1257,6 +1312,7 @@ type_to_stack_type (MonoType *t) case MONO_TYPE_U8: return STACK_I8; case MONO_TYPE_R4: + return cfg->r4_stack_type; case MONO_TYPE_R8: return STACK_R8; case MONO_TYPE_VALUETYPE: @@ -2082,7 +2138,7 @@ emit_instrumentation_call (MonoCompile *cfg, void *func) } static int -ret_type_to_call_opcode (MonoType *type, int calli, int virt, MonoGenericSharingContext *gsctx) +ret_type_to_call_opcode (MonoCompile *cfg, MonoType *type, int calli, int virt, MonoGenericSharingContext *gsctx) { if (type->byref) return calli? OP_CALL_REG: virt? OP_CALL_MEMBASE: OP_CALL; @@ -2117,6 +2173,10 @@ handle_enum: case MONO_TYPE_U8: return calli? OP_LCALL_REG: virt? OP_LCALL_MEMBASE: OP_LCALL; case MONO_TYPE_R4: + if (cfg->r4fp) + return calli? OP_RCALL_REG: virt? OP_RCALL_MEMBASE: OP_RCALL; + else + return calli? OP_FCALL_REG: virt? OP_FCALL_MEMBASE: OP_FCALL; case MONO_TYPE_R8: return calli? OP_FCALL_REG: virt? OP_FCALL_MEMBASE: OP_FCALL; case MONO_TYPE_VALUETYPE: @@ -2212,6 +2272,9 @@ target_type_is_incompatible (MonoCompile *cfg, MonoType *target, MonoInst *arg) return 1; return 0; case MONO_TYPE_R4: + if (arg->type != cfg->r4_stack_type) + return 1; + return 0; case MONO_TYPE_R8: if (arg->type != STACK_R8) return 1; @@ -2326,6 +2389,9 @@ handle_enum: return 1; continue; case MONO_TYPE_R4: + if (args [i]->type != cfg->r4_stack_type) + return 1; + continue; case MONO_TYPE_R8: if (args [i]->type != STACK_R8) return 1; @@ -2369,6 +2435,8 @@ callvirt_to_call (int opcode) return OP_VOIDCALL; case OP_FCALL_MEMBASE: return OP_FCALL; + case OP_RCALL_MEMBASE: + return OP_RCALL; case OP_VCALL_MEMBASE: return OP_VCALL; case OP_LCALL_MEMBASE: @@ -2539,7 +2607,7 @@ mono_emit_call_args (MonoCompile *cfg, MonoMethodSignature *sig, MONO_INST_NEW_CALL (cfg, call, OP_TAILCALL); } else - MONO_INST_NEW_CALL (cfg, call, ret_type_to_call_opcode (sig->ret, calli, virtual, cfg->generic_sharing_context)); + MONO_INST_NEW_CALL (cfg, call, ret_type_to_call_opcode (cfg, sig->ret, calli, virtual, cfg->generic_sharing_context)); call->args = args; call->signature = sig; @@ -2936,6 +3004,57 @@ mono_emit_abs_call (MonoCompile *cfg, MonoJumpInfoType patch_type, gconstpointer ((MonoCallInst*)ins)->fptr_is_patch = TRUE; return ins; } + +static gboolean +direct_icalls_enabled (MonoCompile *cfg) +{ + /* LLVM on amd64 can't handle calls to non-32 bit addresses */ +#ifdef TARGET_AMD64 + if (cfg->compile_llvm) + return FALSE; +#endif + if (cfg->gen_seq_points_debug_data || cfg->disable_direct_icalls) + return FALSE; + return TRUE; +} + +MonoInst* +mono_emit_jit_icall_by_info (MonoCompile *cfg, MonoJitICallInfo *info, MonoInst **args, MonoBasicBlock **out_cbb) +{ + /* + * Call the jit icall without a wrapper if possible. + * The wrapper is needed for the following reasons: + * - to handle exceptions thrown using mono_raise_exceptions () from the + * icall function. The EH code needs the lmf frame pushed by the + * wrapper to be able to unwind back to managed code. + * - to be able to do stack walks for asynchronously suspended + * threads when debugging. + */ + if (info->no_raise && direct_icalls_enabled (cfg)) { + char *name; + int costs; + + if (!info->wrapper_method) { + name = g_strdup_printf ("__icall_wrapper_%s", info->name); + info->wrapper_method = mono_marshal_get_icall_wrapper (info->sig, name, info->func, TRUE); + g_free (name); + mono_memory_barrier (); + } + + /* + * Inline the wrapper method, which is basically a call to the C icall, and + * an exception check. + */ + costs = inline_method (cfg, info->wrapper_method, NULL, + args, NULL, cfg->real_offset, TRUE, out_cbb); + g_assert (costs > 0); + g_assert (!MONO_TYPE_IS_VOID (info->sig->ret)); + + return args [0]; + } else { + return mono_emit_native_call (cfg, mono_icall_get_wrapper (info), info->sig, args); + } +} static MonoInst* mono_emit_widen_call_res (MonoCompile *cfg, MonoInst *ins, MonoMethodSignature *fsig) @@ -3230,7 +3349,7 @@ mini_emit_stobj (MonoCompile *cfg, MonoInst *dest, MonoInst *src, MonoClass *kla } } - if (!size_ins && (cfg->opt & MONO_OPT_INTRINS) && n <= sizeof (gpointer) * 5) { + if (!size_ins && (cfg->opt & MONO_OPT_INTRINS) && n <= sizeof (gpointer) * 8) { /* FIXME: Optimize the case when src/dest is OP_LDADDR */ mini_emit_memcpy (cfg, dest->dreg, 0, src->dreg, 0, n, align); } else { @@ -3290,7 +3409,7 @@ mini_emit_initobj (MonoCompile *cfg, MonoInst *dest, const guchar *ip, MonoClass n = mono_class_value_size (klass, &align); - if (n <= sizeof (gpointer) * 5) { + if (n <= sizeof (gpointer) * 8) { mini_emit_memset (cfg, dest->dreg, 0, n, 0, align); } else { @@ -3874,8 +3993,9 @@ handle_alloc (MonoCompile *cfg, MonoClass *klass, gboolean for_box, int context_ MonoInst *data; int rgctx_info; MonoInst *iargs [2]; + gboolean known_instance_size = !mini_is_gsharedvt_klass (cfg, klass); - MonoMethod *managed_alloc = mono_gc_get_managed_allocator (klass, for_box); + MonoMethod *managed_alloc = mono_gc_get_managed_allocator (klass, for_box, known_instance_size); if (cfg->opt & MONO_OPT_SHARED) rgctx_info = MONO_RGCTX_INFO_KLASS; @@ -3892,8 +4012,11 @@ handle_alloc (MonoCompile *cfg, MonoClass *klass, gboolean for_box, int context_ alloc_ftn = mono_object_new_specific; } - if (managed_alloc && !(cfg->opt & MONO_OPT_SHARED)) + if (managed_alloc && !(cfg->opt & MONO_OPT_SHARED)) { + if (known_instance_size) + EMIT_NEW_ICONST (cfg, iargs [1], mono_gc_get_aligned_size_for_allocator (klass->instance_size)); return mono_emit_method_call (cfg, managed_alloc, iargs, NULL); + } return mono_emit_jit_icall (cfg, alloc_ftn, iargs); } @@ -3920,11 +4043,12 @@ handle_alloc (MonoCompile *cfg, MonoClass *klass, gboolean for_box, int context_ } #ifndef MONO_CROSS_COMPILE - managed_alloc = mono_gc_get_managed_allocator (klass, for_box); + managed_alloc = mono_gc_get_managed_allocator (klass, for_box, TRUE); #endif if (managed_alloc) { EMIT_NEW_VTABLECONST (cfg, iargs [0], vtable); + EMIT_NEW_ICONST (cfg, iargs [1], mono_gc_get_aligned_size_for_allocator (klass->instance_size)); return mono_emit_method_call (cfg, managed_alloc, iargs, NULL); } alloc_ftn = mono_class_get_allocation_ftn (vtable, for_box, &pass_lw); @@ -4062,7 +4186,6 @@ handle_box (MonoCompile *cfg, MonoInst *val, MonoClass *klass, int context_used, } } - static gboolean mini_class_has_reference_variant_generic_argument (MonoCompile *cfg, MonoClass *klass, int context_used) { @@ -4091,8 +4214,38 @@ mini_class_has_reference_variant_generic_argument (MonoCompile *cfg, MonoClass * return FALSE; } -// FIXME: This doesn't work yet (class libs tests fail?) -#define is_complex_isinst(klass) (TRUE || (klass->flags & TYPE_ATTRIBUTE_INTERFACE) || klass->rank || mono_class_is_nullable (klass) || mono_class_is_marshalbyref (klass) || (klass->flags & TYPE_ATTRIBUTE_SEALED) || klass->byval_arg.type == MONO_TYPE_VAR || klass->byval_arg.type == MONO_TYPE_MVAR) +static GHashTable* direct_icall_type_hash; + +static gboolean +icall_is_direct_callable (MonoCompile *cfg, MonoMethod *cmethod) +{ + /* LLVM on amd64 can't handle calls to non-32 bit addresses */ + if (!direct_icalls_enabled (cfg)) + return FALSE; + + /* + * An icall is directly callable if it doesn't directly or indirectly call mono_raise_exception (). + * Whitelist a few icalls for now. + */ + if (!direct_icall_type_hash) { + GHashTable *h = g_hash_table_new (g_str_hash, g_str_equal); + + g_hash_table_insert (h, (char*)"Decimal", GUINT_TO_POINTER (1)); + g_hash_table_insert (h, (char*)"Number", GUINT_TO_POINTER (1)); + g_hash_table_insert (h, (char*)"Buffer", GUINT_TO_POINTER (1)); + mono_memory_barrier (); + direct_icall_type_hash = h; + } + + if (cmethod->klass == mono_defaults.math_class) + return TRUE; + /* No locking needed */ + if (cmethod->klass->image == mono_defaults.corlib && g_hash_table_lookup (direct_icall_type_hash, cmethod->klass->name)) + return TRUE; + return FALSE; +} + +#define is_complex_isinst(klass) ((klass->flags & TYPE_ATTRIBUTE_INTERFACE) || klass->rank || mono_class_is_nullable (klass) || mono_class_is_marshalbyref (klass) || (klass->flags & TYPE_ATTRIBUTE_SEALED) || klass->byval_arg.type == MONO_TYPE_VAR || klass->byval_arg.type == MONO_TYPE_MVAR) static MonoInst* emit_castclass_with_cache (MonoCompile *cfg, MonoClass *klass, MonoInst **args, MonoBasicBlock **out_bblock) @@ -4110,6 +4263,14 @@ emit_castclass_with_cache (MonoCompile *cfg, MonoClass *klass, MonoInst **args, return res; } +static int +get_castclass_cache_idx (MonoCompile *cfg) +{ + /* Each CASTCLASS_CACHE patch needs a unique index which identifies the call site */ + cfg->castclass_cache_index ++; + return (cfg->method_index << 16) | cfg->castclass_cache_index; +} + static MonoInst* emit_castclass_with_cache_nonshared (MonoCompile *cfg, MonoInst *obj, MonoClass *klass, MonoBasicBlock **out_bblock) { @@ -4124,9 +4285,7 @@ emit_castclass_with_cache_nonshared (MonoCompile *cfg, MonoInst *obj, MonoClass /* inline cache*/ if (cfg->compile_aot) { - /* Each CASTCLASS_CACHE patch needs a unique index which identifies the call site */ - cfg->castclass_cache_index ++; - idx = (cfg->method_index << 16) | cfg->castclass_cache_index; + idx = get_castclass_cache_idx (cfg); EMIT_NEW_AOTCONST (cfg, args [2], MONO_PATCH_INFO_CASTCLASS_CACHE, GINT_TO_POINTER (idx)); } else { EMIT_NEW_PCONST (cfg, args [2], mono_domain_alloc0 (cfg->domain, sizeof (gpointer))); @@ -4141,15 +4300,47 @@ emit_castclass_with_cache_nonshared (MonoCompile *cfg, MonoInst *obj, MonoClass * Returns NULL and set the cfg exception on error. */ static MonoInst* -handle_castclass (MonoCompile *cfg, MonoClass *klass, MonoInst *src, int context_used, MonoBasicBlock **out_bb) +handle_castclass (MonoCompile *cfg, MonoClass *klass, MonoInst *src, guint8 *ip, MonoBasicBlock **out_bb, int *inline_costs) { MonoBasicBlock *is_null_bb; int obj_reg = src->dreg; int vtable_reg = alloc_preg (cfg); - MonoInst *klass_inst = NULL; + int context_used; + MonoInst *klass_inst = NULL, *res; + MonoBasicBlock *bblock; *out_bb = cfg->cbb; + context_used = mini_class_check_context_used (cfg, klass); + + if (!context_used && mini_class_has_reference_variant_generic_argument (cfg, klass, context_used)) { + res = emit_castclass_with_cache_nonshared (cfg, src, klass, &bblock); + (*inline_costs) += 2; + *out_bb = cfg->cbb; + return res; + } else if (!context_used && (mono_class_is_marshalbyref (klass) || klass->flags & TYPE_ATTRIBUTE_INTERFACE)) { + MonoMethod *mono_castclass; + MonoInst *iargs [1]; + int costs; + + mono_castclass = mono_marshal_get_castclass (klass); + iargs [0] = src; + + save_cast_details (cfg, klass, src->dreg, TRUE, &bblock); + costs = inline_method (cfg, mono_castclass, mono_method_signature (mono_castclass), + iargs, ip, cfg->real_offset, TRUE, &bblock); + reset_cast_details (cfg); + CHECK_CFG_EXCEPTION; + g_assert (costs > 0); + + cfg->real_offset += 5; + + (*inline_costs) += costs; + + *out_bb = cfg->cbb; + return src; + } + if (context_used) { MonoInst *args [3]; @@ -4216,6 +4407,9 @@ handle_castclass (MonoCompile *cfg, MonoClass *klass, MonoInst *src, int context *out_bb = cfg->cbb; return src; + +exception_exit: + return NULL; } /* @@ -4565,6 +4759,48 @@ handle_ccastclass (MonoCompile *cfg, MonoClass *klass, MonoInst *src) return ins; } +static G_GNUC_UNUSED MonoInst* +handle_enum_has_flag (MonoCompile *cfg, MonoClass *klass, MonoInst *enum_this, MonoInst *enum_flag) +{ + MonoType *enum_type = mono_type_get_underlying_type (&klass->byval_arg); + guint32 load_opc = mono_type_to_load_membase (cfg, enum_type); + gboolean is_i4 = TRUE; + + switch (enum_type->type) { + case MONO_TYPE_I8: + case MONO_TYPE_U8: +#if SIZEOF_REGISTER == 8 + case MONO_TYPE_I: + case MONO_TYPE_U: +#endif + is_i4 = FALSE; + break; + } + + { + MonoInst *load, *and, *cmp, *ceq; + int enum_reg = is_i4 ? alloc_ireg (cfg) : alloc_lreg (cfg); + int and_reg = is_i4 ? alloc_ireg (cfg) : alloc_lreg (cfg); + int dest_reg = alloc_ireg (cfg); + + EMIT_NEW_LOAD_MEMBASE (cfg, load, load_opc, enum_reg, enum_this->dreg, 0); + EMIT_NEW_BIALU (cfg, and, is_i4 ? OP_IAND : OP_LAND, and_reg, enum_reg, enum_flag->dreg); + EMIT_NEW_BIALU (cfg, cmp, is_i4 ? OP_ICOMPARE : OP_LCOMPARE, -1, and_reg, enum_flag->dreg); + EMIT_NEW_UNALU (cfg, ceq, is_i4 ? OP_ICEQ : OP_LCEQ, dest_reg, -1); + + ceq->type = STACK_I4; + + if (!is_i4) { + load = mono_decompose_opcode (cfg, load, NULL); + and = mono_decompose_opcode (cfg, and, NULL); + cmp = mono_decompose_opcode (cfg, cmp, NULL); + ceq = mono_decompose_opcode (cfg, ceq, NULL); + } + + return ceq; + } +} + /* * Returns NULL and set the cfg exception on error. */ @@ -4692,6 +4928,99 @@ handle_array_new (MonoCompile *cfg, int rank, MonoInst **sp, unsigned char *ip) return mono_emit_native_call (cfg, mono_icall_get_wrapper (info), info->sig, sp); } +/* + * handle_constrained_gsharedvt_call: + * + * Handle constrained calls where the receiver is a gsharedvt type. + * Return the instruction representing the call. Set the cfg exception on failure. + */ +static MonoInst* +handle_constrained_gsharedvt_call (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **sp, MonoClass *constrained_call, + gboolean *ref_emit_widen, MonoBasicBlock **ref_bblock) +{ + MonoInst *ins = NULL; + MonoBasicBlock *bblock = *ref_bblock; + gboolean emit_widen = *ref_emit_widen; + + /* + * Constrained calls need to behave differently at runtime dependending on whenever the receiver is instantiated as ref type or as a vtype. + * This is hard to do with the current call code, since we would have to emit a branch and two different calls. So instead, we + * pack the arguments into an array, and do the rest of the work in in an icall. + */ + if (((cmethod->klass == mono_defaults.object_class) || (cmethod->klass->flags & TYPE_ATTRIBUTE_INTERFACE) || (!cmethod->klass->valuetype && cmethod->klass->image != mono_defaults.corlib)) && + (MONO_TYPE_IS_VOID (fsig->ret) || MONO_TYPE_IS_PRIMITIVE (fsig->ret) || MONO_TYPE_IS_REFERENCE (fsig->ret) || MONO_TYPE_ISSTRUCT (fsig->ret) || mini_is_gsharedvt_type (cfg, fsig->ret)) && + (fsig->param_count == 0 || (!fsig->hasthis && fsig->param_count == 1) || (fsig->param_count == 1 && (MONO_TYPE_IS_REFERENCE (fsig->params [0]) || fsig->params [0]->byref || mini_is_gsharedvt_type (cfg, fsig->params [0]))))) { + MonoInst *args [16]; + + /* + * This case handles calls to + * - object:ToString()/Equals()/GetHashCode(), + * - System.IComparable:CompareTo() + * - System.IEquatable:Equals () + * plus some simple interface calls enough to support AsyncTaskMethodBuilder. + */ + + args [0] = sp [0]; + if (mono_method_check_context_used (cmethod)) + args [1] = emit_get_rgctx_method (cfg, mono_method_check_context_used (cmethod), cmethod, MONO_RGCTX_INFO_METHOD); + else + EMIT_NEW_METHODCONST (cfg, args [1], cmethod); + args [2] = emit_get_rgctx_klass (cfg, mono_class_check_context_used (constrained_call), constrained_call, MONO_RGCTX_INFO_KLASS); + + /* !fsig->hasthis is for the wrapper for the Object.GetType () icall */ + if (fsig->hasthis && fsig->param_count) { + /* Pass the arguments using a localloc-ed array using the format expected by runtime_invoke () */ + MONO_INST_NEW (cfg, ins, OP_LOCALLOC_IMM); + ins->dreg = alloc_preg (cfg); + ins->inst_imm = fsig->param_count * sizeof (mgreg_t); + MONO_ADD_INS (cfg->cbb, ins); + args [4] = ins; + + if (mini_is_gsharedvt_type (cfg, fsig->params [0])) { + int addr_reg; + + args [3] = emit_get_gsharedvt_info_klass (cfg, mono_class_from_mono_type (fsig->params [0]), MONO_RGCTX_INFO_CLASS_BOX_TYPE); + + EMIT_NEW_VARLOADA_VREG (cfg, ins, sp [1]->dreg, fsig->params [0]); + addr_reg = ins->dreg; + EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, args [4]->dreg, 0, addr_reg); + } else { + EMIT_NEW_ICONST (cfg, args [3], 0); + EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, args [4]->dreg, 0, sp [1]->dreg); + } + } else { + EMIT_NEW_ICONST (cfg, args [3], 0); + EMIT_NEW_ICONST (cfg, args [4], 0); + } + ins = mono_emit_jit_icall (cfg, mono_gsharedvt_constrained_call, args); + emit_widen = FALSE; + + if (mini_is_gsharedvt_type (cfg, fsig->ret)) { + ins = handle_unbox_gsharedvt (cfg, mono_class_from_mono_type (fsig->ret), ins, &bblock); + } else if (MONO_TYPE_IS_PRIMITIVE (fsig->ret) || MONO_TYPE_ISSTRUCT (fsig->ret)) { + MonoInst *add; + + /* Unbox */ + NEW_BIALU_IMM (cfg, add, OP_ADD_IMM, alloc_dreg (cfg, STACK_MP), ins->dreg, sizeof (MonoObject)); + MONO_ADD_INS (cfg->cbb, add); + /* Load value */ + NEW_LOAD_MEMBASE_TYPE (cfg, ins, fsig->ret, add->dreg, 0); + MONO_ADD_INS (cfg->cbb, ins); + /* ins represents the call result */ + } + } else { + GSHAREDVT_FAILURE (CEE_CALLVIRT); + } + + *ref_emit_widen = emit_widen; + *ref_bblock = bblock; + + return ins; + + exception_exit: + return NULL; +} + static void mono_emit_load_got_addr (MonoCompile *cfg) { @@ -5034,20 +5363,24 @@ mini_emit_ldelema_ins (MonoCompile *cfg, MonoMethod *cmethod, MonoInst **sp, uns MonoInst *addr; MonoMethod *addr_method; int element_size; + MonoClass *eclass = cmethod->klass->element_class; rank = mono_method_signature (cmethod)->param_count - (is_set? 1: 0); if (rank == 1) - return mini_emit_ldelema_1_ins (cfg, cmethod->klass->element_class, sp [0], sp [1], TRUE); + return mini_emit_ldelema_1_ins (cfg, eclass, sp [0], sp [1], TRUE); #ifndef MONO_ARCH_EMULATE_MUL_DIV /* emit_ldelema_2 depends on OP_LMUL */ - if (rank == 2 && (cfg->opt & MONO_OPT_INTRINS)) { - return mini_emit_ldelema_2_ins (cfg, cmethod->klass->element_class, sp [0], sp [1], sp [2]); + if (rank == 2 && (cfg->opt & MONO_OPT_INTRINS) && !mini_is_gsharedvt_variable_klass (cfg, eclass)) { + return mini_emit_ldelema_2_ins (cfg, eclass, sp [0], sp [1], sp [2]); } #endif - element_size = mono_class_array_element_size (cmethod->klass->element_class); + if (mini_is_gsharedvt_variable_klass (cfg, eclass)) + element_size = 0; + else + element_size = mono_class_array_element_size (eclass); addr_method = mono_marshal_get_array_address (rank, element_size); addr = mono_emit_method_call (cfg, addr_method, sp, NULL); @@ -5290,7 +5623,7 @@ llvm_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign opcode = OP_ABS; } - if (opcode) { + if (opcode && fsig->param_count == 1) { MONO_INST_NEW (cfg, ins, opcode); ins->type = STACK_R8; ins->dreg = mono_alloc_freg (cfg); @@ -5321,7 +5654,7 @@ llvm_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign } } - if (opcode) { + if (opcode && fsig->param_count == 2) { MONO_INST_NEW (cfg, ins, opcode); ins->type = fsig->params [0]->type == MONO_TYPE_I4 ? STACK_I4 : STACK_I8; ins->dreg = mono_alloc_ireg (cfg); @@ -5360,7 +5693,7 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign "System.Runtime.CompilerServices", "RuntimeHelpers"); if (cmethod->klass == mono_defaults.string_class) { - if (strcmp (cmethod->name, "get_Chars") == 0) { + if (strcmp (cmethod->name, "get_Chars") == 0 && fsig->param_count == 2) { int dreg = alloc_ireg (cfg); int index_reg = alloc_preg (cfg); int mult_reg = alloc_preg (cfg); @@ -5387,9 +5720,9 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOADU2_MEMBASE, dreg, add_reg, MONO_STRUCT_OFFSET (MonoString, chars)); #endif - type_from_op (ins, NULL, NULL); + type_from_op (cfg, ins, NULL, NULL); return ins; - } else if (strcmp (cmethod->name, "get_Length") == 0) { + } else if (strcmp (cmethod->name, "get_Length") == 0 && fsig->param_count == 1) { int dreg = alloc_ireg (cfg); /* Decompose later to allow more optimizations */ EMIT_NEW_UNALU (cfg, ins, OP_STRLEN, dreg, args [0]->dreg); @@ -5399,7 +5732,7 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign cfg->flags |= MONO_CFG_HAS_ARRAY_ACCESS; return ins; - } else if (strcmp (cmethod->name, "InternalSetChar") == 0) { + } else if (strcmp (cmethod->name, "InternalSetChar") == 0 && fsig->param_count == 3) { int mult_reg = alloc_preg (cfg); int add_reg = alloc_preg (cfg); @@ -5412,16 +5745,16 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign return NULL; } else if (cmethod->klass == mono_defaults.object_class) { - if (strcmp (cmethod->name, "GetType") == 0) { + if (strcmp (cmethod->name, "GetType") == 0 && fsig->param_count == 1) { int dreg = alloc_ireg_ref (cfg); int vt_reg = alloc_preg (cfg); MONO_EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, vt_reg, args [0]->dreg, MONO_STRUCT_OFFSET (MonoObject, vtable)); EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, dreg, vt_reg, MONO_STRUCT_OFFSET (MonoVTable, type)); - type_from_op (ins, NULL, NULL); + type_from_op (cfg, ins, NULL, NULL); return ins; #if !defined(MONO_ARCH_EMULATE_MUL_DIV) - } else if (strcmp (cmethod->name, "InternalGetHashCode") == 0 && !mono_gc_is_moving ()) { + } else if (strcmp (cmethod->name, "InternalGetHashCode") == 0 && fsig->param_count == 1 && !mono_gc_is_moving ()) { int dreg = alloc_ireg (cfg); int t1 = alloc_ireg (cfg); @@ -5431,22 +5764,26 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign return ins; #endif - } else if (strcmp (cmethod->name, ".ctor") == 0) { + } else if (strcmp (cmethod->name, ".ctor") == 0 && fsig->param_count == 0) { MONO_INST_NEW (cfg, ins, OP_NOP); MONO_ADD_INS (cfg->cbb, ins); return ins; } else return NULL; } else if (cmethod->klass == mono_defaults.array_class) { - if (!cfg->gsharedvt && strcmp (cmethod->name + 1, "etGenericValueImpl") == 0) - return emit_array_generic_access (cfg, fsig, args, *cmethod->name == 'S'); + if (strcmp (cmethod->name, "GetGenericValueImpl") == 0 && fsig->param_count == 3 && !cfg->gsharedvt) + return emit_array_generic_access (cfg, fsig, args, FALSE); + else if (strcmp (cmethod->name, "SetGenericValueImpl") == 0 && fsig->param_count == 3 && !cfg->gsharedvt) + return emit_array_generic_access (cfg, fsig, args, TRUE); #ifndef MONO_BIG_ARRAYS /* * This is an inline version of GetLength/GetLowerBound(0) used frequently in * Array methods. */ - if ((strcmp (cmethod->name, "GetLength") == 0 || strcmp (cmethod->name, "GetLowerBound") == 0) && args [1]->opcode == OP_ICONST && args [1]->inst_c0 == 0) { + else if (((strcmp (cmethod->name, "GetLength") == 0 && fsig->param_count == 2) || + (strcmp (cmethod->name, "GetLowerBound") == 0 && fsig->param_count == 2)) && + args [1]->opcode == OP_ICONST && args [1]->inst_c0 == 0) { int dreg = alloc_ireg (cfg); int bounds_reg = alloc_ireg_mp (cfg); MonoBasicBlock *end_bb, *szarray_bb; @@ -5486,60 +5823,149 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign if (cmethod->name [0] != 'g') return NULL; - if (strcmp (cmethod->name, "get_Rank") == 0) { + if (strcmp (cmethod->name, "get_Rank") == 0 && fsig->param_count == 1) { int dreg = alloc_ireg (cfg); int vtable_reg = alloc_preg (cfg); MONO_EMIT_NEW_LOAD_MEMBASE_OP_FAULT (cfg, OP_LOAD_MEMBASE, vtable_reg, args [0]->dreg, MONO_STRUCT_OFFSET (MonoObject, vtable)); EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOADU1_MEMBASE, dreg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, rank)); - type_from_op (ins, NULL, NULL); + type_from_op (cfg, ins, NULL, NULL); return ins; - } else if (strcmp (cmethod->name, "get_Length") == 0) { + } else if (strcmp (cmethod->name, "get_Length") == 0 && fsig->param_count == 1) { int dreg = alloc_ireg (cfg); EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, ins, OP_LOADI4_MEMBASE, dreg, args [0]->dreg, MONO_STRUCT_OFFSET (MonoArray, max_length)); - type_from_op (ins, NULL, NULL); + type_from_op (cfg, ins, NULL, NULL); return ins; } else return NULL; } else if (cmethod->klass == runtime_helpers_class) { - if (strcmp (cmethod->name, "get_OffsetToStringData") == 0) { + if (strcmp (cmethod->name, "get_OffsetToStringData") == 0 && fsig->param_count == 0) { EMIT_NEW_ICONST (cfg, ins, MONO_STRUCT_OFFSET (MonoString, chars)); return ins; } else return NULL; } else if (cmethod->klass == mono_defaults.thread_class) { - if (strcmp (cmethod->name, "SpinWait_nop") == 0) { + if (strcmp (cmethod->name, "SpinWait_nop") == 0 && fsig->param_count == 0) { MONO_INST_NEW (cfg, ins, OP_RELAXED_NOP); MONO_ADD_INS (cfg->cbb, ins); return ins; - } else if (strcmp (cmethod->name, "MemoryBarrier") == 0) { - return emit_memory_barrier (cfg, FullBarrier); + } else if (strcmp (cmethod->name, "MemoryBarrier") == 0 && fsig->param_count == 0) { + return emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_SEQ); + } else if (!strcmp (cmethod->name, "VolatileRead") && fsig->param_count == 1) { + guint32 opcode = 0; + gboolean is_ref = mini_type_is_reference (cfg, fsig->params [0]); + + if (fsig->params [0]->type == MONO_TYPE_I1) + opcode = OP_LOADI1_MEMBASE; + else if (fsig->params [0]->type == MONO_TYPE_U1) + opcode = OP_LOADU1_MEMBASE; + else if (fsig->params [0]->type == MONO_TYPE_I2) + opcode = OP_LOADI2_MEMBASE; + else if (fsig->params [0]->type == MONO_TYPE_U2) + opcode = OP_LOADU2_MEMBASE; + else if (fsig->params [0]->type == MONO_TYPE_I4) + opcode = OP_LOADI4_MEMBASE; + else if (fsig->params [0]->type == MONO_TYPE_U4) + opcode = OP_LOADU4_MEMBASE; + else if (fsig->params [0]->type == MONO_TYPE_I8 || fsig->params [0]->type == MONO_TYPE_U8) + opcode = OP_LOADI8_MEMBASE; + else if (fsig->params [0]->type == MONO_TYPE_R4) + opcode = OP_LOADR4_MEMBASE; + else if (fsig->params [0]->type == MONO_TYPE_R8) + opcode = OP_LOADR8_MEMBASE; + else if (is_ref || fsig->params [0]->type == MONO_TYPE_I || fsig->params [0]->type == MONO_TYPE_U) + opcode = OP_LOAD_MEMBASE; + + if (opcode) { + MONO_INST_NEW (cfg, ins, opcode); + ins->inst_basereg = args [0]->dreg; + ins->inst_offset = 0; + MONO_ADD_INS (cfg->cbb, ins); + + switch (fsig->params [0]->type) { + case MONO_TYPE_I1: + case MONO_TYPE_U1: + case MONO_TYPE_I2: + case MONO_TYPE_U2: + case MONO_TYPE_I4: + case MONO_TYPE_U4: + ins->dreg = mono_alloc_ireg (cfg); + ins->type = STACK_I4; + break; + case MONO_TYPE_I8: + case MONO_TYPE_U8: + ins->dreg = mono_alloc_lreg (cfg); + ins->type = STACK_I8; + break; + case MONO_TYPE_I: + case MONO_TYPE_U: + ins->dreg = mono_alloc_ireg (cfg); +#if SIZEOF_REGISTER == 8 + ins->type = STACK_I8; +#else + ins->type = STACK_I4; +#endif + break; + case MONO_TYPE_R4: + case MONO_TYPE_R8: + ins->dreg = mono_alloc_freg (cfg); + ins->type = STACK_R8; + break; + default: + g_assert (mini_type_is_reference (cfg, fsig->params [0])); + ins->dreg = mono_alloc_ireg_ref (cfg); + ins->type = STACK_OBJ; + break; + } + + if (opcode == OP_LOADI8_MEMBASE) + ins = mono_decompose_opcode (cfg, ins, NULL); + + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_ACQ); + + return ins; + } + } else if (!strcmp (cmethod->name, "VolatileWrite") && fsig->param_count == 2) { + guint32 opcode = 0; + gboolean is_ref = mini_type_is_reference (cfg, fsig->params [0]); + + if (fsig->params [0]->type == MONO_TYPE_I1 || fsig->params [0]->type == MONO_TYPE_U1) + opcode = OP_STOREI1_MEMBASE_REG; + else if (fsig->params [0]->type == MONO_TYPE_I2 || fsig->params [0]->type == MONO_TYPE_U2) + opcode = OP_STOREI2_MEMBASE_REG; + else if (fsig->params [0]->type == MONO_TYPE_I4 || fsig->params [0]->type == MONO_TYPE_U4) + opcode = OP_STOREI4_MEMBASE_REG; + else if (fsig->params [0]->type == MONO_TYPE_I8 || fsig->params [0]->type == MONO_TYPE_U8) + opcode = OP_STOREI8_MEMBASE_REG; + else if (fsig->params [0]->type == MONO_TYPE_R4) + opcode = OP_STORER4_MEMBASE_REG; + else if (fsig->params [0]->type == MONO_TYPE_R8) + opcode = OP_STORER8_MEMBASE_REG; + else if (is_ref || fsig->params [0]->type == MONO_TYPE_I || fsig->params [0]->type == MONO_TYPE_U) + opcode = OP_STORE_MEMBASE_REG; + + if (opcode) { + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_REL); + + MONO_INST_NEW (cfg, ins, opcode); + ins->sreg1 = args [1]->dreg; + ins->inst_destbasereg = args [0]->dreg; + ins->inst_offset = 0; + MONO_ADD_INS (cfg->cbb, ins); + + if (opcode == OP_STOREI8_MEMBASE_REG) + ins = mono_decompose_opcode (cfg, ins, NULL); + + return ins; + } } } else if (cmethod->klass == mono_defaults.monitor_class) { - - /* FIXME this should be integrated to the check below once we support the trampoline version */ -#if defined(MONO_ARCH_ENABLE_MONITOR_IL_FASTPATH) - if (strcmp (cmethod->name, "Enter") == 0 && fsig->param_count == 2) { - MonoMethod *fast_method = NULL; - - /* Avoid infinite recursion */ - if (cfg->method->wrapper_type == MONO_WRAPPER_UNKNOWN && !strcmp (cfg->method->name, "FastMonitorEnterV4")) - return NULL; - - fast_method = mono_monitor_get_fast_path (cmethod); - if (!fast_method) - return NULL; - - return (MonoInst*)mono_emit_method_call (cfg, fast_method, args, NULL); - } -#endif - #if defined(MONO_ARCH_MONITOR_OBJECT_REG) if (strcmp (cmethod->name, "Enter") == 0 && fsig->param_count == 1) { MonoCallInst *call; @@ -5558,7 +5984,26 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign } return (MonoInst*)call; - } else if (strcmp (cmethod->name, "Exit") == 0) { +#if defined(MONO_ARCH_MONITOR_LOCK_TAKEN_REG) + } else if (strcmp (cmethod->name, "Enter") == 0 && fsig->param_count == 2) { + MonoCallInst *call; + + if (COMPILE_LLVM (cfg)) { + /* + * Pass the argument normally, the LLVM backend will handle the + * calling convention problems. + */ + call = (MonoCallInst*)mono_emit_abs_call (cfg, MONO_PATCH_INFO_MONITOR_ENTER_V4, NULL, helper_sig_monitor_enter_v4_trampoline_llvm, args); + } else { + call = (MonoCallInst*)mono_emit_abs_call (cfg, MONO_PATCH_INFO_MONITOR_ENTER_V4, + NULL, helper_sig_monitor_enter_exit_trampoline, NULL); + mono_call_inst_add_outarg_reg (cfg, call, args [0]->dreg, MONO_ARCH_MONITOR_OBJECT_REG, FALSE); + mono_call_inst_add_outarg_reg (cfg, call, args [1]->dreg, MONO_ARCH_MONITOR_LOCK_TAKEN_REG, FALSE); + } + + return (MonoInst*)call; +#endif + } else if (strcmp (cmethod->name, "Exit") == 0 && fsig->param_count == 1) { MonoCallInst *call; if (COMPILE_LLVM (cfg)) { @@ -5572,24 +6017,6 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign return (MonoInst*)call; } -#elif defined(MONO_ARCH_ENABLE_MONITOR_IL_FASTPATH) - { - MonoMethod *fast_method = NULL; - - /* Avoid infinite recursion */ - if (cfg->method->wrapper_type == MONO_WRAPPER_UNKNOWN && - (strcmp (cfg->method->name, "FastMonitorEnter") == 0 || - strcmp (cfg->method->name, "FastMonitorExit") == 0)) - return NULL; - - if ((strcmp (cmethod->name, "Enter") == 0 && fsig->param_count == 2) || - strcmp (cmethod->name, "Exit") == 0) - fast_method = mono_monitor_get_fast_path (cmethod); - if (!fast_method) - return NULL; - - return (MonoInst*)mono_emit_method_call (cfg, fast_method, args, NULL); - } #endif } else if (cmethod->klass->image == mono_defaults.corlib && (strcmp (cmethod->klass->name_space, "System.Threading") == 0) && @@ -5597,25 +6024,35 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign ins = NULL; #if SIZEOF_REGISTER == 8 - if (strcmp (cmethod->name, "Read") == 0 && (fsig->params [0]->type == MONO_TYPE_I8)) { - MonoInst *load_ins; + if (strcmp (cmethod->name, "Read") == 0 && fsig->param_count == 1 && (fsig->params [0]->type == MONO_TYPE_I8)) { + if (mono_arch_opcode_supported (OP_ATOMIC_LOAD_I8)) { + MONO_INST_NEW (cfg, ins, OP_ATOMIC_LOAD_I8); + ins->dreg = mono_alloc_preg (cfg); + ins->sreg1 = args [0]->dreg; + ins->type = STACK_I8; + ins->backend.memory_barrier_kind = MONO_MEMORY_BARRIER_SEQ; + MONO_ADD_INS (cfg->cbb, ins); + } else { + MonoInst *load_ins; - emit_memory_barrier (cfg, FullBarrier); + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_SEQ); - /* 64 bit reads are already atomic */ - MONO_INST_NEW (cfg, load_ins, OP_LOADI8_MEMBASE); - load_ins->dreg = mono_alloc_preg (cfg); - load_ins->inst_basereg = args [0]->dreg; - load_ins->inst_offset = 0; - MONO_ADD_INS (cfg->cbb, load_ins); + /* 64 bit reads are already atomic */ + MONO_INST_NEW (cfg, load_ins, OP_LOADI8_MEMBASE); + load_ins->dreg = mono_alloc_preg (cfg); + load_ins->inst_basereg = args [0]->dreg; + load_ins->inst_offset = 0; + load_ins->type = STACK_I8; + MONO_ADD_INS (cfg->cbb, load_ins); - emit_memory_barrier (cfg, FullBarrier); + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_SEQ); - ins = load_ins; + ins = load_ins; + } } #endif - if (strcmp (cmethod->name, "Increment") == 0) { + if (strcmp (cmethod->name, "Increment") == 0 && fsig->param_count == 1) { MonoInst *ins_iconst; guint32 opcode = 0; @@ -5643,7 +6080,7 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign ins->type = (opcode == OP_ATOMIC_ADD_I4) ? STACK_I4 : STACK_I8; MONO_ADD_INS (cfg->cbb, ins); } - } else if (strcmp (cmethod->name, "Decrement") == 0) { + } else if (strcmp (cmethod->name, "Decrement") == 0 && fsig->param_count == 1) { MonoInst *ins_iconst; guint32 opcode = 0; @@ -5671,7 +6108,7 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign ins->type = (opcode == OP_ATOMIC_ADD_I4) ? STACK_I4 : STACK_I8; MONO_ADD_INS (cfg->cbb, ins); } - } else if (strcmp (cmethod->name, "Add") == 0) { + } else if (strcmp (cmethod->name, "Add") == 0 && fsig->param_count == 2) { guint32 opcode = 0; if (fsig->params [0]->type == MONO_TYPE_I4) { @@ -5694,21 +6131,30 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign MONO_ADD_INS (cfg->cbb, ins); } } + else if (strcmp (cmethod->name, "Exchange") == 0 && fsig->param_count == 2) { + MonoInst *f2i = NULL, *i2f; + guint32 opcode, f2i_opcode, i2f_opcode; + gboolean is_ref = mini_type_is_reference (cfg, fsig->params [0]); + gboolean is_float = fsig->params [0]->type == MONO_TYPE_R4 || fsig->params [0]->type == MONO_TYPE_R8; - if (strcmp (cmethod->name, "Exchange") == 0) { - guint32 opcode; - gboolean is_ref = fsig->params [0]->type == MONO_TYPE_OBJECT; - - if (fsig->params [0]->type == MONO_TYPE_I4) { + if (fsig->params [0]->type == MONO_TYPE_I4 || + fsig->params [0]->type == MONO_TYPE_R4) { opcode = OP_ATOMIC_EXCHANGE_I4; + f2i_opcode = OP_MOVE_F_TO_I4; + i2f_opcode = OP_MOVE_I4_TO_F; cfg->has_atomic_exchange_i4 = TRUE; } #if SIZEOF_REGISTER == 8 - else if (is_ref || (fsig->params [0]->type == MONO_TYPE_I8) || - (fsig->params [0]->type == MONO_TYPE_I)) + else if (is_ref || + fsig->params [0]->type == MONO_TYPE_I8 || + fsig->params [0]->type == MONO_TYPE_R8 || + fsig->params [0]->type == MONO_TYPE_I) { opcode = OP_ATOMIC_EXCHANGE_I8; + f2i_opcode = OP_MOVE_F_TO_I8; + i2f_opcode = OP_MOVE_I8_TO_F; + } #else - else if (is_ref || (fsig->params [0]->type == MONO_TYPE_I)) { + else if (is_ref || fsig->params [0]->type == MONO_TYPE_I) { opcode = OP_ATOMIC_EXCHANGE_I4; cfg->has_atomic_exchange_i4 = TRUE; } @@ -5719,11 +6165,24 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign if (!mono_arch_opcode_supported (opcode)) return NULL; + if (is_float) { + /* TODO: Decompose these opcodes instead of bailing here. */ + if (COMPILE_SOFT_FLOAT (cfg)) + return NULL; + + MONO_INST_NEW (cfg, f2i, f2i_opcode); + f2i->dreg = mono_alloc_ireg (cfg); + f2i->sreg1 = args [1]->dreg; + if (f2i_opcode == OP_MOVE_F_TO_I4) + f2i->backend.spill_var = mini_get_int_to_float_spill_area (cfg); + MONO_ADD_INS (cfg->cbb, f2i); + } + MONO_INST_NEW (cfg, ins, opcode); ins->dreg = is_ref ? mono_alloc_ireg_ref (cfg) : mono_alloc_ireg (cfg); ins->inst_basereg = args [0]->dreg; ins->inst_offset = 0; - ins->sreg2 = args [1]->dreg; + ins->sreg2 = is_float ? f2i->dreg : args [1]->dreg; MONO_ADD_INS (cfg->cbb, ins); switch (fsig->params [0]->type) { @@ -5731,65 +6190,313 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign ins->type = STACK_I4; break; case MONO_TYPE_I8: - case MONO_TYPE_I: ins->type = STACK_I8; break; - case MONO_TYPE_OBJECT: - ins->type = STACK_OBJ; + case MONO_TYPE_I: +#if SIZEOF_REGISTER == 8 + ins->type = STACK_I8; +#else + ins->type = STACK_I4; +#endif + break; + case MONO_TYPE_R4: + case MONO_TYPE_R8: + ins->type = STACK_R8; break; default: - g_assert_not_reached (); + g_assert (mini_type_is_reference (cfg, fsig->params [0])); + ins->type = STACK_OBJ; + break; + } + + if (is_float) { + MONO_INST_NEW (cfg, i2f, i2f_opcode); + i2f->dreg = mono_alloc_freg (cfg); + i2f->sreg1 = ins->dreg; + i2f->type = STACK_R8; + if (i2f_opcode == OP_MOVE_I4_TO_F) + i2f->backend.spill_var = mini_get_int_to_float_spill_area (cfg); + MONO_ADD_INS (cfg->cbb, i2f); + + ins = i2f; } if (cfg->gen_write_barriers && is_ref) emit_write_barrier (cfg, args [0], args [1]); } - - if ((strcmp (cmethod->name, "CompareExchange") == 0)) { - int size = 0; + else if ((strcmp (cmethod->name, "CompareExchange") == 0) && fsig->param_count == 3) { + MonoInst *f2i_new = NULL, *f2i_cmp = NULL, *i2f; + guint32 opcode, f2i_opcode, i2f_opcode; gboolean is_ref = mini_type_is_reference (cfg, fsig->params [1]); - if (fsig->params [1]->type == MONO_TYPE_I4) - size = 4; - else if (is_ref || fsig->params [1]->type == MONO_TYPE_I) - size = sizeof (gpointer); - else if (sizeof (gpointer) == 8 && fsig->params [1]->type == MONO_TYPE_I8) - size = 8; - if (size == 4) { - if (!mono_arch_opcode_supported (OP_ATOMIC_CAS_I4)) - return NULL; - MONO_INST_NEW (cfg, ins, OP_ATOMIC_CAS_I4); - ins->dreg = is_ref ? alloc_ireg_ref (cfg) : alloc_ireg (cfg); - ins->sreg1 = args [0]->dreg; - ins->sreg2 = args [1]->dreg; - ins->sreg3 = args [2]->dreg; - ins->type = STACK_I4; - MONO_ADD_INS (cfg->cbb, ins); + gboolean is_float = fsig->params [1]->type == MONO_TYPE_R4 || fsig->params [1]->type == MONO_TYPE_R8; + + if (fsig->params [1]->type == MONO_TYPE_I4 || + fsig->params [1]->type == MONO_TYPE_R4) { + opcode = OP_ATOMIC_CAS_I4; + f2i_opcode = OP_MOVE_F_TO_I4; + i2f_opcode = OP_MOVE_I4_TO_F; cfg->has_atomic_cas_i4 = TRUE; - } else if (size == 8) { - if (!mono_arch_opcode_supported (OP_ATOMIC_CAS_I8)) - return NULL; - MONO_INST_NEW (cfg, ins, OP_ATOMIC_CAS_I8); - ins->dreg = is_ref ? alloc_ireg_ref (cfg) : alloc_ireg (cfg); - ins->sreg1 = args [0]->dreg; - ins->sreg2 = args [1]->dreg; - ins->sreg3 = args [2]->dreg; - ins->type = STACK_I8; - MONO_ADD_INS (cfg->cbb, ins); - } else { - /* g_assert_not_reached (); */ } +#if SIZEOF_REGISTER == 8 + else if (is_ref || + fsig->params [1]->type == MONO_TYPE_I8 || + fsig->params [1]->type == MONO_TYPE_R8 || + fsig->params [1]->type == MONO_TYPE_I) { + opcode = OP_ATOMIC_CAS_I8; + f2i_opcode = OP_MOVE_F_TO_I8; + i2f_opcode = OP_MOVE_I8_TO_F; + } +#else + else if (is_ref || fsig->params [1]->type == MONO_TYPE_I) { + opcode = OP_ATOMIC_CAS_I4; + cfg->has_atomic_cas_i4 = TRUE; + } +#endif + else + return NULL; + + if (!mono_arch_opcode_supported (opcode)) + return NULL; + + if (is_float) { + /* TODO: Decompose these opcodes instead of bailing here. */ + if (COMPILE_SOFT_FLOAT (cfg)) + return NULL; + + MONO_INST_NEW (cfg, f2i_new, f2i_opcode); + f2i_new->dreg = mono_alloc_ireg (cfg); + f2i_new->sreg1 = args [1]->dreg; + if (f2i_opcode == OP_MOVE_F_TO_I4) + f2i_new->backend.spill_var = mini_get_int_to_float_spill_area (cfg); + MONO_ADD_INS (cfg->cbb, f2i_new); + + MONO_INST_NEW (cfg, f2i_cmp, f2i_opcode); + f2i_cmp->dreg = mono_alloc_ireg (cfg); + f2i_cmp->sreg1 = args [2]->dreg; + if (f2i_opcode == OP_MOVE_F_TO_I4) + f2i_cmp->backend.spill_var = mini_get_int_to_float_spill_area (cfg); + MONO_ADD_INS (cfg->cbb, f2i_cmp); + } + + MONO_INST_NEW (cfg, ins, opcode); + ins->dreg = is_ref ? alloc_ireg_ref (cfg) : alloc_ireg (cfg); + ins->sreg1 = args [0]->dreg; + ins->sreg2 = is_float ? f2i_new->dreg : args [1]->dreg; + ins->sreg3 = is_float ? f2i_cmp->dreg : args [2]->dreg; + MONO_ADD_INS (cfg->cbb, ins); + + switch (fsig->params [0]->type) { + case MONO_TYPE_I4: + ins->type = STACK_I4; + break; + case MONO_TYPE_I8: + ins->type = STACK_I8; + break; + case MONO_TYPE_I: +#if SIZEOF_REGISTER == 8 + ins->type = STACK_I8; +#else + ins->type = STACK_I4; +#endif + break; + case MONO_TYPE_R4: + case MONO_TYPE_R8: + ins->type = STACK_R8; + break; + default: + g_assert (mini_type_is_reference (cfg, fsig->params [0])); + ins->type = STACK_OBJ; + break; + } + + if (is_float) { + MONO_INST_NEW (cfg, i2f, i2f_opcode); + i2f->dreg = mono_alloc_freg (cfg); + i2f->sreg1 = ins->dreg; + i2f->type = STACK_R8; + if (i2f_opcode == OP_MOVE_I4_TO_F) + i2f->backend.spill_var = mini_get_int_to_float_spill_area (cfg); + MONO_ADD_INS (cfg->cbb, i2f); + + ins = i2f; + } + if (cfg->gen_write_barriers && is_ref) emit_write_barrier (cfg, args [0], args [1]); } + else if ((strcmp (cmethod->name, "CompareExchange") == 0) && fsig->param_count == 4 && + fsig->params [1]->type == MONO_TYPE_I4) { + MonoInst *cmp, *ceq; - if (strcmp (cmethod->name, "MemoryBarrier") == 0) - ins = emit_memory_barrier (cfg, FullBarrier); + if (!mono_arch_opcode_supported (OP_ATOMIC_CAS_I4)) + return NULL; + + /* int32 r = CAS (location, value, comparand); */ + MONO_INST_NEW (cfg, ins, OP_ATOMIC_CAS_I4); + ins->dreg = alloc_ireg (cfg); + ins->sreg1 = args [0]->dreg; + ins->sreg2 = args [1]->dreg; + ins->sreg3 = args [2]->dreg; + ins->type = STACK_I4; + MONO_ADD_INS (cfg->cbb, ins); + + /* bool result = r == comparand; */ + MONO_INST_NEW (cfg, cmp, OP_ICOMPARE); + cmp->sreg1 = ins->dreg; + cmp->sreg2 = args [2]->dreg; + cmp->type = STACK_I4; + MONO_ADD_INS (cfg->cbb, cmp); + + MONO_INST_NEW (cfg, ceq, OP_ICEQ); + ceq->dreg = alloc_ireg (cfg); + ceq->type = STACK_I4; + MONO_ADD_INS (cfg->cbb, ceq); + + /* *success = result; */ + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREI1_MEMBASE_REG, args [3]->dreg, 0, ceq->dreg); + + cfg->has_atomic_cas_i4 = TRUE; + } + else if (strcmp (cmethod->name, "MemoryBarrier") == 0 && fsig->param_count == 0) + ins = emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_SEQ); if (ins) return ins; - } else if (cmethod->klass->image == mono_defaults.corlib) { - if (cmethod->name [0] == 'B' && strcmp (cmethod->name, "Break") == 0 - && strcmp (cmethod->klass->name, "Debugger") == 0) { + } else if (cmethod->klass->image == mono_defaults.corlib && + (strcmp (cmethod->klass->name_space, "System.Threading") == 0) && + (strcmp (cmethod->klass->name, "Volatile") == 0)) { + ins = NULL; + + if (!strcmp (cmethod->name, "Read") && fsig->param_count == 1) { + guint32 opcode = 0; + gboolean is_ref = mini_type_is_reference (cfg, fsig->params [0]); + gboolean is_float = fsig->params [0]->type == MONO_TYPE_R4 || fsig->params [0]->type == MONO_TYPE_R8; + + if (fsig->params [0]->type == MONO_TYPE_I1) + opcode = OP_ATOMIC_LOAD_I1; + else if (fsig->params [0]->type == MONO_TYPE_U1 || fsig->params [0]->type == MONO_TYPE_BOOLEAN) + opcode = OP_ATOMIC_LOAD_U1; + else if (fsig->params [0]->type == MONO_TYPE_I2) + opcode = OP_ATOMIC_LOAD_I2; + else if (fsig->params [0]->type == MONO_TYPE_U2) + opcode = OP_ATOMIC_LOAD_U2; + else if (fsig->params [0]->type == MONO_TYPE_I4) + opcode = OP_ATOMIC_LOAD_I4; + else if (fsig->params [0]->type == MONO_TYPE_U4) + opcode = OP_ATOMIC_LOAD_U4; + else if (fsig->params [0]->type == MONO_TYPE_R4) + opcode = OP_ATOMIC_LOAD_R4; + else if (fsig->params [0]->type == MONO_TYPE_R8) + opcode = OP_ATOMIC_LOAD_R8; +#if SIZEOF_REGISTER == 8 + else if (fsig->params [0]->type == MONO_TYPE_I8 || fsig->params [0]->type == MONO_TYPE_I) + opcode = OP_ATOMIC_LOAD_I8; + else if (is_ref || fsig->params [0]->type == MONO_TYPE_U8 || fsig->params [0]->type == MONO_TYPE_U) + opcode = OP_ATOMIC_LOAD_U8; +#else + else if (fsig->params [0]->type == MONO_TYPE_I) + opcode = OP_ATOMIC_LOAD_I4; + else if (is_ref || fsig->params [0]->type == MONO_TYPE_U) + opcode = OP_ATOMIC_LOAD_U4; +#endif + + if (opcode) { + if (!mono_arch_opcode_supported (opcode)) + return NULL; + + MONO_INST_NEW (cfg, ins, opcode); + ins->dreg = is_ref ? mono_alloc_ireg_ref (cfg) : (is_float ? mono_alloc_freg (cfg) : mono_alloc_ireg (cfg)); + ins->sreg1 = args [0]->dreg; + ins->backend.memory_barrier_kind = MONO_MEMORY_BARRIER_ACQ; + MONO_ADD_INS (cfg->cbb, ins); + + switch (fsig->params [0]->type) { + case MONO_TYPE_BOOLEAN: + case MONO_TYPE_I1: + case MONO_TYPE_U1: + case MONO_TYPE_I2: + case MONO_TYPE_U2: + case MONO_TYPE_I4: + case MONO_TYPE_U4: + ins->type = STACK_I4; + break; + case MONO_TYPE_I8: + case MONO_TYPE_U8: + ins->type = STACK_I8; + break; + case MONO_TYPE_I: + case MONO_TYPE_U: +#if SIZEOF_REGISTER == 8 + ins->type = STACK_I8; +#else + ins->type = STACK_I4; +#endif + break; + case MONO_TYPE_R4: + case MONO_TYPE_R8: + ins->type = STACK_R8; + break; + default: + g_assert (mini_type_is_reference (cfg, fsig->params [0])); + ins->type = STACK_OBJ; + break; + } + } + } + + if (!strcmp (cmethod->name, "Write") && fsig->param_count == 2) { + guint32 opcode = 0; + gboolean is_ref = mini_type_is_reference (cfg, fsig->params [0]); + + if (fsig->params [0]->type == MONO_TYPE_I1) + opcode = OP_ATOMIC_STORE_I1; + else if (fsig->params [0]->type == MONO_TYPE_U1 || fsig->params [0]->type == MONO_TYPE_BOOLEAN) + opcode = OP_ATOMIC_STORE_U1; + else if (fsig->params [0]->type == MONO_TYPE_I2) + opcode = OP_ATOMIC_STORE_I2; + else if (fsig->params [0]->type == MONO_TYPE_U2) + opcode = OP_ATOMIC_STORE_U2; + else if (fsig->params [0]->type == MONO_TYPE_I4) + opcode = OP_ATOMIC_STORE_I4; + else if (fsig->params [0]->type == MONO_TYPE_U4) + opcode = OP_ATOMIC_STORE_U4; + else if (fsig->params [0]->type == MONO_TYPE_R4) + opcode = OP_ATOMIC_STORE_R4; + else if (fsig->params [0]->type == MONO_TYPE_R8) + opcode = OP_ATOMIC_STORE_R8; +#if SIZEOF_REGISTER == 8 + else if (fsig->params [0]->type == MONO_TYPE_I8 || fsig->params [0]->type == MONO_TYPE_I) + opcode = OP_ATOMIC_STORE_I8; + else if (is_ref || fsig->params [0]->type == MONO_TYPE_U8 || fsig->params [0]->type == MONO_TYPE_U) + opcode = OP_ATOMIC_STORE_U8; +#else + else if (fsig->params [0]->type == MONO_TYPE_I) + opcode = OP_ATOMIC_STORE_I4; + else if (is_ref || fsig->params [0]->type == MONO_TYPE_U) + opcode = OP_ATOMIC_STORE_U4; +#endif + + if (opcode) { + if (!mono_arch_opcode_supported (opcode)) + return NULL; + + MONO_INST_NEW (cfg, ins, opcode); + ins->dreg = args [0]->dreg; + ins->sreg1 = args [1]->dreg; + ins->backend.memory_barrier_kind = MONO_MEMORY_BARRIER_REL; + MONO_ADD_INS (cfg->cbb, ins); + + if (cfg->gen_write_barriers && is_ref) + emit_write_barrier (cfg, args [0], args [1]); + } + } + + if (ins) + return ins; + } else if (cmethod->klass->image == mono_defaults.corlib && + (strcmp (cmethod->klass->name_space, "System.Diagnostics") == 0) && + (strcmp (cmethod->klass->name, "Debugger") == 0)) { + if (!strcmp (cmethod->name, "Break") && fsig->param_count == 0) { if (should_insert_brekpoint (cfg->method)) { ins = mono_emit_jit_icall (cfg, mono_debugger_agent_user_break, NULL); } else { @@ -5798,49 +6505,57 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign } return ins; } - if (cmethod->name [0] == 'g' && strcmp (cmethod->name, "get_IsRunningOnWindows") == 0 - && strcmp (cmethod->klass->name, "Environment") == 0) { + } else if (cmethod->klass->image == mono_defaults.corlib && + (strcmp (cmethod->klass->name_space, "System") == 0) && + (strcmp (cmethod->klass->name, "Environment") == 0)) { + if (!strcmp (cmethod->name, "get_IsRunningOnWindows") && fsig->param_count == 0) { #ifdef TARGET_WIN32 - EMIT_NEW_ICONST (cfg, ins, 1); + EMIT_NEW_ICONST (cfg, ins, 1); #else - EMIT_NEW_ICONST (cfg, ins, 0); + EMIT_NEW_ICONST (cfg, ins, 0); #endif - return ins; } } else if (cmethod->klass == mono_defaults.math_class) { /* - * There is general branches code for Min/Max, but it does not work for + * There is general branchless code for Min/Max, but it does not work for * all inputs: * http://everything2.com/?node_id=1051618 */ - } else if ((!strcmp (cmethod->klass->image->assembly->aname.name, "MonoMac") || !strcmp (cmethod->klass->image->assembly->aname.name, "monotouch")) && !strcmp (cmethod->klass->name, "Selector") && !strcmp (cmethod->name, "GetHandle") && cfg->compile_aot && (args [0]->opcode == OP_GOT_ENTRY || args[0]->opcode == OP_AOTCONST)) { + } else if ((!strcmp (cmethod->klass->image->assembly->aname.name, "MonoMac") || + !strcmp (cmethod->klass->image->assembly->aname.name, "monotouch")) && + !strcmp (cmethod->klass->name_space, "XamCore.ObjCRuntime") && + !strcmp (cmethod->klass->name, "Selector")) { #ifdef MONO_ARCH_HAVE_OBJC_GET_SELECTOR - MonoInst *pi; - MonoJumpInfoToken *ji; - MonoString *s; + if (!strcmp (cmethod->klass->name, "GetHandle") && fsig->param_count == 1 && + (args [0]->opcode == OP_GOT_ENTRY || args [0]->opcode == OP_AOTCONST) && + cfg->compile_aot) { + MonoInst *pi; + MonoJumpInfoToken *ji; + MonoString *s; - cfg->disable_llvm = TRUE; + cfg->disable_llvm = TRUE; - if (args [0]->opcode == OP_GOT_ENTRY) { - pi = args [0]->inst_p1; - g_assert (pi->opcode == OP_PATCH_INFO); - g_assert (GPOINTER_TO_INT (pi->inst_p1) == MONO_PATCH_INFO_LDSTR); - ji = pi->inst_p0; - } else { - g_assert (GPOINTER_TO_INT (args [0]->inst_p1) == MONO_PATCH_INFO_LDSTR); - ji = args [0]->inst_p0; + if (args [0]->opcode == OP_GOT_ENTRY) { + pi = args [0]->inst_p1; + g_assert (pi->opcode == OP_PATCH_INFO); + g_assert (GPOINTER_TO_INT (pi->inst_p1) == MONO_PATCH_INFO_LDSTR); + ji = pi->inst_p0; + } else { + g_assert (GPOINTER_TO_INT (args [0]->inst_p1) == MONO_PATCH_INFO_LDSTR); + ji = args [0]->inst_p0; + } + + NULLIFY_INS (args [0]); + + // FIXME: Ugly + s = mono_ldstr (cfg->domain, ji->image, mono_metadata_token_index (ji->token)); + MONO_INST_NEW (cfg, ins, OP_OBJC_GET_SELECTOR); + ins->dreg = mono_alloc_ireg (cfg); + // FIXME: Leaks + ins->inst_p0 = mono_string_to_utf8 (s); + MONO_ADD_INS (cfg->cbb, ins); + return ins; } - - NULLIFY_INS (args [0]); - - // FIXME: Ugly - s = mono_ldstr (cfg->domain, ji->image, mono_metadata_token_index (ji->token)); - MONO_INST_NEW (cfg, ins, OP_OBJC_GET_SELECTOR); - ins->dreg = mono_alloc_ireg (cfg); - // FIXME: Leaks - ins->inst_p0 = mono_string_to_utf8 (s); - MONO_ADD_INS (cfg->cbb, ins); - return ins; #endif } @@ -5882,7 +6597,7 @@ mini_redirect_call (MonoCompile *cfg, MonoMethod *method, g_assert (vtable); /*Should not fail since it System.String*/ #ifndef MONO_CROSS_COMPILE - managed_alloc = mono_gc_get_managed_allocator (method->klass, FALSE); + managed_alloc = mono_gc_get_managed_allocator (method->klass, FALSE, FALSE); #endif if (!managed_alloc) return NULL; @@ -5987,6 +6702,7 @@ static void emit_init_rvar (MonoCompile *cfg, int dreg, MonoType *rtype) { static double r8_0 = 0.0; + static float r4_0 = 0.0; MonoInst *ins; int t; @@ -5999,6 +6715,12 @@ emit_init_rvar (MonoCompile *cfg, int dreg, MonoType *rtype) MONO_EMIT_NEW_ICONST (cfg, dreg, 0); } else if (t == MONO_TYPE_I8 || t == MONO_TYPE_U8) { MONO_EMIT_NEW_I8CONST (cfg, dreg, 0); + } else if (cfg->r4fp && t == MONO_TYPE_R4) { + MONO_INST_NEW (cfg, ins, OP_R4CONST); + ins->type = STACK_R4; + ins->inst_p0 = (void*)&r4_0; + ins->dreg = dreg; + MONO_ADD_INS (cfg->cbb, ins); } else if (t == MONO_TYPE_R4 || t == MONO_TYPE_R8) { MONO_INST_NEW (cfg, ins, OP_R8CONST); ins->type = STACK_R8; @@ -6029,6 +6751,8 @@ emit_dummy_init_rvar (MonoCompile *cfg, int dreg, MonoType *rtype) MONO_EMIT_NEW_DUMMY_INIT (cfg, dreg, OP_DUMMY_ICONST); } else if (t == MONO_TYPE_I8 || t == MONO_TYPE_U8) { MONO_EMIT_NEW_DUMMY_INIT (cfg, dreg, OP_DUMMY_I8CONST); + } else if (cfg->r4fp && t == MONO_TYPE_R4) { + MONO_EMIT_NEW_DUMMY_INIT (cfg, dreg, OP_DUMMY_R4CONST); } else if (t == MONO_TYPE_R4 || t == MONO_TYPE_R8) { MONO_EMIT_NEW_DUMMY_INIT (cfg, dreg, OP_DUMMY_R8CONST); } else if ((t == MONO_TYPE_VALUETYPE) || (t == MONO_TYPE_TYPEDBYREF) || @@ -6096,6 +6820,9 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, return 0; #endif + if (!fsig) + fsig = mono_method_signature (cmethod); + if (cfg->verbose_level > 2) printf ("INLINE START %p %s -> %s\n", cmethod, mono_method_full_name (cfg->method, TRUE), mono_method_full_name (cmethod, TRUE)); @@ -6161,7 +6888,7 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, prev_ret_var_set = cfg->ret_var_set; prev_disable_inline = cfg->disable_inline; - if (*ip == CEE_CALLVIRT && !(cmethod->flags & METHOD_ATTRIBUTE_STATIC)) + if (ip && *ip == CEE_CALLVIRT && !(cmethod->flags & METHOD_ATTRIBUTE_STATIC)) virtual = TRUE; costs = mono_method_to_ir (cfg, cmethod, sbblock, ebblock, rvar, sp, real_offset, virtual); @@ -6235,7 +6962,8 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, cfg->cbb = ebblock; } - *out_cbb = cfg->cbb; + if (out_cbb) + *out_cbb = cfg->cbb; if (rvar) { /* @@ -6407,8 +7135,11 @@ mini_get_method_allow_open (MonoMethod *m, guint32 token, MonoClass *klass, Mono if (m->wrapper_type != MONO_WRAPPER_NONE) { method = mono_method_get_wrapper_data (m, token); - if (context) - method = mono_class_inflate_generic_method (method, context); + if (context) { + MonoError error; + method = mono_class_inflate_generic_method_checked (method, context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + } } else { method = mono_get_method_full (m->klass->image, token, klass, context); } @@ -6576,6 +7307,7 @@ initialize_array_data (MonoMethod *method, gboolean aot, unsigned char *ip, Mono * call void class [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array, valuetype [mscorlib]System.RuntimeFieldHandle) */ if (ip [0] == CEE_DUP && ip [1] == CEE_LDTOKEN && ip [5] == 0x4 && ip [6] == CEE_CALL) { + MonoError error; guint32 token = read32 (ip + 7); guint32 field_token = read32 (ip + 2); guint32 field_index = field_token & 0xffffff; @@ -6584,11 +7316,13 @@ initialize_array_data (MonoMethod *method, gboolean aot, unsigned char *ip, Mono int size = 0; MonoMethod *cmethod; MonoClass *dummy_class; - MonoClassField *field = mono_field_from_token (method->klass->image, field_token, &dummy_class, NULL); + MonoClassField *field = mono_field_from_token_checked (method->klass->image, field_token, &dummy_class, NULL, &error); int dummy_align; - if (!field) + if (!field) { + mono_error_cleanup (&error); /* FIXME don't swallow the error */ return NULL; + } *out_field_token = field_token; @@ -7088,7 +7822,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b seq_points = FALSE; } - if (cfg->gen_seq_points && cfg->method == method) { + if (cfg->gen_seq_points_debug_data && cfg->method == method) { minfo = mono_debug_lookup_method (method); if (minfo) { int i, n_il_offsets; @@ -7105,6 +7839,11 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b } g_free (il_offsets); g_free (line_numbers); + } else if (!method->wrapper_type && !method->dynamic && mono_debug_image_has_debug_info (method->klass->image)) { + /* Methods without line number info like auto-generated property accessors */ + seq_point_locs = mono_bitset_mem_new (mono_mempool_alloc0 (cfg->mempool, mono_bitset_alloc_size (header->code_size, 0)), header->code_size, 0); + seq_point_set_locs = mono_bitset_mem_new (mono_mempool_alloc0 (cfg->mempool, mono_bitset_alloc_size (header->code_size, 0)), header->code_size, 0); + sym_seq_points = TRUE; } } @@ -7516,11 +8255,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b skip_dead_blocks = !dont_verify; if (skip_dead_blocks) { - original_bb = bb = mono_basic_block_split (method, &error); - if (!mono_error_ok (&error)) { - mono_error_cleanup (&error); - UNVERIFIED; - } + original_bb = bb = mono_basic_block_split (method, &cfg->error); + CHECK_CFG_ERROR; g_assert (bb); } @@ -7859,10 +8595,10 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b dreg = alloc_freg (cfg); EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOADR4_MEMBASE, dreg, cons->dreg, 0); - ins->type = STACK_R8; + ins->type = cfg->r4_stack_type; } else { MONO_INST_NEW (cfg, ins, OP_R4CONST); - ins->type = STACK_R8; + ins->type = cfg->r4_stack_type; ins->dreg = alloc_dreg (cfg, STACK_R8); ins->inst_p0 = f; MONO_ADD_INS (bblock, ins); @@ -8024,6 +8760,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b gboolean push_res = TRUE; gboolean skip_ret = FALSE; gboolean delegate_invoke = FALSE; + gboolean direct_icall = FALSE; CHECK_OPSIZE (5); token = read32 (ip + 1); @@ -8037,7 +8774,6 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b --sp; addr = *sp; fsig = mini_get_signature (method, token, generic_context); - n = fsig->param_count + fsig->hasthis; if (method->dynamic && fsig->pinvoke) { MonoInst *args [3]; @@ -8066,7 +8802,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (!((constrained_call->byval_arg.type == MONO_TYPE_VAR || constrained_call->byval_arg.type == MONO_TYPE_MVAR) && cfg->generic_sharing_context)) { - cmethod = mono_get_method_constrained_with_method (image, cil_method, constrained_call, generic_context); + cmethod = mono_get_method_constrained_with_method (image, cil_method, constrained_call, generic_context, &cfg->error); + CHECK_CFG_ERROR; } } else { if (cfg->verbose_level > 2) @@ -8082,7 +8819,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (!mini_is_gsharedvt_klass (cfg, constrained_call)) g_assert (!cmethod->klass->valuetype); } else { - cmethod = mono_get_method_constrained (image, token, constrained_call, generic_context, &cil_method); + cmethod = mono_get_method_constrained_checked (image, token, constrained_call, generic_context, &cil_method, &cfg->error); + CHECK_CFG_ERROR; } } } @@ -8123,45 +8861,28 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (!mono_class_init (cmethod->klass)) TYPE_LOAD_ERROR (cmethod->klass); + fsig = mono_method_signature (cmethod); + if (!fsig) + LOAD_ERROR; if (cmethod->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL && mini_class_is_system_array (cmethod->klass)) { array_rank = cmethod->klass->rank; - fsig = mono_method_signature (cmethod); + } else if ((cmethod->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) && icall_is_direct_callable (cfg, cmethod)) { + direct_icall = TRUE; + } else if (fsig->pinvoke) { + MonoMethod *wrapper = mono_marshal_get_native_wrapper (cmethod, + check_for_pending_exc, cfg->compile_aot); + fsig = mono_method_signature (wrapper); + } else if (constrained_call) { } else { - fsig = mono_method_signature (cmethod); - - if (!fsig) - LOAD_ERROR; - - if (fsig->pinvoke) { - MonoMethod *wrapper = mono_marshal_get_native_wrapper (cmethod, - check_for_pending_exc, cfg->compile_aot); - fsig = mono_method_signature (wrapper); - } else if (constrained_call) { - fsig = mono_method_signature (cmethod); - } else { - fsig = mono_method_get_signature_full (cmethod, image, token, generic_context); - } + fsig = mono_method_get_signature_checked (cmethod, image, token, generic_context, &cfg->error); + CHECK_CFG_ERROR; } mono_save_token_info (cfg, image, token, cil_method); - if (!MONO_TYPE_IS_VOID (fsig->ret)) { - /* - * Need to emit an implicit seq point after every non-void call so single stepping through nested calls like - * foo (bar (), baz ()) - * works correctly. MS does this also: - * http://stackoverflow.com/questions/6937198/making-your-net-language-step-correctly-in-the-debugger - * The problem with this approach is that the debugger will stop after all calls returning a value, - * even for simple cases, like: - * int i = foo (); - */ - /* Special case a few common successor opcodes */ - if (!(ip + 5 < end && (ip [5] == CEE_POP || ip [5] == CEE_NOP)) && !(seq_point_locs && mono_bitset_test_fast (seq_point_locs, ip + 5 - header->code))) - need_seq_point = TRUE; - } - - n = fsig->param_count + fsig->hasthis; + if (!(seq_point_locs && mono_bitset_test_fast (seq_point_locs, ip + 5 - header->code))) + need_seq_point = TRUE; /* Don't support calls made using type arguments for now */ /* @@ -8170,17 +8891,19 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b GSHAREDVT_FAILURE (*ip); } */ - - if (mono_security_cas_enabled ()) { - if (check_linkdemand (cfg, method, cmethod)) - INLINE_FAILURE ("linkdemand"); - CHECK_CFG_EXCEPTION; - } - - if (cmethod->string_ctor && method->wrapper_type != MONO_WRAPPER_RUNTIME_INVOKE) - g_assert_not_reached (); } + if (cmethod && mono_security_cas_enabled ()) { + if (check_linkdemand (cfg, method, cmethod)) + INLINE_FAILURE ("linkdemand"); + CHECK_CFG_EXCEPTION; + } + + if (cmethod && cmethod->string_ctor && method->wrapper_type != MONO_WRAPPER_RUNTIME_INVOKE) + g_assert_not_reached (); + + n = fsig->param_count + fsig->hasthis; + if (!cfg->generic_sharing_context && cmethod && cmethod->klass->generic_container) UNVERIFIED; @@ -8195,80 +8918,18 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (constrained_call) { if (mini_is_gsharedvt_klass (cfg, constrained_call)) { - /* - * Constrained calls need to behave differently at runtime dependending on whenever the receiver is instantiated as ref type or as a vtype. - */ if ((cmethod->klass != mono_defaults.object_class) && constrained_call->valuetype && cmethod->klass->valuetype) { /* The 'Own method' case below */ } else if (cmethod->klass->image != mono_defaults.corlib && !(cmethod->klass->flags & TYPE_ATTRIBUTE_INTERFACE) && !cmethod->klass->valuetype) { /* 'The type parameter is instantiated as a reference type' case below. */ - } else if (((cmethod->klass == mono_defaults.object_class) || (cmethod->klass->flags & TYPE_ATTRIBUTE_INTERFACE) || (!cmethod->klass->valuetype && cmethod->klass->image != mono_defaults.corlib)) && - (MONO_TYPE_IS_VOID (fsig->ret) || MONO_TYPE_IS_PRIMITIVE (fsig->ret) || MONO_TYPE_IS_REFERENCE (fsig->ret) || MONO_TYPE_ISSTRUCT (fsig->ret) || mini_is_gsharedvt_type (cfg, fsig->ret)) && - (fsig->param_count == 0 || (!fsig->hasthis && fsig->param_count == 1) || (fsig->param_count == 1 && (MONO_TYPE_IS_REFERENCE (fsig->params [0]) || mini_is_gsharedvt_type (cfg, fsig->params [0]))))) { - MonoInst *args [16]; - - /* - * This case handles calls to - * - object:ToString()/Equals()/GetHashCode(), - * - System.IComparable:CompareTo() - * - System.IEquatable:Equals () - * plus some simple interface calls enough to support AsyncTaskMethodBuilder. - */ - - args [0] = sp [0]; - if (mono_method_check_context_used (cmethod)) - args [1] = emit_get_rgctx_method (cfg, mono_method_check_context_used (cmethod), cmethod, MONO_RGCTX_INFO_METHOD); - else - EMIT_NEW_METHODCONST (cfg, args [1], cmethod); - args [2] = emit_get_rgctx_klass (cfg, mono_class_check_context_used (constrained_call), constrained_call, MONO_RGCTX_INFO_KLASS); - - /* !fsig->hasthis is for the wrapper for the Object.GetType () icall */ - if (fsig->hasthis && fsig->param_count) { - /* Pass the arguments using a localloc-ed array using the format expected by runtime_invoke () */ - MONO_INST_NEW (cfg, ins, OP_LOCALLOC_IMM); - ins->dreg = alloc_preg (cfg); - ins->inst_imm = fsig->param_count * sizeof (mgreg_t); - MONO_ADD_INS (cfg->cbb, ins); - args [4] = ins; - - if (mini_is_gsharedvt_type (cfg, fsig->params [0])) { - int addr_reg; - - args [3] = emit_get_gsharedvt_info_klass (cfg, mono_class_from_mono_type (fsig->params [0]), MONO_RGCTX_INFO_CLASS_BOX_TYPE); - - EMIT_NEW_VARLOADA_VREG (cfg, ins, sp [1]->dreg, fsig->params [0]); - addr_reg = ins->dreg; - EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, args [4]->dreg, 0, addr_reg); - } else { - EMIT_NEW_ICONST (cfg, args [3], 0); - EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, args [4]->dreg, 0, sp [1]->dreg); - } - } else { - EMIT_NEW_ICONST (cfg, args [3], 0); - EMIT_NEW_ICONST (cfg, args [4], 0); - } - ins = mono_emit_jit_icall (cfg, mono_gsharedvt_constrained_call, args); - emit_widen = FALSE; - - if (mini_is_gsharedvt_type (cfg, fsig->ret)) { - ins = handle_unbox_gsharedvt (cfg, mono_class_from_mono_type (fsig->ret), ins, &bblock); - } else if (MONO_TYPE_IS_PRIMITIVE (fsig->ret) || MONO_TYPE_ISSTRUCT (fsig->ret)) { - MonoInst *add; - - /* Unbox */ - NEW_BIALU_IMM (cfg, add, OP_ADD_IMM, alloc_dreg (cfg, STACK_MP), ins->dreg, sizeof (MonoObject)); - MONO_ADD_INS (cfg->cbb, add); - /* Load value */ - NEW_LOAD_MEMBASE_TYPE (cfg, ins, fsig->ret, add->dreg, 0); - MONO_ADD_INS (cfg->cbb, ins); - /* ins represents the call result */ - } - - goto call_end; } else { - GSHAREDVT_FAILURE (*ip); + ins = handle_constrained_gsharedvt_call (cfg, cmethod, fsig, sp, constrained_call, &emit_widen, &bblock); + CHECK_CFG_EXCEPTION; + g_assert (ins); + goto call_end; } } + /* * We have the `constrained.' prefix opcode. */ @@ -8590,7 +9251,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b * This needs to be used for all generic calls, not just ones with a gsharedvt signature, to avoid * patching gshared method addresses into a gsharedvt method. */ - if (cmethod && cfg->gsharedvt && (mini_is_gsharedvt_signature (cfg, fsig) || cmethod->is_inflated || cmethod->klass->generic_class)) { + if (cmethod && cfg->gsharedvt && (mini_is_gsharedvt_signature (cfg, fsig) || cmethod->is_inflated || cmethod->klass->generic_class) && + !(cmethod->klass->rank && cmethod->klass->byval_arg.type != MONO_TYPE_SZARRAY)) { MonoRgctxInfoType info_type; if (virtual) { @@ -8616,10 +9278,6 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b } } - if (cmethod->klass->rank && cmethod->klass->byval_arg.type != MONO_TYPE_SZARRAY) - /* test_0_multi_dim_arrays () in gshared.cs */ - GSHAREDVT_FAILURE (*ip); - if ((cmethod->klass->parent == mono_defaults.multicastdelegate_class) && (!strcmp (cmethod->name, "Invoke"))) keep_this_alive = sp [0]; @@ -8679,16 +9337,35 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b goto call_end; } + /* Direct calls to icalls */ + if (direct_icall) { + MonoMethod *wrapper; + int costs; + + /* Inline the wrapper */ + wrapper = mono_marshal_get_native_wrapper (cmethod, TRUE, cfg->compile_aot); + + costs = inline_method (cfg, wrapper, fsig, sp, ip, cfg->real_offset, TRUE, &bblock); + g_assert (costs > 0); + cfg->real_offset += 5; + + if (!MONO_TYPE_IS_VOID (fsig->ret)) { + /* *sp is already set by inline_method */ + sp++; + push_res = FALSE; + } + + inline_costs += costs; + + goto call_end; + } + /* Indirect calls */ if (addr) { if (call_opcode == CEE_CALL) g_assert (context_used); else if (call_opcode == CEE_CALLI) g_assert (!vtable_arg); - else - /* FIXME: what the hell is this??? */ - g_assert (cmethod->flags & METHOD_ATTRIBUTE_FINAL || - !(cmethod->flags & METHOD_ATTRIBUTE_FINAL)); /* Prevent inlining of methods with indirect calls */ INLINE_FAILURE ("indirect call"); @@ -8739,6 +9416,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b EMIT_NEW_STORE_MEMBASE_TYPE (cfg, ins, fsig->params [fsig->param_count - 1], addr->dreg, 0, val->dreg); if (cfg->gen_write_barriers && val->type == STACK_OBJ && !(val->opcode == OP_PCONST && val->inst_c0 == 0)) emit_write_barrier (cfg, addr, val); + if (cfg->gen_write_barriers && mini_is_gsharedvt_klass (cfg, cmethod->klass)) + GSHAREDVT_FAILURE (*ip); } else if (strcmp (cmethod->name, "Get") == 0) { /* array Get */ addr = mini_emit_ldelema_ins (cfg, cmethod, sp, ip, FALSE); @@ -9072,7 +9751,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b MONO_INST_NEW(cfg, cmp, OP_ICOMPARE_IMM); cmp->sreg1 = sp [0]->dreg; - type_from_op (cmp, sp [0], NULL); + type_from_op (cfg, cmp, sp [0], NULL); CHECK_TYPE (cmp); #if SIZEOF_REGISTER == 4 @@ -9090,7 +9769,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b MONO_ADD_INS (bblock, cmp); MONO_INST_NEW (cfg, ins, is_true ? CEE_BNE_UN : CEE_BEQ); - type_from_op (ins, sp [0], NULL); + type_from_op (cfg, ins, sp [0], NULL); MONO_ADD_INS (bblock, ins); ins->inst_many_bb = mono_mempool_alloc (cfg->mempool, sizeof(gpointer)*2); GET_BBLOCK (cfg, tblock, target); @@ -9265,13 +9944,14 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b NEW_LOAD_MEMBASE (cfg, ins, ldind_to_load_membase (*ip), dreg, sp [0]->dreg, 0); ins->type = ldind_type [*ip - CEE_LDIND_I1]; + if (*ip == CEE_LDIND_R4) + ins->type = cfg->r4_stack_type; ins->flags |= ins_flag; MONO_ADD_INS (bblock, ins); *sp++ = ins; if (ins_flag & MONO_INST_VOLATILE) { /* Volatile loads have acquire semantics, see 12.6.7 in Ecma 335 */ - /* FIXME it's questionable if acquire semantics require full barrier or just LoadLoad*/ - emit_memory_barrier (cfg, FullBarrier); + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_ACQ); } ins_flag = 0; ++ip; @@ -9289,8 +9969,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (ins_flag & MONO_INST_VOLATILE) { /* Volatile stores have release semantics, see 12.6.7 in Ecma 335 */ - /* FIXME it's questionable if acquire semantics require full barrier or just LoadLoad*/ - emit_memory_barrier (cfg, FullBarrier); + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_REL); } NEW_STORE_MEMBASE (cfg, ins, stind_to_store_membase (*ip), sp [0]->dreg, 0, sp [1]->dreg); @@ -9313,7 +9992,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b sp -= 2; ins->sreg1 = sp [0]->dreg; ins->sreg2 = sp [1]->dreg; - type_from_op (ins, sp [0], sp [1]); + type_from_op (cfg, ins, sp [0], sp [1]); CHECK_TYPE (ins); ins->dreg = alloc_dreg ((cfg), (ins)->type); @@ -9331,7 +10010,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b MONO_ADD_INS ((cfg)->cbb, (ins)); - *sp++ = mono_decompose_opcode (cfg, ins); + *sp++ = mono_decompose_opcode (cfg, ins, &bblock); ip++; break; case CEE_ADD: @@ -9352,9 +10031,9 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b sp -= 2; ins->sreg1 = sp [0]->dreg; ins->sreg2 = sp [1]->dreg; - type_from_op (ins, sp [0], sp [1]); + type_from_op (cfg, ins, sp [0], sp [1]); CHECK_TYPE (ins); - ADD_WIDEN_OP (ins, sp [0], sp [1]); + add_widen_op (cfg, ins, &sp [0], &sp [1]); ins->dreg = alloc_dreg ((cfg), (ins)->type); /* FIXME: Pass opcode to is_inst_imm */ @@ -9384,14 +10063,14 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b ins->inst_imm = (gssize)(sp [1]->inst_c0); ins->sreg2 = -1; - /* Might be followed by an instruction added by ADD_WIDEN_OP */ + /* Might be followed by an instruction added by add_widen_op */ if (sp [1]->next == NULL) NULLIFY_INS (sp [1]); } } MONO_ADD_INS ((cfg)->cbb, (ins)); - *sp++ = mono_decompose_opcode (cfg, ins); + *sp++ = mono_decompose_opcode (cfg, ins, &bblock); ip++; break; case CEE_NEG: @@ -9440,7 +10119,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b case CEE_CONV_OVF_U: CHECK_STACK (1); - if (sp [-1]->type == STACK_R8) { + if (sp [-1]->type == STACK_R8 || sp [-1]->type == STACK_R4) { ADD_UNOP (CEE_CONV_OVF_I8); ADD_UNOP (*ip); } else { @@ -9453,7 +10132,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b case CEE_CONV_OVF_U4: CHECK_STACK (1); - if (sp [-1]->type == STACK_R8) { + if (sp [-1]->type == STACK_R8 || sp [-1]->type == STACK_R4) { ADD_UNOP (CEE_CONV_OVF_U8); ADD_UNOP (*ip); } else { @@ -9556,8 +10235,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b ip += stloc_len; if (ins_flag & MONO_INST_VOLATILE) { /* Volatile loads have acquire semantics, see 12.6.7 in Ecma 335 */ - /* FIXME it's questionable if acquire semantics require full barrier or just LoadLoad*/ - emit_memory_barrier (cfg, FullBarrier); + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_ACQ); } ins_flag = 0; break; @@ -9584,8 +10262,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (ins_flag & MONO_INST_VOLATILE) { /* Volatile loads have acquire semantics, see 12.6.7 in Ecma 335 */ - /* FIXME it's questionable if acquire semantics require full barrier or just LoadLoad*/ - emit_memory_barrier (cfg, FullBarrier); + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_ACQ); } ip += 5; @@ -9605,8 +10282,12 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b } else if (method->wrapper_type != MONO_WRAPPER_NONE) { MonoInst *iargs [1]; + char *str = mono_method_get_wrapper_data (method, n); - EMIT_NEW_PCONST (cfg, iargs [0], mono_method_get_wrapper_data (method, n)); + if (cfg->compile_aot) + EMIT_NEW_LDSTRLITCONST (cfg, iargs [0], str); + else + EMIT_NEW_PCONST (cfg, iargs [0], str); *sp = mono_emit_jit_icall (cfg, mono_string_new_wrapper, iargs); } else { if (cfg->opt & MONO_OPT_SHARED) { @@ -9672,9 +10353,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b cmethod = mini_get_method (cfg, method, token, NULL, generic_context); if (!cmethod || mono_loader_get_last_error ()) LOAD_ERROR; - fsig = mono_method_get_signature_full (cmethod, image, token, generic_context); - if (!fsig) - LOAD_ERROR; + fsig = mono_method_get_signature_checked (cmethod, image, token, generic_context, &cfg->error); + CHECK_CFG_ERROR; mono_save_token_info (cfg, image, token, cmethod); @@ -9836,6 +10516,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b ip += 5; inline_costs += 5; + if (!(seq_point_locs && mono_bitset_test_fast (seq_point_locs, ip - header->code))) + emit_seq_point (cfg, method, ip, FALSE, TRUE); break; } case CEE_CASTCLASS: @@ -9848,42 +10530,11 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (sp [0]->type != STACK_OBJ) UNVERIFIED; - context_used = mini_class_check_context_used (cfg, klass); + ins = handle_castclass (cfg, klass, *sp, ip, &bblock, &inline_costs); + CHECK_CFG_EXCEPTION; - if (!context_used && mini_class_has_reference_variant_generic_argument (cfg, klass, context_used)) { - *sp = emit_castclass_with_cache_nonshared (cfg, sp [0], klass, &bblock); - sp ++; - ip += 5; - inline_costs += 2; - } else if (!context_used && (mono_class_is_marshalbyref (klass) || klass->flags & TYPE_ATTRIBUTE_INTERFACE)) { - MonoMethod *mono_castclass; - MonoInst *iargs [1]; - int costs; - - mono_castclass = mono_marshal_get_castclass (klass); - iargs [0] = sp [0]; - - save_cast_details (cfg, klass, sp [0]->dreg, TRUE, &bblock); - costs = inline_method (cfg, mono_castclass, mono_method_signature (mono_castclass), - iargs, ip, cfg->real_offset, TRUE, &bblock); - reset_cast_details (cfg); - CHECK_CFG_EXCEPTION; - g_assert (costs > 0); - - ip += 5; - cfg->real_offset += 5; - - *sp++ = iargs [0]; - - inline_costs += costs; - } - else { - ins = handle_castclass (cfg, klass, *sp, context_used, &bblock); - CHECK_CFG_EXCEPTION; - bblock = cfg->cbb; - *sp ++ = ins; - ip += 5; - } + *sp ++ = ins; + ip += 5; break; case CEE_ISINST: { CHECK_STACK (1); @@ -9900,6 +10551,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (!context_used && mini_class_has_reference_variant_generic_argument (cfg, klass, context_used)) { MonoMethod *mono_isinst = mono_marshal_get_isinst_with_cache (); MonoInst *args [3]; + int idx; /* obj */ args [0] = *sp; @@ -9908,10 +10560,12 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b EMIT_NEW_CLASSCONST (cfg, args [1], klass); /* inline cache*/ - if (cfg->compile_aot) - EMIT_NEW_AOTCONST (cfg, args [2], MONO_PATCH_INFO_CASTCLASS_CACHE, NULL); - else + if (cfg->compile_aot) { + idx = get_castclass_cache_idx (cfg); + EMIT_NEW_AOTCONST (cfg, args [2], MONO_PATCH_INFO_CASTCLASS_CACHE, GINT_TO_POINTER (idx)); + } else { EMIT_NEW_PCONST (cfg, args [2], mono_domain_alloc0 (cfg->domain, sizeof (gpointer))); + } *sp++ = mono_emit_method_call (cfg, mono_isinst, args, NULL); ip += 5; @@ -9946,6 +10600,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b break; } case CEE_UNBOX_ANY: { + MonoInst *res, *addr; + CHECK_STACK (1); --sp; CHECK_OPSIZE (5); @@ -9958,71 +10614,29 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b context_used = mini_class_check_context_used (cfg, klass); if (mini_is_gsharedvt_klass (cfg, klass)) { - *sp = handle_unbox_gsharedvt (cfg, klass, *sp, &bblock); - sp ++; - - ip += 5; + res = handle_unbox_gsharedvt (cfg, klass, *sp, &bblock); + inline_costs += 2; + } else if (generic_class_is_reference_type (cfg, klass)) { + res = handle_castclass (cfg, klass, *sp, ip, &bblock, &inline_costs); + CHECK_CFG_EXCEPTION; + } else if (mono_class_is_nullable (klass)) { + res = handle_unbox_nullable (cfg, *sp, klass, context_used); + } else { + addr = handle_unbox (cfg, klass, sp, context_used); + /* LDOBJ */ + EMIT_NEW_LOAD_MEMBASE_TYPE (cfg, ins, &klass->byval_arg, addr->dreg, 0); + res = ins; inline_costs += 2; - break; } - if (generic_class_is_reference_type (cfg, klass)) { - /* CASTCLASS FIXME kill this huge slice of duplicated code*/ - if (!context_used && mini_class_has_reference_variant_generic_argument (cfg, klass, context_used)) { - *sp = emit_castclass_with_cache_nonshared (cfg, sp [0], klass, &bblock); - sp ++; - ip += 5; - inline_costs += 2; - } else if (!context_used && (mono_class_is_marshalbyref (klass) || klass->flags & TYPE_ATTRIBUTE_INTERFACE)) { - MonoMethod *mono_castclass; - MonoInst *iargs [1]; - int costs; - - mono_castclass = mono_marshal_get_castclass (klass); - iargs [0] = sp [0]; - - costs = inline_method (cfg, mono_castclass, mono_method_signature (mono_castclass), - iargs, ip, cfg->real_offset, TRUE, &bblock); - CHECK_CFG_EXCEPTION; - g_assert (costs > 0); - - ip += 5; - cfg->real_offset += 5; - - *sp++ = iargs [0]; - inline_costs += costs; - } else { - ins = handle_castclass (cfg, klass, *sp, context_used, &bblock); - CHECK_CFG_EXCEPTION; - bblock = cfg->cbb; - *sp ++ = ins; - ip += 5; - } - break; - } - - if (mono_class_is_nullable (klass)) { - ins = handle_unbox_nullable (cfg, *sp, klass, context_used); - *sp++= ins; - ip += 5; - break; - } - - /* UNBOX */ - ins = handle_unbox (cfg, klass, sp, context_used); - *sp = ins; - + *sp ++ = res; ip += 5; - - /* LDOBJ */ - EMIT_NEW_LOAD_MEMBASE_TYPE (cfg, ins, &klass->byval_arg, sp [0]->dreg, 0); - *sp++ = ins; - - inline_costs += 2; break; } case CEE_BOX: { MonoInst *val; + MonoClass *enum_class; + MonoMethod *has_flag; CHECK_STACK (1); --sp; @@ -10048,6 +10662,49 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b UNVERIFIED; /* frequent check in generic code: box (struct), brtrue */ + /* + * Look for: + * + * + * + * box MyFlags + * constrained. MyFlags + * callvirt instace bool class [mscorlib] System.Enum::HasFlag (class [mscorlib] System.Enum) + * + * If we find this sequence and the operand types on box and constrained + * are equal, we can emit a specialized instruction sequence instead of + * the very slow HasFlag () call. + */ + if ((cfg->opt & MONO_OPT_INTRINS) && + /* Cheap checks first. */ + ip + 5 + 6 + 5 < end && + ip [5] == CEE_PREFIX1 && + ip [6] == CEE_CONSTRAINED_ && + ip [11] == CEE_CALLVIRT && + ip_in_bb (cfg, bblock, ip + 5 + 6 + 5) && + mono_class_is_enum (klass) && + (enum_class = mini_get_class (method, read32 (ip + 7), generic_context)) && + (has_flag = mini_get_method (cfg, method, read32 (ip + 12), NULL, generic_context)) && + has_flag->klass == mono_defaults.enum_class && + !strcmp (has_flag->name, "HasFlag") && + has_flag->signature->hasthis && + has_flag->signature->param_count == 1) { + CHECK_TYPELOAD (enum_class); + + if (enum_class == klass) { + MonoInst *enum_this, *enum_flag; + + ip += 5 + 6 + 5; + --sp; + + enum_this = sp [0]; + enum_flag = sp [1]; + + *sp++ = handle_enum_has_flag (cfg, klass, enum_this, enum_flag); + break; + } + } + // FIXME: LLVM can't handle the inconsistent bb linking if (!mono_class_is_nullable (klass) && ip + 5 < end && ip_in_bb (cfg, bblock, ip + 5) && @@ -10203,10 +10860,9 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b klass = field->parent; } else { - field = mono_field_from_token (image, token, &klass, generic_context); + field = mono_field_from_token_checked (image, token, &klass, generic_context, &cfg->error); + CHECK_CFG_ERROR; } - if (!field) - LOAD_ERROR; if (!dont_verify && !cfg->skip_visibility && !mono_method_can_access_field (method, field)) FIELD_ACCESS_FAILURE (method, field); mono_class_init (klass); @@ -10603,8 +11259,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if ((op == CEE_STFLD || op == CEE_STSFLD) && (ins_flag & MONO_INST_VOLATILE)) { /* Volatile stores have release semantics, see 12.6.7 in Ecma 335 */ - /* FIXME it's questionable if acquire semantics require full barrier or just LoadLoad*/ - emit_memory_barrier (cfg, FullBarrier); + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_REL); } if (op == CEE_LDSFLDA) { @@ -10715,8 +11370,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if ((op == CEE_LDFLD || op == CEE_LDSFLD) && (ins_flag & MONO_INST_VOLATILE)) { /* Volatile loads have acquire semantics, see 12.6.7 in Ecma 335 */ - /* FIXME it's questionable if acquire semantics require full barrier or just LoadLoad*/ - emit_memory_barrier (cfg, FullBarrier); + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_ACQ); } ins_flag = 0; @@ -10732,8 +11386,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b CHECK_TYPELOAD (klass); if (ins_flag & MONO_INST_VOLATILE) { /* Volatile stores have release semantics, see 12.6.7 in Ecma 335 */ - /* FIXME it's questionable if acquire semantics require full barrier or just LoadLoad*/ - emit_memory_barrier (cfg, FullBarrier); + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_REL); } /* FIXME: should check item at sp [1] is compatible with the type of the store. */ EMIT_NEW_STORE_MEMBASE_TYPE (cfg, ins, &klass->byval_arg, sp [0]->dreg, 0, sp [1]->dreg); @@ -10774,7 +11427,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b ins->type = STACK_I4; ins->dreg = alloc_ireg (cfg); MONO_ADD_INS (cfg->cbb, ins); - *sp = mono_decompose_opcode (cfg, ins); + *sp = mono_decompose_opcode (cfg, ins, &bblock); } if (context_used) { @@ -10999,7 +11652,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b ins->type = STACK_R8; MONO_ADD_INS (bblock, ins); - *sp++ = mono_decompose_opcode (cfg, ins); + *sp++ = mono_decompose_opcode (cfg, ins, &bblock); ++ip; break; @@ -11016,10 +11669,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b MONO_INST_NEW (cfg, ins, *ip); --sp; CHECK_OPSIZE (5); - klass = mono_class_get_and_inflate_typespec_checked (image, read32 (ip + 1), generic_context, &error); - mono_error_cleanup (&error); /* FIXME don't swallow the error */ + klass = mini_get_class (method, read32 (ip + 1), generic_context); CHECK_TYPELOAD (klass); - mono_class_init (klass); context_used = mini_class_check_context_used (cfg, klass); @@ -11057,10 +11708,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b MONO_INST_NEW (cfg, ins, *ip); --sp; CHECK_OPSIZE (5); - klass = mono_class_get_and_inflate_typespec_checked (image, read32 (ip + 1), generic_context, &error); - mono_error_cleanup (&error); /* FIXME don't swallow the error */ + klass = mini_get_class (method, read32 (ip + 1), generic_context); CHECK_TYPELOAD (klass); - mono_class_init (klass); context_used = mini_class_check_context_used (cfg, klass); @@ -11113,7 +11762,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b handle = &((MonoClass*)handle)->byval_arg; } else { - handle = mono_ldtoken (image, n, &handle_class, generic_context); + handle = mono_ldtoken_checked (image, n, &handle_class, generic_context, &cfg->error); + CHECK_CFG_ERROR; } if (!handle) LOAD_ERROR; @@ -11126,14 +11776,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b typeof(Gen<>). */ context_used = 0; } else if (handle_class == mono_defaults.typehandle_class) { - /* If we get a MONO_TYPE_CLASS - then we need to provide the - open type, not an - instantiation of it. */ - if (mono_type_get_type (handle) == MONO_TYPE_CLASS) - context_used = 0; - else - context_used = mini_class_check_context_used (cfg, mono_class_from_mono_type (handle)); + context_used = mini_class_check_context_used (cfg, mono_class_from_mono_type (handle)); } else if (handle_class == mono_defaults.fieldhandle_class) context_used = mini_class_check_context_used (cfg, ((MonoClassField*)handle)->parent); else if (handle_class == mono_defaults.methodhandle_class) @@ -11663,9 +12306,9 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b break; } case CEE_MONO_MEMORY_BARRIER: { - CHECK_OPSIZE (5); - emit_memory_barrier (cfg, (int)read32 (ip + 1)); - ip += 5; + CHECK_OPSIZE (6); + emit_memory_barrier (cfg, (int)read32 (ip + 2)); + ip += 6; break; } case CEE_MONO_JIT_ATTACH: { @@ -11760,8 +12403,13 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b case CEE_CGT_UN: case CEE_CLT: case CEE_CLT_UN: { - MonoInst *cmp; + MonoInst *cmp, *arg1, *arg2; + CHECK_STACK (2); + sp -= 2; + arg1 = sp [0]; + arg2 = sp [1]; + /* * The following transforms: * CEE_CEQ into OP_CEQ @@ -11771,25 +12419,27 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b * CEE_CLT_UN into OP_CLT_UN */ MONO_INST_NEW (cfg, cmp, (OP_CEQ - CEE_CEQ) + ip [1]); - + MONO_INST_NEW (cfg, ins, cmp->opcode); - sp -= 2; - cmp->sreg1 = sp [0]->dreg; - cmp->sreg2 = sp [1]->dreg; - type_from_op (cmp, sp [0], sp [1]); + cmp->sreg1 = arg1->dreg; + cmp->sreg2 = arg2->dreg; + type_from_op (cfg, cmp, arg1, arg2); CHECK_TYPE (cmp); - if ((sp [0]->type == STACK_I8) || ((SIZEOF_VOID_P == 8) && ((sp [0]->type == STACK_PTR) || (sp [0]->type == STACK_OBJ) || (sp [0]->type == STACK_MP)))) + add_widen_op (cfg, cmp, &arg1, &arg2); + if ((arg1->type == STACK_I8) || ((SIZEOF_VOID_P == 8) && ((arg1->type == STACK_PTR) || (arg1->type == STACK_OBJ) || (arg1->type == STACK_MP)))) cmp->opcode = OP_LCOMPARE; - else if (sp [0]->type == STACK_R8) + else if (arg1->type == STACK_R4) + cmp->opcode = OP_RCOMPARE; + else if (arg1->type == STACK_R8) cmp->opcode = OP_FCOMPARE; else cmp->opcode = OP_ICOMPARE; MONO_ADD_INS (bblock, cmp); ins->type = STACK_I4; ins->dreg = alloc_dreg (cfg, ins->type); - type_from_op (ins, sp [0], sp [1]); + type_from_op (cfg, ins, arg1, arg2); - if (cmp->opcode == OP_FCOMPARE) { + if (cmp->opcode == OP_FCOMPARE || cmp->opcode == OP_RCOMPARE) { /* * The backends expect the fceq opcodes to do the * comparison too. @@ -12151,26 +12801,25 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b * FIXME: It's unclear whether we should be emitting both the acquire * and release barriers for cpblk. It is technically both a load and * store operation, so it seems like that's the sensible thing to do. + * + * FIXME: We emit full barriers on both sides of the operation for + * simplicity. We should have a separate atomic memcpy method instead. */ MonoMethod *memcpy_method = get_memcpy_method (); - if (ins_flag & MONO_INST_VOLATILE) { - /* Volatile stores have release semantics, see 12.6.7 in Ecma 335 */ - /* FIXME it's questionable if acquire semantics require full barrier or just LoadLoad*/ - emit_memory_barrier (cfg, FullBarrier); - } + + if (ins_flag & MONO_INST_VOLATILE) + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_SEQ); + call = mono_emit_method_call (cfg, memcpy_method, iargs, NULL); call->flags |= ins_flag; - if (ins_flag & MONO_INST_VOLATILE) { - /* Volatile loads have acquire semantics, see 12.6.7 in Ecma 335 */ - /* FIXME it's questionable if acquire semantics require full barrier or just LoadLoad*/ - emit_memory_barrier (cfg, FullBarrier); - } + + if (ins_flag & MONO_INST_VOLATILE) + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_SEQ); } else { MonoMethod *memset_method = get_memset_method (); if (ins_flag & MONO_INST_VOLATILE) { /* Volatile stores have release semantics, see 12.6.7 in Ecma 335 */ - /* FIXME it's questionable if acquire semantics require full barrier or just LoadLoad*/ - emit_memory_barrier (cfg, FullBarrier); + emit_memory_barrier (cfg, MONO_MEMORY_BARRIER_REL); } call = mono_emit_method_call (cfg, memset_method, iargs, NULL); call->flags |= ins_flag; @@ -12231,17 +12880,14 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b CHECK_OPSIZE (6); token = read32 (ip + 2); if (mono_metadata_token_table (token) == MONO_TABLE_TYPESPEC && !image_is_dynamic (method->klass->image) && !generic_context) { - MonoType *type = mono_type_create_from_typespec_checked (image, token, &error); - mono_error_cleanup (&error); /* FIXME don't swallow the error */ - if (!type) - UNVERIFIED; + MonoType *type = mono_type_create_from_typespec_checked (image, token, &cfg->error); + CHECK_CFG_ERROR; val = mono_type_size (type, &ialign); } else { - MonoClass *klass = mono_class_get_and_inflate_typespec_checked (image, token, generic_context, &error); - mono_error_cleanup (&error); /* FIXME don't swallow the error */ + MonoClass *klass = mini_get_class (method, token, generic_context); CHECK_TYPELOAD (klass); - mono_class_init (klass); + val = mono_type_size (&klass->byval_arg, &ialign); if (mini_is_gsharedvt_klass (cfg, klass)) @@ -12375,7 +13021,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b } /* Add a sequence point for method entry/exit events */ - if (seq_points) { + if (seq_points && cfg->gen_seq_points_debug_data) { NEW_SEQ_POINT (cfg, ins, METHOD_ENTRY_IL_OFFSET, FALSE); MONO_ADD_INS (init_localsbb, ins); NEW_SEQ_POINT (cfg, ins, METHOD_EXIT_IL_OFFSET, FALSE); @@ -12424,6 +13070,10 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b mono_print_code (cfg, "AFTER METHOD-TO-IR"); goto cleanup; + +mono_error_exit: + g_assert (!mono_error_ok (&cfg->error)); + goto cleanup; exception_exit: g_assert (cfg->exception_type != MONO_EXCEPTION_NONE); @@ -13518,7 +14168,7 @@ mono_spill_global_vars (MonoCompile *cfg, gboolean *need_local_opts) ins->inst_destbasereg = var->inst_basereg; ins->inst_offset = var->inst_offset; spec = INS_INFO (ins->opcode); - } else if (!lvreg && ((ins->opcode == OP_MOVE) || (ins->opcode == OP_FMOVE) || (ins->opcode == OP_LMOVE))) { + } else if (!lvreg && ((ins->opcode == OP_MOVE) || (ins->opcode == OP_FMOVE) || (ins->opcode == OP_LMOVE) || (ins->opcode == OP_RMOVE))) { ins->opcode = store_opcode; ins->inst_destbasereg = var->inst_basereg; ins->inst_offset = var->inst_offset; diff --git a/mta-mono/vendor/mono/mini/mini-amd64.c b/mta-mono/vendor/mono/mini/mini-amd64.c index 652129e..29336f2 100644 --- a/mta-mono/vendor/mono/mini/mini-amd64.c +++ b/mta-mono/vendor/mono/mini/mini-amd64.c @@ -502,6 +502,8 @@ typedef struct { /* Only if storage == ArgValuetypeInReg */ ArgStorage pair_storage [2]; gint8 pair_regs [2]; + /* The size of each pair */ + int pair_size [2]; int nregs; } ArgInfo; @@ -684,17 +686,56 @@ mono_arch_nacl_pad(guint8 *code, int pad) } #endif +static int +count_fields_nested (MonoClass *klass) +{ + MonoMarshalType *info; + int i, count; + + info = mono_marshal_load_type_info (klass); + g_assert(info); + count = 0; + for (i = 0; i < info->num_fields; ++i) { + if (MONO_TYPE_ISSTRUCT (info->fields [i].field->type)) + count += count_fields_nested (mono_class_from_mono_type (info->fields [i].field->type)); + else + count ++; + } + return count; +} + +static int +collect_field_info_nested (MonoClass *klass, MonoMarshalField *fields, int index, int offset) +{ + MonoMarshalType *info; + int i; + + info = mono_marshal_load_type_info (klass); + g_assert(info); + for (i = 0; i < info->num_fields; ++i) { + if (MONO_TYPE_ISSTRUCT (info->fields [i].field->type)) { + index = collect_field_info_nested (mono_class_from_mono_type (info->fields [i].field->type), fields, index, info->fields [i].offset); + } else { + memcpy (&fields [index], &info->fields [i], sizeof (MonoMarshalField)); + fields [index].offset += offset; + index ++; + } + } + return index; +} + static void add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgInfo *ainfo, MonoType *type, gboolean is_return, guint32 *gr, guint32 *fr, guint32 *stack_size) { - guint32 size, quad, nquads, i; + guint32 size, quad, nquads, i, nfields; /* Keep track of the size used in each quad so we can */ /* use the right size when copying args/return vars. */ guint32 quadsize [2] = {8, 8}; ArgumentClass args [2]; MonoMarshalType *info = NULL; + MonoMarshalField *fields = NULL; MonoClass *klass; MonoGenericSharingContext tmp_gsctx; gboolean pass_on_stack = FALSE; @@ -710,7 +751,7 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn klass = mono_class_from_mono_type (type); size = mini_type_stack_size_full (gsctx, &klass->byval_arg, NULL, sig->pinvoke); #ifndef HOST_WIN32 - if (!sig->pinvoke && !disable_vtypes_in_regs && ((is_return && (size == 8)) || (!is_return && (size <= 16)))) { + if (!sig->pinvoke && ((is_return && (size == 8)) || (!is_return && (size <= 16)))) { /* We pass and return vtypes of size 8 in a register */ } else if (!sig->pinvoke || (size == 0) || (size > 16)) { pass_on_stack = TRUE; @@ -728,12 +769,21 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn guint32 field_size; info = mono_marshal_load_type_info (klass); - g_assert(info); - for (i = 0; i < info->num_fields; ++i) { - field_size = mono_marshal_type_size (info->fields [i].field->type, - info->fields [i].mspec, + g_assert (info); + + /* + * Collect field information recursively to be able to + * handle nested structures. + */ + nfields = count_fields_nested (klass); + fields = g_new0 (MonoMarshalField, nfields); + collect_field_info_nested (klass, fields, 0, 0); + + for (i = 0; i < nfields; ++i) { + field_size = mono_marshal_type_size (fields [i].field->type, + fields [i].mspec, &align, TRUE, klass->unicode); - if ((info->fields [i].offset < 8) && (info->fields [i].offset + field_size) > 8) { + if ((fields [i].offset < 8) && (fields [i].offset + field_size) > 8) { pass_on_stack = TRUE; break; } @@ -746,6 +796,7 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn *stack_size += ALIGN_TO (size, 8); ainfo->storage = ArgOnStack; + g_free (fields); return; } @@ -759,6 +810,11 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn nquads = 1; if (!sig->pinvoke) { + int n = mono_class_value_size (klass, NULL); + + quadsize [0] = n >= 8 ? 8 : n; + quadsize [1] = n >= 8 ? MAX (n - 8, 8) : 0; + /* Always pass in 1 or 2 integer registers */ args [0] = ARG_CLASS_INTEGER; args [1] = ARG_CLASS_INTEGER; @@ -773,8 +829,8 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn * The X87 and SSEUP stuff is left out since there are no such types in * the CLR. */ - info = mono_marshal_load_type_info (klass); g_assert (info); + g_assert (fields); #ifndef HOST_WIN32 if (info->native_size > 16) { @@ -782,6 +838,7 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn *stack_size += ALIGN_TO (info->native_size, 8); ainfo->storage = ArgOnStack; + g_free (fields); return; } #else @@ -809,6 +866,7 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn } } + g_free (fields); return; } #endif @@ -820,36 +878,38 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn guint32 align; ArgumentClass class1; - if (info->num_fields == 0) + if (nfields == 0) class1 = ARG_CLASS_MEMORY; else class1 = ARG_CLASS_NO_CLASS; - for (i = 0; i < info->num_fields; ++i) { - size = mono_marshal_type_size (info->fields [i].field->type, - info->fields [i].mspec, + for (i = 0; i < nfields; ++i) { + size = mono_marshal_type_size (fields [i].field->type, + fields [i].mspec, &align, TRUE, klass->unicode); - if ((info->fields [i].offset < 8) && (info->fields [i].offset + size) > 8) { + if ((fields [i].offset < 8) && (fields [i].offset + size) > 8) { /* Unaligned field */ NOT_IMPLEMENTED; } /* Skip fields in other quad */ - if ((quad == 0) && (info->fields [i].offset >= 8)) + if ((quad == 0) && (fields [i].offset >= 8)) continue; - if ((quad == 1) && (info->fields [i].offset < 8)) + if ((quad == 1) && (fields [i].offset < 8)) continue; /* How far into this quad this data extends.*/ /* (8 is size of quad) */ - quadsize [quad] = info->fields [i].offset + size - (quad * 8); + quadsize [quad] = fields [i].offset + size - (quad * 8); - class1 = merge_argument_class_from_type (gsctx, info->fields [i].field->type, class1); + class1 = merge_argument_class_from_type (gsctx, fields [i].field->type, class1); } g_assert (class1 != ARG_CLASS_NO_CLASS); args [quad] = class1; } } + g_free (fields); + /* Post merger cleanup */ if ((args [0] == ARG_CLASS_MEMORY) || (args [1] == ARG_CLASS_MEMORY)) args [0] = args [1] = ARG_CLASS_MEMORY; @@ -859,8 +919,17 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn int orig_gr = *gr; int orig_fr = *fr; + while (quadsize [0] != 1 && quadsize [0] != 2 && quadsize [0] != 4 && quadsize [0] != 8) + quadsize [0] ++; + while (quadsize [1] != 1 && quadsize [1] != 2 && quadsize [1] != 4 && quadsize [1] != 8) + quadsize [1] ++; + ainfo->storage = ArgValuetypeInReg; ainfo->pair_storage [0] = ainfo->pair_storage [1] = ArgNone; + g_assert (quadsize [0] <= 8); + g_assert (quadsize [1] <= 8); + ainfo->pair_size [0] = quadsize [0]; + ainfo->pair_size [1] = quadsize [1]; ainfo->nregs = nquads; for (quad = 0; quad < nquads; ++quad) { switch (args [quad]) { @@ -1962,7 +2031,7 @@ mono_arch_create_vars (MonoCompile *cfg) } } - if (cfg->gen_seq_points) { + if (cfg->gen_seq_points_debug_data) { MonoInst *ins; if (cfg->compile_aot) { @@ -3000,7 +3069,7 @@ mono_arch_peephole_pass_1 (MonoCompile *cfg, MonoBasicBlock *bb) MonoInst *ins, *n; MONO_BB_FOR_EACH_INS_SAFE (bb, n, ins) { - MonoInst *last_ins = ins->prev; + MonoInst *last_ins = mono_inst_prev (ins, FILTER_IL_SEQ_POINT); switch (ins->opcode) { case OP_ADD_IMM: @@ -3036,6 +3105,8 @@ mono_arch_peephole_pass_1 (MonoCompile *cfg, MonoBasicBlock *bb) } else if (((ins2->opcode == OP_ICONST) || (ins2->opcode == OP_I8CONST)) && (ins2->dreg == ins->dreg) && (ins2->inst_c0 == 0)) { NULLIFY_INS (ins2); /* Continue */ + } else if (ins2->opcode == OP_IL_SEQ_POINT) { + /* Continue */ } else { break; } @@ -3092,9 +3163,10 @@ mono_arch_peephole_pass_2 (MonoCompile *cfg, MonoBasicBlock *bb) switch (ins->opcode) { case OP_ICONST: case OP_I8CONST: { + MonoInst *next = mono_inst_next (ins, FILTER_IL_SEQ_POINT); /* reg = 0 -> XOR (reg, reg) */ /* XOR sets cflags on x86, so we cant do it always */ - if (ins->inst_c0 == 0 && (!ins->next || (ins->next && INST_IGNORES_CFLAGS (ins->next->opcode)))) { + if (ins->inst_c0 == 0 && (!next || (next && INST_IGNORES_CFLAGS (next->opcode)))) { ins->opcode = OP_LXOR; ins->sreg1 = ins->dreg; ins->sreg2 = ins->dreg; @@ -3131,6 +3203,8 @@ mono_arch_peephole_pass_2 (MonoCompile *cfg, MonoBasicBlock *bb) } else if (((ins2->opcode == OP_ICONST) || (ins2->opcode == OP_I8CONST)) && (ins2->dreg == ins->dreg) && (ins2->inst_c0 == 0)) { NULLIFY_INS (ins2); /* Continue */ + } else if (ins2->opcode == OP_IL_SEQ_POINT) { + /* Continue */ } else { break; } @@ -3279,7 +3353,10 @@ cc_signed_table [] = { static unsigned char* emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size, gboolean is_signed) { - amd64_sse_cvttsd2si_reg_reg (code, dreg, sreg); + if (size == 8) + amd64_sse_cvttsd2si_reg_reg (code, dreg, sreg); + else + amd64_sse_cvttsd2si_reg_reg_size (code, dreg, sreg, 4); if (size == 1) amd64_widen_reg (code, dreg, dreg, is_signed, FALSE); @@ -3419,6 +3496,12 @@ emit_move_return_value (MonoCompile *cfg, MonoInst *ins, guint8 *code) amd64_sse_movsd_reg_reg (code, ins->dreg, AMD64_XMM0); } break; + case OP_RCALL: + case OP_RCALL_REG: + case OP_RCALL_MEMBASE: + if (ins->dreg != AMD64_XMM0) + amd64_sse_movss_reg_reg (code, ins->dreg, AMD64_XMM0); + break; case OP_VCALL: case OP_VCALL_REG: case OP_VCALL_MEMBASE: @@ -3466,7 +3549,7 @@ static int tls_gs_offset; gboolean mono_amd64_have_tls_get (void) { -#ifdef __APPLE__ +#ifdef TARGET_MACH static gboolean have_tls_get = FALSE; static gboolean inited = FALSE; guint8 *ins; @@ -3497,6 +3580,8 @@ mono_amd64_have_tls_get (void) tls_gs_offset = ins[5]; return have_tls_get; +#elif defined(TARGET_ANDROID) + return FALSE; #else return TRUE; #endif @@ -4109,6 +4194,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_NOT_REACHED: case OP_NOT_NULL: break; + case OP_IL_SEQ_POINT: + mono_add_seq_point (cfg, bb, ins, code - cfg->native_code); + break; case OP_SEQ_POINT: { int i; @@ -4577,10 +4665,16 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) amd64_mov_reg_imm_size (code, ins->dreg, 0, 8); break; case OP_MOVE: - amd64_mov_reg_reg (code, ins->dreg, ins->sreg1, sizeof(mgreg_t)); + if (ins->dreg != ins->sreg1) + amd64_mov_reg_reg (code, ins->dreg, ins->sreg1, sizeof(mgreg_t)); break; case OP_AMD64_SET_XMMREG_R4: { - amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg1); + if (cfg->r4fp) { + if (ins->dreg != ins->sreg1) + amd64_sse_movss_reg_reg (code, ins->dreg, ins->sreg1); + } else { + amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg1); + } break; } case OP_AMD64_SET_XMMREG_R8: { @@ -4640,6 +4734,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } case OP_CALL: case OP_FCALL: + case OP_RCALL: case OP_LCALL: case OP_VCALL: case OP_VCALL2: @@ -4676,6 +4771,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) code = emit_move_return_value (cfg, ins, code); break; case OP_FCALL_REG: + case OP_RCALL_REG: case OP_LCALL_REG: case OP_VCALL_REG: case OP_VCALL2_REG: @@ -4724,6 +4820,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) code = emit_move_return_value (cfg, ins, code); break; case OP_FCALL_MEMBASE: + case OP_RCALL_MEMBASE: case OP_LCALL_MEMBASE: case OP_VCALL_MEMBASE: case OP_VCALL2_MEMBASE: @@ -5005,12 +5102,16 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) float f = *(float *)ins->inst_p0; if ((f == 0.0) && (mono_signbit (f) == 0)) { - amd64_sse_xorpd_reg_reg (code, ins->dreg, ins->dreg); + if (cfg->r4fp) + amd64_sse_xorps_reg_reg (code, ins->dreg, ins->dreg); + else + amd64_sse_xorpd_reg_reg (code, ins->dreg, ins->dreg); } else { mono_add_patch_info (cfg, offset, MONO_PATCH_INFO_R4, ins->inst_p0); amd64_sse_movss_reg_membase (code, ins->dreg, AMD64_RIP, 0); - amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); + if (!cfg->r4fp) + amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); } break; } @@ -5021,31 +5122,51 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) amd64_sse_movsd_reg_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset); break; case OP_STORER4_MEMBASE_REG: - /* This requires a double->single conversion */ - amd64_sse_cvtsd2ss_reg_reg (code, MONO_ARCH_FP_SCRATCH_REG, ins->sreg1); - amd64_sse_movss_membase_reg (code, ins->inst_destbasereg, ins->inst_offset, MONO_ARCH_FP_SCRATCH_REG); + if (cfg->r4fp) { + amd64_sse_movss_membase_reg (code, ins->inst_destbasereg, ins->inst_offset, ins->sreg1); + } else { + /* This requires a double->single conversion */ + amd64_sse_cvtsd2ss_reg_reg (code, MONO_ARCH_FP_SCRATCH_REG, ins->sreg1); + amd64_sse_movss_membase_reg (code, ins->inst_destbasereg, ins->inst_offset, MONO_ARCH_FP_SCRATCH_REG); + } break; case OP_LOADR4_MEMBASE: - amd64_sse_movss_reg_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset); - amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); + if (cfg->r4fp) { + amd64_sse_movss_reg_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset); + } else { + amd64_sse_movss_reg_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset); + amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); + } break; case OP_ICONV_TO_R4: - amd64_sse_cvtsi2ss_reg_reg_size (code, ins->dreg, ins->sreg1, 4); - amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); + if (cfg->r4fp) { + amd64_sse_cvtsi2ss_reg_reg_size (code, ins->dreg, ins->sreg1, 4); + } else { + amd64_sse_cvtsi2ss_reg_reg_size (code, ins->dreg, ins->sreg1, 4); + amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); + } break; case OP_ICONV_TO_R8: amd64_sse_cvtsi2sd_reg_reg_size (code, ins->dreg, ins->sreg1, 4); break; case OP_LCONV_TO_R4: - amd64_sse_cvtsi2ss_reg_reg (code, ins->dreg, ins->sreg1); - amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); + if (cfg->r4fp) { + amd64_sse_cvtsi2ss_reg_reg (code, ins->dreg, ins->sreg1); + } else { + amd64_sse_cvtsi2ss_reg_reg (code, ins->dreg, ins->sreg1); + amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); + } break; case OP_LCONV_TO_R8: amd64_sse_cvtsi2sd_reg_reg (code, ins->dreg, ins->sreg1); break; case OP_FCONV_TO_R4: - amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg1); - amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); + if (cfg->r4fp) { + amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg1); + } else { + amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg1); + amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); + } break; case OP_FCONV_TO_I1: code = emit_float_to_int (cfg, code, ins->dreg, ins->sreg1, 1, TRUE); @@ -5069,6 +5190,40 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_FCONV_TO_I8: code = emit_float_to_int (cfg, code, ins->dreg, ins->sreg1, 8, TRUE); break; + + case OP_RCONV_TO_I1: + amd64_sse_cvtss2si_reg_reg_size (code, ins->dreg, ins->sreg1, 4); + amd64_widen_reg (code, ins->dreg, ins->dreg, TRUE, FALSE); + break; + case OP_RCONV_TO_U1: + amd64_sse_cvtss2si_reg_reg_size (code, ins->dreg, ins->sreg1, 4); + amd64_widen_reg (code, ins->dreg, ins->dreg, FALSE, FALSE); + break; + case OP_RCONV_TO_I2: + amd64_sse_cvtss2si_reg_reg_size (code, ins->dreg, ins->sreg1, 4); + amd64_widen_reg (code, ins->dreg, ins->dreg, TRUE, TRUE); + break; + case OP_RCONV_TO_U2: + amd64_sse_cvtss2si_reg_reg_size (code, ins->dreg, ins->sreg1, 4); + amd64_widen_reg (code, ins->dreg, ins->dreg, FALSE, TRUE); + break; + case OP_RCONV_TO_I4: + amd64_sse_cvtss2si_reg_reg_size (code, ins->dreg, ins->sreg1, 4); + break; + case OP_RCONV_TO_U4: + amd64_sse_cvtss2si_reg_reg_size (code, ins->dreg, ins->sreg1, 4); + break; + case OP_RCONV_TO_I8: + amd64_sse_cvtss2si_reg_reg_size (code, ins->dreg, ins->sreg1, 8); + break; + case OP_RCONV_TO_R8: + amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->sreg1); + break; + case OP_RCONV_TO_R4: + if (ins->dreg != ins->sreg1) + amd64_sse_movss_reg_reg (code, ins->dreg, ins->sreg1); + break; + case OP_LCONV_TO_R_UN: { guint8 *br [2]; @@ -5112,6 +5267,29 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ins->dreg != ins->sreg1) amd64_sse_movsd_reg_reg (code, ins->dreg, ins->sreg1); break; + case OP_RMOVE: + if (ins->dreg != ins->sreg1) + amd64_sse_movss_reg_reg (code, ins->dreg, ins->sreg1); + break; + case OP_MOVE_F_TO_I4: + if (cfg->r4fp) { + amd64_movd_reg_xreg_size (code, ins->dreg, ins->sreg1, 8); + } else { + amd64_sse_cvtsd2ss_reg_reg (code, MONO_ARCH_FP_SCRATCH_REG, ins->sreg1); + amd64_movd_reg_xreg_size (code, ins->dreg, MONO_ARCH_FP_SCRATCH_REG, 8); + } + break; + case OP_MOVE_I4_TO_F: + amd64_movd_xreg_reg_size (code, ins->dreg, ins->sreg1, 8); + if (!cfg->r4fp) + amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); + break; + case OP_MOVE_F_TO_I8: + amd64_movd_reg_xreg_size (code, ins->dreg, ins->sreg1, 8); + break; + case OP_MOVE_I8_TO_F: + amd64_movd_xreg_reg_size (code, ins->dreg, ins->sreg1, 8); + break; case OP_FADD: amd64_sse_addsd_reg_reg (code, ins->dreg, ins->sreg2); break; @@ -5151,6 +5329,30 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_SQRT: EMIT_SSE2_FPFUNC (code, fsqrt, ins->dreg, ins->sreg1); break; + + case OP_RADD: + amd64_sse_addss_reg_reg (code, ins->dreg, ins->sreg2); + break; + case OP_RSUB: + amd64_sse_subss_reg_reg (code, ins->dreg, ins->sreg2); + break; + case OP_RMUL: + amd64_sse_mulss_reg_reg (code, ins->dreg, ins->sreg2); + break; + case OP_RDIV: + amd64_sse_divss_reg_reg (code, ins->dreg, ins->sreg2); + break; + case OP_RNEG: { + static float r4_0 = -0.0; + + g_assert (ins->sreg1 == ins->dreg); + + mono_add_patch_info (cfg, offset, MONO_PATCH_INFO_R4, &r4_0); + amd64_sse_movss_reg_membase (code, MONO_ARCH_FP_SCRATCH_REG, AMD64_RIP, 0); + amd64_sse_xorps_reg_reg (code, ins->dreg, MONO_ARCH_FP_SCRATCH_REG); + break; + } + case OP_IMIN: g_assert (cfg->opt & MONO_OPT_CMOV); g_assert (ins->dreg == ins->sreg1); @@ -5208,12 +5410,21 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) */ amd64_sse_comisd_reg_reg (code, ins->sreg2, ins->sreg1); break; + case OP_RCOMPARE: + /* + * FIXME: Get rid of this. + * The two arguments are swapped because the fbranch instructions + * depend on this for the non-sse case to work. + */ + amd64_sse_comiss_reg_reg (code, ins->sreg2, ins->sreg1); + break; case OP_FCNEQ: case OP_FCEQ: { /* zeroing the register at the start results in * shorter and faster code (we can also remove the widening op) */ guchar *unordered_check; + amd64_alu_reg_reg (code, X86_XOR, ins->dreg, ins->dreg); amd64_sse_comisd_reg_reg (code, ins->sreg1, ins->sreg2); unordered_check = code; @@ -5234,7 +5445,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; } case OP_FCLT: - case OP_FCLT_UN: + case OP_FCLT_UN: { /* zeroing the register at the start results in * shorter and faster code (we can also remove the widening op) */ @@ -5254,6 +5465,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) amd64_set_reg (code, X86_CC_GT, ins->dreg, FALSE); } break; + } case OP_FCLE: { guchar *unordered_check; amd64_alu_reg_reg (code, X86_XOR, ins->dreg, ins->dreg); @@ -5270,6 +5482,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) * shorter and faster code (we can also remove the widening op) */ guchar *unordered_check; + amd64_alu_reg_reg (code, X86_XOR, ins->dreg, ins->dreg); amd64_sse_comisd_reg_reg (code, ins->sreg2, ins->sreg1); if (ins->opcode == OP_FCGT) { @@ -5292,7 +5505,58 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) amd64_patch (unordered_check, code); break; } - + + case OP_RCEQ: + case OP_RCGT: + case OP_RCLT: + case OP_RCLT_UN: + case OP_RCGT_UN: { + int x86_cond; + gboolean unordered = FALSE; + + amd64_alu_reg_reg (code, X86_XOR, ins->dreg, ins->dreg); + amd64_sse_comiss_reg_reg (code, ins->sreg2, ins->sreg1); + + switch (ins->opcode) { + case OP_RCEQ: + x86_cond = X86_CC_EQ; + break; + case OP_RCGT: + x86_cond = X86_CC_LT; + break; + case OP_RCLT: + x86_cond = X86_CC_GT; + break; + case OP_RCLT_UN: + x86_cond = X86_CC_GT; + unordered = TRUE; + break; + case OP_RCGT_UN: + x86_cond = X86_CC_LT; + unordered = TRUE; + break; + default: + g_assert_not_reached (); + break; + } + + if (unordered) { + guchar *unordered_check; + guchar *jump_to_end; + + unordered_check = code; + x86_branch8 (code, X86_CC_P, 0, FALSE); + amd64_set_reg (code, x86_cond, ins->dreg, FALSE); + jump_to_end = code; + x86_jump8 (code, 0); + amd64_patch (unordered_check, code); + amd64_inc_reg (code, ins->dreg); + amd64_patch (jump_to_end, code); + } else { + amd64_set_reg (code, x86_cond, ins->dreg, FALSE); + } + break; + } case OP_FCLT_MEMBASE: case OP_FCGT_MEMBASE: case OP_FCLT_UN_MEMBASE: @@ -5445,14 +5709,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; } case OP_MEMORY_BARRIER: { - switch (ins->backend.memory_barrier_kind) { - case StoreLoadBarrier: - case FullBarrier: - /* http://blogs.sun.com/dave/resource/NHM-Pipeline-Blog-V2.txt */ - x86_prefix (code, X86_LOCK_PREFIX); - amd64_alu_membase_imm (code, X86_ADD, AMD64_RSP, 0, 0); - break; - } + if (ins->backend.memory_barrier_kind == MONO_MEMORY_BARRIER_SEQ) + x86_mfence (code); break; } case OP_ATOMIC_ADD_I4: @@ -5476,62 +5734,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } case OP_ATOMIC_EXCHANGE_I4: case OP_ATOMIC_EXCHANGE_I8: { - guchar *br[2]; - int sreg2 = ins->sreg2; - int breg = ins->inst_basereg; - guint32 size; - gboolean need_push = FALSE, rdx_pushed = FALSE; - - if (ins->opcode == OP_ATOMIC_EXCHANGE_I8) - size = 8; - else - size = 4; - - /* - * See http://msdn.microsoft.com/en-us/magazine/cc302329.aspx for - * an explanation of how this works. - */ - - /* cmpxchg uses eax as comperand, need to make sure we can use it - * hack to overcome limits in x86 reg allocator - * (req: dreg == eax and sreg2 != eax and breg != eax) - */ - g_assert (ins->dreg == AMD64_RAX); - - if (breg == AMD64_RAX && ins->sreg2 == AMD64_RAX) - /* Highly unlikely, but possible */ - need_push = TRUE; - - /* The pushes invalidate rsp */ - if ((breg == AMD64_RAX) || need_push) { - amd64_mov_reg_reg (code, AMD64_R11, breg, 8); - breg = AMD64_R11; - } - - /* We need the EAX reg for the comparand */ - if (ins->sreg2 == AMD64_RAX) { - if (breg != AMD64_R11) { - amd64_mov_reg_reg (code, AMD64_R11, AMD64_RAX, 8); - sreg2 = AMD64_R11; - } else { - g_assert (need_push); - amd64_push_reg (code, AMD64_RDX); - amd64_mov_reg_reg (code, AMD64_RDX, AMD64_RAX, size); - sreg2 = AMD64_RDX; - rdx_pushed = TRUE; - } - } - - amd64_mov_reg_membase (code, AMD64_RAX, breg, ins->inst_offset, size); - - br [0] = code; amd64_prefix (code, X86_LOCK_PREFIX); - amd64_cmpxchg_membase_reg_size (code, breg, ins->inst_offset, sreg2, size); - br [1] = code; amd64_branch8 (code, X86_CC_NE, -1, FALSE); - amd64_patch (br [1], br [0]); - - if (rdx_pushed) - amd64_pop_reg (code, AMD64_RDX); + guint32 size = ins->opcode == OP_ATOMIC_EXCHANGE_I4 ? 4 : 8; + /* LOCK prefix is implied. */ + amd64_mov_reg_reg (code, GP_SCRATCH_REG, ins->sreg2, size); + amd64_xchg_membase_reg_size (code, ins->sreg1, ins->inst_offset, GP_SCRATCH_REG, size); + amd64_mov_reg_reg (code, ins->dreg, GP_SCRATCH_REG, size); break; } case OP_ATOMIC_CAS_I4: @@ -5558,6 +5766,95 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) amd64_mov_reg_reg (code, ins->dreg, AMD64_RAX, size); break; } + case OP_ATOMIC_LOAD_I1: { + amd64_widen_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset, TRUE, FALSE); + break; + } + case OP_ATOMIC_LOAD_U1: { + amd64_widen_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset, FALSE, FALSE); + break; + } + case OP_ATOMIC_LOAD_I2: { + amd64_widen_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset, TRUE, TRUE); + break; + } + case OP_ATOMIC_LOAD_U2: { + amd64_widen_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset, FALSE, TRUE); + break; + } + case OP_ATOMIC_LOAD_I4: { + amd64_movsxd_reg_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset); + break; + } + case OP_ATOMIC_LOAD_U4: + case OP_ATOMIC_LOAD_I8: + case OP_ATOMIC_LOAD_U8: { + amd64_mov_reg_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset, ins->opcode == OP_ATOMIC_LOAD_U4 ? 4 : 8); + break; + } + case OP_ATOMIC_LOAD_R4: { + amd64_sse_movss_reg_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset); + amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); + break; + } + case OP_ATOMIC_LOAD_R8: { + amd64_sse_movsd_reg_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset); + break; + } + case OP_ATOMIC_STORE_I1: + case OP_ATOMIC_STORE_U1: + case OP_ATOMIC_STORE_I2: + case OP_ATOMIC_STORE_U2: + case OP_ATOMIC_STORE_I4: + case OP_ATOMIC_STORE_U4: + case OP_ATOMIC_STORE_I8: + case OP_ATOMIC_STORE_U8: { + int size; + + switch (ins->opcode) { + case OP_ATOMIC_STORE_I1: + case OP_ATOMIC_STORE_U1: + size = 1; + break; + case OP_ATOMIC_STORE_I2: + case OP_ATOMIC_STORE_U2: + size = 2; + break; + case OP_ATOMIC_STORE_I4: + case OP_ATOMIC_STORE_U4: + size = 4; + break; + case OP_ATOMIC_STORE_I8: + case OP_ATOMIC_STORE_U8: + size = 8; + break; + } + + amd64_mov_membase_reg (code, ins->inst_destbasereg, ins->inst_offset, ins->sreg1, size); + + if (ins->backend.memory_barrier_kind == MONO_MEMORY_BARRIER_SEQ) + x86_mfence (code); + break; + } + case OP_ATOMIC_STORE_R4: { + amd64_sse_cvtsd2ss_reg_reg (code, MONO_ARCH_FP_SCRATCH_REG, ins->sreg1); + amd64_sse_movss_membase_reg (code, ins->inst_destbasereg, ins->inst_offset, MONO_ARCH_FP_SCRATCH_REG); + + if (ins->backend.memory_barrier_kind == MONO_MEMORY_BARRIER_SEQ) + x86_mfence (code); + break; + } + case OP_ATOMIC_STORE_R8: { + x86_nop (code); + x86_nop (code); + amd64_sse_movsd_membase_reg (code, ins->inst_destbasereg, ins->inst_offset, ins->sreg1); + x86_nop (code); + x86_nop (code); + + if (ins->backend.memory_barrier_kind == MONO_MEMORY_BARRIER_SEQ) + x86_mfence (code); + break; + } case OP_CARD_TABLE_WBARRIER: { int ptr = ins->sreg1; int value = ins->sreg2; @@ -6133,21 +6430,33 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_INSERTX_R4_SLOW: switch (ins->inst_c0) { case 0: - amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg2); + if (cfg->r4fp) + amd64_sse_movss_reg_reg (code, ins->dreg, ins->sreg2); + else + amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg2); break; case 1: amd64_sse_pshufd_reg_reg_imm (code, ins->dreg, ins->dreg, mono_simd_shuffle_mask(1, 0, 2, 3)); - amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg2); + if (cfg->r4fp) + amd64_sse_movss_reg_reg (code, ins->dreg, ins->sreg2); + else + amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg2); amd64_sse_pshufd_reg_reg_imm (code, ins->dreg, ins->dreg, mono_simd_shuffle_mask(1, 0, 2, 3)); break; case 2: amd64_sse_pshufd_reg_reg_imm (code, ins->dreg, ins->dreg, mono_simd_shuffle_mask(2, 1, 0, 3)); - amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg2); + if (cfg->r4fp) + amd64_sse_movss_reg_reg (code, ins->dreg, ins->sreg2); + else + amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg2); amd64_sse_pshufd_reg_reg_imm (code, ins->dreg, ins->dreg, mono_simd_shuffle_mask(2, 1, 0, 3)); break; case 3: amd64_sse_pshufd_reg_reg_imm (code, ins->dreg, ins->dreg, mono_simd_shuffle_mask(3, 1, 2, 0)); - amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg2); + if (cfg->r4fp) + amd64_sse_movss_reg_reg (code, ins->dreg, ins->sreg2); + else + amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg2); amd64_sse_pshufd_reg_reg_imm (code, ins->dreg, ins->dreg, mono_simd_shuffle_mask(3, 1, 2, 0)); break; } @@ -6186,9 +6495,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_XZERO: amd64_sse_pxor_reg_reg (code, ins->dreg, ins->dreg); break; - case OP_ICONV_TO_R8_RAW: + case OP_ICONV_TO_R4_RAW: amd64_movd_xreg_reg_size (code, ins->dreg, ins->sreg1, 4); - amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg); break; case OP_FCONV_TO_R8_X: @@ -6227,8 +6535,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) amd64_sse_pshufd_reg_reg_imm (code, ins->dreg, ins->dreg, 0x44); break; case OP_EXPAND_R4: - amd64_sse_movsd_reg_reg (code, ins->dreg, ins->sreg1); - amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->dreg); + if (cfg->r4fp) { + amd64_sse_movsd_reg_reg (code, ins->dreg, ins->sreg1); + } else { + amd64_sse_movsd_reg_reg (code, ins->dreg, ins->sreg1); + amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->dreg); + } amd64_sse_pshufd_reg_reg_imm (code, ins->dreg, ins->dreg, 0); break; case OP_EXPAND_R8: @@ -6862,11 +7174,12 @@ mono_arch_emit_prolog (MonoCompile *cfg) if (!args_clobbered) { MonoBasicBlock *first_bb = cfg->bb_entry; MonoInst *next; + int filter = FILTER_IL_SEQ_POINT; - next = mono_bb_first_ins (first_bb); + next = mono_bb_first_inst (first_bb, filter); if (!next && first_bb->next_bb) { first_bb = first_bb->next_bb; - next = mono_bb_first_ins (first_bb); + next = mono_bb_first_inst (first_bb, filter); } if (first_bb->in_count > 1) @@ -6875,7 +7188,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) for (i = 0; next && i < sig->param_count + sig->hasthis; ++i) { ArgInfo *ainfo = cinfo->args + i; gboolean match = FALSE; - + ins = cfg->args [i]; if (ins->opcode != OP_REGVAR) { switch (ainfo->storage) { @@ -6912,7 +7225,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) } if (match) { - next = next->next; + next = mono_inst_next (next, filter); //next = mono_inst_list_next (&next->node, &first_bb->ins_list); if (!next) break; @@ -6920,7 +7233,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) } } - if (cfg->gen_seq_points) { + if (cfg->gen_seq_points_debug_data) { MonoInst *info_var = cfg->arch.seq_point_info_var; /* Initialize seq_point_info_var */ @@ -7033,7 +7346,7 @@ mono_arch_emit_epilog (MonoCompile *cfg) for (quad = 0; quad < 2; quad ++) { switch (ainfo->pair_storage [quad]) { case ArgInIReg: - amd64_mov_reg_membase (code, ainfo->pair_regs [quad], inst->inst_basereg, inst->inst_offset + (quad * sizeof(mgreg_t)), sizeof(mgreg_t)); + amd64_mov_reg_membase (code, ainfo->pair_regs [quad], inst->inst_basereg, inst->inst_offset + (quad * sizeof(mgreg_t)), ainfo->pair_size [quad]); break; case ArgInFloatSSEReg: amd64_movss_reg_membase (code, ainfo->pair_regs [quad], inst->inst_basereg, inst->inst_offset + (quad * sizeof(mgreg_t))); @@ -7484,7 +7797,7 @@ mono_arch_is_int_overflow (void *sigctx, void *info) int reg; gint64 value; - mono_arch_sigctx_to_monoctx (sigctx, &ctx); + mono_sigctx_to_monoctx (sigctx, &ctx); rip = (guint8*)ctx.rip; @@ -7690,14 +8003,11 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod g_assert ((code - start) < 64); } - nacl_global_codeman_validate(&start, 64, &code); - - mono_debug_add_delegate_trampoline (start, code - start); + nacl_global_codeman_validate (&start, 64, &code); if (code_len) *code_len = code - start; - if (mono_jit_map_is_enabled ()) { char *buff; if (has_target) @@ -7708,6 +8018,7 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod if (!has_target) g_free (buff); } + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_DELEGATE_INVOKE, NULL); return start; } @@ -7815,6 +8126,7 @@ mono_arch_get_delegate_virtual_invoke_impl (MonoMethodSignature *sig, MonoMethod /* Load the vtable */ amd64_mov_reg_membase (code, AMD64_RAX, AMD64_ARG_REG1, MONO_STRUCT_OFFSET (MonoObject, vtable), 8); amd64_jump_membase (code, AMD64_RAX, offset); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_DELEGATE_INVOKE, NULL); return start; } @@ -8025,6 +8337,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI g_assert (code - start <= size); nacl_domain_code_validate(domain, &start, size, &code); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, NULL); return start; } @@ -8052,6 +8365,8 @@ mono_arch_get_cie_program (void) return l; } +#ifndef DISABLE_JIT + MonoInst* mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args) { @@ -8069,7 +8384,7 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho opcode = OP_ABS; } - if (opcode) { + if (opcode && fsig->param_count == 1) { MONO_INST_NEW (cfg, ins, opcode); ins->type = STACK_R8; ins->dreg = mono_alloc_freg (cfg); @@ -8100,7 +8415,7 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho } } - if (opcode) { + if (opcode && fsig->param_count == 2) { MONO_INST_NEW (cfg, ins, opcode); ins->type = fsig->params [0]->type == MONO_TYPE_I4 ? STACK_I4 : STACK_I8; ins->dreg = mono_alloc_ireg (cfg); @@ -8111,7 +8426,7 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho #if 0 /* OP_FREM is not IEEE compatible */ - else if (strcmp (cmethod->name, "IEEERemainder") == 0) { + else if (strcmp (cmethod->name, "IEEERemainder") == 0 && fsig->param_count == 2) { MONO_INST_NEW (cfg, ins, OP_FREM); ins->inst_i0 = args [0]; ins->inst_i1 = args [1]; @@ -8119,13 +8434,9 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho #endif } - /* - * Can't implement CompareExchange methods this way since they have - * three arguments. - */ - return ins; } +#endif gboolean mono_arch_print_tree (MonoInst *tree, int arity) @@ -8440,6 +8751,26 @@ mono_arch_opcode_supported (int opcode) case OP_ATOMIC_EXCHANGE_I8: case OP_ATOMIC_CAS_I4: case OP_ATOMIC_CAS_I8: + case OP_ATOMIC_LOAD_I1: + case OP_ATOMIC_LOAD_I2: + case OP_ATOMIC_LOAD_I4: + case OP_ATOMIC_LOAD_I8: + case OP_ATOMIC_LOAD_U1: + case OP_ATOMIC_LOAD_U2: + case OP_ATOMIC_LOAD_U4: + case OP_ATOMIC_LOAD_U8: + case OP_ATOMIC_LOAD_R4: + case OP_ATOMIC_LOAD_R8: + case OP_ATOMIC_STORE_I1: + case OP_ATOMIC_STORE_I2: + case OP_ATOMIC_STORE_I4: + case OP_ATOMIC_STORE_I8: + case OP_ATOMIC_STORE_U1: + case OP_ATOMIC_STORE_U2: + case OP_ATOMIC_STORE_U4: + case OP_ATOMIC_STORE_U8: + case OP_ATOMIC_STORE_R4: + case OP_ATOMIC_STORE_R8: return TRUE; default: return FALSE; diff --git a/mta-mono/vendor/mono/mini/mini-amd64.h b/mta-mono/vendor/mono/mini/mini-amd64.h index dc43eb7..54edae2 100644 --- a/mta-mono/vendor/mono/mini/mini-amd64.h +++ b/mta-mono/vendor/mono/mini/mini-amd64.h @@ -161,9 +161,6 @@ struct sigcontext { * reproduceable results for benchmarks */ #define MONO_ARCH_CODE_ALIGNMENT 32 -#define MONO_ARCH_RETREG1 X86_EAX -#define MONO_ARCH_RETREG2 X86_EDX - /*This is the max size of the locals area of a given frame. I think 1MB is a safe default for now*/ #define MONO_ARCH_MAX_FRAME_SIZE 0x100000 @@ -273,7 +270,7 @@ typedef struct { */ #define MONO_ARCH_VARARG_ICALLS 1 -#if !defined( HOST_WIN32 ) && !defined(__native_client__) && !defined(__native_client_codegen__) +#if (!defined( HOST_WIN32 ) && !defined(__native_client__) && !defined(__native_client_codegen__)) && defined (HAVE_SIGACTION) #define MONO_ARCH_USE_SIGACTION 1 @@ -293,10 +290,12 @@ typedef struct { #define MONO_AMD64_ARG_REG1 AMD64_RCX #define MONO_AMD64_ARG_REG2 AMD64_RDX #define MONO_AMD64_ARG_REG3 AMD64_R8 +#define MONO_AMD64_ARG_REG4 AMD64_R9 #else #define MONO_AMD64_ARG_REG1 AMD64_RDI #define MONO_AMD64_ARG_REG2 AMD64_RSI #define MONO_AMD64_ARG_REG3 AMD64_RDX +#define MONO_AMD64_ARG_REG4 AMD64_RCX #endif #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS @@ -328,6 +327,7 @@ typedef struct { #define MONO_ARCH_HAVE_LIVERANGE_OPS 1 #define MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX 1 #define MONO_ARCH_MONITOR_OBJECT_REG MONO_AMD64_ARG_REG1 +#define MONO_ARCH_MONITOR_LOCK_TAKEN_REG MONO_AMD64_ARG_REG2 #define MONO_ARCH_HAVE_GET_TRAMPOLINES 1 #define MONO_ARCH_AOT_SUPPORTED 1 @@ -335,8 +335,6 @@ typedef struct { #define MONO_ARCH_SOFT_DEBUG_SUPPORTED 1 #endif -#define MONO_ARCH_ENABLE_MONITOR_IL_FASTPATH 1 - #define MONO_ARCH_SUPPORT_TASKLETS 1 #define MONO_ARCH_GSHARED_SUPPORTED 1 diff --git a/mta-mono/vendor/mono/mini/mini-arm.c b/mta-mono/vendor/mono/mini/mini-arm.c index 7e7c593..89d910d 100644 --- a/mta-mono/vendor/mono/mini/mini-arm.c +++ b/mta-mono/vendor/mono/mini/mini-arm.c @@ -14,9 +14,11 @@ #include #include +#include #include #include #include +#include #include "mini-arm.h" #include "cpu-arm.h" @@ -177,30 +179,7 @@ int mono_exc_esp_offset = 0; #define LDR_PC_VAL ((ARMCOND_AL << ARMCOND_SHIFT) | (1 << 26) | (0 << 22) | (1 << 20) | (15 << 12)) #define IS_LDR_PC(val) (((val) & LDR_MASK) == LDR_PC_VAL) -#define ADD_LR_PC_4 ((ARMCOND_AL << ARMCOND_SHIFT) | (1 << 25) | (1 << 23) | (ARMREG_PC << 16) | (ARMREG_LR << 12) | 4) -#define MOV_LR_PC ((ARMCOND_AL << ARMCOND_SHIFT) | (1 << 24) | (0xa << 20) | (ARMREG_LR << 12) | ARMREG_PC) //#define DEBUG_IMT 0 - -/* A variant of ARM_LDR_IMM which can handle large offsets */ -#define ARM_LDR_IMM_GENERAL(code, dreg, basereg, offset, scratch_reg) do { \ - if (arm_is_imm12 ((offset))) { \ - ARM_LDR_IMM (code, (dreg), (basereg), (offset)); \ - } else { \ - g_assert ((scratch_reg) != (basereg)); \ - code = mono_arm_emit_load_imm (code, (scratch_reg), (offset)); \ - ARM_LDR_REG_REG (code, (dreg), (basereg), (scratch_reg)); \ - } \ - } while (0) - -#define ARM_STR_IMM_GENERAL(code, dreg, basereg, offset, scratch_reg) do { \ - if (arm_is_imm12 ((offset))) { \ - ARM_STR_IMM (code, (dreg), (basereg), (offset)); \ - } else { \ - g_assert ((scratch_reg) != (basereg)); \ - code = mono_arm_emit_load_imm (code, (scratch_reg), (offset)); \ - ARM_STR_REG_REG (code, (dreg), (basereg), (scratch_reg)); \ - } \ - } while (0) #ifndef DISABLE_JIT static void mono_arch_compute_omit_fp (MonoCompile *cfg); @@ -429,6 +408,25 @@ emit_move_return_value (MonoCompile *cfg, MonoInst *ins, guint8 *code) } } break; + case OP_RCALL: + case OP_RCALL_REG: + case OP_RCALL_MEMBASE: { + MonoType *sig_ret; + + g_assert (IS_VFP); + + sig_ret = mini_type_get_underlying_type (NULL, ((MonoCallInst*)ins)->signature->ret); + g_assert (sig_ret->type == MONO_TYPE_R4); + if (IS_HARD_FLOAT) { + ARM_CPYS (code, ins->dreg, ARM_VFP_F0); + } else { + ARM_FMSR (code, ins->dreg, ARMREG_R0); + ARM_CPYS (code, ins->dreg, ins->dreg); + } + break; + } + default: + break; } return code; @@ -533,6 +531,8 @@ emit_float_args (MonoCompile *cfg, MonoCallInst *inst, guint8 *code, int *max_le { GSList *list; + g_assert (!cfg->r4fp); + for (list = inst->float_args; list; list = list->next) { FloatArgData *fad = list->data; MonoInst *var = get_vreg_to_inst (cfg, fad->vreg); @@ -727,6 +727,7 @@ get_delegate_invoke_impl (gboolean has_target, gboolean param_count, guint32 *co mono_arch_flush_icache (start, size); } + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_DELEGATE_INVOKE, NULL); if (code_size) *code_size = code - start; @@ -909,6 +910,7 @@ create_function_wrapper (gpointer function) ARM_LDM (code, ARMREG_IP, 0xffff); mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); return start; } @@ -952,12 +954,25 @@ mono_arch_init (void) arm_fpu = MONO_ARM_FPU_VFP; #if defined(ARM_FPU_NONE) && !defined(__APPLE__) - /* If we're compiling with a soft float fallback and it - turns out that no VFP unit is available, we need to - switch to soft float. We don't do this for iOS, since - iOS devices always have a VFP unit. */ + /* + * If we're compiling with a soft float fallback and it + * turns out that no VFP unit is available, we need to + * switch to soft float. We don't do this for iOS, since + * iOS devices always have a VFP unit. + */ if (!mono_hwcap_arm_has_vfp) arm_fpu = MONO_ARM_FPU_NONE; + + /* + * This environment variable can be useful in testing + * environments to make sure the soft float fallback + * works. Most ARM devices have VFP units these days, so + * normally soft float code would not be exercised much. + */ + const char *soft = g_getenv ("MONO_ARM_FORCE_SOFT_FLOAT"); + + if (soft && !strncmp (soft, "1", 1)) + arm_fpu = MONO_ARM_FPU_NONE; #endif #endif @@ -1116,8 +1131,6 @@ mono_arch_get_allocatable_int_vars (MonoCompile *cfg) return vars; } -#define USE_EXTRA_TEMPS 0 - GList * mono_arch_get_global_int_regs (MonoCompile *cfg) { @@ -1183,6 +1196,8 @@ mono_arch_flush_icache (guint8 *code, gint size) #ifdef MONO_CROSS_COMPILE #elif __APPLE__ sys_icache_invalidate (code, size); +#elif __GNUC_PREREQ(4, 3) + __builtin___clear_cache (code, code + size); #elif __GNUC_PREREQ(4, 1) __clear_cache (code, code + size); #elif defined(PLATFORM_ANDROID) @@ -2143,7 +2158,7 @@ mono_arch_create_vars (MonoCompile *cfg) } } - if (cfg->gen_seq_points) { + if (cfg->gen_seq_points_debug_data) { if (cfg->soft_breakpoints) { MonoInst *ins = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL); ins->flags |= MONO_INST_VOLATILE; @@ -2242,18 +2257,8 @@ mono_arch_get_llvm_call_info (MonoCompile *cfg, MonoMethodSignature *sig) linfo->args [i].storage = LLVMArgInIReg; break; case RegTypeStructByVal: - // FIXME: Passing entirely on the stack or split reg/stack - if (ainfo->vtsize == 0 && ainfo->size <= 2) { - linfo->args [i].storage = LLVMArgVtypeInReg; - linfo->args [i].pair_storage [0] = LLVMArgInIReg; - if (ainfo->size == 2) - linfo->args [i].pair_storage [1] = LLVMArgInIReg; - else - linfo->args [i].pair_storage [1] = LLVMArgNone; - } else { - cfg->exception_message = g_strdup_printf ("vtype-by-val on stack"); - cfg->disable_llvm = TRUE; - } + linfo->args [i].storage = LLVMArgAsIArgs; + linfo->args [i].nslots = ainfo->struct_size / sizeof (gpointer); break; default: cfg->exception_message = g_strdup_printf ("ainfo->storage (%d)", ainfo->storage); @@ -3533,7 +3538,8 @@ loop_start: ins->opcode = map_to_reg_reg_op (ins->opcode); last_ins = temp; goto loop_start; /* make it handle the possibly big ins->inst_offset */ - case OP_FCOMPARE: { + case OP_FCOMPARE: + case OP_RCOMPARE: { gboolean swap = FALSE; int reg; @@ -3624,6 +3630,38 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size, return code; } +static guchar* +emit_r4_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size, gboolean is_signed) +{ + /* sreg is a float, dreg is an integer reg */ + g_assert (IS_VFP); + code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1); + if (is_signed) + ARM_TOSIZS (code, vfp_scratch1, sreg); + else + ARM_TOUIZS (code, vfp_scratch1, sreg); + ARM_FMRS (code, dreg, vfp_scratch1); + code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1); + + if (!is_signed) { + if (size == 1) + ARM_AND_REG_IMM8 (code, dreg, dreg, 0xff); + else if (size == 2) { + ARM_SHL_IMM (code, dreg, dreg, 16); + ARM_SHR_IMM (code, dreg, dreg, 16); + } + } else { + if (size == 1) { + ARM_SHL_IMM (code, dreg, dreg, 24); + ARM_SAR_IMM (code, dreg, dreg, 24); + } else if (size == 2) { + ARM_SHL_IMM (code, dreg, dreg, 16); + ARM_SAR_IMM (code, dreg, dreg, 16); + } + } + return code; +} + #endif /* #ifndef DISABLE_JIT */ typedef struct { @@ -4251,7 +4289,94 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ARM_MOV_REG_REG (code, ins->dreg, ARMREG_LR); break; } + case OP_ATOMIC_LOAD_I1: + case OP_ATOMIC_LOAD_U1: + case OP_ATOMIC_LOAD_I2: + case OP_ATOMIC_LOAD_U2: + case OP_ATOMIC_LOAD_I4: + case OP_ATOMIC_LOAD_U4: + case OP_ATOMIC_LOAD_R4: + case OP_ATOMIC_LOAD_R8: { + if (ins->backend.memory_barrier_kind == MONO_MEMORY_BARRIER_SEQ) + ARM_DMB (code, ARM_DMB_SY); + code = mono_arm_emit_load_imm (code, ARMREG_LR, ins->inst_offset); + + switch (ins->opcode) { + case OP_ATOMIC_LOAD_I1: + ARM_LDRSB_REG_REG (code, ins->dreg, ins->inst_basereg, ARMREG_LR); + break; + case OP_ATOMIC_LOAD_U1: + ARM_LDRB_REG_REG (code, ins->dreg, ins->inst_basereg, ARMREG_LR); + break; + case OP_ATOMIC_LOAD_I2: + ARM_LDRSH_REG_REG (code, ins->dreg, ins->inst_basereg, ARMREG_LR); + break; + case OP_ATOMIC_LOAD_U2: + ARM_LDRH_REG_REG (code, ins->dreg, ins->inst_basereg, ARMREG_LR); + break; + case OP_ATOMIC_LOAD_I4: + case OP_ATOMIC_LOAD_U4: + ARM_LDR_REG_REG (code, ins->dreg, ins->inst_basereg, ARMREG_LR); + break; + case OP_ATOMIC_LOAD_R4: + code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1); + ARM_ADD_REG_REG (code, ARMREG_LR, ins->inst_basereg, ARMREG_LR); + ARM_FLDS (code, vfp_scratch1, ARMREG_LR, 0); + ARM_CVTS (code, ins->dreg, vfp_scratch1); + code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1); + break; + case OP_ATOMIC_LOAD_R8: + ARM_ADD_REG_REG (code, ARMREG_LR, ins->inst_basereg, ARMREG_LR); + ARM_FLDD (code, ins->dreg, ARMREG_LR, 0); + break; + } + + ARM_DMB (code, ARM_DMB_SY); + break; + } + case OP_ATOMIC_STORE_I1: + case OP_ATOMIC_STORE_U1: + case OP_ATOMIC_STORE_I2: + case OP_ATOMIC_STORE_U2: + case OP_ATOMIC_STORE_I4: + case OP_ATOMIC_STORE_U4: + case OP_ATOMIC_STORE_R4: + case OP_ATOMIC_STORE_R8: { + ARM_DMB (code, ARM_DMB_SY); + + code = mono_arm_emit_load_imm (code, ARMREG_LR, ins->inst_offset); + + switch (ins->opcode) { + case OP_ATOMIC_STORE_I1: + case OP_ATOMIC_STORE_U1: + ARM_STRB_REG_REG (code, ins->sreg1, ins->inst_destbasereg, ARMREG_LR); + break; + case OP_ATOMIC_STORE_I2: + case OP_ATOMIC_STORE_U2: + ARM_STRH_REG_REG (code, ins->sreg1, ins->inst_destbasereg, ARMREG_LR); + break; + case OP_ATOMIC_STORE_I4: + case OP_ATOMIC_STORE_U4: + ARM_STR_REG_REG (code, ins->sreg1, ins->inst_destbasereg, ARMREG_LR); + break; + case OP_ATOMIC_STORE_R4: + code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1); + ARM_ADD_REG_REG (code, ARMREG_LR, ins->inst_destbasereg, ARMREG_LR); + ARM_CVTD (code, vfp_scratch1, ins->sreg1); + ARM_FSTS (code, vfp_scratch1, ARMREG_LR, 0); + code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1); + break; + case OP_ATOMIC_STORE_R8: + ARM_ADD_REG_REG (code, ARMREG_LR, ins->inst_destbasereg, ARMREG_LR); + ARM_FSTD (code, ins->sreg1, ARMREG_LR, 0); + break; + } + + if (ins->backend.memory_barrier_kind == MONO_MEMORY_BARRIER_SEQ) + ARM_DMB (code, ARM_DMB_SY); + break; + } /*case OP_BIGMUL: ppc_mullw (code, ppc_r4, ins->sreg1, ins->sreg2); ppc_mulhw (code, ppc_r3, ins->sreg1, ins->sreg2); @@ -4400,6 +4525,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_NOT_REACHED: case OP_NOT_NULL: break; + case OP_IL_SEQ_POINT: + mono_add_seq_point (cfg, bb, ins, code - cfg->native_code); + break; case OP_SEQ_POINT: { int i; MonoInst *info_var = cfg->arch.seq_point_info_var; @@ -4771,13 +4899,27 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; } case OP_FMOVE: - if (IS_VFP) + if (IS_VFP && ins->dreg != ins->sreg1) ARM_CPYD (code, ins->dreg, ins->sreg1); break; + case OP_MOVE_F_TO_I4: + code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1); + ARM_CVTD (code, vfp_scratch1, ins->sreg1); + ARM_FMRS (code, ins->dreg, vfp_scratch1); + code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1); + break; + case OP_MOVE_I4_TO_F: + ARM_FMSR (code, ins->dreg, ins->sreg1); + ARM_CVTS (code, ins->dreg, ins->dreg); + break; case OP_FCONV_TO_R4: if (IS_VFP) { - ARM_CVTD (code, ins->dreg, ins->sreg1); - ARM_CVTS (code, ins->dreg, ins->dreg); + if (cfg->r4fp) { + ARM_CVTD (code, ins->dreg, ins->sreg1); + } else { + ARM_CVTD (code, ins->dreg, ins->sreg1); + ARM_CVTS (code, ins->dreg, ins->dreg); + } } break; case OP_JMP: @@ -4878,6 +5020,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; } case OP_FCALL: + case OP_RCALL: case OP_LCALL: case OP_VCALL: case OP_VCALL2: @@ -4898,6 +5041,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) code = emit_move_return_value (cfg, ins, code); break; case OP_FCALL_REG: + case OP_RCALL_REG: case OP_LCALL_REG: case OP_VCALL_REG: case OP_VCALL2_REG: @@ -4912,6 +5056,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) code = emit_move_return_value (cfg, ins, code); break; case OP_FCALL_MEMBASE: + case OP_RCALL_MEMBASE: case OP_LCALL_MEMBASE: case OP_VCALL_MEMBASE: case OP_VCALL2_MEMBASE: @@ -5205,10 +5350,13 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ARM_MOV_REG_IMM8_COND (code, ins->dreg, 0, ARMCOND_GT); break; case OP_ICGE_UN: - case OP_ICLE_UN: ARM_MOV_REG_IMM8 (code, ins->dreg, 1); ARM_MOV_REG_IMM8_COND (code, ins->dreg, 0, ARMCOND_LO); break; + case OP_ICLE_UN: + ARM_MOV_REG_IMM8 (code, ins->dreg, 1); + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 0, ARMCOND_HI); + break; case OP_COND_EXC_EQ: case OP_COND_EXC_NE_UN: case OP_COND_EXC_LT: @@ -5285,11 +5433,13 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ARM_B (code, 0); *(guint32*)code = ((guint32*)(ins->inst_p0))[0]; code += 4; - ARM_CVTS (code, ins->dreg, ins->dreg); + if (!cfg->r4fp) + ARM_CVTS (code, ins->dreg, ins->dreg); } else { code = mono_arm_emit_load_imm (code, ARMREG_LR, (guint32)ins->inst_p0); ARM_FLDS (code, ins->dreg, ARMREG_LR, 0); - ARM_CVTS (code, ins->dreg, ins->dreg); + if (!cfg->r4fp) + ARM_CVTS (code, ins->dreg, ins->dreg); } break; case OP_STORER8_MEMBASE_REG: @@ -5314,28 +5464,41 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_STORER4_MEMBASE_REG: g_assert (arm_is_fpimm8 (ins->inst_offset)); - code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1); - ARM_CVTD (code, vfp_scratch1, ins->sreg1); - ARM_FSTS (code, vfp_scratch1, ins->inst_destbasereg, ins->inst_offset); - code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1); + if (cfg->r4fp) { + ARM_FSTS (code, ins->sreg1, ins->inst_destbasereg, ins->inst_offset); + } else { + code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1); + ARM_CVTD (code, vfp_scratch1, ins->sreg1); + ARM_FSTS (code, vfp_scratch1, ins->inst_destbasereg, ins->inst_offset); + code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1); + } break; case OP_LOADR4_MEMBASE: - g_assert (arm_is_fpimm8 (ins->inst_offset)); - code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1); - ARM_FLDS (code, vfp_scratch1, ins->inst_basereg, ins->inst_offset); - ARM_CVTS (code, ins->dreg, vfp_scratch1); - code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1); + if (cfg->r4fp) { + ARM_FLDS (code, ins->dreg, ins->inst_basereg, ins->inst_offset); + } else { + g_assert (arm_is_fpimm8 (ins->inst_offset)); + code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1); + ARM_FLDS (code, vfp_scratch1, ins->inst_basereg, ins->inst_offset); + ARM_CVTS (code, ins->dreg, vfp_scratch1); + code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1); + } break; case OP_ICONV_TO_R_UN: { g_assert_not_reached (); break; } case OP_ICONV_TO_R4: - code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1); - ARM_FMSR (code, vfp_scratch1, ins->sreg1); - ARM_FSITOS (code, vfp_scratch1, vfp_scratch1); - ARM_CVTS (code, ins->dreg, vfp_scratch1); - code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1); + if (cfg->r4fp) { + ARM_FMSR (code, ins->dreg, ins->sreg1); + ARM_FSITOS (code, ins->dreg, ins->dreg); + } else { + code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1); + ARM_FMSR (code, vfp_scratch1, ins->sreg1); + ARM_FSITOS (code, vfp_scratch1, vfp_scratch1); + ARM_CVTS (code, ins->dreg, vfp_scratch1); + code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1); + } break; case OP_ICONV_TO_R8: code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1); @@ -5347,17 +5510,20 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_SETFRET: { MonoType *sig_ret = mini_type_get_underlying_type (NULL, mono_method_signature (cfg->method)->ret); if (sig_ret->type == MONO_TYPE_R4) { - ARM_CVTD (code, ARM_VFP_F0, ins->sreg1); + if (cfg->r4fp) { + g_assert (!IS_HARD_FLOAT); + ARM_FMRS (code, ARMREG_R0, ins->sreg1); + } else { + ARM_CVTD (code, ARM_VFP_F0, ins->sreg1); - if (!IS_HARD_FLOAT) { - ARM_FMRS (code, ARMREG_R0, ARM_VFP_F0); + if (!IS_HARD_FLOAT) + ARM_FMRS (code, ARMREG_R0, ARM_VFP_F0); } } else { - if (IS_HARD_FLOAT) { + if (IS_HARD_FLOAT) ARM_CPYD (code, ARM_VFP_D0, ins->sreg1); - } else { + else ARM_FMRRD (code, ARMREG_R0, ARMREG_R1, ins->sreg1); - } } break; } @@ -5447,6 +5613,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ARM_FMSTAT (code); } break; + case OP_RCOMPARE: + g_assert (IS_VFP); + ARM_CMPS (code, ins->sreg1, ins->sreg2); + ARM_FMSTAT (code); + break; case OP_FCEQ: if (IS_VFP) { ARM_CMPD (code, ins->sreg1, ins->sreg2); @@ -5589,6 +5760,115 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; } + case OP_RCONV_TO_I1: + code = emit_r4_to_int (cfg, code, ins->dreg, ins->sreg1, 1, TRUE); + break; + case OP_RCONV_TO_U1: + code = emit_r4_to_int (cfg, code, ins->dreg, ins->sreg1, 1, FALSE); + break; + case OP_RCONV_TO_I2: + code = emit_r4_to_int (cfg, code, ins->dreg, ins->sreg1, 2, TRUE); + break; + case OP_RCONV_TO_U2: + code = emit_r4_to_int (cfg, code, ins->dreg, ins->sreg1, 2, FALSE); + break; + case OP_RCONV_TO_I4: + code = emit_r4_to_int (cfg, code, ins->dreg, ins->sreg1, 4, TRUE); + break; + case OP_RCONV_TO_U4: + code = emit_r4_to_int (cfg, code, ins->dreg, ins->sreg1, 4, FALSE); + break; + case OP_RCONV_TO_R4: + g_assert (IS_VFP); + if (ins->dreg != ins->sreg1) + ARM_CPYS (code, ins->dreg, ins->sreg1); + break; + case OP_RCONV_TO_R8: + g_assert (IS_VFP); + ARM_CVTS (code, ins->dreg, ins->sreg1); + break; + case OP_RADD: + ARM_VFP_ADDS (code, ins->dreg, ins->sreg1, ins->sreg2); + break; + case OP_RSUB: + ARM_VFP_SUBS (code, ins->dreg, ins->sreg1, ins->sreg2); + break; + case OP_RMUL: + ARM_VFP_MULS (code, ins->dreg, ins->sreg1, ins->sreg2); + break; + case OP_RDIV: + ARM_VFP_DIVS (code, ins->dreg, ins->sreg1, ins->sreg2); + break; + case OP_RNEG: + ARM_NEGS (code, ins->dreg, ins->sreg1); + break; + case OP_RCEQ: + if (IS_VFP) { + ARM_CMPS (code, ins->sreg1, ins->sreg2); + ARM_FMSTAT (code); + } + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 0, ARMCOND_NE); + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 1, ARMCOND_EQ); + break; + case OP_RCLT: + if (IS_VFP) { + ARM_CMPS (code, ins->sreg1, ins->sreg2); + ARM_FMSTAT (code); + } + ARM_MOV_REG_IMM8 (code, ins->dreg, 0); + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 1, ARMCOND_MI); + break; + case OP_RCLT_UN: + if (IS_VFP) { + ARM_CMPS (code, ins->sreg1, ins->sreg2); + ARM_FMSTAT (code); + } + ARM_MOV_REG_IMM8 (code, ins->dreg, 0); + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 1, ARMCOND_MI); + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 1, ARMCOND_VS); + break; + case OP_RCGT: + if (IS_VFP) { + ARM_CMPS (code, ins->sreg2, ins->sreg1); + ARM_FMSTAT (code); + } + ARM_MOV_REG_IMM8 (code, ins->dreg, 0); + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 1, ARMCOND_MI); + break; + case OP_RCGT_UN: + if (IS_VFP) { + ARM_CMPS (code, ins->sreg2, ins->sreg1); + ARM_FMSTAT (code); + } + ARM_MOV_REG_IMM8 (code, ins->dreg, 0); + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 1, ARMCOND_MI); + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 1, ARMCOND_VS); + break; + case OP_RCNEQ: + if (IS_VFP) { + ARM_CMPS (code, ins->sreg1, ins->sreg2); + ARM_FMSTAT (code); + } + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 1, ARMCOND_NE); + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 0, ARMCOND_EQ); + break; + case OP_RCGE: + if (IS_VFP) { + ARM_CMPS (code, ins->sreg1, ins->sreg2); + ARM_FMSTAT (code); + } + ARM_MOV_REG_IMM8 (code, ins->dreg, 1); + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 0, ARMCOND_MI); + break; + case OP_RCLE: + if (IS_VFP) { + ARM_CMPS (code, ins->sreg2, ins->sreg1); + ARM_FMSTAT (code); + } + ARM_MOV_REG_IMM8 (code, ins->dreg, 1); + ARM_MOV_REG_IMM8_COND (code, ins->dreg, 0, ARMCOND_MI); + break; + case OP_GC_LIVENESS_DEF: case OP_GC_LIVENESS_USE: case OP_GC_PARAM_SLOT_LIVENESS_DEF: @@ -6918,6 +7198,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI #endif mono_arch_flush_icache ((guint8*)start, size); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, NULL); mono_stats.imt_thunks_size += code - start; g_assert (DISTANCE (start, code) <= size); @@ -7249,7 +7530,24 @@ mono_arch_opcode_supported (int opcode) case OP_ATOMIC_ADD_I4: case OP_ATOMIC_EXCHANGE_I4: case OP_ATOMIC_CAS_I4: + case OP_ATOMIC_LOAD_I1: + case OP_ATOMIC_LOAD_I2: + case OP_ATOMIC_LOAD_I4: + case OP_ATOMIC_LOAD_U1: + case OP_ATOMIC_LOAD_U2: + case OP_ATOMIC_LOAD_U4: + case OP_ATOMIC_STORE_I1: + case OP_ATOMIC_STORE_I2: + case OP_ATOMIC_STORE_I4: + case OP_ATOMIC_STORE_U1: + case OP_ATOMIC_STORE_U2: + case OP_ATOMIC_STORE_U4: return v7_supported; + case OP_ATOMIC_LOAD_R4: + case OP_ATOMIC_LOAD_R8: + case OP_ATOMIC_STORE_R4: + case OP_ATOMIC_STORE_R8: + return v7_supported && IS_VFP; default: return FALSE; } diff --git a/mta-mono/vendor/mono/mini/mini-arm.h b/mta-mono/vendor/mono/mini/mini-arm.h index f22514b..e9f9901 100644 --- a/mta-mono/vendor/mono/mini/mini-arm.h +++ b/mta-mono/vendor/mono/mini/mini-arm.h @@ -242,7 +242,6 @@ typedef struct MonoCompileArch { #define MONO_ARCH_EMULATE_DIV 1 #define MONO_ARCH_EMULATE_CONV_R8_UN 1 #define MONO_ARCH_EMULATE_MUL_OVF 1 -//#define MONO_ARCH_BIGMUL_INTRINS 1 #define ARM_FIRST_ARG_REG 0 #define ARM_LAST_ARG_REG 3 @@ -258,9 +257,6 @@ typedef struct MonoCompileArch { #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE #define MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK 1 -#define ARM_NUM_REG_ARGS (ARM_LAST_ARG_REG-ARM_FIRST_ARG_REG+1) -#define ARM_NUM_REG_FPARGS 0 - #define MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES 1 #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1 diff --git a/mta-mono/vendor/mono/mini/mini-codegen.c b/mta-mono/vendor/mono/mini/mini-codegen.c index f4bdecb..92a2272 100644 --- a/mta-mono/vendor/mono/mini/mini-codegen.c +++ b/mta-mono/vendor/mono/mini/mini-codegen.c @@ -580,6 +580,7 @@ mono_print_ins_index (int i, MonoInst *ins) case OP_IOR_IMM: case OP_IXOR_IMM: case OP_SUB_IMM: + case OP_STORE_MEMBASE_IMM: printf (" [%d]", (int)ins->inst_imm); break; case OP_ADD_IMM: @@ -686,6 +687,7 @@ mono_print_ins_index (int i, MonoInst *ins) case OP_GC_LIVENESS_USE: printf (" R%d", (int)ins->inst_c1); break; + case OP_IL_SEQ_POINT: case OP_SEQ_POINT: printf (" il: %x", (int)ins->inst_imm); break; @@ -2354,6 +2356,8 @@ mono_opcode_to_cond (int opcode) case OP_LCEQ: case OP_FBEQ: case OP_FCEQ: + case OP_RBEQ: + case OP_RCEQ: case OP_COND_EXC_EQ: case OP_COND_EXC_IEQ: case OP_CMOV_IEQ: @@ -2392,6 +2396,8 @@ mono_opcode_to_cond (int opcode) case OP_LCLT: case OP_FBLT: case OP_FCLT: + case OP_RBLT: + case OP_RCLT: case OP_COND_EXC_LT: case OP_COND_EXC_ILT: case OP_CMOV_ILT: @@ -2404,6 +2410,8 @@ mono_opcode_to_cond (int opcode) case OP_LCGT: case OP_FBGT: case OP_FCGT: + case OP_RBGT: + case OP_RCGT: case OP_COND_EXC_GT: case OP_COND_EXC_IGT: case OP_CMOV_IGT: @@ -2434,6 +2442,8 @@ mono_opcode_to_cond (int opcode) case OP_LCLT_UN: case OP_FBLT_UN: case OP_FCLT_UN: + case OP_RBLT_UN: + case OP_RCLT_UN: case OP_COND_EXC_LT_UN: case OP_COND_EXC_ILT_UN: case OP_CMOV_ILT_UN: @@ -2446,6 +2456,8 @@ mono_opcode_to_cond (int opcode) case OP_LCGT_UN: case OP_FCGT_UN: case OP_FBGT_UN: + case OP_RCGT_UN: + case OP_RBGT_UN: case OP_COND_EXC_GT_UN: case OP_COND_EXC_IGT_UN: case OP_CMOV_IGT_UN: @@ -2573,7 +2585,8 @@ mono_is_regsize_var (MonoType *t) void mono_peephole_ins (MonoBasicBlock *bb, MonoInst *ins) { - MonoInst *last_ins = ins->prev; + int filter = FILTER_IL_SEQ_POINT; + MonoInst *last_ins = mono_inst_prev (ins, filter); switch (ins->opcode) { case OP_MUL_IMM: @@ -2597,7 +2610,7 @@ mono_peephole_ins (MonoBasicBlock *bb, MonoInst *ins) * OP_MOVE reg1, reg2 */ if (last_ins && last_ins->opcode == OP_GC_LIVENESS_DEF) - last_ins = last_ins->prev; + last_ins = mono_inst_prev (ins, filter); if (last_ins && (((ins->opcode == OP_LOADI4_MEMBASE) && (last_ins->opcode == OP_STOREI4_MEMBASE_REG)) || ((ins->opcode == OP_LOAD_MEMBASE) && (last_ins->opcode == OP_STORE_MEMBASE_REG))) && @@ -2747,4 +2760,53 @@ mini_exception_id_by_name (const char *name) return -1; } +gboolean +mini_type_is_hfa (MonoType *t, int *out_nfields, int *out_esize) +{ + MonoClass *klass; + gpointer iter; + MonoClassField *field; + MonoType *ftype, *prev_ftype = NULL; + int nfields = 0; + + klass = mono_class_from_mono_type (t); + iter = NULL; + while ((field = mono_class_get_fields (klass, &iter))) { + if (field->type->attrs & FIELD_ATTRIBUTE_STATIC) + continue; + ftype = mono_field_get_type (field); + ftype = mini_native_type_replace_type (ftype); + + if (MONO_TYPE_ISSTRUCT (ftype)) { + int nested_nfields, nested_esize; + + if (!mini_type_is_hfa (ftype, &nested_nfields, &nested_esize)) + return FALSE; + if (nested_esize == 4) + ftype = &mono_defaults.single_class->byval_arg; + else + ftype = &mono_defaults.double_class->byval_arg; + if (prev_ftype && prev_ftype->type != ftype->type) + return FALSE; + prev_ftype = ftype; + nfields += nested_nfields; + // FIXME: Nested float structs are aligned to 8 bytes + if (ftype->type == MONO_TYPE_R4) + return FALSE; + } else { + if (!(!ftype->byref && (ftype->type == MONO_TYPE_R4 || ftype->type == MONO_TYPE_R8))) + return FALSE; + if (prev_ftype && prev_ftype->type != ftype->type) + return FALSE; + prev_ftype = ftype; + nfields ++; + } + } + if (nfields == 0 || nfields > 4) + return FALSE; + *out_nfields = nfields; + *out_esize = prev_ftype->type == MONO_TYPE_R4 ? 4 : 8; + return TRUE; +} + #endif /* DISABLE_JIT */ diff --git a/mta-mono/vendor/mono/mini/mini-exceptions.c b/mta-mono/vendor/mono/mini/mini-exceptions.c index db4a1ce..47162f8 100644 --- a/mta-mono/vendor/mono/mini/mini-exceptions.c +++ b/mta-mono/vendor/mono/mini/mini-exceptions.c @@ -12,9 +12,12 @@ #include #include -#include #include +#ifdef HAVE_SIGNAL_H +#include +#endif + #ifdef HAVE_EXECINFO_H #include #endif @@ -52,6 +55,11 @@ #include "mini.h" #include "trace.h" #include "debugger-agent.h" +#include "seq-points.h" + +#ifdef ENABLE_EXTENSION_MODULE +#include "../../../mono-extensions/mono/mini/mini-exceptions.c" +#endif #ifndef MONO_ARCH_CONTEXT_DEF #define MONO_ARCH_CONTEXT_DEF @@ -546,6 +554,7 @@ get_generic_context_from_stack_frame (MonoJitInfo *ji, gpointer generic_info) static MonoMethod* get_method_from_stack_frame (MonoJitInfo *ji, gpointer generic_info) { + MonoError error; MonoGenericContext context; MonoMethod *method; @@ -555,7 +564,8 @@ get_method_from_stack_frame (MonoJitInfo *ji, gpointer generic_info) method = jinfo_get_method (ji); method = mono_method_get_declaring_generic_method (method); - method = mono_class_inflate_generic_method (method, &context); + method = mono_class_inflate_generic_method_checked (method, &context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ return method; } @@ -690,6 +700,7 @@ ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info } else MONO_OBJECT_SETREF (sf, method, mono_method_get_object (domain, method, NULL)); + sf->method_address = (gsize) ji->code_start; sf->native_offset = (char *)ip - (char *)ji->code_start; /* @@ -698,10 +709,15 @@ ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info * operation, so we shouldn't call this method twice. */ location = mono_debug_lookup_source_location (jinfo_get_method (ji), sf->native_offset, domain); - if (location) + if (location) { sf->il_offset = location->il_offset; - else - sf->il_offset = 0; + } else { + SeqPoint sp; + if (find_prev_seq_point_for_native_offset (domain, jinfo_get_method (ji), sf->native_offset, NULL, &sp)) + sf->il_offset = sp.il_offset; + else + sf->il_offset = 0; + } if (need_file_info) { if (location && location->source_file) { @@ -852,7 +868,15 @@ mono_walk_stack_full (MonoJitStackWalk func, MonoContext *start_ctx, MonoDomain MonoDebugSourceLocation *source; source = mono_debug_lookup_source_location (jinfo_get_method (frame.ji), frame.native_offset, domain); - il_offset = source ? source->il_offset : -1; + if (source) { + il_offset = source->il_offset; + } else { + SeqPoint sp; + if (find_prev_seq_point_for_native_offset (domain, jinfo_get_method (frame.ji), frame.native_offset, NULL, &sp)) + il_offset = sp.il_offset; + else + il_offset = -1; + } mono_debug_free_source_location (source); } else il_offset = -1; @@ -2076,7 +2100,7 @@ mono_altstack_restore_prot (mgreg_t *regs, guint8 *code, gpointer *tramp_data, g } gboolean -mono_handle_soft_stack_ovf (MonoJitTlsData *jit_tls, MonoJitInfo *ji, void *ctx, guint8* fault_addr) +mono_handle_soft_stack_ovf (MonoJitTlsData *jit_tls, MonoJitInfo *ji, void *ctx, MONO_SIG_HANDLER_INFO_TYPE *siginfo, guint8* fault_addr) { /* we got a stack overflow in the soft-guard pages * There are two cases: @@ -2104,7 +2128,7 @@ mono_handle_soft_stack_ovf (MonoJitTlsData *jit_tls, MonoJitInfo *ji, void *ctx, mono_mprotect ((char*)jit_tls->stack_ovf_guard_base + jit_tls->stack_ovf_guard_size - guard_size, guard_size, MONO_MMAP_READ|MONO_MMAP_WRITE); #ifdef MONO_ARCH_SIGSEGV_ON_ALTSTACK if (ji) { - mono_arch_handle_altstack_exception (ctx, fault_addr, TRUE); + mono_arch_handle_altstack_exception (ctx, siginfo, fault_addr, TRUE); handled = TRUE; } #endif @@ -2183,7 +2207,7 @@ mono_handle_hard_stack_ovf (MonoJitTlsData *jit_tls, MonoJitInfo *ji, void *ctx, mono_runtime_printf_err ("Stack overflow: IP: %p, fault addr: %p", mono_arch_ip_from_context (ctx), fault_addr); #ifdef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX - mono_arch_sigctx_to_monoctx (ctx, &mctx); + mono_sigctx_to_monoctx (ctx, &mctx); mono_runtime_printf_err ("Stacktrace:"); @@ -2248,7 +2272,7 @@ static gboolean handling_sigsegv = FALSE; * information and aborting. */ void -mono_handle_native_sigsegv (int signal, void *ctx) +mono_handle_native_sigsegv (int signal, void *ctx, MONO_SIG_HANDLER_INFO_TYPE *info) { #ifdef MONO_ARCH_USE_SIGACTION struct sigaction sa; @@ -2324,6 +2348,8 @@ mono_handle_native_sigsegv (int signal, void *ctx) } #endif } +#elif defined (ENABLE_EXTENSION_MODULE) + mono_extension_handle_native_sigsegv (ctx, info); #endif /* @@ -2365,7 +2391,7 @@ mono_handle_native_sigsegv (int signal, void *ctx) #else void -mono_handle_native_sigsegv (int signal, void *ctx) +mono_handle_native_sigsegv (int signal, void *ctx, MONO_SIG_HANDLER_INFO_TYPE *info) { g_assert_not_reached (); } @@ -2379,13 +2405,17 @@ mono_print_thread_dump_internal (void *sigctx, MonoContext *start_ctx) #ifdef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX MonoContext ctx; #endif - GString* text = g_string_new (0); + GString* text; char *name; #ifndef HOST_WIN32 char *wapi_desc; #endif GError *error = NULL; + if (!thread) + return; + + text = g_string_new (0); if (thread->name) { name = g_utf16_to_utf8 (thread->name, thread->name_len, NULL, NULL, &error); g_assert (!error); @@ -2409,7 +2439,7 @@ mono_print_thread_dump_internal (void *sigctx, MonoContext *start_ctx) } else if (!sigctx) MONO_INIT_CONTEXT_FROM_FUNC (&ctx, mono_print_thread_dump); else - mono_arch_sigctx_to_monoctx (sigctx, &ctx); + mono_sigctx_to_monoctx (sigctx, &ctx); mono_walk_stack_with_ctx (print_stack_frame_to_string, &ctx, MONO_UNWIND_LOOKUP_ALL, text); #else @@ -2606,7 +2636,7 @@ mono_thread_state_init_from_sigctx (MonoThreadUnwindState *ctx, void *sigctx) } if (sigctx) - mono_arch_sigctx_to_monoctx (sigctx, &ctx->ctx); + mono_sigctx_to_monoctx (sigctx, &ctx->ctx); else #if MONO_ARCH_HAS_MONO_CONTEXT && !defined(MONO_CROSS_COMPILE) MONO_CONTEXT_GET_CURRENT (ctx->ctx); diff --git a/mta-mono/vendor/mono/mini/mini-gc.c b/mta-mono/vendor/mono/mini/mini-gc.c index a528b3f..fddca9c 100644 --- a/mta-mono/vendor/mono/mini/mini-gc.c +++ b/mta-mono/vendor/mono/mini/mini-gc.c @@ -12,8 +12,8 @@ #include "mini-gc.h" #include -//#if 0 -#if defined(MONO_ARCH_GC_MAPS_SUPPORTED) +#if 0 +//#if defined(MONO_ARCH_GC_MAPS_SUPPORTED) #include #include @@ -436,6 +436,13 @@ static int callee_saved_regs [] = { ARMREG_V1, ARMREG_V2, ARMREG_V3, ARMREG_V4, static int callee_saved_regs [] = { }; #elif defined(TARGET_S390X) static int callee_saved_regs [] = { s390_r6, s390_r7, s390_r8, s390_r9, s390_r10, s390_r11, s390_r12, s390_r13, s390_r14 }; +#elif defined(TARGET_POWERPC64) && _CALL_ELF == 2 +static int callee_saved_regs [] = { + ppc_r13, ppc_r14, ppc_r15, ppc_r16, + ppc_r17, ppc_r18, ppc_r19, ppc_r20, + ppc_r21, ppc_r22, ppc_r23, ppc_r24, + ppc_r25, ppc_r26, ppc_r27, ppc_r28, + ppc_r29, ppc_r30, ppc_r31 }; #elif defined(TARGET_POWERPC) static int callee_saved_regs [] = { ppc_r6, ppc_r7, ppc_r8, ppc_r9, ppc_r10, ppc_r11, ppc_r12, ppc_r13, ppc_r14 }; #endif @@ -609,7 +616,7 @@ thread_suspend_func (gpointer user_data, void *sigctx, MonoContext *ctx) tls->unwind_state.unwind_data [MONO_UNWIND_DATA_LMF] = mono_get_lmf (); if (sigctx) { #ifdef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX - mono_arch_sigctx_to_monoctx (sigctx, &tls->unwind_state.ctx); + mono_sigctx_to_monoctx (sigctx, &tls->unwind_state.ctx); tls->unwind_state.valid = TRUE; #else tls->unwind_state.valid = FALSE; diff --git a/mta-mono/vendor/mono/mini/mini-generic-sharing.c b/mta-mono/vendor/mono/mini/mini-generic-sharing.c index 4c42fd9..958c894 100644 --- a/mta-mono/vendor/mono/mini/mini-generic-sharing.c +++ b/mta-mono/vendor/mono/mini/mini-generic-sharing.c @@ -498,12 +498,14 @@ mono_class_get_method_generic (MonoClass *klass, MonoMethod *method) } if (method != declaring) { + MonoError error; MonoGenericContext context; context.class_inst = NULL; context.method_inst = mono_method_get_context (method)->method_inst; - m = mono_class_inflate_generic_method (m, &context); + m = mono_class_inflate_generic_method_checked (m, &context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } return m; @@ -565,7 +567,9 @@ inflate_info (MonoRuntimeGenericContextInfoTemplate *oti, MonoGenericContext *co inflated_method = mono_method_search_in_array_class (inflated_class, method->name, method->signature); } else { - inflated_method = mono_class_inflate_generic_method (method, context); + MonoError error; + inflated_method = mono_class_inflate_generic_method_checked (method, context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } mono_class_init (inflated_method->klass); g_assert (inflated_method->klass == inflated_class); @@ -620,7 +624,9 @@ inflate_info (MonoRuntimeGenericContextInfoTemplate *oti, MonoGenericContext *co inflated_method = mono_method_search_in_array_class (inflated_class, method->name, method->signature); } else { - inflated_method = mono_class_inflate_generic_method (method, context); + MonoError error; + inflated_method = mono_class_inflate_generic_method_checked (method, context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } mono_class_init (inflated_method->klass); g_assert (inflated_method->klass == inflated_class); diff --git a/mta-mono/vendor/mono/mini/mini-ia64.h b/mta-mono/vendor/mono/mini/mini-ia64.h index 15bb596..928ccfb 100644 --- a/mta-mono/vendor/mono/mini/mini-ia64.h +++ b/mta-mono/vendor/mono/mini/mini-ia64.h @@ -41,9 +41,6 @@ #define MONO_ARCH_CODE_ALIGNMENT 16 -#define MONO_ARCH_RETREG1 IA64_R8 -#define MONO_ARCH_FRETREG1 8 - #define MONO_ARCH_SIGNAL_STACK_SIZE SIGSTKSZ struct MonoLMF { @@ -106,7 +103,6 @@ unw_dyn_region_info_t* mono_ia64_create_unwind_region (Ia64CodegenState *code); #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1 #define MONO_ARCH_EMULATE_FREM 1 #define MONO_ARCH_EMULATE_MUL_DIV 1 -#define MONO_ARCH_EMULATE_LONG_MUL_OPTS 1 #define MONO_ARCH_NEED_DIV_CHECK 1 #define MONO_ARCH_HAVE_IS_INT_OVERFLOW 1 diff --git a/mta-mono/vendor/mono/mini/mini-llvm-cpp.cpp b/mta-mono/vendor/mono/mini/mini-llvm-cpp.cpp index 7560fcf..f11db19 100644 --- a/mta-mono/vendor/mono/mini/mini-llvm-cpp.cpp +++ b/mta-mono/vendor/mono/mini/mini-llvm-cpp.cpp @@ -60,10 +60,6 @@ #include "mini-llvm-cpp.h" -#define LLVM_CHECK_VERSION(major,minor) \ - ((LLVM_MAJOR_VERSION > (major)) || \ - ((LLVM_MAJOR_VERSION == (major)) && (LLVM_MINOR_VERSION >= (minor)))) - // extern "C" void LLVMInitializeARMTargetInfo(); // extern "C" void LLVMInitializeARMTarget (); // extern "C" void LLVMInitializeARMTargetMC (); @@ -322,9 +318,25 @@ mono_llvm_build_alloca (LLVMBuilderRef builder, LLVMTypeRef Ty, LLVMValueRef mono_llvm_build_load (LLVMBuilderRef builder, LLVMValueRef PointerVal, - const char *Name, gboolean is_volatile) + const char *Name, gboolean is_volatile, BarrierKind barrier) { - return wrap(unwrap(builder)->CreateLoad(unwrap(PointerVal), is_volatile, Name)); + LoadInst *ins = unwrap(builder)->CreateLoad(unwrap(PointerVal), is_volatile, Name); + + switch (barrier) { + case LLVM_BARRIER_NONE: + break; + case LLVM_BARRIER_ACQ: + ins->setOrdering(Acquire); + break; + case LLVM_BARRIER_SEQ: + ins->setOrdering(SequentiallyConsistent); + break; + default: + g_assert_not_reached (); + break; + } + + return wrap(ins); } LLVMValueRef @@ -341,9 +353,25 @@ mono_llvm_build_aligned_load (LLVMBuilderRef builder, LLVMValueRef PointerVal, LLVMValueRef mono_llvm_build_store (LLVMBuilderRef builder, LLVMValueRef Val, LLVMValueRef PointerVal, - gboolean is_volatile) + gboolean is_volatile, BarrierKind barrier) { - return wrap(unwrap(builder)->CreateStore(unwrap(Val), unwrap(PointerVal), is_volatile)); + StoreInst *ins = unwrap(builder)->CreateStore(unwrap(Val), unwrap(PointerVal), is_volatile); + + switch (barrier) { + case LLVM_BARRIER_NONE: + break; + case LLVM_BARRIER_REL: + ins->setOrdering(Release); + break; + case LLVM_BARRIER_SEQ: + ins->setOrdering(SequentiallyConsistent); + break; + default: + g_assert_not_reached (); + break; + } + + return wrap(ins); } LLVMValueRef @@ -389,16 +417,34 @@ mono_llvm_build_atomic_rmw (LLVMBuilderRef builder, AtomicRMWOp op, LLVMValueRef break; } - ins = unwrap (builder)->CreateAtomicRMW (aop, unwrap (ptr), unwrap (val), AcquireRelease); + ins = unwrap (builder)->CreateAtomicRMW (aop, unwrap (ptr), unwrap (val), SequentiallyConsistent); return wrap (ins); } LLVMValueRef -mono_llvm_build_fence (LLVMBuilderRef builder) +mono_llvm_build_fence (LLVMBuilderRef builder, BarrierKind kind) { FenceInst *ins; + AtomicOrdering ordering; - ins = unwrap (builder)->CreateFence (AcquireRelease); + g_assert (kind != LLVM_BARRIER_NONE); + + switch (kind) { + case LLVM_BARRIER_ACQ: + ordering = Acquire; + break; + case LLVM_BARRIER_REL: + ordering = Release; + break; + case LLVM_BARRIER_SEQ: + ordering = SequentiallyConsistent; + break; + default: + g_assert_not_reached (); + break; + } + + ins = unwrap (builder)->CreateFence (ordering); return wrap (ins); } @@ -606,7 +652,6 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func // EngineBuilder no longer has a copy assignment operator (?) std::unique_ptr Owner(unwrap(MP)); EngineBuilder b (std::move(Owner)); - EngineBuilder &eb = b; #ifdef TARGET_AMD64 ExecutionEngine *EE = b.setJITMemoryManager (mono_mm).setTargetOptions (opts).setAllocateGVsWithCode (true).setMCPU (cpu_name).setCodeModel (CodeModel::Large).create (); #else diff --git a/mta-mono/vendor/mono/mini/mini-llvm-cpp.h b/mta-mono/vendor/mono/mini/mini-llvm-cpp.h index 554532f..ee502e2 100644 --- a/mta-mono/vendor/mono/mini/mini-llvm-cpp.h +++ b/mta-mono/vendor/mono/mini/mini-llvm-cpp.h @@ -17,6 +17,16 @@ G_BEGIN_DECLS +/* + * Keep in sync with the enum in utils/mono-memory-model.h. + */ +typedef enum { + LLVM_BARRIER_NONE = 0, + LLVM_BARRIER_ACQ = 1, + LLVM_BARRIER_REL = 2, + LLVM_BARRIER_SEQ = 3, +} BarrierKind; + typedef enum { LLVM_ATOMICRMW_OP_XCHG = 0, LLVM_ATOMICRMW_OP_ADD = 1, @@ -48,7 +58,7 @@ mono_llvm_build_alloca (LLVMBuilderRef builder, LLVMTypeRef Ty, LLVMValueRef mono_llvm_build_load (LLVMBuilderRef builder, LLVMValueRef PointerVal, - const char *Name, gboolean is_volatile); + const char *Name, gboolean is_volatile, BarrierKind barrier); LLVMValueRef mono_llvm_build_aligned_load (LLVMBuilderRef builder, LLVMValueRef PointerVal, @@ -56,7 +66,7 @@ mono_llvm_build_aligned_load (LLVMBuilderRef builder, LLVMValueRef PointerVal, LLVMValueRef mono_llvm_build_store (LLVMBuilderRef builder, LLVMValueRef Val, LLVMValueRef PointerVal, - gboolean is_volatile); + gboolean is_volatile, BarrierKind kind); LLVMValueRef mono_llvm_build_aligned_store (LLVMBuilderRef builder, LLVMValueRef Val, LLVMValueRef PointerVal, @@ -66,7 +76,7 @@ LLVMValueRef mono_llvm_build_atomic_rmw (LLVMBuilderRef builder, AtomicRMWOp op, LLVMValueRef ptr, LLVMValueRef val); LLVMValueRef -mono_llvm_build_fence (LLVMBuilderRef builder); +mono_llvm_build_fence (LLVMBuilderRef builder, BarrierKind kind); void mono_llvm_replace_uses_of (LLVMValueRef var, LLVMValueRef v); diff --git a/mta-mono/vendor/mono/mini/mini-llvm.c b/mta-mono/vendor/mono/mini/mini-llvm.c index 28e7666..9fd4666 100644 --- a/mta-mono/vendor/mono/mini/mini-llvm.c +++ b/mta-mono/vendor/mono/mini/mini-llvm.c @@ -7,10 +7,12 @@ #include "mini.h" #include +#include #include #include #include #include +#include #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS @@ -26,6 +28,14 @@ #include "mini-llvm-cpp.h" +#ifdef __MINGW32__ + +#include +extern void *memset(void *, int, size_t); +void bzero (void *to, size_t count) { memset (to, 0, count); } + +#endif + /* * Information associated by mono with LLVM modules. */ @@ -42,8 +52,12 @@ typedef struct { int bb_names_len; GPtrArray *used; LLVMTypeRef ptr_type; + GPtrArray *subprogram_mds; MonoEERef *mono_ee; LLVMExecutionEngineRef ee; + gboolean external_symbols; + gboolean emit_dwarf; + int max_got_offset; } MonoLLVMModule; /* @@ -99,7 +113,8 @@ typedef struct { int *pindexes; LLVMValueRef imt_rgctx_loc; GHashTable *llvm_types; - + LLVMValueRef dbg_md; + MonoDebugMethodInfo *minfo; char temp_name [32]; } EmitContext; @@ -209,6 +224,10 @@ static const char *memcpy_func_name; static void init_jit_module (MonoDomain *domain); +static void emit_dbg_loc (EmitContext *ctx, LLVMBuilderRef builder, const unsigned char *cil_code); +static LLVMValueRef emit_dbg_subprogram (EmitContext *ctx, MonoCompile *cfg, LLVMValueRef method, const char *name); +static void emit_dbg_info (MonoLLVMModule *lmodule, const char *filename, const char *cu_name); + /* * IntPtrType: * @@ -308,6 +327,43 @@ type_to_simd_type (int type) } } +static LLVMTypeRef +create_llvm_type_for_type (MonoClass *klass) +{ + int i, size, nfields, esize; + LLVMTypeRef *eltypes; + char *name; + MonoType *t; + LLVMTypeRef ltype; + + t = &klass->byval_arg; + + if (mini_type_is_hfa (t, &nfields, &esize)) { + /* + * This is needed on arm64 where HFAs are returned in + * registers. + */ + size = nfields; + eltypes = g_new (LLVMTypeRef, size); + for (i = 0; i < size; ++i) + eltypes [i] = esize == 4 ? LLVMFloatType () : LLVMDoubleType (); + } else { + size = get_vtype_size (t); + + eltypes = g_new (LLVMTypeRef, size); + for (i = 0; i < size; ++i) + eltypes [i] = LLVMInt8Type (); + } + + name = mono_type_full_name (&klass->byval_arg); + ltype = LLVMStructCreateNamed (LLVMGetGlobalContext (), name); + LLVMStructSetBody (ltype, eltypes, size, FALSE); + g_free (eltypes); + g_free (name); + + return ltype; +} + /* * type_to_llvm_type: * @@ -379,22 +435,8 @@ type_to_llvm_type (EmitContext *ctx, MonoType *t) ltype = g_hash_table_lookup (ctx->lmodule->llvm_types, klass); if (!ltype) { - int i, size; - LLVMTypeRef *eltypes; - char *name; - - size = get_vtype_size (t); - - eltypes = g_new (LLVMTypeRef, size); - for (i = 0; i < size; ++i) - eltypes [i] = LLVMInt8Type (); - - name = mono_type_full_name (&klass->byval_arg); - ltype = LLVMStructCreateNamed (LLVMGetGlobalContext (), name); - LLVMStructSetBody (ltype, eltypes, size, FALSE); + ltype = create_llvm_type_for_type (klass); g_hash_table_insert (ctx->lmodule->llvm_types, klass, ltype); - g_free (eltypes); - g_free (name); } return ltype; } @@ -463,7 +505,7 @@ type_to_llvm_arg_type (EmitContext *ctx, MonoType *t) * on the IL stack. */ static G_GNUC_UNUSED LLVMTypeRef -llvm_type_to_stack_type (LLVMTypeRef type) +llvm_type_to_stack_type (MonoCompile *cfg, LLVMTypeRef type) { if (type == NULL) return NULL; @@ -471,7 +513,7 @@ llvm_type_to_stack_type (LLVMTypeRef type) return LLVMInt32Type (); else if (type == LLVMInt16Type ()) return LLVMInt32Type (); - else if (type == LLVMFloatType ()) + else if (!cfg->r4fp && type == LLVMFloatType ()) return LLVMDoubleType (); else return type; @@ -539,9 +581,13 @@ op_to_llvm_type (int opcode) return LLVMInt64Type (); case OP_FCONV_TO_I1: case OP_FCONV_TO_U1: + case OP_RCONV_TO_I1: + case OP_RCONV_TO_U1: return LLVMInt8Type (); case OP_FCONV_TO_I2: case OP_FCONV_TO_U2: + case OP_RCONV_TO_I2: + case OP_RCONV_TO_U2: return LLVMInt16Type (); case OP_FCONV_TO_I: case OP_FCONV_TO_U: @@ -583,22 +629,30 @@ load_store_to_llvm_type (int opcode, int *size, gboolean *sext, gboolean *zext) case OP_LOADI1_MEMBASE: case OP_STOREI1_MEMBASE_REG: case OP_STOREI1_MEMBASE_IMM: + case OP_ATOMIC_LOAD_I1: + case OP_ATOMIC_STORE_I1: *size = 1; *sext = TRUE; return LLVMInt8Type (); case OP_LOADU1_MEMBASE: case OP_LOADU1_MEM: + case OP_ATOMIC_LOAD_U1: + case OP_ATOMIC_STORE_U1: *size = 1; *zext = TRUE; return LLVMInt8Type (); case OP_LOADI2_MEMBASE: case OP_STOREI2_MEMBASE_REG: case OP_STOREI2_MEMBASE_IMM: + case OP_ATOMIC_LOAD_I2: + case OP_ATOMIC_STORE_I2: *size = 2; *sext = TRUE; return LLVMInt16Type (); case OP_LOADU2_MEMBASE: case OP_LOADU2_MEM: + case OP_ATOMIC_LOAD_U2: + case OP_ATOMIC_STORE_U2: *size = 2; *zext = TRUE; return LLVMInt16Type (); @@ -608,20 +662,32 @@ load_store_to_llvm_type (int opcode, int *size, gboolean *sext, gboolean *zext) case OP_LOADU4_MEM: case OP_STOREI4_MEMBASE_REG: case OP_STOREI4_MEMBASE_IMM: + case OP_ATOMIC_LOAD_I4: + case OP_ATOMIC_STORE_I4: + case OP_ATOMIC_LOAD_U4: + case OP_ATOMIC_STORE_U4: *size = 4; return LLVMInt32Type (); case OP_LOADI8_MEMBASE: case OP_LOADI8_MEM: case OP_STOREI8_MEMBASE_REG: case OP_STOREI8_MEMBASE_IMM: + case OP_ATOMIC_LOAD_I8: + case OP_ATOMIC_STORE_I8: + case OP_ATOMIC_LOAD_U8: + case OP_ATOMIC_STORE_U8: *size = 8; return LLVMInt64Type (); case OP_LOADR4_MEMBASE: case OP_STORER4_MEMBASE_REG: + case OP_ATOMIC_LOAD_R4: + case OP_ATOMIC_STORE_R4: *size = 4; return LLVMFloatType (); case OP_LOADR8_MEMBASE: case OP_STORER8_MEMBASE_REG: + case OP_ATOMIC_LOAD_R8: + case OP_ATOMIC_STORE_R8: *size = 8; return LLVMDoubleType (); case OP_LOAD_MEMBASE: @@ -1090,24 +1156,36 @@ sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo * ret_type = type_to_llvm_type (ctx, rtype); CHECK_FAILURE (ctx); - if (cinfo && cinfo->ret.storage == LLVMArgVtypeInReg) { - /* LLVM models this by returning an aggregate value */ - if (cinfo->ret.pair_storage [0] == LLVMArgInIReg && cinfo->ret.pair_storage [1] == LLVMArgNone) { - LLVMTypeRef members [2]; + if (cinfo) { + if (cinfo->ret.storage == LLVMArgVtypeInReg) { + /* LLVM models this by returning an aggregate value */ + if (cinfo->ret.pair_storage [0] == LLVMArgInIReg && cinfo->ret.pair_storage [1] == LLVMArgNone) { + LLVMTypeRef members [2]; - members [0] = IntPtrType (); - ret_type = LLVMStructType (members, 1, FALSE); - } else { - g_assert_not_reached (); + members [0] = IntPtrType (); + ret_type = LLVMStructType (members, 1, FALSE); + } else { + g_assert_not_reached (); + } + } else if (cinfo->ret.storage == LLVMArgVtypeByVal) { + /* Vtype returned normally by val */ + } else if (cinfo->ret.storage == LLVMArgFpStruct) { + /* Vtype returned as a fp struct */ + LLVMTypeRef members [16]; + + /* Have to create our own structure since we don't map fp structures to LLVM fp structures yet */ + for (i = 0; i < cinfo->ret.nslots; ++i) + members [i] = cinfo->ret.esize == 8 ? LLVMDoubleType () : LLVMFloatType (); + ret_type = LLVMStructType (members, cinfo->ret.nslots, FALSE); + } else if (mini_type_is_vtype (ctx->cfg, rtype)) { + g_assert (cinfo->ret.storage == LLVMArgVtypeRetAddr); + vretaddr = TRUE; + ret_type = LLVMVoidType (); } - } else if (cinfo && mini_type_is_vtype (ctx->cfg, rtype)) { - g_assert (cinfo->ret.storage == LLVMArgVtypeRetAddr); - vretaddr = TRUE; - ret_type = LLVMVoidType (); } pindexes = g_new0 (int, sig->param_count); - param_types = g_new0 (LLVMTypeRef, (sig->param_count * 2) + 3); + param_types = g_new0 (LLVMTypeRef, (sig->param_count * 8) + 3); pindex = 0; if (cinfo && cinfo->rgctx_arg) { if (sinfo) @@ -1153,12 +1231,21 @@ sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo * if (vretaddr && vret_arg_pindex == pindex) param_types [pindex ++] = IntPtrType (); for (i = 0; i < sig->param_count; ++i) { + LLVMArgInfo *ainfo = cinfo ? &cinfo->args [i + sig->hasthis] : NULL; + if (vretaddr && vret_arg_pindex == pindex) param_types [pindex ++] = IntPtrType (); pindexes [i] = pindex; - if (cinfo && cinfo->args [i + sig->hasthis].storage == LLVMArgVtypeInReg) { + + if (!ainfo) { + param_types [pindex ++] = type_to_llvm_arg_type (ctx, sig->params [i]); + continue; + } + + switch (ainfo->storage) { + case LLVMArgVtypeInReg: for (j = 0; j < 2; ++j) { - switch (cinfo->args [i + sig->hasthis].pair_storage [j]) { + switch (ainfo->pair_storage [j]) { case LLVMArgInIReg: param_types [pindex ++] = LLVMIntType (sizeof (gpointer) * 8); break; @@ -1168,14 +1255,29 @@ sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo * g_assert_not_reached (); } } - } else if (cinfo && cinfo->args [i + sig->hasthis].storage == LLVMArgVtypeByVal) { + break; + case LLVMArgVtypeByVal: param_types [pindex] = type_to_llvm_arg_type (ctx, sig->params [i]); CHECK_FAILURE (ctx); param_types [pindex] = LLVMPointerType (param_types [pindex], 0); pindex ++; - } else { + break; + case LLVMArgAsIArgs: + param_types [pindex] = LLVMArrayType (IntPtrType (), ainfo->nslots); + pindex ++; + break; + case LLVMArgAsFpArgs: { + int j; + + for (j = 0; j < ainfo->nslots; ++j) + param_types [pindex + j] = ainfo->esize == 8 ? LLVMDoubleType () : LLVMFloatType (); + pindex += ainfo->nslots; + break; + } + default: param_types [pindex ++] = type_to_llvm_arg_type (ctx, sig->params [i]); - } + break; + } } if (vretaddr && vret_arg_pindex == pindex) param_types [pindex ++] = IntPtrType (); @@ -1414,14 +1516,39 @@ emit_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, LL return lcall; } +#if LLVM_API_VERSION >= 4 +#define EXTRA_MONO_LOAD_STORE_ARGS 1 +#else +#define EXTRA_MONO_LOAD_STORE_ARGS 0 +#endif + static LLVMValueRef -emit_load (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef addr, const char *name, gboolean is_faulting) +emit_load_general (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef addr, const char *name, gboolean is_faulting, BarrierKind barrier) { const char *intrins_name; LLVMValueRef args [16], res; LLVMTypeRef addr_type; if (is_faulting && bb->region != -1) { +#if LLVM_API_VERSION >= 4 + LLVMAtomicOrdering ordering; + + switch (barrier) { + case LLVM_BARRIER_NONE: + ordering = LLVMAtomicOrderingNotAtomic; + break; + case LLVM_BARRIER_ACQ: + ordering = LLVMAtomicOrderingAcquire; + break; + case LLVM_BARRIER_SEQ: + ordering = LLVMAtomicOrderingSequentiallyConsistent; + break; + default: + g_assert_not_reached (); + break; + } +#endif + /* * We handle loads which can fault by calling a mono specific intrinsic * using an invoke, so they are handled properly inside try blocks. @@ -1452,7 +1579,10 @@ emit_load (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, in args [0] = addr; args [1] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); args [2] = LLVMConstInt (LLVMInt1Type (), TRUE, FALSE); - res = emit_call (ctx, bb, builder_ref, LLVMGetNamedFunction (ctx->module, intrins_name), args, 3); +#if LLVM_API_VERSION >= 4 + args [3] = LLVMConstInt (LLVMInt32Type (), ordering, FALSE); +#endif + res = emit_call (ctx, bb, builder_ref, LLVMGetNamedFunction (ctx->module, intrins_name), args, 3 + EXTRA_MONO_LOAD_STORE_ARGS); if (addr_type == LLVMPointerType (LLVMDoubleType (), 0)) res = LLVMBuildBitCast (*builder_ref, res, LLVMDoubleType (), ""); @@ -1468,7 +1598,7 @@ emit_load (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, in * LLVM will generate invalid code when encountering a load from a * NULL address. */ - res = mono_llvm_build_load (*builder_ref, addr, name, is_faulting); + res = mono_llvm_build_load (*builder_ref, addr, name, is_faulting, barrier); /* Mark it with a custom metadata */ /* @@ -1480,13 +1610,38 @@ emit_load (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, in } } +static LLVMValueRef +emit_load (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef addr, const char *name, gboolean is_faulting) +{ + return emit_load_general (ctx, bb, builder_ref, size, addr, name, is_faulting, LLVM_BARRIER_NONE); +} + static void -emit_store (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef value, LLVMValueRef addr, gboolean is_faulting) +emit_store_general (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef value, LLVMValueRef addr, gboolean is_faulting, BarrierKind barrier) { const char *intrins_name; LLVMValueRef args [16]; if (is_faulting && bb->region != -1) { +#if LLVM_API_VERSION >= 4 + LLVMAtomicOrdering ordering; + + switch (barrier) { + case LLVM_BARRIER_NONE: + ordering = LLVMAtomicOrderingNotAtomic; + break; + case LLVM_BARRIER_REL: + ordering = LLVMAtomicOrderingRelease; + break; + case LLVM_BARRIER_SEQ: + ordering = LLVMAtomicOrderingSequentiallyConsistent; + break; + default: + g_assert_not_reached (); + break; + } +#endif + switch (size) { case 1: intrins_name = "llvm.mono.store.i8.p0i8"; @@ -1513,12 +1668,21 @@ emit_store (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, i args [1] = addr; args [2] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); args [3] = LLVMConstInt (LLVMInt1Type (), TRUE, FALSE); - emit_call (ctx, bb, builder_ref, LLVMGetNamedFunction (ctx->module, intrins_name), args, 4); +#if LLVM_API_VERSION >= 4 + args [4] = LLVMConstInt (LLVMInt32Type (), ordering, FALSE); +#endif + emit_call (ctx, bb, builder_ref, LLVMGetNamedFunction (ctx->module, intrins_name), args, 4 + EXTRA_MONO_LOAD_STORE_ARGS); } else { - LLVMBuildStore (*builder_ref, value, addr); + mono_llvm_build_store (*builder_ref, value, addr, is_faulting, barrier); } } +static void +emit_store (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef value, LLVMValueRef addr, gboolean is_faulting) +{ + emit_store_general (ctx, bb, builder_ref, size, value, addr, is_faulting, LLVM_BARRIER_NONE); +} + /* * emit_cond_system_exception: * @@ -1599,14 +1763,14 @@ emit_cond_system_exception (EmitContext *ctx, MonoBasicBlock *bb, const char *ex } /* - * emit_reg_to_vtype: + * emit_args_to_vtype: * - * Emit code to store the vtype in the registers REGS to the address ADDRESS. + * Emit code to store the vtype in the arguments args to the address ADDRESS. */ static void -emit_reg_to_vtype (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMValueRef address, LLVMArgInfo *ainfo, LLVMValueRef *regs) +emit_args_to_vtype (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMValueRef address, LLVMArgInfo *ainfo, LLVMValueRef *args) { - int j, size; + int j, size, nslots; size = get_vtype_size (t); @@ -1614,27 +1778,47 @@ emit_reg_to_vtype (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMVa address = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (LLVMInt8Type (), 0), ""); } - for (j = 0; j < 2; ++j) { - LLVMValueRef index [2], addr; + if (ainfo->storage == LLVMArgAsFpArgs) + nslots = ainfo->nslots; + else + nslots = 2; + + for (j = 0; j < nslots; ++j) { + LLVMValueRef index [2], addr, daddr; int part_size = size > sizeof (gpointer) ? sizeof (gpointer) : size; LLVMTypeRef part_type; if (ainfo->pair_storage [j] == LLVMArgNone) continue; - part_type = LLVMIntType (part_size * 8); - if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) { - index [0] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE); - addr = LLVMBuildGEP (builder, address, index, 1, ""); - } else { - index [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); - index [1] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE); - addr = LLVMBuildGEP (builder, address, index, 2, ""); - } switch (ainfo->pair_storage [j]) { - case LLVMArgInIReg: - LLVMBuildStore (builder, convert (ctx, regs [j], part_type), LLVMBuildBitCast (ctx->builder, addr, LLVMPointerType (part_type, 0), "")); + case LLVMArgInIReg: { + part_type = LLVMIntType (part_size * 8); + if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) { + index [0] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE); + addr = LLVMBuildGEP (builder, address, index, 1, ""); + } else { + daddr = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (IntPtrType (), 0), ""); + index [0] = LLVMConstInt (LLVMInt32Type (), j, FALSE); + addr = LLVMBuildGEP (builder, daddr, index, 1, ""); + } + LLVMBuildStore (builder, convert (ctx, args [j], part_type), LLVMBuildBitCast (ctx->builder, addr, LLVMPointerType (part_type, 0), "")); break; + } + case LLVMArgInFPReg: { + LLVMTypeRef arg_type; + + if (ainfo->esize == 8) + arg_type = LLVMDoubleType (); + else + arg_type = LLVMFloatType (); + + index [0] = LLVMConstInt (LLVMInt32Type (), j, FALSE); + daddr = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (arg_type, 0), ""); + addr = LLVMBuildGEP (builder, daddr, index, 1, ""); + LLVMBuildStore (builder, args [j], addr); + break; + } case LLVMArgNone: break; default: @@ -1646,41 +1830,55 @@ emit_reg_to_vtype (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMVa } /* - * emit_vtype_to_reg: + * emit_vtype_to_args: * - * Emit code to load a vtype at address ADDRESS into registers. Store the registers - * into REGS, and the number of registers into NREGS. + * Emit code to load a vtype at address ADDRESS into scalar arguments. Store the arguments + * into ARGS, and the number of arguments into NARGS. */ static void -emit_vtype_to_reg (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMValueRef address, LLVMArgInfo *ainfo, LLVMValueRef *regs, guint32 *nregs) +emit_vtype_to_args (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMValueRef address, LLVMArgInfo *ainfo, LLVMValueRef *args, guint32 *nargs) { int pindex = 0; - int j, size; + int j, size, nslots; + LLVMTypeRef arg_type; size = get_vtype_size (t); - if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) { + if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) address = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (LLVMInt8Type (), 0), ""); - } - for (j = 0; j < 2; ++j) { - LLVMValueRef index [2], addr; + if (ainfo->storage == LLVMArgAsFpArgs) + nslots = ainfo->nslots; + else + nslots = 2; + for (j = 0; j < nslots; ++j) { + LLVMValueRef index [2], addr, daddr; int partsize = size > sizeof (gpointer) ? sizeof (gpointer) : size; if (ainfo->pair_storage [j] == LLVMArgNone) continue; - if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) { - index [0] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE); - addr = LLVMBuildGEP (builder, address, index, 1, ""); - } else { - index [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); - index [1] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE); - addr = LLVMBuildGEP (builder, address, index, 2, ""); - } switch (ainfo->pair_storage [j]) { case LLVMArgInIReg: - regs [pindex ++] = convert (ctx, LLVMBuildLoad (builder, LLVMBuildBitCast (ctx->builder, addr, LLVMPointerType (LLVMIntType (partsize * 8), 0), ""), ""), IntPtrType ()); + if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) { + index [0] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE); + addr = LLVMBuildGEP (builder, address, index, 1, ""); + } else { + daddr = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (IntPtrType (), 0), ""); + index [0] = LLVMConstInt (LLVMInt32Type (), j, FALSE); + addr = LLVMBuildGEP (builder, daddr, index, 1, ""); + } + args [pindex ++] = convert (ctx, LLVMBuildLoad (builder, LLVMBuildBitCast (ctx->builder, addr, LLVMPointerType (LLVMIntType (partsize * 8), 0), ""), ""), IntPtrType ()); + break; + case LLVMArgInFPReg: + if (ainfo->esize == 8) + arg_type = LLVMDoubleType (); + else + arg_type = LLVMFloatType (); + daddr = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (arg_type, 0), ""); + index [0] = LLVMConstInt (LLVMInt32Type (), j, FALSE); + addr = LLVMBuildGEP (builder, daddr, index, 1, ""); + args [pindex ++] = LLVMBuildLoad (builder, addr, ""); break; case LLVMArgNone: break; @@ -1690,7 +1888,7 @@ emit_vtype_to_reg (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMVa size -= sizeof (gpointer); } - *nregs = pindex; + *nargs = pindex; } static LLVMValueRef @@ -1794,37 +1992,55 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder) LLVMArgInfo *ainfo = &linfo->args [i + sig->hasthis]; int reg = cfg->args [i + sig->hasthis]->dreg; - if (ainfo->storage == LLVMArgVtypeInReg) { - LLVMValueRef regs [2]; + switch (ainfo->storage) { + case LLVMArgVtypeInReg: + case LLVMArgAsFpArgs: { + LLVMValueRef args [8]; + int j; - /* - * Emit code to save the argument from the registers to - * the real argument. - */ + /* The argument is received as a set of int/fp arguments, store them into the real argument */ + memset (args, 0, sizeof (args)); pindex = ctx->pindexes [i]; - regs [0] = LLVMGetParam (ctx->lmethod, pindex); - if (ainfo->pair_storage [1] != LLVMArgNone) - regs [1] = LLVMGetParam (ctx->lmethod, pindex + 1); - else - regs [1] = NULL; - + if (ainfo->storage == LLVMArgVtypeInReg) { + args [0] = LLVMGetParam (ctx->lmethod, pindex); + if (ainfo->pair_storage [1] != LLVMArgNone) + args [1] = LLVMGetParam (ctx->lmethod, pindex + 1); + } else { + g_assert (ainfo->nslots <= 8); + for (j = 0; j < ainfo->nslots; ++j) + args [j] = LLVMGetParam (ctx->lmethod, ctx->pindexes [i] + j); + } ctx->addresses [reg] = build_alloca (ctx, sig->params [i]); - emit_reg_to_vtype (ctx, builder, sig->params [i], ctx->addresses [reg], ainfo, regs); + emit_args_to_vtype (ctx, builder, sig->params [i], ctx->addresses [reg], ainfo, args); - if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (sig->params [i]))) { + if (ainfo->storage == LLVMArgVtypeInReg && MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (sig->params [i]))) { /* Treat these as normal values */ ctx->values [reg] = LLVMBuildLoad (builder, ctx->addresses [reg], ""); } - } else if (ainfo->storage == LLVMArgVtypeByVal) { + break; + } + case LLVMArgVtypeByVal: { ctx->addresses [reg] = LLVMGetParam (ctx->lmethod, ctx->pindexes [i]); if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (sig->params [i]))) { /* Treat these as normal values */ ctx->values [reg] = LLVMBuildLoad (builder, ctx->addresses [reg], ""); } - } else { - ctx->values [reg] = convert_full (ctx, ctx->values [reg], llvm_type_to_stack_type (type_to_llvm_type (ctx, sig->params [i])), type_is_unsigned (ctx, sig->params [i])); + break; + } + case LLVMArgAsIArgs: { + LLVMValueRef arg = LLVMGetParam (ctx->lmethod, ctx->pindexes [i]); + + ctx->addresses [reg] = build_alloca (ctx, sig->params [i]); + + /* The argument is received as an array of ints, store it into the real argument */ + LLVMBuildStore (ctx->builder, arg, convert (ctx, ctx->addresses [reg], LLVMPointerType (LLVMTypeOf (arg), 0))); + break; + } + default: + ctx->values [reg] = convert_full (ctx, ctx->values [reg], llvm_type_to_stack_type (cfg, type_to_llvm_type (ctx, sig->params [i])), type_is_unsigned (ctx, sig->params [i])); + break; } } @@ -1847,7 +2063,7 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder) */ this_alloc = mono_llvm_build_alloca (builder, ThisType (), LLVMConstInt (LLVMInt32Type (), 1, FALSE), 0, ""); /* This volatile store will keep the alloca alive */ - mono_llvm_build_store (builder, ctx->values [cfg->args [0]->dreg], this_alloc, TRUE); + mono_llvm_build_store (builder, ctx->values [cfg->args [0]->dreg], this_alloc, TRUE, LLVM_BARRIER_NONE); set_metadata_flag (this_alloc, "mono.this"); } @@ -1861,7 +2077,7 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder) g_assert (ctx->addresses [cfg->rgctx_var->dreg]); rgctx_alloc = ctx->addresses [cfg->rgctx_var->dreg]; /* This volatile store will keep the alloca alive */ - store = mono_llvm_build_store (builder, convert (ctx, ctx->rgctx_arg, IntPtrType ()), rgctx_alloc, TRUE); + store = mono_llvm_build_store (builder, convert (ctx, ctx->rgctx_arg, IntPtrType ()), rgctx_alloc, TRUE, LLVM_BARRIER_NONE); set_metadata_flag (rgctx_alloc, "mono.this"); } @@ -1898,9 +2114,6 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder) } /* Have to export this for AOT */ -void -mono_personality (void); - void mono_personality (void) { @@ -1943,8 +2156,8 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, llvm_sig = sig_to_llvm_sig_full (ctx, sig, cinfo, &sinfo); CHECK_FAILURE (ctx); - virtual = (ins->opcode == OP_VOIDCALL_MEMBASE || ins->opcode == OP_CALL_MEMBASE || ins->opcode == OP_VCALL_MEMBASE || ins->opcode == OP_LCALL_MEMBASE || ins->opcode == OP_FCALL_MEMBASE); - calli = (ins->opcode == OP_VOIDCALL_REG || ins->opcode == OP_CALL_REG || ins->opcode == OP_VCALL_REG || ins->opcode == OP_LCALL_REG || ins->opcode == OP_FCALL_REG); + virtual = (ins->opcode == OP_VOIDCALL_MEMBASE || ins->opcode == OP_CALL_MEMBASE || ins->opcode == OP_VCALL_MEMBASE || ins->opcode == OP_LCALL_MEMBASE || ins->opcode == OP_FCALL_MEMBASE || ins->opcode == OP_RCALL_MEMBASE); + calli = !call->fptr_is_patch && (ins->opcode == OP_VOIDCALL_REG || ins->opcode == OP_CALL_REG || ins->opcode == OP_VCALL_REG || ins->opcode == OP_LCALL_REG || ins->opcode == OP_FCALL_REG || ins->opcode == OP_RCALL_REG); /* FIXME: Avoid creating duplicate methods */ @@ -2016,7 +2229,8 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, * their own calling convention on some platforms. */ #ifndef TARGET_AMD64 - if (abs_ji->type == MONO_PATCH_INFO_MONITOR_ENTER || abs_ji->type == MONO_PATCH_INFO_MONITOR_EXIT || abs_ji->type == MONO_PATCH_INFO_GENERIC_CLASS_INIT) + if (abs_ji->type == MONO_PATCH_INFO_MONITOR_ENTER || abs_ji->type == MONO_PATCH_INFO_MONITOR_ENTER_V4 || + abs_ji->type == MONO_PATCH_INFO_MONITOR_EXIT || abs_ji->type == MONO_PATCH_INFO_GENERIC_CLASS_INIT) LLVM_FAILURE (ctx, "trampoline with own cconv"); #endif target = mono_resolve_patch_target (cfg->method, cfg->domain, NULL, abs_ji, FALSE); @@ -2047,7 +2261,7 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, /* * Collect and convert arguments */ - nargs = (sig->param_count * 2) + sig->hasthis + vretaddr + call->rgctx_reg + call->imt_arg_reg; + nargs = (sig->param_count * 16) + sig->hasthis + vretaddr + call->rgctx_reg + call->imt_arg_reg; len = sizeof (LLVMValueRef) * nargs; args = alloca (len); memset (args, 0, len); @@ -2065,7 +2279,7 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, if (!ctx->imt_rgctx_loc) ctx->imt_rgctx_loc = build_alloca_llvm_type (ctx, ctx->lmodule->ptr_type, sizeof (gpointer)); LLVMBuildStore (builder, convert (ctx, ctx->values [call->rgctx_arg_reg], ctx->lmodule->ptr_type), ctx->imt_rgctx_loc); - args [sinfo.rgctx_arg_pindex] = mono_llvm_build_load (builder, ctx->imt_rgctx_loc, "", TRUE); + args [sinfo.rgctx_arg_pindex] = mono_llvm_build_load (builder, ctx->imt_rgctx_loc, "", TRUE, LLVM_BARRIER_NONE); #else args [sinfo.rgctx_arg_pindex] = convert (ctx, values [call->rgctx_arg_reg], ctx->lmodule->ptr_type); #endif @@ -2077,7 +2291,7 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, if (!ctx->imt_rgctx_loc) ctx->imt_rgctx_loc = build_alloca_llvm_type (ctx, ctx->lmodule->ptr_type, sizeof (gpointer)); LLVMBuildStore (builder, convert (ctx, ctx->values [call->imt_arg_reg], ctx->lmodule->ptr_type), ctx->imt_rgctx_loc); - args [sinfo.imt_arg_pindex] = mono_llvm_build_load (builder, ctx->imt_rgctx_loc, "", TRUE); + args [sinfo.imt_arg_pindex] = mono_llvm_build_load (builder, ctx->imt_rgctx_loc, "", TRUE, LLVM_BARRIER_NONE); #else args [sinfo.imt_arg_pindex] = convert (ctx, values [call->imt_arg_reg], ctx->lmodule->ptr_type); #endif @@ -2107,31 +2321,36 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, regpair = (guint32)(gssize)(l->data); reg = regpair & 0xffffff; args [pindex] = values [reg]; - if (ainfo->storage == LLVMArgVtypeInReg) { - int j; - LLVMValueRef regs [2]; - guint32 nregs; - - g_assert (ainfo); + switch (ainfo->storage) { + case LLVMArgVtypeInReg: + case LLVMArgAsFpArgs: { + guint32 nargs; g_assert (addresses [reg]); - - emit_vtype_to_reg (ctx, builder, sig->params [i - sig->hasthis], addresses [reg], ainfo, regs, &nregs); - for (j = 0; j < nregs; ++j) - args [pindex ++] = regs [j]; + emit_vtype_to_args (ctx, builder, sig->params [i - sig->hasthis], addresses [reg], ainfo, args + pindex, &nargs); + pindex += nargs; // FIXME: alignment // FIXME: Get rid of the VMOVE - } else if (ainfo->storage == LLVMArgVtypeByVal) { + break; + } + case LLVMArgVtypeByVal: g_assert (addresses [reg]); args [pindex] = addresses [reg]; - } else { + break; + case LLVMArgAsIArgs: + g_assert (addresses [reg]); + args [pindex] = LLVMBuildLoad (ctx->builder, convert (ctx, addresses [reg], LLVMPointerType (LLVMArrayType (IntPtrType (), ainfo->nslots), 0)), ""); + break; + default: g_assert (args [pindex]); if (i == 0 && sig->hasthis) args [pindex] = convert (ctx, args [pindex], ThisType ()); else args [pindex] = convert (ctx, args [pindex], type_to_llvm_arg_type (ctx, sig->params [i - sig->hasthis])); + break; } + g_assert (pindex <= nargs); l = l->next; } @@ -2172,21 +2391,47 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, /* * Convert the result */ - if (cinfo && cinfo->ret.storage == LLVMArgVtypeInReg) { - LLVMValueRef regs [2]; + if (cinfo) { + switch (cinfo->ret.storage) { + case LLVMArgVtypeInReg: { + LLVMValueRef regs [2]; - if (!addresses [ins->dreg]) - addresses [ins->dreg] = build_alloca (ctx, sig->ret); + if (!addresses [ins->dreg]) + addresses [ins->dreg] = build_alloca (ctx, sig->ret); - regs [0] = LLVMBuildExtractValue (builder, lcall, 0, ""); - if (cinfo->ret.pair_storage [1] != LLVMArgNone) - regs [1] = LLVMBuildExtractValue (builder, lcall, 1, ""); - - emit_reg_to_vtype (ctx, builder, sig->ret, addresses [ins->dreg], &cinfo->ret, regs); - } else if (sig->ret->type != MONO_TYPE_VOID && !vretaddr) { - /* If the method returns an unsigned value, need to zext it */ + regs [0] = LLVMBuildExtractValue (builder, lcall, 0, ""); + if (cinfo->ret.pair_storage [1] != LLVMArgNone) + regs [1] = LLVMBuildExtractValue (builder, lcall, 1, ""); + emit_args_to_vtype (ctx, builder, sig->ret, addresses [ins->dreg], &cinfo->ret, regs); + break; + } + case LLVMArgVtypeByVal: + if (!addresses [call->inst.dreg]) + addresses [call->inst.dreg] = build_alloca (ctx, sig->ret); + LLVMBuildStore (builder, lcall, addresses [call->inst.dreg]); + break; + case LLVMArgFpStruct: + if (!addresses [call->inst.dreg]) + addresses [call->inst.dreg] = build_alloca (ctx, sig->ret); + LLVMBuildStore (builder, lcall, convert_full (ctx, addresses [call->inst.dreg], LLVMPointerType (LLVMTypeOf (lcall), 0), FALSE)); + break; + default: + if (sig->ret->type != MONO_TYPE_VOID && !vretaddr) + /* If the method returns an unsigned value, need to zext it */ + values [ins->dreg] = convert_full (ctx, lcall, llvm_type_to_stack_type (cfg, type_to_llvm_type (ctx, sig->ret)), type_is_unsigned (ctx, sig->ret)); + break; + } + } else { + if (sig->ret->type != MONO_TYPE_VOID && !vretaddr) + /* If the method returns an unsigned value, need to zext it */ + values [ins->dreg] = convert_full (ctx, lcall, llvm_type_to_stack_type (cfg, type_to_llvm_type (ctx, sig->ret)), type_is_unsigned (ctx, sig->ret)); + } - values [ins->dreg] = convert_full (ctx, lcall, llvm_type_to_stack_type (type_to_llvm_type (ctx, sig->ret)), type_is_unsigned (ctx, sig->ret)); + if (vretaddr) { + if (!addresses [call->inst.dreg]) + addresses [call->inst.dreg] = build_alloca (ctx, sig->ret); + g_assert (sinfo.vret_arg_pindex < nargs); + args [sinfo.vret_arg_pindex] = LLVMBuildPtrToInt (builder, addresses [call->inst.dreg], IntPtrType (), ""); } *builder_ref = ctx->builder; @@ -2206,7 +2451,6 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) LLVMValueRef method = ctx->lmethod; LLVMValueRef *values = ctx->values; LLVMValueRef *addresses = ctx->addresses; - int i; LLVMCallInfo *linfo = ctx->linfo; LLVMModuleRef module = ctx->module; BBInfo *bblocks = ctx->bblocks; @@ -2346,6 +2590,8 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) char *dname = NULL; char dname_buf [128]; + emit_dbg_loc (ctx, builder, ins->cil_code); + nins ++; if (nins > 5000 && builder == starting_builder) { /* some steps in llc are non-linear in the size of basic blocks, see #5714 */ @@ -2410,7 +2656,10 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) values [ins->dreg] = LLVMConstReal (LLVMDoubleType (), *(double*)ins->inst_p0); break; case OP_R4CONST: - values [ins->dreg] = LLVMConstFPExt (LLVMConstReal (LLVMFloatType (), *(float*)ins->inst_p0), LLVMDoubleType ()); + if (cfg->r4fp) + values [ins->dreg] = LLVMConstReal (LLVMFloatType (), *(float*)ins->inst_p0); + else + values [ins->dreg] = LLVMConstFPExt (LLVMConstReal (LLVMFloatType (), *(float*)ins->inst_p0), LLVMDoubleType ()); break; case OP_DUMMY_ICONST: values [ins->dreg] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); @@ -2478,11 +2727,30 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) break; } + if (linfo->ret.storage == LLVMArgVtypeByVal) { + LLVMValueRef retval; + + g_assert (addresses [ins->sreg1]); + retval = LLVMBuildLoad (builder, addresses [ins->sreg1], ""); + LLVMBuildRet (builder, retval); + break; + } + if (linfo->ret.storage == LLVMArgVtypeRetAddr) { LLVMBuildRetVoid (builder); break; } + if (linfo->ret.storage == LLVMArgFpStruct) { + LLVMTypeRef ret_type = LLVMGetReturnType (LLVMGetElementType (LLVMTypeOf (method))); + LLVMValueRef retval; + + g_assert (addresses [ins->sreg1]); + retval = LLVMBuildLoad (builder, convert (ctx, addresses [ins->sreg1], LLVMPointerType (ret_type, 0)), ""); + LLVMBuildRet (builder, retval); + break; + } + if (!lhs || ctx->is_dead [ins->sreg1]) { /* * The method did not set its return value, probably because it @@ -2499,6 +2767,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) break; case OP_ICOMPARE: case OP_FCOMPARE: + case OP_RCOMPARE: case OP_LCOMPARE: case OP_COMPARE: case OP_ICOMPARE_IMM: @@ -2541,9 +2810,11 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) } /* We use COMPARE+SETcc/Bcc, llvm uses SETcc+br cond */ - if (ins->opcode == OP_FCOMPARE) + if (ins->opcode == OP_FCOMPARE) { cmp = LLVMBuildFCmp (builder, fpcond_to_llvm_cond [rel], convert (ctx, lhs, LLVMDoubleType ()), convert (ctx, rhs, LLVMDoubleType ()), ""); - else if (ins->opcode == OP_COMPARE_IMM) { + } else if (ins->opcode == OP_RCOMPARE) { + cmp = LLVMBuildFCmp (builder, fpcond_to_llvm_cond [rel], convert (ctx, lhs, LLVMFloatType ()), convert (ctx, rhs, LLVMFloatType ()), ""); + } else if (ins->opcode == OP_COMPARE_IMM) { if (LLVMGetTypeKind (LLVMTypeOf (lhs)) == LLVMPointerTypeKind && ins->inst_imm == 0) cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], lhs, LLVMConstNull (LLVMTypeOf (lhs)), ""); else @@ -2609,6 +2880,20 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) values [ins->dreg] = LLVMBuildZExt (builder, cmp, LLVMInt32Type (), dname); break; } + case OP_RCEQ: + case OP_RCLT: + case OP_RCLT_UN: + case OP_RCGT: + case OP_RCGT_UN: { + CompRelation rel; + LLVMValueRef cmp; + + rel = mono_opcode_to_cond (ins->opcode); + + cmp = LLVMBuildFCmp (builder, fpcond_to_llvm_cond [rel], convert (ctx, lhs, LLVMFloatType ()), convert (ctx, rhs, LLVMFloatType ()), ""); + values [ins->dreg] = LLVMBuildZExt (builder, cmp, LLVMInt32Type (), dname); + break; + } case OP_PHI: case OP_FPHI: case OP_VPHI: @@ -2672,7 +2957,8 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) g_assert (lhs); values [ins->dreg] = lhs; break; - case OP_FMOVE: { + case OP_FMOVE: + case OP_RMOVE: { MonoInst *var = get_vreg_to_inst (cfg, ins->dreg); g_assert (lhs); @@ -2687,6 +2973,22 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) } break; } + case OP_MOVE_F_TO_I4: { + values [ins->dreg] = LLVMBuildBitCast (builder, LLVMBuildFPTrunc (builder, lhs, LLVMFloatType (), ""), LLVMInt32Type (), ""); + break; + } + case OP_MOVE_I4_TO_F: { + values [ins->dreg] = LLVMBuildFPExt (builder, LLVMBuildBitCast (builder, lhs, LLVMFloatType (), ""), LLVMDoubleType (), ""); + break; + } + case OP_MOVE_F_TO_I8: { + values [ins->dreg] = LLVMBuildBitCast (builder, lhs, LLVMInt64Type (), ""); + break; + } + case OP_MOVE_I8_TO_F: { + values [ins->dreg] = LLVMBuildBitCast (builder, lhs, LLVMDoubleType (), ""); + break; + } case OP_IADD: case OP_ISUB: case OP_IAND: @@ -2720,6 +3022,29 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) lhs = convert (ctx, lhs, regtype_to_llvm_type (spec [MONO_INST_DEST])); rhs = convert (ctx, rhs, regtype_to_llvm_type (spec [MONO_INST_DEST])); +#ifdef MONO_ARCH_NEED_DIV_CHECK + switch (ins->opcode) { + case OP_IDIV: + case OP_LDIV: + case OP_IREM: + case OP_LREM: + case OP_IDIV_UN: + case OP_LDIV_UN: + case OP_IREM_UN: + case OP_LREM_UN: { + LLVMValueRef cmp; + + cmp = LLVMBuildICmp (builder, LLVMIntEQ, rhs, LLVMConstInt (LLVMTypeOf (rhs), 0, FALSE), ""); + emit_cond_system_exception (ctx, bb, "DivideByZeroException", cmp); + CHECK_FAILURE (ctx); + builder = ctx->builder; + break; + } + default: + break; + } +#endif + switch (ins->opcode) { case OP_IADD: case OP_LADD: @@ -2750,6 +3075,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) values [ins->dreg] = LLVMBuildUDiv (builder, lhs, rhs, dname); break; case OP_FDIV: + case OP_RDIV: values [ins->dreg] = LLVMBuildFDiv (builder, lhs, rhs, dname); break; case OP_IAND: @@ -2791,6 +3117,31 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) g_assert_not_reached (); } break; + case OP_RADD: + case OP_RSUB: + case OP_RMUL: + case OP_RDIV: { + lhs = convert (ctx, lhs, LLVMFloatType ()); + rhs = convert (ctx, rhs, LLVMFloatType ()); + switch (ins->opcode) { + case OP_RADD: + values [ins->dreg] = LLVMBuildFAdd (builder, lhs, rhs, dname); + break; + case OP_RSUB: + values [ins->dreg] = LLVMBuildFSub (builder, lhs, rhs, dname); + break; + case OP_RMUL: + values [ins->dreg] = LLVMBuildFMul (builder, lhs, rhs, dname); + break; + case OP_RDIV: + values [ins->dreg] = LLVMBuildFDiv (builder, lhs, rhs, dname); + break; + default: + g_assert_not_reached (); + break; + } + break; + } case OP_IADD_IMM: case OP_ISUB_IMM: case OP_IMUL_IMM: @@ -2912,6 +3263,10 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) lhs = convert (ctx, lhs, LLVMDoubleType ()); values [ins->dreg] = LLVMBuildFSub (builder, LLVMConstReal (LLVMDoubleType (), 0.0), lhs, dname); break; + case OP_RNEG: + lhs = convert (ctx, lhs, LLVMFloatType ()); + values [ins->dreg] = LLVMBuildFSub (builder, LLVMConstReal (LLVMFloatType (), 0.0), lhs, dname); + break; case OP_INOT: { guint32 v = 0xffffffff; values [ins->dreg] = LLVMBuildXor (builder, LLVMConstInt (LLVMInt32Type (), v, FALSE), convert (ctx, lhs, LLVMInt32Type ()), dname); @@ -2963,21 +3318,27 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) values [ins->dreg] = LLVMBuildZExt (builder, lhs, LLVMInt64Type (), dname); break; case OP_FCONV_TO_I4: + case OP_RCONV_TO_I4: values [ins->dreg] = LLVMBuildFPToSI (builder, lhs, LLVMInt32Type (), dname); break; case OP_FCONV_TO_I1: + case OP_RCONV_TO_I1: values [ins->dreg] = LLVMBuildSExt (builder, LLVMBuildFPToSI (builder, lhs, LLVMInt8Type (), dname), LLVMInt32Type (), ""); break; case OP_FCONV_TO_U1: + case OP_RCONV_TO_U1: values [ins->dreg] = LLVMBuildZExt (builder, LLVMBuildFPToUI (builder, lhs, LLVMInt8Type (), dname), LLVMInt32Type (), ""); break; case OP_FCONV_TO_I2: + case OP_RCONV_TO_I2: values [ins->dreg] = LLVMBuildSExt (builder, LLVMBuildFPToSI (builder, lhs, LLVMInt16Type (), dname), LLVMInt32Type (), ""); break; case OP_FCONV_TO_U2: + case OP_RCONV_TO_U2: values [ins->dreg] = LLVMBuildZExt (builder, LLVMBuildFPToUI (builder, lhs, LLVMInt16Type (), dname), LLVMInt32Type (), ""); break; case OP_FCONV_TO_I8: + case OP_RCONV_TO_I8: values [ins->dreg] = LLVMBuildFPToSI (builder, lhs, LLVMInt64Type (), dname); break; case OP_FCONV_TO_I: @@ -2999,11 +3360,23 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) case OP_ICONV_TO_R4: case OP_LCONV_TO_R4: v = LLVMBuildSIToFP (builder, lhs, LLVMFloatType (), ""); - values [ins->dreg] = LLVMBuildFPExt (builder, v, LLVMDoubleType (), dname); + if (cfg->r4fp) + values [ins->dreg] = v; + else + values [ins->dreg] = LLVMBuildFPExt (builder, v, LLVMDoubleType (), dname); break; case OP_FCONV_TO_R4: v = LLVMBuildFPTrunc (builder, lhs, LLVMFloatType (), ""); - values [ins->dreg] = LLVMBuildFPExt (builder, v, LLVMDoubleType (), dname); + if (cfg->r4fp) + values [ins->dreg] = v; + else + values [ins->dreg] = LLVMBuildFPExt (builder, v, LLVMDoubleType (), dname); + break; + case OP_RCONV_TO_R8: + values [ins->dreg] = LLVMBuildFPExt (builder, lhs, LLVMDoubleType (), dname); + break; + case OP_RCONV_TO_R4: + values [ins->dreg] = lhs; break; case OP_SEXT_I4: values [ins->dreg] = LLVMBuildSExt (builder, convert (ctx, lhs, LLVMInt32Type ()), LLVMInt64Type (), dname); @@ -3119,7 +3492,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) values [ins->dreg] = LLVMBuildSExt (builder, values [ins->dreg], LLVMInt32Type (), dname); else if (zext) values [ins->dreg] = LLVMBuildZExt (builder, values [ins->dreg], LLVMInt32Type (), dname); - else if (ins->opcode == OP_LOADR4_MEMBASE) + else if (!cfg->r4fp && ins->opcode == OP_LOADR4_MEMBASE) values [ins->dreg] = LLVMBuildFPExt (builder, values [ins->dreg], LLVMDoubleType (), dname); break; } @@ -3188,16 +3561,19 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) case OP_CALL: case OP_LCALL: case OP_FCALL: + case OP_RCALL: case OP_VCALL: case OP_VOIDCALL_MEMBASE: case OP_CALL_MEMBASE: case OP_LCALL_MEMBASE: case OP_FCALL_MEMBASE: + case OP_RCALL_MEMBASE: case OP_VCALL_MEMBASE: case OP_VOIDCALL_REG: case OP_CALL_REG: case OP_LCALL_REG: case OP_FCALL_REG: + case OP_RCALL_REG: case OP_VCALL_REG: { process_call (ctx, bb, &builder, ins); CHECK_FAILURE (ctx); @@ -3224,6 +3600,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) //mono_add_patch_info (cfg, 0, (MonoJumpInfoType)ins->inst_i1, ins->inst_p0); got_offset = mono_aot_get_got_offset (cfg->patch_info); + ctx->lmodule->max_got_offset = MAX (ctx->lmodule->max_got_offset, got_offset); indexes [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); indexes [1] = LLVMConstInt (LLVMInt32Type (), (gssize)got_offset, FALSE); @@ -3389,7 +3766,86 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) break; } case OP_MEMORY_BARRIER: { - mono_llvm_build_fence (builder); + mono_llvm_build_fence (builder, (BarrierKind) ins->backend.memory_barrier_kind); + break; + } + case OP_ATOMIC_LOAD_I1: + case OP_ATOMIC_LOAD_I2: + case OP_ATOMIC_LOAD_I4: + case OP_ATOMIC_LOAD_I8: + case OP_ATOMIC_LOAD_U1: + case OP_ATOMIC_LOAD_U2: + case OP_ATOMIC_LOAD_U4: + case OP_ATOMIC_LOAD_U8: + case OP_ATOMIC_LOAD_R4: + case OP_ATOMIC_LOAD_R8: { + LLVM_FAILURE (ctx, "atomic mono.load intrinsic"); +#if LLVM_API_VERSION >= 4 + int size; + gboolean sext, zext; + LLVMTypeRef t; + gboolean is_volatile = (ins->flags & MONO_INST_FAULT); + BarrierKind barrier = (BarrierKind) ins->backend.memory_barrier_kind; + LLVMValueRef index, addr; + + t = load_store_to_llvm_type (ins->opcode, &size, &sext, &zext); + + if (sext || zext) + dname = (char *)""; + + if (ins->inst_offset != 0) { + index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE); + addr = LLVMBuildGEP (builder, convert (ctx, lhs, LLVMPointerType (t, 0)), &index, 1, ""); + } else { + addr = lhs; + } + + addr = convert (ctx, addr, LLVMPointerType (t, 0)); + + values [ins->dreg] = emit_load_general (ctx, bb, &builder, size, addr, dname, is_volatile, barrier); + + if (sext) + values [ins->dreg] = LLVMBuildSExt (builder, values [ins->dreg], LLVMInt32Type (), dname); + else if (zext) + values [ins->dreg] = LLVMBuildZExt (builder, values [ins->dreg], LLVMInt32Type (), dname); +#else + LLVM_FAILURE (ctx, "atomic mono.load intrinsic"); +#endif + break; + } + case OP_ATOMIC_STORE_I1: + case OP_ATOMIC_STORE_I2: + case OP_ATOMIC_STORE_I4: + case OP_ATOMIC_STORE_I8: + case OP_ATOMIC_STORE_U1: + case OP_ATOMIC_STORE_U2: + case OP_ATOMIC_STORE_U4: + case OP_ATOMIC_STORE_U8: + case OP_ATOMIC_STORE_R4: + case OP_ATOMIC_STORE_R8: { + LLVM_FAILURE (ctx, "atomic mono.load intrinsic"); +#if LLVM_API_VERSION >= 4 + int size; + gboolean sext, zext; + LLVMTypeRef t; + gboolean is_volatile = (ins->flags & MONO_INST_FAULT); + BarrierKind barrier = (BarrierKind) ins->backend.memory_barrier_kind; + LLVMValueRef index, addr, value; + + if (!values [ins->inst_destbasereg]) + LLVM_FAILURE (ctx, "inst_destbasereg"); + + t = load_store_to_llvm_type (ins->opcode, &size, &sext, &zext); + + index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE); + addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (t, 0)), &index, 1, ""); + value = convert (ctx, values [ins->sreg1], t); + + emit_store_general (ctx, bb, &builder, size, value, addr, is_volatile, barrier); + break; +#else + LLVM_FAILURE (ctx, "atomic mono.store intrinsic"); +#endif break; } case OP_RELAXED_NOP: { @@ -3796,6 +4252,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) case OP_EXPAND_R8: { LLVMTypeRef t = simd_op_to_llvm_type (ins->opcode); LLVMValueRef mask [16], v; + int i; for (i = 0; i < 16; ++i) mask [i] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); @@ -3847,11 +4304,6 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) break; } - case OP_ICONV_TO_R8_RAW: - /* Same as OP_ICONV_TO_R8 */ - values [ins->dreg] = convert (ctx, LLVMBuildBitCast (builder, lhs, LLVMFloatType (), ""), LLVMDoubleType ()); - break; - case OP_COMPPS: case OP_COMPPD: { LLVMValueRef args [3]; @@ -4245,8 +4697,10 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) if (!has_terminator && bb->next_bb && (bb == cfg->bb_entry || bb->in_count > 0)) LLVMBuildBr (builder, get_bb (ctx, bb->next_bb)); - if (bb == cfg->bb_exit && sig->ret->type == MONO_TYPE_VOID) + if (bb == cfg->bb_exit && sig->ret->type == MONO_TYPE_VOID) { + emit_dbg_loc (ctx, builder, cfg->header->code + cfg->header->code_size - 1); LLVMBuildRetVoid (builder); + } if (bb == cfg->bb_entry) ctx->last_alloca = LLVMGetLastInstruction (get_bb (ctx, cfg->bb_entry)); @@ -4430,6 +4884,10 @@ mono_llvm_emit_method (MonoCompile *cfg) /* This causes an assertion in later LLVM versions */ LLVMSetVisibility (method, LLVMHiddenVisibility); #endif + if (ctx->lmodule->external_symbols) { + LLVMSetLinkage (method, LLVMExternalLinkage); + LLVMSetVisibility (method, LLVMHiddenVisibility); + } } else { LLVMSetLinkage (method, LLVMPrivateLinkage); } @@ -4446,6 +4904,9 @@ mono_llvm_emit_method (MonoCompile *cfg) if (clause->flags != MONO_EXCEPTION_CLAUSE_FINALLY && clause->flags != MONO_EXCEPTION_CLAUSE_NONE) LLVM_FAILURE (ctx, "non-finally/catch clause."); } + if (header->num_clauses || (cfg->method->iflags & METHOD_IMPL_ATTRIBUTE_NOINLINING)) + /* We can't handle inlined methods with clauses */ + LLVMAddFunctionAttr (method, LLVMNoInlineAttribute); if (linfo->rgctx_arg) { ctx->rgctx_arg = LLVMGetParam (method, sinfo.rgctx_arg_pindex); @@ -4484,6 +4945,11 @@ mono_llvm_emit_method (MonoCompile *cfg) } g_free (names); + if (ctx->lmodule->emit_dwarf && cfg->compile_aot && mono_debug_enabled ()) { + ctx->minfo = mono_debug_lookup_method (cfg->method); + ctx->dbg_md = emit_dbg_subprogram (ctx, cfg, method, method_name); + } + max_block_num = 0; for (bb = cfg->bb_entry; bb; bb = bb->next_bb) max_block_num = MAX (max_block_num, bb->block_num); @@ -4531,7 +4997,7 @@ mono_llvm_emit_method (MonoCompile *cfg) case OP_FPHI: case OP_VPHI: case OP_XPHI: { - LLVMTypeRef phi_type = llvm_type_to_stack_type (type_to_llvm_type (ctx, &ins->klass->byval_arg)); + LLVMTypeRef phi_type = llvm_type_to_stack_type (cfg, type_to_llvm_type (ctx, &ins->klass->byval_arg)); CHECK_FAILURE (ctx); @@ -4802,6 +5268,8 @@ mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call) } case LLVMArgVtypeByVal: case LLVMArgVtypeInReg: + case LLVMArgAsIArgs: + case LLVMArgAsFpArgs: MONO_INST_NEW (cfg, ins, OP_LLVM_OUTARG_VT); ins->dreg = mono_alloc_ireg (cfg); ins->sreg1 = in->dreg; @@ -5203,15 +5671,21 @@ add_intrinsics (LLVMModuleRef module) arg_types [0] = LLVMPointerType (LLVMIntType (i * 8), 0); arg_types [1] = LLVMInt32Type (); arg_types [2] = LLVMInt1Type (); +#if LLVM_API_VERSION >= 4 + arg_types [3] = LLVMInt32Type (); +#endif sprintf (name, "llvm.mono.load.i%d.p0i%d", i * 8, i * 8); - LLVMAddFunction (module, name, LLVMFunctionType (LLVMIntType (i * 8), arg_types, 3, FALSE)); + LLVMAddFunction (module, name, LLVMFunctionType (LLVMIntType (i * 8), arg_types, 3 + EXTRA_MONO_LOAD_STORE_ARGS, FALSE)); arg_types [0] = LLVMIntType (i * 8); arg_types [1] = LLVMPointerType (LLVMIntType (i * 8), 0); arg_types [2] = LLVMInt32Type (); arg_types [3] = LLVMInt1Type (); +#if LLVM_API_VERSION >= 4 + arg_types [4] = LLVMInt32Type (); +#endif sprintf (name, "llvm.mono.store.i%d.p0i%d", i * 8, i * 8); - LLVMAddFunction (module, name, LLVMFunctionType (LLVMVoidType (), arg_types, 4, FALSE)); + LLVMAddFunction (module, name, LLVMFunctionType (LLVMVoidType (), arg_types, 4 + EXTRA_MONO_LOAD_STORE_ARGS, FALSE)); } } } @@ -5307,7 +5781,7 @@ mono_llvm_free_domain_info (MonoDomain *domain) } void -mono_llvm_create_aot_module (const char *got_symbol) +mono_llvm_create_aot_module (const char *got_symbol, gboolean external_symbols, gboolean emit_dwarf) { /* Delete previous module */ if (aot_module.plt_entries) @@ -5319,6 +5793,10 @@ mono_llvm_create_aot_module (const char *got_symbol) aot_module.module = LLVMModuleCreateWithName ("aot"); aot_module.got_symbol = got_symbol; + aot_module.external_symbols = external_symbols; + aot_module.emit_dwarf = emit_dwarf; + /* The first few entries are reserved */ + aot_module.max_got_offset = 16; add_intrinsics (aot_module.module); add_types (&aot_module); @@ -5349,6 +5827,7 @@ mono_llvm_create_aot_module (const char *got_symbol) lbuilder = LLVMCreateBuilder (); LLVMPositionBuilderAtEnd (lbuilder, lbb); LLVMBuildRetVoid (lbuilder); + mark_as_used (&aot_module, personality); } aot_module.llvm_types = g_hash_table_new (NULL, NULL); @@ -5361,7 +5840,7 @@ mono_llvm_create_aot_module (const char *got_symbol) * Emit the aot module into the LLVM bitcode file FILENAME. */ void -mono_llvm_emit_aot_module (const char *filename, int got_size) +mono_llvm_emit_aot_module (const char *filename, const char *cu_name) { LLVMTypeRef got_type; LLVMValueRef real_got; @@ -5371,11 +5850,15 @@ mono_llvm_emit_aot_module (const char *filename, int got_size) * Create the real got variable and replace all uses of the dummy variable with * the real one. */ - got_type = LLVMArrayType (aot_module.ptr_type, got_size); + got_type = LLVMArrayType (aot_module.ptr_type, module->max_got_offset + 1); real_got = LLVMAddGlobal (aot_module.module, got_type, aot_module.got_symbol); LLVMSetInitializer (real_got, LLVMConstNull (got_type)); - LLVMSetLinkage (real_got, LLVMInternalLinkage); - + if (module->external_symbols) { + LLVMSetLinkage (real_got, LLVMExternalLinkage); + LLVMSetVisibility (real_got, LLVMHiddenVisibility); + } else { + LLVMSetLinkage (real_got, LLVMInternalLinkage); + } mono_llvm_replace_uses_of (aot_module.got_var, real_got); mark_as_used (&aot_module, real_got); @@ -5384,6 +5867,7 @@ mono_llvm_emit_aot_module (const char *filename, int got_size) LLVMDeleteGlobal (aot_module.got_var); emit_llvm_used (&aot_module); + emit_dbg_info (&aot_module, filename, cu_name); /* Replace PLT entries for directly callable methods with the methods themselves */ { @@ -5419,6 +5903,223 @@ mono_llvm_emit_aot_module (const char *filename, int got_size) LLVMWriteBitcodeToFile (aot_module.module, filename); } + +static LLVMValueRef +md_string (const char *s) +{ + return LLVMMDString (s, strlen (s)); +} + +/* Debugging support */ + +static void +emit_dbg_info (MonoLLVMModule *lmodule, const char *filename, const char *cu_name) +{ + LLVMModuleRef module = lmodule->module; + LLVMValueRef args [16], cu_args [16], cu, ver; + int n_cuargs; + char *build_info, *s, *dir; + + /* + * This can only be enabled when LLVM code is emitted into a separate object + * file, since the AOT compiler also emits dwarf info, + * and the abbrev indexes will not be correct since llvm has added its own + * abbrevs. + */ + if (!lmodule->emit_dwarf) + return; + + /* + * Emit dwarf info in the form of LLVM metadata. There is some + * out-of-date documentation at: + * http://llvm.org/docs/SourceLevelDebugging.html + * but most of this was gathered from the llvm and + * clang sources. + */ + + n_cuargs = 0; + cu_args [n_cuargs ++] = LLVMConstInt (LLVMInt32Type (), DW_TAG_compile_unit, FALSE); + /* CU name/compilation dir */ + dir = g_path_get_dirname (filename); + args [0] = LLVMMDString (cu_name, strlen (cu_name)); + args [1] = LLVMMDString (dir, strlen (dir)); + cu_args [n_cuargs ++] = LLVMMDNode (args, 2); + g_free (dir); + /* Language */ + cu_args [n_cuargs ++] = LLVMConstInt (LLVMInt32Type (), DW_LANG_C99, FALSE); + /* Producer */ + build_info = mono_get_runtime_build_info (); + s = g_strdup_printf ("Mono AOT Compiler %s (LLVM)", build_info); + cu_args [n_cuargs ++] = LLVMMDString (s, strlen (s)); + g_free (build_info); + /* Optimized */ + cu_args [n_cuargs ++] = LLVMConstInt (LLVMInt32Type (), 1, FALSE); + /* Flags */ + cu_args [n_cuargs ++] = LLVMMDString ("", strlen ("")); + /* Runtime version */ + cu_args [n_cuargs ++] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); + /* Enums */ + cu_args [n_cuargs ++] = LLVMMDNode (args, 0); + cu_args [n_cuargs ++] = LLVMMDNode (args, 0); + /* Subprograms */ + if (lmodule->subprogram_mds) { + LLVMValueRef *mds; + int i; + + mds = g_new0 (LLVMValueRef, lmodule->subprogram_mds->len); + for (i = 0; i < lmodule->subprogram_mds->len; ++i) + mds [i] = g_ptr_array_index (lmodule->subprogram_mds, i); + cu_args [n_cuargs ++] = LLVMMDNode (mds, lmodule->subprogram_mds->len); + } else { + cu_args [n_cuargs ++] = LLVMMDNode (args, 0); + } + /* GVs */ + cu_args [n_cuargs ++] = LLVMMDNode (args, 0); + /* Imported modules */ + cu_args [n_cuargs ++] = LLVMMDNode (args, 0); + /* SplitName */ + cu_args [n_cuargs ++] = LLVMMDString ("", strlen ("")); + /* DebugEmissionKind = FullDebug */ + cu_args [n_cuargs ++] = LLVMConstInt (LLVMInt32Type (), 1, FALSE); + cu = LLVMMDNode (cu_args, n_cuargs); + LLVMAddNamedMetadataOperand (module, "llvm.dbg.cu", cu); + + args [0] = LLVMConstInt (LLVMInt32Type (), 1, FALSE); + args [1] = LLVMMDString ("Dwarf Version", strlen ("Dwarf Version")); + args [2] = LLVMConstInt (LLVMInt32Type (), 2, FALSE); + ver = LLVMMDNode (args, 3); + LLVMAddNamedMetadataOperand (module, "llvm.module.flags", ver); + + args [0] = LLVMConstInt (LLVMInt32Type (), 1, FALSE); + args [1] = LLVMMDString ("Debug Info Version", strlen ("Debug Info Version")); + args [2] = LLVMConstInt (LLVMInt32Type (), 1, FALSE); + ver = LLVMMDNode (args, 3); + LLVMAddNamedMetadataOperand (module, "llvm.module.flags", ver); +} + +static LLVMValueRef +emit_dbg_subprogram (EmitContext *ctx, MonoCompile *cfg, LLVMValueRef method, const char *name) +{ + MonoLLVMModule *module = ctx->lmodule; + MonoDebugMethodInfo *minfo = ctx->minfo; + char *source_file, *dir, *filename; + LLVMValueRef md, args [16], ctx_args [16], md_args [64], type_args [16], ctx_md, type_md; + int n_il_offsets; + int *il_offsets; + int *line_numbers; + + if (!minfo) + return NULL; + + mono_debug_symfile_get_line_numbers_full (minfo, &source_file, NULL, &n_il_offsets, &il_offsets, &line_numbers, NULL, NULL, NULL, NULL); + if (!source_file) + source_file = g_strdup (""); + dir = g_path_get_dirname (source_file); + filename = g_path_get_basename (source_file); + + ctx_args [0] = LLVMConstInt (LLVMInt32Type (), 0x29, FALSE); + args [0] = md_string (filename); + args [1] = md_string (dir); + ctx_args [1] = LLVMMDNode (args, 2); + ctx_md = LLVMMDNode (ctx_args, 2); + + type_args [0] = LLVMConstInt (LLVMInt32Type (), DW_TAG_subroutine_type, FALSE); + type_args [1] = NULL; + type_args [2] = NULL; + type_args [3] = LLVMMDString ("", 0); + type_args [4] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); + type_args [5] = LLVMConstInt (LLVMInt64Type (), 0, FALSE); + type_args [6] = LLVMConstInt (LLVMInt64Type (), 0, FALSE); + type_args [7] = LLVMConstInt (LLVMInt64Type (), 0, FALSE); + type_args [8] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); + type_args [9] = NULL; + type_args [10] = NULL; + type_args [11] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); + type_args [12] = NULL; + type_args [13] = NULL; + type_args [14] = NULL; + type_md = LLVMMDNode (type_args, 14); + + /* http://llvm.org/docs/SourceLevelDebugging.html#subprogram-descriptors */ + md_args [0] = LLVMConstInt (LLVMInt32Type (), DW_TAG_subprogram, FALSE); + /* Source directory + file pair */ + args [0] = md_string (filename); + args [1] = md_string (dir); + md_args [1] = LLVMMDNode (args ,2); + md_args [2] = ctx_md; + md_args [3] = md_string (cfg->method->name); + md_args [4] = md_string (name); + md_args [5] = md_string (name); + /* Line number */ + if (n_il_offsets) + md_args [6] = LLVMConstInt (LLVMInt32Type (), line_numbers [0], FALSE); + else + md_args [6] = LLVMConstInt (LLVMInt32Type (), 1, FALSE); + /* Type */ + md_args [7] = type_md; + /* static */ + md_args [8] = LLVMConstInt (LLVMInt1Type (), 0, FALSE); + /* not extern */ + md_args [9] = LLVMConstInt (LLVMInt1Type (), 1, FALSE); + /* Virtuality */ + md_args [10] = LLVMConstInt (LLVMInt32Type (), 0, FALSE); + /* Index into a virtual function */ + md_args [11] = NULL; + md_args [12] = NULL; + /* Flags */ + md_args [13] = LLVMConstInt (LLVMInt1Type (), 0, FALSE); + /* isOptimized */ + md_args [14] = LLVMConstInt (LLVMInt1Type (), 1, FALSE); + /* Pointer to LLVM function */ + md_args [15] = method; + /* Function template parameter */ + md_args [16] = NULL; + /* Function declaration descriptor */ + md_args [17] = NULL; + /* List of function variables */ + md_args [18] = LLVMMDNode (args, 0); + /* Line number */ + md_args [19] = LLVMConstInt (LLVMInt32Type (), 1, FALSE); + md = LLVMMDNode (md_args, 20); + + if (!module->subprogram_mds) + module->subprogram_mds = g_ptr_array_new (); + g_ptr_array_add (module->subprogram_mds, md); + + g_free (dir); + g_free (filename); + g_free (source_file); + g_free (il_offsets); + g_free (line_numbers); + + return md; +} + +static void +emit_dbg_loc (EmitContext *ctx, LLVMBuilderRef builder, const unsigned char *cil_code) +{ + MonoCompile *cfg = ctx->cfg; + + if (ctx->minfo && cil_code && cil_code >= cfg->header->code && cil_code < cfg->header->code + cfg->header->code_size) { + MonoDebugSourceLocation *loc; + LLVMValueRef loc_md, md_args [16]; + int nmd_args; + + loc = mono_debug_symfile_lookup_location (ctx->minfo, cil_code - cfg->header->code); + + if (loc) { + nmd_args = 0; + md_args [nmd_args ++] = LLVMConstInt (LLVMInt32Type (), loc->row, FALSE); + md_args [nmd_args ++] = LLVMConstInt (LLVMInt32Type (), loc->column, FALSE); + md_args [nmd_args ++] = ctx->dbg_md; + md_args [nmd_args ++] = NULL; + loc_md = LLVMMDNode (md_args, nmd_args); + LLVMSetCurrentDebugLocation (builder, loc_md); + mono_debug_symfile_free_location (loc); + } + } +} + /* DESIGN: - Emit LLVM IR from the mono IR using the LLVM C API. diff --git a/mta-mono/vendor/mono/mini/mini-llvm.h b/mta-mono/vendor/mono/mini/mini-llvm.h index 541ae3d..eec8bb5 100644 --- a/mta-mono/vendor/mono/mini/mini-llvm.h +++ b/mta-mono/vendor/mono/mini/mini-llvm.h @@ -15,8 +15,8 @@ int mono_llvm_load (const char* bpath) MONO_INTERNAL; typedef void (*MonoLLVMVoidFunc)(void); typedef void (*MonoLLVMCFGFunc)(MonoCompile *cfg); typedef void (*MonoLLVMEmitCallFunc)(MonoCompile *cfg, MonoCallInst *call); -typedef void (*MonoLLVMCreateAotFunc)(const char *got_symbol); -typedef void (*MonoLLVMEmitAotFunc)(const char *filename, int got_size); +typedef void (*MonoLLVMCreateAotFunc)(const char *got_symbol, gboolean external_symbols, gboolean emit_dwarf); +typedef void (*MonoLLVMEmitAotFunc)(const char *filename, const char *cu_name); typedef void (*MonoLLVMFreeDomainFunc)(MonoDomain *domain); static MonoLLVMVoidFunc mono_llvm_init_fptr; @@ -53,17 +53,17 @@ mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call) } void -mono_llvm_create_aot_module (const char *got_symbol) +mono_llvm_create_aot_module (const char *got_symbol, gboolean external_symbols, gboolean emit_dwarf) { g_assert (mono_llvm_create_aot_module_fptr); - mono_llvm_create_aot_module_fptr (got_symbol); + mono_llvm_create_aot_module_fptr (got_symbol, external_symbols, emit_dwarf); } void -mono_llvm_emit_aot_module (const char *filename, int got_size) +mono_llvm_emit_aot_module (const char *filename, const char *cu_name) { g_assert (mono_llvm_emit_aot_module_fptr); - mono_llvm_emit_aot_module_fptr (filename, got_size); + mono_llvm_emit_aot_module_fptr (filename, cu_name); } void diff --git a/mta-mono/vendor/mono/mini/mini-mips.c b/mta-mono/vendor/mono/mini/mini-mips.c index 2aa6bd1..833a1fa 100644 --- a/mta-mono/vendor/mono/mini/mini-mips.c +++ b/mta-mono/vendor/mono/mini/mini-mips.c @@ -3305,8 +3305,8 @@ emit_reserve_param_area (MonoCompile *cfg, guint8 *code) if (ppc_is_imm16 (-size)) { ppc_stwu (code, ppc_r0, -size, ppc_sp); } else { - ppc_load (code, ppc_r11, -size); - ppc_stwux (code, ppc_r0, ppc_sp, ppc_r11); + ppc_load (code, ppc_r12, -size); + ppc_stwux (code, ppc_r0, ppc_sp, ppc_r12); } #endif return code; @@ -3327,8 +3327,8 @@ emit_unreserve_param_area (MonoCompile *cfg, guint8 *code) if (ppc_is_imm16 (size)) { ppc_stwu (code, ppc_r0, size, ppc_sp); } else { - ppc_load (code, ppc_r11, size); - ppc_stwux (code, ppc_r0, ppc_sp, ppc_r11); + ppc_load (code, ppc_r12, size); + ppc_stwux (code, ppc_r0, ppc_sp, ppc_r12); } #endif return code; @@ -3394,6 +3394,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_NOT_REACHED: case OP_NOT_NULL: break; + case OP_IL_SEQ_POINT: + mono_add_seq_point (cfg, bb, ins, code - cfg->native_code); + break; case OP_SEQ_POINT: { if (ins->flags & MONO_INST_SINGLE_STEP_LOC) { guint32 addr = (guint32)ss_trigger_page; @@ -3431,9 +3434,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) mips_mfhi (code, ins->dreg+1); break; case OP_MEMORY_BARRIER: -#if 0 - ppc_sync (code); -#endif + mips_sync (code, 0); break; case OP_STOREI1_MEMBASE_IMM: mips_load_const (code, mips_temp, ins->inst_imm); @@ -3719,8 +3720,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_DIV_IMM: g_assert_not_reached (); #if 0 - ppc_load (code, ppc_r11, ins->inst_imm); - ppc_divwod (code, ins->dreg, ins->sreg1, ppc_r11); + ppc_load (code, ppc_r12, ins->inst_imm); + ppc_divwod (code, ins->dreg, ins->sreg1, ppc_r12); ppc_mfspr (code, ppc_r0, ppc_xer); ppc_andisd (code, ppc_r0, ppc_r0, (1<<14)); /* FIXME: use OverflowException for 0x80000000/-1 */ @@ -3912,6 +3913,14 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) mips_fmovd (code, ins->dreg, ins->sreg1); } break; + case OP_MOVE_F_TO_I4: + mips_cvtsd (code, mips_ftemp, ins->sreg1); + mips_mfc1 (code, ins->dreg, mips_ftemp); + break; + case OP_MOVE_I4_TO_F: + mips_mtc1 (code, ins->dreg, ins->sreg1); + mips_cvtds (code, ins->dreg, ins->dreg); + break; case OP_MIPS_CVTSD: /* Convert from double to float and leave it there */ mips_cvtsd (code, ins->dreg, ins->sreg1); diff --git a/mta-mono/vendor/mono/mini/mini-mips.h b/mta-mono/vendor/mono/mini/mini-mips.h index d8d7691..1d84ef8 100644 --- a/mta-mono/vendor/mono/mini/mini-mips.h +++ b/mta-mono/vendor/mono/mini/mini-mips.h @@ -231,7 +231,6 @@ typedef struct MonoCompileArch { #define MONO_ARCH_EMULATE_LCONV_TO_R4 1 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1 #define MONO_ARCH_EMULATE_FREM 1 -#define MONO_ARCH_BIGMUL_INTRINS 1 #endif #if SIZEOF_REGISTER == 8 @@ -330,8 +329,6 @@ typedef struct { #undef DEBUG_EXCEPTIONS -#define MONO_ZERO_REG mips_zero - #define MONO_EMIT_NEW_MIPS_COND_EXC(cfg,cond,sr1,sr2,name) do { \ MonoInst *inst; \ MONO_INST_NEW ((cfg), (inst), cond); \ diff --git a/mta-mono/vendor/mono/mini/mini-ops.h b/mta-mono/vendor/mono/mini/mini-ops.h index e667a4c..cdab7a8 100644 --- a/mta-mono/vendor/mono/mini/mini-ops.h +++ b/mta-mono/vendor/mono/mini/mini-ops.h @@ -15,6 +15,7 @@ MINI_OP(OP_VPHI, "vphi", VREG, NONE, NONE) MINI_OP(OP_COMPARE, "compare", NONE, IREG, IREG) MINI_OP(OP_COMPARE_IMM, "compare_imm", NONE, IREG, NONE) MINI_OP(OP_FCOMPARE, "fcompare", NONE, FREG, FREG) +MINI_OP(OP_RCOMPARE, "rcompare", NONE, FREG, FREG) MINI_OP(OP_LCOMPARE, "lcompare", NONE, LREG, LREG) MINI_OP(OP_ICOMPARE, "icompare", NONE, IREG, IREG) MINI_OP(OP_ICOMPARE_IMM, "icompare_imm", NONE, IREG, NONE) @@ -37,6 +38,7 @@ MINI_OP(OP_LOCALLOC, "localloc", IREG, IREG, NONE) MINI_OP(OP_LOCALLOC_IMM, "localloc_imm", IREG, NONE, NONE) MINI_OP(OP_CHECK_THIS, "checkthis", NONE, IREG, NONE) MINI_OP(OP_SEQ_POINT, "seq_point", NONE, NONE, NONE) +MINI_OP(OP_IL_SEQ_POINT, "il_seq_point", NONE, NONE, NONE) MINI_OP(OP_IMPLICIT_EXCEPTION, "implicit_exception", NONE, NONE, NONE) MINI_OP(OP_VOIDCALL, "voidcall", NONE, NONE, NONE) @@ -48,6 +50,9 @@ MINI_OP(OP_CALL_MEMBASE, "call_membase", IREG, IREG, NONE) MINI_OP(OP_FCALL, "fcall", FREG, NONE, NONE) MINI_OP(OP_FCALL_REG, "fcall_reg", FREG, IREG, NONE) MINI_OP(OP_FCALL_MEMBASE, "fcall_membase", FREG, IREG, NONE) +MINI_OP(OP_RCALL, "rcall", FREG, NONE, NONE) +MINI_OP(OP_RCALL_REG, "rcall_reg", FREG, IREG, NONE) +MINI_OP(OP_RCALL_MEMBASE, "rcall_membase", FREG, IREG, NONE) MINI_OP(OP_LCALL, "lcall", LREG, NONE, NONE) MINI_OP(OP_LCALL_REG, "lcall_reg", LREG, IREG, NONE) MINI_OP(OP_LCALL_MEMBASE, "lcall_membase", LREG, IREG, NONE) @@ -67,6 +72,7 @@ MINI_OP(OP_R8CONST, "r8const", FREG, NONE, NONE) MINI_OP(OP_DUMMY_ICONST, "dummy_iconst", IREG, NONE, NONE) MINI_OP(OP_DUMMY_I8CONST, "dummy_i8const", LREG, NONE, NONE) MINI_OP(OP_DUMMY_R8CONST, "dummy_r8const", FREG, NONE, NONE) +MINI_OP(OP_DUMMY_R4CONST, "dummy_r4const", FREG, NONE, NONE) MINI_OP(OP_DUMMY_VZERO, "dummy_vzero", VREG, NONE, NONE) MINI_OP(OP_REGVAR, "regvar", NONE, NONE, NONE) MINI_OP(OP_REGOFFSET, "regoffset", NONE, NONE, NONE) @@ -169,6 +175,17 @@ MINI_OP(OP_MOVE, "move", IREG, IREG, NONE) MINI_OP(OP_LMOVE, "lmove", LREG, LREG, NONE) MINI_OP(OP_FMOVE, "fmove", FREG, FREG, NONE) MINI_OP(OP_VMOVE, "vmove", VREG, VREG, NONE) +MINI_OP(OP_RMOVE, "rmove", FREG, FREG, NONE) + +/* + * All 4 of these are only available when soft float isn't active. They + * perform no conversions; they simply move values back and forth. + */ +MINI_OP(OP_MOVE_F_TO_I4, "move_f_to_i4", IREG, FREG, NONE) +MINI_OP(OP_MOVE_I4_TO_F, "move_i4_to_f", FREG, IREG, NONE) +/* These 2 are only available on 64-bit targets. */ +MINI_OP(OP_MOVE_F_TO_I8, "move_f_to_i8", IREG, FREG, NONE) +MINI_OP(OP_MOVE_I8_TO_F, "move_i8_to_f", FREG, IREG, NONE) MINI_OP(OP_VZERO, "vzero", VREG, NONE, NONE) @@ -292,11 +309,11 @@ MINI_OP(OP_LCONV_TO_OVF_I8,"long_conv_to_ovf_i8", LREG, LREG, NONE) MINI_OP(OP_LCONV_TO_OVF_U8,"long_conv_to_ovf_u8", LREG, LREG, NONE) /* mono_decompose_long_opts () depends on the order here */ -MINI_OP(OP_LCEQ, "long_ceq", LREG, NONE, NONE) -MINI_OP(OP_LCGT, "long_cgt", LREG, NONE, NONE) -MINI_OP(OP_LCGT_UN,"long_cgt_un", LREG, NONE, NONE) -MINI_OP(OP_LCLT, "long_clt", LREG, NONE, NONE) -MINI_OP(OP_LCLT_UN,"long_clt_un", LREG, NONE, NONE) +MINI_OP(OP_LCEQ, "long_ceq", IREG, NONE, NONE) +MINI_OP(OP_LCGT, "long_cgt", IREG, NONE, NONE) +MINI_OP(OP_LCGT_UN,"long_cgt_un", IREG, NONE, NONE) +MINI_OP(OP_LCLT, "long_clt", IREG, NONE, NONE) +MINI_OP(OP_LCLT_UN,"long_clt_un", IREG, NONE, NONE) MINI_OP(OP_LCONV_TO_R_UN,"long_conv_to_r_un", FREG, LREG, NONE) MINI_OP(OP_LCONV_TO_U, "long_conv_to_u", IREG, LREG, NONE) @@ -453,6 +470,17 @@ MINI_OP(OP_FBGT_UN, "float_bgt_un", NONE, NONE, NONE) MINI_OP(OP_FBLE_UN, "float_ble_un", NONE, NONE, NONE) MINI_OP(OP_FBLT_UN, "float_blt_un", NONE, NONE, NONE) +MINI_OP(OP_RBEQ, "r4_beq", NONE, NONE, NONE) +MINI_OP(OP_RBGE, "r4_bge", NONE, NONE, NONE) +MINI_OP(OP_RBGT, "r4_bgt", NONE, NONE, NONE) +MINI_OP(OP_RBLE, "r4_ble", NONE, NONE, NONE) +MINI_OP(OP_RBLT, "r4_blt", NONE, NONE, NONE) +MINI_OP(OP_RBNE_UN, "r4_bne_un", NONE, NONE, NONE) +MINI_OP(OP_RBGE_UN, "r4_bge_un", NONE, NONE, NONE) +MINI_OP(OP_RBGT_UN, "r4_bgt_un", NONE, NONE, NONE) +MINI_OP(OP_RBLE_UN, "r4_ble_un", NONE, NONE, NONE) +MINI_OP(OP_RBLT_UN, "r4_blt_un", NONE, NONE, NONE) + /* float opcodes: must be in the same order as the matching CEE_ opcodes: binops_op_map */ MINI_OP(OP_FADD, "float_add", FREG, FREG, FREG) MINI_OP(OP_FSUB, "float_sub", FREG, FREG, FREG) @@ -462,6 +490,15 @@ MINI_OP(OP_FDIV_UN,"float_div_un", FREG, FREG, FREG) MINI_OP(OP_FREM, "float_rem", FREG, FREG, FREG) MINI_OP(OP_FREM_UN,"float_rem_un", FREG, FREG, FREG) +/* r4 opcodes: must be in the same order as the matching CEE_ opcodes: binops_op_map */ +MINI_OP(OP_RADD, "r4_add", FREG, FREG, FREG) +MINI_OP(OP_RSUB, "r4_sub", FREG, FREG, FREG) +MINI_OP(OP_RMUL, "r4_mul", FREG, FREG, FREG) +MINI_OP(OP_RDIV, "r4_div", FREG, FREG, FREG) +MINI_OP(OP_RDIV_UN,"r4_div_un", FREG, FREG, FREG) +MINI_OP(OP_RREM, "r4_rem", FREG, FREG, FREG) +MINI_OP(OP_RREM_UN,"r4_rem_un", FREG, FREG, FREG) + /* float opcodes: must be in the same order as the matching CEE_ opcodes: unops_op_map */ MINI_OP(OP_FNEG, "float_neg", FREG, FREG, NONE) MINI_OP(OP_FNOT, "float_not", FREG, FREG, NONE) @@ -474,12 +511,25 @@ MINI_OP(OP_FCONV_TO_R8,"float_conv_to_r8", FREG, FREG, NONE) MINI_OP(OP_FCONV_TO_U4,"float_conv_to_u4", IREG, FREG, NONE) MINI_OP(OP_FCONV_TO_U8,"float_conv_to_u8", LREG, FREG, NONE) +MINI_OP(OP_RNEG, "r4_neg", FREG, FREG, NONE) +MINI_OP(OP_RNOT, "r4_not", FREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_I1,"r4_conv_to_i1", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_I2,"r4_conv_to_i2", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_I4,"r4_conv_to_i4", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_I8,"r4_conv_to_i8", LREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_R4,"r4_conv_to_r4", FREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_R8,"r4_conv_to_r8", FREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_U4,"r4_conv_to_u4", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_U8,"r4_conv_to_u8", LREG, FREG, NONE) + +/* float opcodes: must be in the same order as the matching CEE_ opcodes: ovfops_op_map */ MINI_OP(OP_FCONV_TO_U2, "float_conv_to_u2", IREG, FREG, NONE) MINI_OP(OP_FCONV_TO_U1, "float_conv_to_u1", IREG, FREG, NONE) MINI_OP(OP_FCONV_TO_I, "float_conv_to_i", IREG, FREG, NONE) MINI_OP(OP_FCONV_TO_OVF_I,"float_conv_to_ovf_i", IREG, FREG, NONE) MINI_OP(OP_FCONV_TO_OVF_U,"float_conv_to_ovd_u", IREG, FREG, NONE) +/* float opcodes: must be in the same order as the matching CEE_ opcodes: ovfops_op_map */ MINI_OP(OP_FADD_OVF, "float_add_ovf", FREG, FREG, FREG) MINI_OP(OP_FADD_OVF_UN, "float_add_ovf_un", FREG, FREG, FREG) MINI_OP(OP_FMUL_OVF, "float_mul_ovf", FREG, FREG, FREG) @@ -527,6 +577,52 @@ MINI_OP(OP_FCLT_UN_MEMBASE,"float_clt_un_membase", IREG, FREG, IREG) MINI_OP(OP_FCONV_TO_U, "float_conv_to_u", IREG, FREG, NONE) MINI_OP(OP_CKFINITE, "ckfinite", FREG, FREG, NONE) +/* r4 opcodes: must be in the same order as the matching CEE_ opcodes: ovfops_op_map */ +MINI_OP(OP_RCONV_TO_U2, "r4_conv_to_u2", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_U1, "r4_conv_to_u1", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_I, "r4_conv_to_i", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_I,"r4_conv_to_ovf_i", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_U,"r4_conv_to_ovd_u", IREG, FREG, NONE) + +/* r4 opcodes: must be in the same order as the matching CEE_ opcodes: ovfops_op_map */ +MINI_OP(OP_RADD_OVF, "r4_add_ovf", FREG, FREG, FREG) +MINI_OP(OP_RADD_OVF_UN, "r4_add_ovf_un", FREG, FREG, FREG) +MINI_OP(OP_RMUL_OVF, "r4_mul_ovf", FREG, FREG, FREG) +MINI_OP(OP_RMUL_OVF_UN, "r4_mul_ovf_un", FREG, FREG, FREG) +MINI_OP(OP_RSUB_OVF, "r4_sub_ovf", FREG, FREG, FREG) +MINI_OP(OP_RSUB_OVF_UN, "r4_sub_ovf_un", FREG, FREG, FREG) + +MINI_OP(OP_RCONV_TO_OVF_I1_UN,"r4_conv_to_ovf_i1_un", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_I2_UN,"r4_conv_to_ovf_i2_un", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_I4_UN,"r4_conv_to_ovf_i4_un", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_I8_UN,"r4_conv_to_ovf_i8_un", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_U1_UN,"r4_conv_to_ovf_u1_un", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_U2_UN,"r4_conv_to_ovf_u2_un", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_U4_UN,"r4_conv_to_ovf_u4_un", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_U8_UN,"r4_conv_to_ovf_u8_un", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_I_UN, "r4_conv_to_ovf_i_un", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_U_UN, "r4_conv_to_ovf_u_un", IREG, FREG, NONE) + +MINI_OP(OP_RCONV_TO_OVF_I1,"r4_conv_to_ovf_i1", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_U1,"r4_conv_to_ovf_u1", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_I2,"r4_conv_to_ovf_i2", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_U2,"r4_conv_to_ovf_u2", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_I4,"r4_conv_to_ovf_i4", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_U4,"r4_conv_to_ovf_u4", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_I8,"r4_conv_to_ovf_i8", IREG, FREG, NONE) +MINI_OP(OP_RCONV_TO_OVF_U8,"r4_conv_to_ovf_u8", IREG, FREG, NONE) + +/* r4 opcodes: must be in the same order as the matching CEE_ opcodes: ceqops_op_map */ +MINI_OP(OP_RCEQ, "r4_ceq", IREG, FREG, FREG) +MINI_OP(OP_RCGT, "r4_cgt", IREG, FREG, FREG) +MINI_OP(OP_RCGT_UN,"r4_cgt_un", IREG, FREG, FREG) +MINI_OP(OP_RCLT, "r4_clt", IREG, FREG, FREG) +MINI_OP(OP_RCLT_UN,"r4_clt_un", IREG, FREG, FREG) + +MINI_OP(OP_RCNEQ, "r4_cneq", IREG, FREG, FREG) +MINI_OP(OP_RCGE, "r4_cge", IREG, FREG, FREG) +MINI_OP(OP_RCLE, "r4_cle", IREG, FREG, FREG) + /* Return the low 32 bits of a double vreg */ MINI_OP(OP_FGETLOW32, "float_getlow32", IREG, FREG, NONE) /* Return the high 32 bits of a double vreg */ @@ -789,7 +885,7 @@ MINI_OP(OP_PSHLQ, "pshlq", XREG, XREG, NONE) MINI_OP(OP_PSHLQ_REG, "pshlq_reg", XREG, XREG, XREG) MINI_OP(OP_EXTRACT_I4, "extract_i4", IREG, XREG, NONE) -MINI_OP(OP_ICONV_TO_R8_RAW, "iconv_to_r8_raw", FREG, IREG, NONE) +MINI_OP(OP_ICONV_TO_R4_RAW, "iconv_to_r4_raw", FREG, IREG, NONE) MINI_OP(OP_EXTRACT_I2, "extract_i2", IREG, XREG, NONE) MINI_OP(OP_EXTRACT_U2, "extract_u2", IREG, XREG, NONE) @@ -849,9 +945,9 @@ MINI_OP(OP_XPHI, "xphi", XREG, NONE, NONE) /* * These are used for efficient implementation of the - * methods on the System.Threading.Interlocked class - * on architectures that support it. This is checked - * via mono_arch_opcode_supported (). + * atomic methods on Interlocked, Volatile, and Thread. + * This is done only on architectures that support it, + * as per mono_arch_opcode_supported (). * * Note that while the 32-bit variants are used on * both 32-bit and 64-bit systems, the 64-bit variants @@ -861,22 +957,47 @@ MINI_OP(OP_XPHI, "xphi", XREG, NONE, NONE) * 64-bit variants to instructions operating on 32-bit * registers is very complicated on some architectures. * - * The memory_barrier instruction translates to a full - * acquire/release barrier. Such a memory barrier is - * implied at the beginning and end of all other atomic - * operations, such that they ensure sequential - * consistency. + * For memory_barrier and load/store instructions, the + * inst.backend.memory_barrier_kind field indicates + * which semantics to use. * - * All of these return the new value at the given - * memory location after performing the operation. -*/ + * Where relevant, all of these return the new value at + * the given memory location after performing the + * operation. + */ + +MINI_OP(OP_MEMORY_BARRIER, "memory_barrier", NONE, NONE, NONE) + +MINI_OP(OP_ATOMIC_LOAD_I1, "atomic_load_i1", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_LOAD_I2, "atomic_load_i2", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_LOAD_I4, "atomic_load_i4", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_LOAD_I8, "atomic_load_i8", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_LOAD_U1, "atomic_load_u1", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_LOAD_U2, "atomic_load_u2", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_LOAD_U4, "atomic_load_u4", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_LOAD_U8, "atomic_load_u8", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_LOAD_R4, "atomic_load_r4", FREG, IREG, NONE) +MINI_OP(OP_ATOMIC_LOAD_R8, "atomic_load_r8", FREG, IREG, NONE) + +MINI_OP(OP_ATOMIC_STORE_I1, "atomic_store_i1", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_STORE_I2, "atomic_store_i2", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_STORE_I4, "atomic_store_i4", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_STORE_I8, "atomic_store_i8", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_STORE_U1, "atomic_store_u1", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_STORE_U2, "atomic_store_u2", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_STORE_U4, "atomic_store_u4", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_STORE_U8, "atomic_store_u8", IREG, IREG, NONE) +MINI_OP(OP_ATOMIC_STORE_R4, "atomic_store_r4", IREG, FREG, NONE) +MINI_OP(OP_ATOMIC_STORE_R8, "atomic_store_r8", IREG, FREG, NONE) + MINI_OP(OP_ATOMIC_ADD_I4, "atomic_add_i4", IREG, IREG, IREG) MINI_OP(OP_ATOMIC_ADD_I8, "atomic_add_i8", IREG, IREG, IREG) + MINI_OP(OP_ATOMIC_EXCHANGE_I4, "atomic_exchange_i4", IREG, IREG, IREG) MINI_OP(OP_ATOMIC_EXCHANGE_I8, "atomic_exchange_i8", IREG, IREG, IREG) + MINI_OP3(OP_ATOMIC_CAS_I4, "atomic_cas_i4", IREG, IREG, IREG, IREG) MINI_OP3(OP_ATOMIC_CAS_I8, "atomic_cas_i8", IREG, IREG, IREG, IREG) -MINI_OP(OP_MEMORY_BARRIER, "memory_barrier", NONE, NONE, NONE) /* Conditional move opcodes. * Must be in the same order as the matching CEE_B... opcodes diff --git a/mta-mono/vendor/mono/mini/mini-posix.c b/mta-mono/vendor/mono/mini/mini-posix.c index abec7e3..5390d7a 100644 --- a/mta-mono/vendor/mono/mini/mini-posix.c +++ b/mta-mono/vendor/mono/mini/mini-posix.c @@ -197,6 +197,7 @@ MONO_SIG_HANDLER_SIGNATURE (mono_chain_signal) MONO_SIG_HANDLER_FUNC (static, sigabrt_signal_handler) { MonoJitInfo *ji = NULL; + MONO_SIG_HANDLER_INFO_TYPE *info = MONO_SIG_HANDLER_GET_INFO (); MONO_SIG_HANDLER_GET_CONTEXT; if (mono_thread_internal_current ()) @@ -204,7 +205,7 @@ MONO_SIG_HANDLER_FUNC (static, sigabrt_signal_handler) if (!ji) { if (mono_chain_signal (MONO_SIG_HANDLER_PARAMS)) return; - mono_handle_native_sigsegv (SIGABRT, ctx); + mono_handle_native_sigsegv (SIGABRT, ctx, info); } } @@ -297,7 +298,10 @@ MONO_SIG_HANDLER_FUNC (static, sigusr1_signal_handler) #endif #ifdef SIGPROF -#if defined(__ia64__) || defined(__sparc__) || defined(sparc) || defined(__s390__) || defined(s390) + +static int profiling_signal_in_use; + +#if defined(__ia64__) || defined(__sparc__) || defined(sparc) MONO_SIG_HANDLER_FUNC (static, sigprof_signal_handler) { @@ -309,8 +313,6 @@ MONO_SIG_HANDLER_FUNC (static, sigprof_signal_handler) #else -static int profiling_signal_in_use; - static void per_thread_profiler_hit (void *ctx) { @@ -325,7 +327,7 @@ per_thread_profiler_hit (void *ctx) MonoContext mono_context; guchar *ips [call_chain_depth + 1]; - mono_arch_sigctx_to_monoctx (ctx, &mono_context); + mono_sigctx_to_monoctx (ctx, &mono_context); ips [0] = MONO_CONTEXT_GET_IP (&mono_context); if (jit_tls != NULL) { diff --git a/mta-mono/vendor/mono/mini/mini-ppc.c b/mta-mono/vendor/mono/mini/mini-ppc.c index a7c8398..80a6c8a 100644 --- a/mta-mono/vendor/mono/mini/mini-ppc.c +++ b/mta-mono/vendor/mono/mini/mini-ppc.c @@ -104,11 +104,11 @@ offsets_from_pthread_key (guint32 key, int *offset2) /* FIXME: ensure the sc call preserves all but r3 */ #define emit_darwing4_tls(code,dreg,key) do {\ int off1 = 0x48 + key * sizeof (gpointer); \ - if ((dreg) != ppc_r3) ppc_mr ((code), ppc_r11, ppc_r3); \ + if ((dreg) != ppc_r3) ppc_mr ((code), ppc_r12, ppc_r3); \ ppc_li ((code), ppc_r0, 0x7FF2); \ ppc_sc ((code)); \ ppc_lwz ((code), (dreg), off1, ppc_r3); \ - if ((dreg) != ppc_r3) ppc_mr ((code), ppc_r3, ppc_r11); \ + if ((dreg) != ppc_r3) ppc_mr ((code), ppc_r3, ppc_r12); \ } while (0); #ifdef PPC_THREAD_PTR_REG @@ -119,8 +119,8 @@ offsets_from_pthread_key (guint32 key, int *offset2) ppc_ldptr ((code), (dreg), off1, PPC_THREAD_PTR_REG); \ } else { \ int off3 = (off2 + 1) > 1; \ - ppc_addis ((code), ppc_r11, PPC_THREAD_PTR_REG, off3); \ - ppc_ldptr ((code), (dreg), off1, ppc_r11); \ + ppc_addis ((code), ppc_r12, PPC_THREAD_PTR_REG, off3); \ + ppc_ldptr ((code), (dreg), off1, ppc_r12); \ } \ } while (0); #else @@ -191,29 +191,29 @@ emit_memcpy (guint8 *code, int size, int dreg, int doffset, int sreg, int soffse ppc_load (code, ppc_r0, shifted); ppc_mtctr (code, ppc_r0); - //g_assert (sreg == ppc_r11); - ppc_addi (code, ppc_r12, dreg, (doffset - sizeof (gpointer))); - ppc_addi (code, ppc_r11, sreg, (soffset - sizeof (gpointer))); + //g_assert (sreg == ppc_r12); + ppc_addi (code, ppc_r11, dreg, (doffset - sizeof (gpointer))); + ppc_addi (code, ppc_r12, sreg, (soffset - sizeof (gpointer))); copy_loop_start = code; - ppc_ldptr_update (code, ppc_r0, (unsigned int)sizeof (gpointer), ppc_r11); - ppc_stptr_update (code, ppc_r0, (unsigned int)sizeof (gpointer), ppc_r12); + ppc_ldptr_update (code, ppc_r0, (unsigned int)sizeof (gpointer), ppc_r12); + ppc_stptr_update (code, ppc_r0, (unsigned int)sizeof (gpointer), ppc_r11); copy_loop_jump = code; ppc_bc (code, PPC_BR_DEC_CTR_NONZERO, 0, 0); ppc_patch (copy_loop_jump, copy_loop_start); size -= shifted * sizeof (gpointer); doffset = soffset = 0; - dreg = ppc_r12; + dreg = ppc_r11; } #ifdef __mono_ppc64__ /* the hardware has multiple load/store units and the move is long enough to use more then one regiester, then use load/load/store/store to execute 2 instructions per cycle. */ - if ((cpu_hw_caps & PPC_MULTIPLE_LS_UNITS) && (dreg != ppc_r12) && (sreg != ppc_r12)) { + if ((cpu_hw_caps & PPC_MULTIPLE_LS_UNITS) && (dreg != ppc_r11) && (sreg != ppc_r11)) { while (size >= 16) { ppc_ldptr (code, ppc_r0, soffset, sreg); - ppc_ldptr (code, ppc_r12, soffset+8, sreg); + ppc_ldptr (code, ppc_r11, soffset+8, sreg); ppc_stptr (code, ppc_r0, doffset, dreg); - ppc_stptr (code, ppc_r12, doffset+8, dreg); + ppc_stptr (code, ppc_r11, doffset+8, dreg); size -= 16; soffset += 16; doffset += 16; @@ -227,12 +227,12 @@ emit_memcpy (guint8 *code, int size, int dreg, int doffset, int sreg, int soffse doffset += 8; } #else - if ((cpu_hw_caps & PPC_MULTIPLE_LS_UNITS) && (dreg != ppc_r12) && (sreg != ppc_r12)) { + if ((cpu_hw_caps & PPC_MULTIPLE_LS_UNITS) && (dreg != ppc_r11) && (sreg != ppc_r11)) { while (size >= 8) { ppc_lwz (code, ppc_r0, soffset, sreg); - ppc_lwz (code, ppc_r12, soffset+4, sreg); + ppc_lwz (code, ppc_r11, soffset+4, sreg); ppc_stw (code, ppc_r0, doffset, dreg); - ppc_stw (code, ppc_r12, doffset+4, dreg); + ppc_stw (code, ppc_r11, doffset+4, dreg); size -= 8; soffset += 8; doffset += 8; @@ -744,7 +744,7 @@ mono_arch_get_global_int_regs (MonoCompile *cfg) for (i = 14; i < top; ++i) { /* * Reserve r29 for holding the vtable address for virtual calls in AOT mode, - * since the trampolines can clobber r11. + * since the trampolines can clobber r12. */ if (!(cfg->compile_aot && i == 29)) regs = g_list_prepend (regs, GUINT_TO_POINTER (i)); @@ -1789,8 +1789,8 @@ mono_arch_instrument_prolog (MonoCompile *cfg, void *func, void *p, gboolean ena ppc_load_ptr (code, ppc_r3, cfg->method); ppc_li (code, ppc_r4, 0); /* NULL ebp for now */ - ppc_load_func (code, ppc_r0, func); - ppc_mtlr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, func); + ppc_mtlr (code, PPC_CALL_REG); ppc_blrl (code); return code; } @@ -1887,8 +1887,8 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea } ppc_load_ptr (code, ppc_r3, cfg->method); - ppc_load_func (code, ppc_r0, func); - ppc_mtlr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, func); + ppc_mtlr (code, PPC_CALL_REG); ppc_blrl (code); switch (save_mode) { @@ -2822,14 +2822,14 @@ handle_thunk (int absolute, guchar *code, const guchar *target) { static void patch_ins (guint8 *code, guint32 ins) { - *(guint32*)code = GUINT32_TO_BE (ins); + *(guint32*)code = ins; mono_arch_flush_icache (code, 4); } void ppc_patch_full (guchar *code, const guchar *target, gboolean is_fd) { - guint32 ins = GUINT32_FROM_BE (*(guint32*)code); + guint32 ins = *(guint32*)code; guint32 prim = ins >> 26; guint32 ovf; @@ -2912,7 +2912,13 @@ ppc_patch_full (guchar *code, const guchar *target, gboolean is_fd) else code -= 24; } else { - if (ppc_is_load_op (seq [5]) || ppc_opcode (seq [5]) == 31) /* ld || lwz || mr */ + if (ppc_is_load_op (seq [5]) +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + /* With function descs we need to do more careful + matches. */ + || ppc_opcode (seq [5]) == 31 /* ld || lwz || mr */ +#endif + ) branch_ins = seq + 8; else branch_ins = seq + 6; @@ -2927,7 +2933,7 @@ ppc_patch_full (guchar *code, const guchar *target, gboolean is_fd) if (!is_fd) { guint8 *buf = (guint8*)&seq [5]; - ppc_mr (buf, ppc_r0, ppc_r11); + ppc_mr (buf, PPC_CALL_REG, ppc_r12); ppc_nop (buf); } } else { @@ -2936,8 +2942,12 @@ ppc_patch_full (guchar *code, const guchar *target, gboolean is_fd) } /* FIXME: make this thread safe */ - /* FIXME: we're assuming we're using r11 here */ - ppc_load_ptr_sequence (code, ppc_r11, target); +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + /* FIXME: we're assuming we're using r12 here */ + ppc_load_ptr_sequence (code, ppc_r12, target); +#else + ppc_load_ptr_sequence (code, PPC_CALL_REG, target); +#endif mono_arch_flush_icache ((guint8*)seq, 28); #else guint32 *seq; @@ -2952,8 +2962,8 @@ ppc_patch_full (guchar *code, const guchar *target, gboolean is_fd) g_assert ((seq [2] >> 26) == 31); g_assert (seq [3] == 0x4e800021 || seq [3] == 0x4e800020 || seq [3] == 0x4e800420); /* FIXME: make this thread safe */ - ppc_lis (code, ppc_r0, (guint32)(target) >> 16); - ppc_ori (code, ppc_r0, ppc_r0, (guint32)(target) & 0xffff); + ppc_lis (code, PPC_CALL_REG, (guint32)(target) >> 16); + ppc_ori (code, PPC_CALL_REG, PPC_CALL_REG, (guint32)(target) & 0xffff); mono_arch_flush_icache (code - 8, 8); #endif } else { @@ -3010,8 +3020,8 @@ emit_reserve_param_area (MonoCompile *cfg, guint8 *code) if (ppc_is_imm16 (-size)) { ppc_stptr_update (code, ppc_r0, -size, ppc_sp); } else { - ppc_load (code, ppc_r11, -size); - ppc_stptr_update_indexed (code, ppc_r0, ppc_sp, ppc_r11); + ppc_load (code, ppc_r12, -size); + ppc_stptr_update_indexed (code, ppc_r0, ppc_sp, ppc_r12); } return code; @@ -3032,8 +3042,8 @@ emit_unreserve_param_area (MonoCompile *cfg, guint8 *code) if (ppc_is_imm16 (size)) { ppc_stptr_update (code, ppc_r0, size, ppc_sp); } else { - ppc_load (code, ppc_r11, size); - ppc_stptr_update_indexed (code, ppc_r0, ppc_sp, ppc_r11); + ppc_load (code, ppc_r12, size); + ppc_stptr_update_indexed (code, ppc_r0, ppc_sp, ppc_r12); } return code; @@ -3094,6 +3104,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_NOT_REACHED: case OP_NOT_NULL: break; + case OP_IL_SEQ_POINT: + mono_add_seq_point (cfg, bb, ins, code - cfg->native_code); + break; case OP_SEQ_POINT: { int i; @@ -3107,8 +3120,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) * a breakpoint is hit will step to the next IL offset. */ if (ins->flags & MONO_INST_SINGLE_STEP_LOC) { - ppc_load (code, ppc_r11, (gsize)ss_trigger_page); - ppc_ldptr (code, ppc_r11, 0, ppc_r11); + ppc_load (code, ppc_r12, (gsize)ss_trigger_page); + ppc_ldptr (code, ppc_r12, 0, ppc_r12); } mono_add_seq_point (cfg, bb, ins, code - cfg->native_code); @@ -3142,8 +3155,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_stb (code, ins->sreg1, ins->inst_offset, ins->inst_destbasereg); } else { if (ppc_is_imm32 (ins->inst_offset)) { - ppc_addis (code, ppc_r12, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); - ppc_stb (code, ins->sreg1, ins->inst_offset, ppc_r12); + ppc_addis (code, ppc_r11, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); + ppc_stb (code, ins->sreg1, ins->inst_offset, ppc_r11); } else { ppc_load (code, ppc_r0, ins->inst_offset); ppc_stbx (code, ins->sreg1, ins->inst_destbasereg, ppc_r0); @@ -3155,8 +3168,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_sth (code, ins->sreg1, ins->inst_offset, ins->inst_destbasereg); } else { if (ppc_is_imm32 (ins->inst_offset)) { - ppc_addis (code, ppc_r12, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); - ppc_sth (code, ins->sreg1, ins->inst_offset, ppc_r12); + ppc_addis (code, ppc_r11, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); + ppc_sth (code, ins->sreg1, ins->inst_offset, ppc_r11); } else { ppc_load (code, ppc_r0, ins->inst_offset); ppc_sthx (code, ins->sreg1, ins->inst_destbasereg, ppc_r0); @@ -3168,8 +3181,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_stptr (code, ins->sreg1, ins->inst_offset, ins->inst_destbasereg); } else { if (ppc_is_imm32 (ins->inst_offset)) { - ppc_addis (code, ppc_r12, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); - ppc_stptr (code, ins->sreg1, ins->inst_offset, ppc_r12); + ppc_addis (code, ppc_r11, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); + ppc_stptr (code, ins->sreg1, ins->inst_offset, ppc_r11); } else { ppc_load (code, ppc_r0, ins->inst_offset); ppc_stptr_indexed (code, ins->sreg1, ins->inst_destbasereg, ppc_r0); @@ -3371,8 +3384,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_break"); if ((FORCE_INDIR_CALL || cfg->method->dynamic) && !cfg->compile_aot) { - ppc_load_func (code, ppc_r0, 0); - ppc_mtlr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, 0); + ppc_mtlr (code, PPC_CALL_REG); ppc_blrl (code); } else { ppc_bl (code, 0); @@ -3696,7 +3709,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) CASE_PPC32 (OP_ICONV_TO_I4) CASE_PPC32 (OP_ICONV_TO_U4) case OP_MOVE: - ppc_mr (code, ins->dreg, ins->sreg1); + if (ins->dreg != ins->sreg1) + ppc_mr (code, ins->dreg, ins->sreg1); break; case OP_SETLRET: { int saved = ins->sreg1; @@ -3711,7 +3725,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; } case OP_FMOVE: - ppc_fmr (code, ins->dreg, ins->sreg1); + if (ins->dreg != ins->sreg1) + ppc_fmr (code, ins->dreg, ins->sreg1); break; case OP_FCONV_TO_R4: ppc_frsp (code, ins->dreg, ins->sreg1); @@ -3725,7 +3740,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) */ g_assert (!cfg->method->save_lmf); /* - * Note: we can use ppc_r11 here because it is dead anyway: + * Note: we can use ppc_r12 here because it is dead anyway: * we're leaving the method. */ if (1 || cfg->flags & MONO_CFG_HAS_CALLS) { @@ -3733,26 +3748,26 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ppc_is_imm16 (ret_offset)) { ppc_ldptr (code, ppc_r0, ret_offset, cfg->frame_reg); } else { - ppc_load (code, ppc_r11, ret_offset); - ppc_ldptr_indexed (code, ppc_r0, cfg->frame_reg, ppc_r11); + ppc_load (code, ppc_r12, ret_offset); + ppc_ldptr_indexed (code, ppc_r0, cfg->frame_reg, ppc_r12); } ppc_mtlr (code, ppc_r0); } if (ppc_is_imm16 (cfg->stack_usage)) { - ppc_addi (code, ppc_r11, cfg->frame_reg, cfg->stack_usage); + ppc_addi (code, ppc_r12, cfg->frame_reg, cfg->stack_usage); } else { /* cfg->stack_usage is an int, so we can use * an addis/addi sequence here even in 64-bit. */ - ppc_addis (code, ppc_r11, cfg->frame_reg, ppc_ha(cfg->stack_usage)); - ppc_addi (code, ppc_r11, ppc_r11, cfg->stack_usage); + ppc_addis (code, ppc_r12, cfg->frame_reg, ppc_ha(cfg->stack_usage)); + ppc_addi (code, ppc_r12, ppc_r12, cfg->stack_usage); } if (!cfg->method->save_lmf) { pos = 0; for (i = 31; i >= 13; --i) { if (cfg->used_int_regs & (1 << i)) { pos += sizeof (gpointer); - ppc_ldptr (code, i, -pos, ppc_r11); + ppc_ldptr (code, i, -pos, ppc_r12); } } } else { @@ -3761,27 +3776,27 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) /* Copy arguments on the stack to our argument area */ if (call->stack_usage) { - code = emit_memcpy (code, call->stack_usage, ppc_r11, PPC_STACK_PARAM_OFFSET, ppc_sp, PPC_STACK_PARAM_OFFSET); - /* r11 was clobbered */ + code = emit_memcpy (code, call->stack_usage, ppc_r12, PPC_STACK_PARAM_OFFSET, ppc_sp, PPC_STACK_PARAM_OFFSET); + /* r12 was clobbered */ g_assert (cfg->frame_reg == ppc_sp); if (ppc_is_imm16 (cfg->stack_usage)) { - ppc_addi (code, ppc_r11, cfg->frame_reg, cfg->stack_usage); + ppc_addi (code, ppc_r12, cfg->frame_reg, cfg->stack_usage); } else { /* cfg->stack_usage is an int, so we can use * an addis/addi sequence here even in 64-bit. */ - ppc_addis (code, ppc_r11, cfg->frame_reg, ppc_ha(cfg->stack_usage)); - ppc_addi (code, ppc_r11, ppc_r11, cfg->stack_usage); + ppc_addis (code, ppc_r12, cfg->frame_reg, ppc_ha(cfg->stack_usage)); + ppc_addi (code, ppc_r12, ppc_r12, cfg->stack_usage); } } - ppc_mr (code, ppc_sp, ppc_r11); + ppc_mr (code, ppc_sp, ppc_r12); mono_add_patch_info (cfg, (guint8*) code - cfg->native_code, MONO_PATCH_INFO_METHOD_JUMP, call->method); if (cfg->compile_aot) { /* arch_emit_got_access () patches this */ ppc_load32 (code, ppc_r0, 0); #ifdef PPC_USES_FUNCTION_DESCRIPTOR - ppc_ldptr_indexed (code, ppc_r11, ppc_r30, ppc_r0); - ppc_ldptr (code, ppc_r0, 0, ppc_r11); + ppc_ldptr_indexed (code, ppc_r12, ppc_r30, ppc_r0); + ppc_ldptr (code, ppc_r0, 0, ppc_r12); #else ppc_ldptr_indexed (code, ppc_r0, ppc_r30, ppc_r0); #endif @@ -3819,8 +3834,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) else mono_add_patch_info (cfg, offset, MONO_PATCH_INFO_ABS, call->fptr); if ((FORCE_INDIR_CALL || cfg->method->dynamic) && !cfg->compile_aot) { - ppc_load_func (code, ppc_r0, 0); - ppc_mtlr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, 0); + ppc_mtlr (code, PPC_CALL_REG); ppc_blrl (code); } else { ppc_bl (code, 0); @@ -3853,7 +3868,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_VCALL2_MEMBASE: case OP_VOIDCALL_MEMBASE: case OP_CALL_MEMBASE: - if (cfg->compile_aot && ins->sreg1 == ppc_r11) { + if (cfg->compile_aot && ins->sreg1 == ppc_r12) { /* The trampolines clobber this */ ppc_mr (code, ppc_r29, ins->sreg1); ppc_ldptr (code, ppc_r0, ins->inst_offset, ppc_r29); @@ -3871,9 +3886,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) int alloca_waste = PPC_STACK_PARAM_OFFSET + cfg->param_area + 31; int area_offset = alloca_waste; area_offset &= ~31; - ppc_addi (code, ppc_r11, ins->sreg1, alloca_waste + 31); + ppc_addi (code, ppc_r12, ins->sreg1, alloca_waste + 31); /* FIXME: should be calculated from MONO_ARCH_FRAME_ALIGNMENT */ - ppc_clear_right_imm (code, ppc_r11, ppc_r11, 4); + ppc_clear_right_imm (code, ppc_r12, ppc_r12, 4); /* use ctr to store the number of words to 0 if needed */ if (ins->flags & MONO_INST_INIT) { /* we zero 4 bytes at a time: @@ -3886,8 +3901,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_mtctr (code, ppc_r0); } ppc_ldptr (code, ppc_r0, 0, ppc_sp); - ppc_neg (code, ppc_r11, ppc_r11); - ppc_stptr_update_indexed (code, ppc_r0, ppc_sp, ppc_r11); + ppc_neg (code, ppc_r12, ppc_r12); + ppc_stptr_update_indexed (code, ppc_r0, ppc_sp, ppc_r12); /* FIXME: make this loop work in 8 byte increments on PPC64 */ @@ -3897,9 +3912,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) * run at least once */ ppc_addi (code, ins->dreg, ppc_sp, (area_offset - 8)); - ppc_li (code, ppc_r11, 0); + ppc_li (code, ppc_r12, 0); zero_loop_start = code; - ppc_stwu (code, ppc_r11, 4, ins->dreg); + ppc_stwu (code, ppc_r12, 4, ins->dreg); zero_loop_jump = code; ppc_bc (code, PPC_BR_DEC_CTR_NONZERO, 0, 0); ppc_patch (zero_loop_jump, zero_loop_start); @@ -3913,8 +3928,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_arch_throw_exception"); if ((FORCE_INDIR_CALL || cfg->method->dynamic) && !cfg->compile_aot) { - ppc_load_func (code, ppc_r0, 0); - ppc_mtlr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, 0); + ppc_mtlr (code, PPC_CALL_REG); ppc_blrl (code); } else { ppc_bl (code, 0); @@ -3927,8 +3942,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_arch_rethrow_exception"); if ((FORCE_INDIR_CALL || cfg->method->dynamic) && !cfg->compile_aot) { - ppc_load_func (code, ppc_r0, 0); - ppc_mtlr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, 0); + ppc_mtlr (code, PPC_CALL_REG); ppc_blrl (code); } else { ppc_bl (code, 0); @@ -3943,8 +3958,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ppc_is_imm16 (spvar->inst_offset)) { ppc_stptr (code, ppc_r0, spvar->inst_offset, spvar->inst_basereg); } else { - ppc_load (code, ppc_r11, spvar->inst_offset); - ppc_stptr_indexed (code, ppc_r0, ppc_r11, spvar->inst_basereg); + ppc_load (code, ppc_r12, spvar->inst_offset); + ppc_stptr_indexed (code, ppc_r0, ppc_r12, spvar->inst_basereg); } break; } @@ -3957,8 +3972,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ppc_is_imm16 (spvar->inst_offset)) { ppc_ldptr (code, ppc_r0, spvar->inst_offset, spvar->inst_basereg); } else { - ppc_load (code, ppc_r11, spvar->inst_offset); - ppc_ldptr_indexed (code, ppc_r0, spvar->inst_basereg, ppc_r11); + ppc_load (code, ppc_r12, spvar->inst_offset); + ppc_ldptr_indexed (code, ppc_r0, spvar->inst_basereg, ppc_r12); } ppc_mtlr (code, ppc_r0); ppc_blr (code); @@ -4064,11 +4079,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) /* FIXME: Optimize this */ ppc_bl (code, 1); - ppc_mflr (code, ppc_r11); + ppc_mflr (code, ppc_r12); ppc_b (code, 3); *(double*)code = *(double*)ins->inst_p0; code += 8; - ppc_lfd (code, ins->dreg, 8, ppc_r11); + ppc_lfd (code, ins->dreg, 8, ppc_r12); break; case OP_R4CONST: g_assert_not_reached (); @@ -4078,8 +4093,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_stfd (code, ins->sreg1, ins->inst_offset, ins->inst_destbasereg); } else { if (ppc_is_imm32 (ins->inst_offset)) { - ppc_addis (code, ppc_r12, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); - ppc_stfd (code, ins->sreg1, ins->inst_offset, ppc_r12); + ppc_addis (code, ppc_r11, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); + ppc_stfd (code, ins->sreg1, ins->inst_offset, ppc_r11); } else { ppc_load (code, ppc_r0, ins->inst_offset); ppc_stfdx (code, ins->sreg1, ins->inst_destbasereg, ppc_r0); @@ -4091,8 +4106,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_lfd (code, ins->dreg, ins->inst_offset, ins->inst_basereg); } else { if (ppc_is_imm32 (ins->inst_offset)) { - ppc_addis (code, ppc_r12, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); - ppc_lfd (code, ins->dreg, ins->inst_offset, ppc_r12); + ppc_addis (code, ppc_r11, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); + ppc_lfd (code, ins->dreg, ins->inst_offset, ppc_r11); } else { ppc_load (code, ppc_r0, ins->inst_offset); ppc_lfdx (code, ins->dreg, ins->inst_destbasereg, ppc_r0); @@ -4105,8 +4120,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_stfs (code, ins->sreg1, ins->inst_offset, ins->inst_destbasereg); } else { if (ppc_is_imm32 (ins->inst_offset)) { - ppc_addis (code, ppc_r12, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); - ppc_stfs (code, ins->sreg1, ins->inst_offset, ppc_r12); + ppc_addis (code, ppc_r11, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); + ppc_stfs (code, ins->sreg1, ins->inst_offset, ppc_r11); } else { ppc_load (code, ppc_r0, ins->inst_offset); ppc_stfsx (code, ins->sreg1, ins->inst_destbasereg, ppc_r0); @@ -4118,8 +4133,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_lfs (code, ins->dreg, ins->inst_offset, ins->inst_basereg); } else { if (ppc_is_imm32 (ins->inst_offset)) { - ppc_addis (code, ppc_r12, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); - ppc_lfs (code, ins->dreg, ins->inst_offset, ppc_r12); + ppc_addis (code, ppc_r11, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); + ppc_lfs (code, ins->dreg, ins->inst_offset, ppc_r11); } else { ppc_load (code, ppc_r0, ins->inst_offset); ppc_lfsx (code, ins->dreg, ins->inst_destbasereg, ppc_r0); @@ -4509,6 +4524,16 @@ mono_arch_register_lowlevel_calls (void) } #ifdef __mono_ppc64__ +#ifdef _LITTLE_ENDIAN +#define patch_load_sequence(ip,val) do {\ + guint16 *__load = (guint16*)(ip); \ + g_assert (sizeof (val) == sizeof (gsize)); \ + __load [0] = (((guint64)(gsize)(val)) >> 48) & 0xffff; \ + __load [2] = (((guint64)(gsize)(val)) >> 32) & 0xffff; \ + __load [6] = (((guint64)(gsize)(val)) >> 16) & 0xffff; \ + __load [8] = ((guint64)(gsize)(val)) & 0xffff; \ + } while (0) +#elif defined _BIG_ENDIAN #define patch_load_sequence(ip,val) do {\ guint16 *__load = (guint16*)(ip); \ g_assert (sizeof (val) == sizeof (gsize)); \ @@ -4518,6 +4543,9 @@ mono_arch_register_lowlevel_calls (void) __load [9] = ((guint64)(gsize)(val)) & 0xffff; \ } while (0) #else +#error huh? No endianess defined by compiler +#endif +#else #define patch_load_sequence(ip,val) do {\ guint16 *__lis_ori = (guint16*)(ip); \ __lis_ori [1] = (((gulong)(val)) >> 16) & 0xffff; \ @@ -4728,12 +4756,12 @@ mono_arch_emit_prolog (MonoCompile *cfg) code = save_registers (cfg, code, alloc_size - pos, ppc_sp, method->save_lmf, cfg->used_int_regs, cfa_offset); } else { if (pos) - ppc_addi (code, ppc_r11, ppc_sp, -pos); + ppc_addi (code, ppc_r12, ppc_sp, -pos); ppc_load (code, ppc_r0, -alloc_size); ppc_str_update_indexed (code, ppc_sp, ppc_sp, ppc_r0); cfa_offset = alloc_size; mono_emit_unwind_op_def_cfa_offset (cfg, code, alloc_size); - code = save_registers (cfg, code, 0, ppc_r11, method->save_lmf, cfg->used_int_regs, cfa_offset); + code = save_registers (cfg, code, 0, ppc_r12, method->save_lmf, cfg->used_int_regs, cfa_offset); } } if (cfg->frame_reg != ppc_sp) { @@ -4779,8 +4807,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) if (ppc_is_imm16 (inst->inst_offset)) { ppc_stptr (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); } else { - ppc_load (code, ppc_r11, inst->inst_offset); - ppc_stptr_indexed (code, ainfo->reg, ppc_r11, inst->inst_basereg); + ppc_load (code, ppc_r12, inst->inst_offset); + ppc_stptr_indexed (code, ainfo->reg, ppc_r12, inst->inst_basereg); } } @@ -4797,8 +4825,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) else if (ainfo->regtype == RegTypeFP) ppc_fmr (code, inst->dreg, ainfo->reg); else if (ainfo->regtype == RegTypeBase) { - ppc_ldr (code, ppc_r11, 0, ppc_sp); - ppc_ldptr (code, inst->dreg, ainfo->offset, ppc_r11); + ppc_ldr (code, ppc_r12, 0, ppc_sp); + ppc_ldptr (code, inst->dreg, ainfo->offset, ppc_r12); } else g_assert_not_reached (); @@ -4813,11 +4841,11 @@ mono_arch_emit_prolog (MonoCompile *cfg) ppc_stb (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); } else { if (ppc_is_imm32 (inst->inst_offset)) { - ppc_addis (code, ppc_r11, inst->inst_basereg, ppc_ha(inst->inst_offset)); - ppc_stb (code, ainfo->reg, inst->inst_offset, ppc_r11); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(inst->inst_offset)); + ppc_stb (code, ainfo->reg, inst->inst_offset, ppc_r12); } else { - ppc_load (code, ppc_r11, inst->inst_offset); - ppc_stbx (code, ainfo->reg, inst->inst_basereg, ppc_r11); + ppc_load (code, ppc_r12, inst->inst_offset); + ppc_stbx (code, ainfo->reg, inst->inst_basereg, ppc_r12); } } break; @@ -4826,11 +4854,11 @@ mono_arch_emit_prolog (MonoCompile *cfg) ppc_sth (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); } else { if (ppc_is_imm32 (inst->inst_offset)) { - ppc_addis (code, ppc_r11, inst->inst_basereg, ppc_ha(inst->inst_offset)); - ppc_sth (code, ainfo->reg, inst->inst_offset, ppc_r11); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(inst->inst_offset)); + ppc_sth (code, ainfo->reg, inst->inst_offset, ppc_r12); } else { - ppc_load (code, ppc_r11, inst->inst_offset); - ppc_sthx (code, ainfo->reg, inst->inst_basereg, ppc_r11); + ppc_load (code, ppc_r12, inst->inst_offset); + ppc_sthx (code, ainfo->reg, inst->inst_basereg, ppc_r12); } } break; @@ -4840,11 +4868,11 @@ mono_arch_emit_prolog (MonoCompile *cfg) ppc_stw (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); } else { if (ppc_is_imm32 (inst->inst_offset)) { - ppc_addis (code, ppc_r11, inst->inst_basereg, ppc_ha(inst->inst_offset)); - ppc_stw (code, ainfo->reg, inst->inst_offset, ppc_r11); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(inst->inst_offset)); + ppc_stw (code, ainfo->reg, inst->inst_offset, ppc_r12); } else { - ppc_load (code, ppc_r11, inst->inst_offset); - ppc_stwx (code, ainfo->reg, inst->inst_basereg, ppc_r11); + ppc_load (code, ppc_r12, inst->inst_offset); + ppc_stwx (code, ainfo->reg, inst->inst_basereg, ppc_r12); } } break; @@ -4852,8 +4880,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) if (ppc_is_imm16 (inst->inst_offset)) { ppc_str (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); } else { - ppc_load (code, ppc_r11, inst->inst_offset); - ppc_str_indexed (code, ainfo->reg, ppc_r11, inst->inst_basereg); + ppc_load (code, ppc_r12, inst->inst_offset); + ppc_str_indexed (code, ainfo->reg, ppc_r12, inst->inst_basereg); } break; #else @@ -4862,10 +4890,10 @@ mono_arch_emit_prolog (MonoCompile *cfg) ppc_stw (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); ppc_stw (code, ainfo->reg + 1, inst->inst_offset + 4, inst->inst_basereg); } else { - ppc_addis (code, ppc_r11, inst->inst_basereg, ppc_ha(inst->inst_offset)); - ppc_addi (code, ppc_r11, ppc_r11, inst->inst_offset); - ppc_stw (code, ainfo->reg, 0, ppc_r11); - ppc_stw (code, ainfo->reg + 1, 4, ppc_r11); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(inst->inst_offset)); + ppc_addi (code, ppc_r12, ppc_r12, inst->inst_offset); + ppc_stw (code, ainfo->reg, 0, ppc_r12); + ppc_stw (code, ainfo->reg + 1, 4, ppc_r12); } break; #endif @@ -4874,31 +4902,31 @@ mono_arch_emit_prolog (MonoCompile *cfg) ppc_stptr (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); } else { if (ppc_is_imm32 (inst->inst_offset)) { - ppc_addis (code, ppc_r11, inst->inst_basereg, ppc_ha(inst->inst_offset)); - ppc_stptr (code, ainfo->reg, inst->inst_offset, ppc_r11); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(inst->inst_offset)); + ppc_stptr (code, ainfo->reg, inst->inst_offset, ppc_r12); } else { - ppc_load (code, ppc_r11, inst->inst_offset); - ppc_stptr_indexed (code, ainfo->reg, inst->inst_basereg, ppc_r11); + ppc_load (code, ppc_r12, inst->inst_offset); + ppc_stptr_indexed (code, ainfo->reg, inst->inst_basereg, ppc_r12); } } break; } } else if (ainfo->regtype == RegTypeBase) { g_assert (ppc_is_imm16 (ainfo->offset)); - /* load the previous stack pointer in r11 */ - ppc_ldr (code, ppc_r11, 0, ppc_sp); - ppc_ldptr (code, ppc_r0, ainfo->offset, ppc_r11); + /* load the previous stack pointer in r12 */ + ppc_ldr (code, ppc_r12, 0, ppc_sp); + ppc_ldptr (code, ppc_r0, ainfo->offset, ppc_r12); switch (ainfo->size) { case 1: if (ppc_is_imm16 (inst->inst_offset)) { ppc_stb (code, ppc_r0, inst->inst_offset, inst->inst_basereg); } else { if (ppc_is_imm32 (inst->inst_offset)) { - ppc_addis (code, ppc_r11, inst->inst_basereg, ppc_ha(inst->inst_offset)); - ppc_stb (code, ppc_r0, inst->inst_offset, ppc_r11); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(inst->inst_offset)); + ppc_stb (code, ppc_r0, inst->inst_offset, ppc_r12); } else { - ppc_load (code, ppc_r11, inst->inst_offset); - ppc_stbx (code, ppc_r0, inst->inst_basereg, ppc_r11); + ppc_load (code, ppc_r12, inst->inst_offset); + ppc_stbx (code, ppc_r0, inst->inst_basereg, ppc_r12); } } break; @@ -4907,11 +4935,11 @@ mono_arch_emit_prolog (MonoCompile *cfg) ppc_sth (code, ppc_r0, inst->inst_offset, inst->inst_basereg); } else { if (ppc_is_imm32 (inst->inst_offset)) { - ppc_addis (code, ppc_r11, inst->inst_basereg, ppc_ha(inst->inst_offset)); - ppc_sth (code, ppc_r0, inst->inst_offset, ppc_r11); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(inst->inst_offset)); + ppc_sth (code, ppc_r0, inst->inst_offset, ppc_r12); } else { - ppc_load (code, ppc_r11, inst->inst_offset); - ppc_sthx (code, ppc_r0, inst->inst_basereg, ppc_r11); + ppc_load (code, ppc_r12, inst->inst_offset); + ppc_sthx (code, ppc_r0, inst->inst_basereg, ppc_r12); } } break; @@ -4921,11 +4949,11 @@ mono_arch_emit_prolog (MonoCompile *cfg) ppc_stw (code, ppc_r0, inst->inst_offset, inst->inst_basereg); } else { if (ppc_is_imm32 (inst->inst_offset)) { - ppc_addis (code, ppc_r11, inst->inst_basereg, ppc_ha(inst->inst_offset)); - ppc_stw (code, ppc_r0, inst->inst_offset, ppc_r11); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(inst->inst_offset)); + ppc_stw (code, ppc_r0, inst->inst_offset, ppc_r12); } else { - ppc_load (code, ppc_r11, inst->inst_offset); - ppc_stwx (code, ppc_r0, inst->inst_basereg, ppc_r11); + ppc_load (code, ppc_r12, inst->inst_offset); + ppc_stwx (code, ppc_r0, inst->inst_basereg, ppc_r12); } } break; @@ -4933,8 +4961,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) if (ppc_is_imm16 (inst->inst_offset)) { ppc_str (code, ppc_r0, inst->inst_offset, inst->inst_basereg); } else { - ppc_load (code, ppc_r11, inst->inst_offset); - ppc_str_indexed (code, ppc_r0, ppc_r11, inst->inst_basereg); + ppc_load (code, ppc_r12, inst->inst_offset); + ppc_str_indexed (code, ppc_r0, ppc_r12, inst->inst_basereg); } break; #else @@ -4942,15 +4970,15 @@ mono_arch_emit_prolog (MonoCompile *cfg) g_assert (ppc_is_imm16 (ainfo->offset + 4)); if (ppc_is_imm16 (inst->inst_offset + 4)) { ppc_stw (code, ppc_r0, inst->inst_offset, inst->inst_basereg); - ppc_lwz (code, ppc_r0, ainfo->offset + 4, ppc_r11); + ppc_lwz (code, ppc_r0, ainfo->offset + 4, ppc_r12); ppc_stw (code, ppc_r0, inst->inst_offset + 4, inst->inst_basereg); } else { - /* use r12 to load the 2nd half of the long before we clobber r11. */ - ppc_lwz (code, ppc_r12, ainfo->offset + 4, ppc_r11); - ppc_addis (code, ppc_r11, inst->inst_basereg, ppc_ha(inst->inst_offset)); - ppc_addi (code, ppc_r11, ppc_r11, inst->inst_offset); - ppc_stw (code, ppc_r0, 0, ppc_r11); - ppc_stw (code, ppc_r12, 4, ppc_r11); + /* use r11 to load the 2nd half of the long before we clobber r12. */ + ppc_lwz (code, ppc_r11, ainfo->offset + 4, ppc_r12); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(inst->inst_offset)); + ppc_addi (code, ppc_r12, ppc_r12, inst->inst_offset); + ppc_stw (code, ppc_r0, 0, ppc_r12); + ppc_stw (code, ppc_r11, 4, ppc_r12); } break; #endif @@ -4959,11 +4987,11 @@ mono_arch_emit_prolog (MonoCompile *cfg) ppc_stptr (code, ppc_r0, inst->inst_offset, inst->inst_basereg); } else { if (ppc_is_imm32 (inst->inst_offset)) { - ppc_addis (code, ppc_r11, inst->inst_basereg, ppc_ha(inst->inst_offset)); - ppc_stptr (code, ppc_r0, inst->inst_offset, ppc_r11); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(inst->inst_offset)); + ppc_stptr (code, ppc_r0, inst->inst_offset, ppc_r12); } else { - ppc_load (code, ppc_r11, inst->inst_offset); - ppc_stptr_indexed (code, ppc_r0, inst->inst_basereg, ppc_r11); + ppc_load (code, ppc_r12, inst->inst_offset); + ppc_stptr_indexed (code, ppc_r0, inst->inst_basereg, ppc_r12); } } break; @@ -5022,39 +5050,39 @@ mono_arch_emit_prolog (MonoCompile *cfg) /* FIXME: we need to do the shifting here, too */ if (ainfo->bytes) NOT_IMPLEMENTED; - /* load the previous stack pointer in r11 (r0 gets overwritten by the memcpy) */ - ppc_ldr (code, ppc_r11, 0, ppc_sp); + /* load the previous stack pointer in r12 (r0 gets overwritten by the memcpy) */ + ppc_ldr (code, ppc_r12, 0, ppc_sp); if ((size & MONO_PPC_32_64_CASE (3, 7)) != 0) { code = emit_memcpy (code, size - soffset, inst->inst_basereg, doffset, - ppc_r11, ainfo->offset + soffset); + ppc_r12, ainfo->offset + soffset); } else { code = emit_memcpy (code, ainfo->vtsize * sizeof (gpointer), inst->inst_basereg, doffset, - ppc_r11, ainfo->offset + soffset); + ppc_r12, ainfo->offset + soffset); } } } else if (ainfo->regtype == RegTypeStructByAddr) { /* if it was originally a RegTypeBase */ if (ainfo->offset) { - /* load the previous stack pointer in r11 */ - ppc_ldr (code, ppc_r11, 0, ppc_sp); - ppc_ldptr (code, ppc_r11, ainfo->offset, ppc_r11); + /* load the previous stack pointer in r12 */ + ppc_ldr (code, ppc_r12, 0, ppc_sp); + ppc_ldptr (code, ppc_r12, ainfo->offset, ppc_r12); } else { - ppc_mr (code, ppc_r11, ainfo->reg); + ppc_mr (code, ppc_r12, ainfo->reg); } if (cfg->tailcall_valuetype_addrs) { MonoInst *addr = cfg->tailcall_valuetype_addrs [tailcall_struct_index]; g_assert (ppc_is_imm16 (addr->inst_offset)); - ppc_stptr (code, ppc_r11, addr->inst_offset, addr->inst_basereg); + ppc_stptr (code, ppc_r12, addr->inst_offset, addr->inst_basereg); tailcall_struct_index++; } g_assert (ppc_is_imm16 (inst->inst_offset)); - code = emit_memcpy (code, ainfo->vtsize, inst->inst_basereg, inst->inst_offset, ppc_r11, 0); + code = emit_memcpy (code, ainfo->vtsize, inst->inst_basereg, inst->inst_offset, ppc_r12, 0); /*g_print ("copy in %s: %d bytes from %d to offset: %d\n", method->name, ainfo->vtsize, ainfo->reg, inst->inst_offset);*/ } else g_assert_not_reached (); @@ -5075,8 +5103,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_get_lmf_addr"); if ((FORCE_INDIR_CALL || cfg->method->dynamic) && !cfg->compile_aot) { - ppc_load_func (code, ppc_r0, 0); - ppc_mtlr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, 0); + ppc_mtlr (code, PPC_CALL_REG); ppc_blrl (code); } else { ppc_bl (code, 0); @@ -5086,25 +5114,25 @@ mono_arch_emit_prolog (MonoCompile *cfg) /* lmf_offset is the offset from the previous stack pointer, * alloc_size is the total stack space allocated, so the offset * of MonoLMF from the current stack ptr is alloc_size - lmf_offset. - * The pointer to the struct is put in ppc_r11 (new_lmf). + * The pointer to the struct is put in ppc_r12 (new_lmf). * The callee-saved registers are already in the MonoLMF structure */ - ppc_addi (code, ppc_r11, ppc_sp, alloc_size - lmf_offset); + ppc_addi (code, ppc_r12, ppc_sp, alloc_size - lmf_offset); /* ppc_r3 is the result from mono_get_lmf_addr () */ - ppc_stptr (code, ppc_r3, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); + ppc_stptr (code, ppc_r3, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r12); /* new_lmf->previous_lmf = *lmf_addr */ ppc_ldptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); - ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); - /* *(lmf_addr) = r11 */ - ppc_stptr (code, ppc_r11, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); + ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r12); + /* *(lmf_addr) = r12 */ + ppc_stptr (code, ppc_r12, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); /* save method info */ if (cfg->compile_aot) // FIXME: ppc_load (code, ppc_r0, 0); else ppc_load_ptr (code, ppc_r0, method); - ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, method), ppc_r11); - ppc_stptr (code, ppc_sp, G_STRUCT_OFFSET(MonoLMF, ebp), ppc_r11); + ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, method), ppc_r12); + ppc_stptr (code, ppc_sp, G_STRUCT_OFFSET(MonoLMF, ebp), ppc_r12); /* save the current IP */ if (cfg->compile_aot) { ppc_bl (code, 1); @@ -5117,7 +5145,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) ppc_load_sequence (code, ppc_r0, (gulong)0x01010101L); #endif } - ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, eip), ppc_r11); + ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, eip), ppc_r12); } if (tracing) @@ -5169,21 +5197,21 @@ mono_arch_emit_epilog (MonoCompile *cfg) lmf_offset = pos; /* save the frame reg in r8 */ ppc_mr (code, ppc_r8, cfg->frame_reg); - ppc_addi (code, ppc_r11, cfg->frame_reg, cfg->stack_usage - lmf_offset); + ppc_addi (code, ppc_r12, cfg->frame_reg, cfg->stack_usage - lmf_offset); /* r5 = previous_lmf */ - ppc_ldptr (code, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); + ppc_ldptr (code, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r12); /* r6 = lmf_addr */ - ppc_ldptr (code, ppc_r6, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); + ppc_ldptr (code, ppc_r6, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r12); /* *(lmf_addr) = previous_lmf */ ppc_stptr (code, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r6); /* FIXME: speedup: there is no actual need to restore the registers if * we didn't actually change them (idea from Zoltan). */ /* restore iregs */ - ppc_ldr_multiple (code, ppc_r13, G_STRUCT_OFFSET(MonoLMF, iregs), ppc_r11); + ppc_ldr_multiple (code, ppc_r13, G_STRUCT_OFFSET(MonoLMF, iregs), ppc_r12); /* restore fregs */ /*for (i = 14; i < 32; i++) { - ppc_lfd (code, i, G_STRUCT_OFFSET(MonoLMF, fregs) + ((i-14) * sizeof (gdouble)), ppc_r11); + ppc_lfd (code, i, G_STRUCT_OFFSET(MonoLMF, fregs) + ((i-14) * sizeof (gdouble)), ppc_r12); }*/ g_assert (ppc_is_imm16 (cfg->stack_usage + PPC_RET_ADDR_OFFSET)); /* use the saved copy of the frame reg in r8 */ @@ -5198,8 +5226,8 @@ mono_arch_emit_epilog (MonoCompile *cfg) if (ppc_is_imm16 (return_offset)) { ppc_ldr (code, ppc_r0, return_offset, cfg->frame_reg); } else { - ppc_load (code, ppc_r11, return_offset); - ppc_ldr_indexed (code, ppc_r0, cfg->frame_reg, ppc_r11); + ppc_load (code, ppc_r12, return_offset); + ppc_ldr_indexed (code, ppc_r0, cfg->frame_reg, ppc_r12); } ppc_mtlr (code, ppc_r0); } @@ -5210,7 +5238,7 @@ mono_arch_emit_epilog (MonoCompile *cfg) offset -= sizeof (mgreg_t); } if (cfg->frame_reg != ppc_sp) - ppc_mr (code, ppc_r11, cfg->frame_reg); + ppc_mr (code, ppc_r12, cfg->frame_reg); /* note r31 (possibly the frame register) is restored last */ for (i = 13; i <= 31; i++) { if (cfg->used_int_regs & (1 << i)) { @@ -5219,22 +5247,22 @@ mono_arch_emit_epilog (MonoCompile *cfg) } } if (cfg->frame_reg != ppc_sp) - ppc_addi (code, ppc_sp, ppc_r11, cfg->stack_usage); + ppc_addi (code, ppc_sp, ppc_r12, cfg->stack_usage); else ppc_addi (code, ppc_sp, ppc_sp, cfg->stack_usage); } else { - ppc_load32 (code, ppc_r11, cfg->stack_usage); + ppc_load32 (code, ppc_r12, cfg->stack_usage); if (cfg->used_int_regs) { - ppc_add (code, ppc_r11, cfg->frame_reg, ppc_r11); + ppc_add (code, ppc_r12, cfg->frame_reg, ppc_r12); for (i = 31; i >= 13; --i) { if (cfg->used_int_regs & (1 << i)) { pos += sizeof (mgreg_t); - ppc_ldr (code, i, -pos, ppc_r11); + ppc_ldr (code, i, -pos, ppc_r12); } } - ppc_mr (code, ppc_sp, ppc_r11); + ppc_mr (code, ppc_sp, ppc_r12); } else { - ppc_add (code, ppc_sp, cfg->frame_reg, ppc_r11); + ppc_add (code, ppc_sp, cfg->frame_reg, ppc_r12); } } @@ -5385,8 +5413,8 @@ mono_arch_emit_exceptions (MonoCompile *cfg) patch_info->data.name = "mono_arch_throw_corlib_exception"; patch_info->ip.i = code - cfg->native_code; if (FORCE_INDIR_CALL || cfg->method->dynamic) { - ppc_load_func (code, ppc_r0, 0); - ppc_mtctr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, 0); + ppc_mtctr (code, PPC_CALL_REG); ppc_bcctr (code, PPC_BR_ALWAYS, 0); } else { ppc_bl (code, 0); @@ -5621,15 +5649,15 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI start = code; /* - * We need to save and restore r11 because it might be + * We need to save and restore r12 because it might be * used by the caller as the vtable register, so * clobbering it will trip up the magic trampoline. * - * FIXME: Get rid of this by making sure that r11 is + * FIXME: Get rid of this by making sure that r12 is * not used as the vtable register in interface calls. */ - ppc_stptr (code, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_sp); - ppc_load (code, ppc_r11, (gsize)(& (vtable->vtable [0]))); + ppc_stptr (code, ppc_r12, PPC_RET_ADDR_OFFSET, ppc_sp); + ppc_load (code, ppc_r12, (gsize)(& (vtable->vtable [0]))); for (i = 0; i < count; ++i) { MonoIMTCheckItem *item = imt_entries [i]; @@ -5645,8 +5673,8 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI if (item->has_target_code) { ppc_load_ptr (code, ppc_r0, item->value.target_code); } else { - ppc_ldptr (code, ppc_r0, (sizeof (gpointer) * item->value.vtable_slot), ppc_r11); - ppc_ldptr (code, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_sp); + ppc_ldptr (code, ppc_r0, (sizeof (gpointer) * item->value.vtable_slot), ppc_r12); + ppc_ldptr (code, ppc_r12, PPC_RET_ADDR_OFFSET, ppc_sp); } ppc_mtctr (code, ppc_r0); ppc_bcctr (code, PPC_BR_ALWAYS, 0); @@ -5678,8 +5706,8 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI item->jmp_code = code; ppc_bc (code, PPC_BR_FALSE, PPC_BR_EQ, 0); #endif - ppc_ldptr (code, ppc_r0, (sizeof (gpointer) * item->value.vtable_slot), ppc_r11); - ppc_ldptr (code, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_sp); + ppc_ldptr (code, ppc_r0, (sizeof (gpointer) * item->value.vtable_slot), ppc_r12); + ppc_ldptr (code, ppc_r12, PPC_RET_ADDR_OFFSET, ppc_sp); ppc_mtctr (code, ppc_r0); ppc_bcctr (code, PPC_BR_ALWAYS, 0); #if ENABLE_WRONG_METHOD_CHECK @@ -5804,17 +5832,17 @@ mono_arch_emit_load_got_addr (guint8 *start, guint8 *code, MonoCompile *cfg, Mon * Emit code to load the contents of the GOT slot identified by TRAMP_TYPE and * TARGET from the mscorlib GOT in full-aot code. * On PPC, the GOT address is assumed to be in r30, and the result is placed into - * r11. + * r12. */ guint8* mono_arch_emit_load_aotconst (guint8 *start, guint8 *code, MonoJumpInfo **ji, int tramp_type, gconstpointer target) { /* Load the mscorlib got address */ - ppc_ldptr (code, ppc_r11, sizeof (gpointer), ppc_r30); + ppc_ldptr (code, ppc_r12, sizeof (gpointer), ppc_r30); *ji = mono_patch_info_list_prepend (*ji, code - start, tramp_type, target); /* arch_emit_got_access () patches this */ ppc_load32 (code, ppc_r0, 0); - ppc_ldptr_indexed (code, ppc_r11, ppc_r11, ppc_r0); + ppc_ldptr_indexed (code, ppc_r12, ppc_r12, ppc_r0); return code; } @@ -5837,8 +5865,8 @@ mono_arch_set_breakpoint (MonoJitInfo *ji, guint8 *ip) guint8 *code = ip; guint8 *orig_code = code; - ppc_load_sequence (code, ppc_r11, (gsize)bp_trigger_page); - ppc_ldptr (code, ppc_r11, 0, ppc_r11); + ppc_load_sequence (code, ppc_r12, (gsize)bp_trigger_page); + ppc_ldptr (code, ppc_r12, 0, ppc_r12); g_assert (code - orig_code == BREAKPOINT_SIZE); diff --git a/mta-mono/vendor/mono/mini/mini-ppc.h b/mta-mono/vendor/mono/mini/mini-ppc.h index 4b39b7a..a6a7e96 100644 --- a/mta-mono/vendor/mono/mini/mini-ppc.h +++ b/mta-mono/vendor/mono/mini/mini-ppc.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #ifdef __mono_ppc64__ @@ -68,23 +69,20 @@ typedef struct MonoCompileArch { #ifdef __mono_ppc64__ #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS #define MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS + +/* ELFv2 ABI doesn't use function descriptors. */ +#if _CALL_ELF == 2 +#undef PPC_USES_FUNCTION_DESCRIPTOR +#else #define PPC_USES_FUNCTION_DESCRIPTOR +#endif #ifndef __mono_ilp32__ #define MONO_ARCH_HAVE_TLS_GET 1 -#define MONO_ARCH_ENABLE_MONITOR_IL_FASTPATH 1 #endif #else /* must be __mono_ppc__ */ -#if 0 -/* enabling this for PPC32 causes hangs in the thread/delegate tests. - So disable for now. */ -#if defined(__linux__) -#define MONO_ARCH_ENABLE_MONITOR_IL_FASTPATH 1 -#endif -#endif - #define MONO_ARCH_HAVE_TLS_GET 1 #define MONO_ARCH_EMULATE_FCONV_TO_I8 1 #define MONO_ARCH_EMULATE_LCONV_TO_R8 1 @@ -93,11 +91,10 @@ typedef struct MonoCompileArch { #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1 #define MONO_ARCH_EMULATE_FREM 1 -#define MONO_ARCH_BIGMUL_INTRINS 1 #define MONO_ARCH_GC_MAPS_SUPPORTED 1 /* Parameters used by the register allocator */ -#define MONO_ARCH_CALLEE_REGS ((0xff << ppc_r3) | (1 << ppc_r11) | (1 << ppc_r12)) +#define MONO_ARCH_CALLEE_REGS ((0xff << ppc_r3) | (1 << ppc_r12) | (1 << ppc_r11)) #define MONO_ARCH_CALLEE_SAVED_REGS (0xfffff << ppc_r13) /* ppc_13 - ppc_31 */ #if defined(__APPLE__) || defined(__mono_ppc64__) @@ -147,7 +144,6 @@ typedef struct MonoCompileArch { #define PPC_MINIMAL_PARAM_AREA_SIZE 64 #define PPC_LAST_FPARG_REG ppc_f13 #define PPC_PASS_STRUCTS_BY_VALUE 1 -#define PPC_SMALL_RET_STRUCT_IN_REG 0 #define PPC_THREAD_PTR_REG ppc_r13 #else #define PPC_RET_ADDR_OFFSET 4 @@ -156,7 +152,6 @@ typedef struct MonoCompileArch { #define PPC_MINIMAL_PARAM_AREA_SIZE 0 #define PPC_LAST_FPARG_REG ppc_f8 #define PPC_PASS_STRUCTS_BY_VALUE 0 -#define PPC_SMALL_RET_STRUCT_IN_REG 1 #define PPC_THREAD_PTR_REG ppc_r2 #endif #define PPC_FIRST_ARG_REG ppc_r3 @@ -164,15 +159,17 @@ typedef struct MonoCompileArch { #define PPC_FIRST_FPARG_REG ppc_f1 #endif +#define PPC_CALL_REG ppc_r12 + #if defined(HAVE_WORKING_SIGALTSTACK) && !defined(__APPLE__) #define MONO_ARCH_SIGSEGV_ON_ALTSTACK 1 #define MONO_ARCH_SIGNAL_STACK_SIZE (12 * 1024) #endif /* HAVE_WORKING_SIGALTSTACK */ #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE -#define MONO_ARCH_IMT_REG ppc_r12 +#define MONO_ARCH_IMT_REG ppc_r11 -#define MONO_ARCH_VTABLE_REG ppc_r12 +#define MONO_ARCH_VTABLE_REG ppc_r11 #define MONO_ARCH_RGCTX_REG MONO_ARCH_IMT_REG #define MONO_ARCH_NO_IOV_CHECK 1 @@ -194,7 +191,6 @@ typedef struct MonoCompileArch { #define MONO_ARCH_HAVE_OP_TAIL_CALL 1 #define PPC_NUM_REG_ARGS (PPC_LAST_ARG_REG-PPC_FIRST_ARG_REG+1) -#define PPC_NUM_REG_FPARGS (PPC_LAST_FPARG_REG-PPC_FIRST_FPARG_REG+1) #ifdef MONO_CROSS_COMPILE diff --git a/mta-mono/vendor/mono/mini/mini-s390x.c b/mta-mono/vendor/mono/mini/mini-s390x.c index d84c878..3676ab5 100644 --- a/mta-mono/vendor/mono/mini/mini-s390x.c +++ b/mta-mono/vendor/mono/mini/mini-s390x.c @@ -3827,20 +3827,30 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) EMIT_COND_SYSTEM_EXCEPTION (S390_CC_LT, "OverflowException"); s390_lgfr (code, ins->dreg, ins->sreg1); break; - case OP_FMOVE: { + case OP_FMOVE: if (ins->dreg != ins->sreg1) { s390_ldr (code, ins->dreg, ins->sreg1); } - } break; - case OP_FCONV_TO_R4: { + case OP_MOVE_F_TO_I8: + s390_lgdr (code, ins->dreg, ins->sreg1); + break; + case OP_MOVE_I8_TO_F: + s390_ldgr (code, ins->dreg, ins->sreg1); + break; + case OP_MOVE_F_TO_I4: + s390_lgdr (code, ins->dreg, ins->sreg1); + break; + case OP_MOVE_I4_TO_F: + s390_lgfr (code, s390_r0, ins->sreg1); + s390_ldgr (code, ins->dreg, s390_r0); + break; + case OP_FCONV_TO_R4: s390_ledbr (code, ins->dreg, ins->sreg1); s390_ldebr (code, ins->dreg, ins->dreg); - } break; - case OP_S390_SETF4RET: { + case OP_S390_SETF4RET: s390_ledbr (code, ins->dreg, ins->sreg1); - } break; case OP_TLS_GET: { if (s390_is_imm16 (ins->inst_offset)) { @@ -4072,6 +4082,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_NOT_NULL: { } break; + case OP_IL_SEQ_POINT: + mono_add_seq_point (cfg, bb, ins, code - cfg->native_code); + break; case OP_SEQ_POINT: { int i; @@ -4577,8 +4590,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } } break; - case OP_MEMORY_BARRIER: { - } + case OP_MEMORY_BARRIER: + s390_mem (code); break; case OP_GC_LIVENESS_DEF: case OP_GC_LIVENESS_USE: @@ -5635,6 +5648,8 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod mono_arch_flush_icache (start, size); } + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_DELEGATE_INVOKE, NULL); + if (code_len) *code_len = code - start; @@ -5909,8 +5924,9 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, } mono_arch_flush_icache ((guint8*)start, (code - start)); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, NULL); - if (!fail_tramp) + if (!fail_tramp) mono_stats.imt_thunks_size += (code - start); g_assert (code - start <= size); diff --git a/mta-mono/vendor/mono/mini/mini-s390x.h b/mta-mono/vendor/mono/mini/mini-s390x.h index b40425c..7de88fd 100644 --- a/mta-mono/vendor/mono/mini/mini-s390x.h +++ b/mta-mono/vendor/mono/mini/mini-s390x.h @@ -68,11 +68,6 @@ typedef struct #define S390_LAST_ARG_REG s390_r6 #define S390_FIRST_FPARG_REG s390_f0 #define S390_LAST_FPARG_REG s390_f6 -#define S390_PASS_STRUCTS_BY_VALUE 1 -#define S390_SMALL_RET_STRUCT_IN_REG 1 - -#define S390_NUM_REG_ARGS (S390_LAST_ARG_REG-S390_FIRST_ARG_REG+1) -#define S390_NUM_REG_FPARGS ((S390_LAST_FPARG_REG-S390_FIRST_FPARG_REG)/2) /*===============================================*/ /* Definitions used by mini-codegen.c */ @@ -115,8 +110,6 @@ typedef struct #define MONO_ARCH_FRAME_ALIGNMENT 8 #define MONO_ARCH_CODE_ALIGNMENT 32 -#define MONO_ARCH_RETREG1 s390_r2 - /*-----------------------------------------------*/ /* Macros used to generate instructions */ /*-----------------------------------------------*/ diff --git a/mta-mono/vendor/mono/mini/mini-sparc.h b/mta-mono/vendor/mono/mini/mini-sparc.h index ab8e452..2c9d877 100644 --- a/mta-mono/vendor/mono/mini/mini-sparc.h +++ b/mta-mono/vendor/mono/mini/mini-sparc.h @@ -57,8 +57,6 @@ #define MONO_ARCH_CODE_ALIGNMENT 32 -#define MONO_ARCH_RETREG1 sparc_i0 - #ifdef SPARCV9 #define MONO_SPARC_STACK_BIAS 2047 #else diff --git a/mta-mono/vendor/mono/mini/mini-trampolines.c b/mta-mono/vendor/mono/mini/mini-trampolines.c index d8f1e42..daac4fe 100644 --- a/mta-mono/vendor/mono/mini/mini-trampolines.c +++ b/mta-mono/vendor/mono/mini/mini-trampolines.c @@ -176,6 +176,7 @@ mono_convert_imt_slot_to_vtable_slot (gpointer* slot, mgreg_t *regs, guint8 *cod mono_vtable_build_imt_slot (vt, mono_method_get_imt_slot (imt_method)); if (imt_method->is_inflated && ((MonoMethodInflated*)imt_method)->context.method_inst) { + MonoError error; MonoGenericContext context = { NULL, NULL }; /* @@ -188,7 +189,8 @@ mono_convert_imt_slot_to_vtable_slot (gpointer* slot, mgreg_t *regs, guint8 *cod if (impl->klass->generic_class) context.class_inst = impl->klass->generic_class->context.class_inst; context.method_inst = ((MonoMethodInflated*)imt_method)->context.method_inst; - impl = mono_class_inflate_generic_method (impl, &context); + impl = mono_class_inflate_generic_method_checked (impl, &context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } else { /* Avoid loading metadata or creating a generic vtable if possible */ if (lookup_aot && !vt->klass->valuetype) @@ -464,6 +466,7 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram * return TRUE for methods used in IMT calls too. */ if (virtual && is_generic_method_definition (m)) { + MonoError error; MonoGenericContext context = { NULL, NULL }; MonoMethod *declaring; @@ -483,7 +486,8 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram context.method_inst = ((MonoMethodInflated*)generic_virtual)->context.method_inst; } - m = mono_class_inflate_generic_method (declaring, &context); + m = mono_class_inflate_generic_method_checked (declaring, &context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ /* FIXME: only do this if the method is sharable */ need_rgctx_tramp = TRUE; } else if ((context_used = mono_method_check_context_used (m))) { @@ -542,6 +546,7 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram } if (method_inst || m->wrapper_type) { + MonoError error; MonoGenericContext context = { NULL, NULL }; if (m->is_inflated) @@ -555,7 +560,8 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram context.class_inst = klass->generic_container->context.class_inst; context.method_inst = method_inst; - actual_method = mono_class_inflate_generic_method (declaring, &context); + actual_method = mono_class_inflate_generic_method_checked (declaring, &context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ } else { actual_method = mono_class_get_method_generic (klass, m); } @@ -781,6 +787,7 @@ mono_vcall_trampoline (mgreg_t *regs, guint8 *code, int slot, guint8 *tramp) gpointer mono_generic_virtual_remoting_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8 *tramp) { + MonoError error; MonoGenericContext context = { NULL, NULL }; MonoMethod *imt_method, *declaring; gpointer addr; @@ -802,7 +809,8 @@ mono_generic_virtual_remoting_trampoline (mgreg_t *regs, guint8 *code, MonoMetho imt_method = mono_arch_find_imt_method (regs, code); if (imt_method->is_inflated) context.method_inst = ((MonoMethodInflated*)imt_method)->context.method_inst; - m = mono_class_inflate_generic_method (declaring, &context); + m = mono_class_inflate_generic_method_checked (declaring, &context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */; m = mono_marshal_get_remoting_invoke_with_check (m); addr = mono_compile_method (m); @@ -954,6 +962,17 @@ mono_monitor_enter_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, gui mono_monitor_enter (obj); } +void +mono_monitor_enter_v4_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp) +{ +#ifdef MONO_ARCH_MONITOR_LOCK_TAKEN_REG + char *lock_taken = (char*)regs [MONO_ARCH_MONITOR_LOCK_TAKEN_REG]; + mono_monitor_enter_v4 (obj, lock_taken); +#else + g_assert_not_reached (); +#endif +} + void mono_monitor_exit_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp) { @@ -1255,6 +1274,8 @@ mono_get_trampoline_func (MonoTrampolineType tramp_type) #endif case MONO_TRAMPOLINE_MONITOR_ENTER: return mono_monitor_enter_trampoline; + case MONO_TRAMPOLINE_MONITOR_ENTER_V4: + return mono_monitor_enter_v4_trampoline; case MONO_TRAMPOLINE_MONITOR_EXIT: return mono_monitor_exit_trampoline; case MONO_TRAMPOLINE_VCALL: @@ -1306,6 +1327,7 @@ mono_trampolines_init (void) mono_trampoline_code [MONO_TRAMPOLINE_GENERIC_VIRTUAL_REMOTING] = create_trampoline_code (MONO_TRAMPOLINE_GENERIC_VIRTUAL_REMOTING); #endif mono_trampoline_code [MONO_TRAMPOLINE_MONITOR_ENTER] = create_trampoline_code (MONO_TRAMPOLINE_MONITOR_ENTER); + mono_trampoline_code [MONO_TRAMPOLINE_MONITOR_ENTER_V4] = create_trampoline_code (MONO_TRAMPOLINE_MONITOR_ENTER_V4); mono_trampoline_code [MONO_TRAMPOLINE_MONITOR_EXIT] = create_trampoline_code (MONO_TRAMPOLINE_MONITOR_EXIT); mono_trampoline_code [MONO_TRAMPOLINE_VCALL] = create_trampoline_code (MONO_TRAMPOLINE_VCALL); #ifdef MONO_ARCH_HAVE_HANDLER_BLOCK_GUARD @@ -1641,7 +1663,37 @@ mono_create_monitor_enter_trampoline (void) if (!code) { MonoTrampInfo *info; - code = mono_arch_create_monitor_enter_trampoline (&info, FALSE); + code = mono_arch_create_monitor_enter_trampoline (&info, FALSE, FALSE); + mono_tramp_info_register (info); + } + + mono_trampolines_unlock (); +#else + code = NULL; + g_assert_not_reached (); +#endif + + return code; +} + +gpointer +mono_create_monitor_enter_v4_trampoline (void) +{ + static gpointer code; + + if (mono_aot_only) { + if (!code) + code = mono_aot_get_trampoline ("monitor_enter_v4_trampoline"); + return code; + } + +#if defined(MONO_ARCH_MONITOR_OBJECT_REG) && defined(MONO_ARCH_MONITOR_LOCK_TAKEN_REG) + mono_trampolines_lock (); + + if (!code) { + MonoTrampInfo *info; + + code = mono_arch_create_monitor_enter_trampoline (&info, TRUE, FALSE); mono_tramp_info_register (info); } @@ -1749,11 +1801,22 @@ static const char*tramp_names [MONO_TRAMPOLINE_NUM] = { "restore_stack_prot", "generic_virtual_remoting", "monitor_enter", + "monitor_enter_v4", "monitor_exit", "vcall", "handler_block_guard" }; +/* + * mono_get_generic_trampoline_simple_name: + * + */ +const char* +mono_get_generic_trampoline_simple_name (MonoTrampolineType tramp_type) +{ + return tramp_names [tramp_type]; +} + /* * mono_get_generic_trampoline_name: * diff --git a/mta-mono/vendor/mono/mini/mini-unwind.h b/mta-mono/vendor/mono/mini/mini-unwind.h index a2c9f49..1085cbe 100644 --- a/mta-mono/vendor/mono/mini/mini-unwind.h +++ b/mta-mono/vendor/mono/mini/mini-unwind.h @@ -82,11 +82,11 @@ typedef struct { */ /* Set cfa to reg+offset */ -#define mono_emit_unwind_op_def_cfa(cfg,ip,reg,offset) do { mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_def_cfa, (reg), (offset)); (cfg)->cfa_reg = (reg); (cfg)->cfa_offset = (offset); } while (0) +#define mono_emit_unwind_op_def_cfa(cfg,ip,reg,offset) do { mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_def_cfa, (reg), (offset)); (cfg)->cur_cfa_reg = (reg); (cfg)->cur_cfa_offset = (offset); } while (0) /* Set cfa to reg+existing offset */ -#define mono_emit_unwind_op_def_cfa_reg(cfg,ip,reg) do { mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_def_cfa_register, (reg), (0)); (cfg)->cfa_reg = (reg); } while (0) +#define mono_emit_unwind_op_def_cfa_reg(cfg,ip,reg) do { mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_def_cfa_register, (reg), (0)); (cfg)->cur_cfa_reg = (reg); } while (0) /* Set cfa to existing reg+offset */ -#define mono_emit_unwind_op_def_cfa_offset(cfg,ip,offset) do { mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_def_cfa_offset, (0), (offset)); (cfg)->cfa_offset = (offset); } while (0) +#define mono_emit_unwind_op_def_cfa_offset(cfg,ip,offset) do { mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_def_cfa_offset, (0), (offset)); (cfg)->cur_cfa_offset = (offset); } while (0) /* Reg is the same as it was on enter to the function */ #define mono_emit_unwind_op_same_value(cfg,ip,reg) mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_same_value, (reg), 0) /* Reg is saved at cfa+offset */ diff --git a/mta-mono/vendor/mono/mini/mini-x86.c b/mta-mono/vendor/mono/mini/mini-x86.c index 05b72c0..2e68e49 100644 --- a/mta-mono/vendor/mono/mini/mini-x86.c +++ b/mta-mono/vendor/mono/mini/mini-x86.c @@ -590,17 +590,20 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM add_general (&gr, param_regs, &stack_size, &cinfo->sig_cookie); } + if (cinfo->vtype_retaddr) { + /* if the function returns a struct on stack, the called method already does a ret $0x4 */ + cinfo->callee_stack_pop = 4; + } else if (CALLCONV_IS_STDCALL (sig) && sig->pinvoke) { + /* Have to compensate for the stack space popped by the native callee */ + cinfo->callee_stack_pop = stack_size; + } + if (mono_do_x86_stack_align && (stack_size % MONO_ARCH_FRAME_ALIGNMENT) != 0) { cinfo->need_stack_align = TRUE; cinfo->stack_align_amount = MONO_ARCH_FRAME_ALIGNMENT - (stack_size % MONO_ARCH_FRAME_ALIGNMENT); stack_size += cinfo->stack_align_amount; } - if (cinfo->vtype_retaddr) { - /* if the function returns a struct on stack, the called method already does a ret $0x4 */ - cinfo->callee_stack_pop = 4; - } - cinfo->stack_usage = stack_size; cinfo->reg_usage = gr; cinfo->freg_usage = fr; @@ -868,7 +871,7 @@ mono_arch_is_int_overflow (void *sigctx, void *info) MonoContext ctx; guint8* ip; - mono_arch_sigctx_to_monoctx (sigctx, &ctx); + mono_sigctx_to_monoctx (sigctx, &ctx); ip = (guint8*)ctx.eip; @@ -1920,7 +1923,7 @@ mono_arch_peephole_pass_1 (MonoCompile *cfg, MonoBasicBlock *bb) MonoInst *ins, *n; MONO_BB_FOR_EACH_INS_SAFE (bb, n, ins) { - MonoInst *last_ins = ins->prev; + MonoInst *last_ins = mono_inst_prev (ins, FILTER_IL_SEQ_POINT); switch (ins->opcode) { case OP_IADD_IMM: @@ -2011,7 +2014,7 @@ mono_arch_peephole_pass_2 (MonoCompile *cfg, MonoBasicBlock *bb) * Convert succeeding STORE_MEMBASE_IMM 0 ins to STORE_MEMBASE_REG * since it takes 3 bytes instead of 7. */ - for (ins2 = ins->next; ins2; ins2 = ins2->next) { + for (ins2 = mono_inst_next (ins, FILTER_IL_SEQ_POINT); ins2; ins2 = ins2->next) { if ((ins2->opcode == OP_STORE_MEMBASE_IMM) && (ins2->inst_imm == 0)) { ins2->opcode = OP_STORE_MEMBASE_REG; ins2->sreg1 = ins->dreg; @@ -2289,7 +2292,7 @@ static int tls_gs_offset; gboolean mono_x86_have_tls_get (void) { -#ifdef __APPLE__ +#ifdef TARGET_MACH static gboolean have_tls_get = FALSE; static gboolean inited = FALSE; guint32 *ins; @@ -2761,6 +2764,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_NOT_REACHED: case OP_NOT_NULL: break; + case OP_IL_SEQ_POINT: + mono_add_seq_point (cfg, bb, ins, code - cfg->native_code); + break; case OP_SEQ_POINT: { int i; @@ -3171,7 +3177,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) x86_push_membase (code, ins->inst_basereg, 0xf0f0f0f0); break; case OP_MOVE: - x86_mov_reg_reg (code, ins->dreg, ins->sreg1, 4); + if (ins->dreg != ins->sreg1) + x86_mov_reg_reg (code, ins->dreg, ins->sreg1, 4); break; case OP_TAILCALL: { MonoCallInst *call = (MonoCallInst*)ins; @@ -3697,6 +3704,14 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_FMOVE: /* Not needed on the fp stack */ break; + case OP_MOVE_F_TO_I4: + x86_fst_membase (code, ins->backend.spill_var->inst_basereg, ins->backend.spill_var->inst_offset, FALSE, TRUE); + x86_mov_reg_membase (code, ins->dreg, ins->backend.spill_var->inst_basereg, ins->backend.spill_var->inst_offset, 4); + break; + case OP_MOVE_I4_TO_F: + x86_mov_membase_reg (code, ins->backend.spill_var->inst_basereg, ins->backend.spill_var->inst_offset, ins->sreg1, 4); + x86_fld_membase (code, ins->backend.spill_var->inst_basereg, ins->backend.spill_var->inst_offset, FALSE); + break; case OP_FADD: x86_fp_op_reg (code, X86_FADD, 1, TRUE); break; @@ -4210,14 +4225,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; } case OP_MEMORY_BARRIER: { - /* x86 only needs barrier for StoreLoad and FullBarrier */ - switch (ins->backend.memory_barrier_kind) { - case StoreLoadBarrier: - case FullBarrier: - /* http://blogs.sun.com/dave/resource/NHM-Pipeline-Blog-V2.txt */ + if (ins->backend.memory_barrier_kind == MONO_MEMORY_BARRIER_SEQ) { x86_prefix (code, X86_LOCK_PREFIX); x86_alu_membase_imm (code, X86_ADD, X86_ESP, 0, 0); - break; } break; } @@ -4317,6 +4327,69 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) x86_cmpxchg_membase_reg (code, ins->sreg1, ins->inst_offset, ins->sreg2); break; } + case OP_ATOMIC_LOAD_I1: { + x86_widen_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset, TRUE, FALSE); + break; + } + case OP_ATOMIC_LOAD_U1: { + x86_widen_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset, FALSE, FALSE); + break; + } + case OP_ATOMIC_LOAD_I2: { + x86_widen_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset, TRUE, TRUE); + break; + } + case OP_ATOMIC_LOAD_U2: { + x86_widen_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset, FALSE, TRUE); + break; + } + case OP_ATOMIC_LOAD_I4: + case OP_ATOMIC_LOAD_U4: { + x86_mov_reg_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset, 4); + break; + } + case OP_ATOMIC_LOAD_R4: + case OP_ATOMIC_LOAD_R8: { + x86_fld_membase (code, ins->inst_basereg, ins->inst_offset, ins->opcode == OP_ATOMIC_LOAD_R8); + break; + } + case OP_ATOMIC_STORE_I1: + case OP_ATOMIC_STORE_U1: + case OP_ATOMIC_STORE_I2: + case OP_ATOMIC_STORE_U2: + case OP_ATOMIC_STORE_I4: + case OP_ATOMIC_STORE_U4: { + int size; + + switch (ins->opcode) { + case OP_ATOMIC_STORE_I1: + case OP_ATOMIC_STORE_U1: + size = 1; + break; + case OP_ATOMIC_STORE_I2: + case OP_ATOMIC_STORE_U2: + size = 2; + break; + case OP_ATOMIC_STORE_I4: + case OP_ATOMIC_STORE_U4: + size = 4; + break; + } + + x86_mov_membase_reg (code, ins->inst_destbasereg, ins->inst_offset, ins->sreg1, size); + + if (ins->backend.memory_barrier_kind == MONO_MEMORY_BARRIER_SEQ) + x86_mfence (code); + break; + } + case OP_ATOMIC_STORE_R4: + case OP_ATOMIC_STORE_R8: { + x86_fst_membase (code, ins->inst_destbasereg, ins->inst_offset, ins->opcode == OP_ATOMIC_STORE_R8, TRUE); + + if (ins->backend.memory_barrier_kind == MONO_MEMORY_BARRIER_SEQ) + x86_mfence (code); + break; + } case OP_CARD_TABLE_WBARRIER: { int ptr = ins->sreg1; int value = ins->sreg2; @@ -4860,10 +4933,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_XZERO: x86_sse_alu_pd_reg_reg (code, X86_SSE_PXOR, ins->dreg, ins->dreg); break; - case OP_ICONV_TO_R8_RAW: - x86_mov_membase_reg (code, ins->backend.spill_var->inst_basereg, ins->backend.spill_var->inst_offset, ins->sreg1, 4); - x86_fld_membase (code, ins->backend.spill_var->inst_basereg, ins->backend.spill_var->inst_offset, FALSE); - break; case OP_FCONV_TO_R8_X: x86_fst_membase (code, ins->backend.spill_var->inst_basereg, ins->backend.spill_var->inst_offset, TRUE, TRUE); @@ -5053,6 +5122,7 @@ mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, guint8 *code, Mono case MONO_PATCH_INFO_RGCTX_FETCH: case MONO_PATCH_INFO_GENERIC_CLASS_INIT: case MONO_PATCH_INFO_MONITOR_ENTER: + case MONO_PATCH_INFO_MONITOR_ENTER_V4: case MONO_PATCH_INFO_MONITOR_EXIT: case MONO_PATCH_INFO_JIT_ICALL_ADDR: #if defined(__native_client_codegen__) && defined(__native_client__) @@ -5828,6 +5898,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI } nacl_domain_code_validate (domain, &start, size, &code); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, NULL); return start; } @@ -5878,7 +5949,7 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho opcode = OP_ROUND; } - if (opcode) { + if (opcode && fsig->param_count == 1) { MONO_INST_NEW (cfg, ins, opcode); ins->type = STACK_R8; ins->dreg = mono_alloc_freg (cfg); @@ -5887,7 +5958,7 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho } if (cfg->opt & MONO_OPT_CMOV) { - int opcode = 0; + opcode = 0; if (strcmp (cmethod->name, "Min") == 0) { if (fsig->params [0]->type == MONO_TYPE_I4) @@ -5897,7 +5968,7 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho opcode = OP_IMAX; } - if (opcode) { + if (opcode && fsig->param_count == 2) { MONO_INST_NEW (cfg, ins, opcode); ins->type = STACK_I4; ins->dreg = mono_alloc_ireg (cfg); @@ -5909,7 +5980,7 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho #if 0 /* OP_FREM is not IEEE compatible */ - else if (strcmp (cmethod->name, "IEEERemainder") == 0) { + else if (strcmp (cmethod->name, "IEEERemainder") == 0 && fsig->param_count == 2) { MONO_INST_NEW (cfg, ins, OP_FREM); ins->inst_i0 = args [0]; ins->inst_i1 = args [1]; @@ -6019,7 +6090,6 @@ gpointer mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code) { guint32 esp = regs [X86_ESP]; - CallInfo *cinfo = NULL; gpointer res; int offset; @@ -6031,8 +6101,6 @@ mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code) * */ res = ((MonoObject**)esp) [0]; - if (cinfo) - g_free (cinfo); return res; } @@ -6101,8 +6169,7 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod g_assert ((code - start) < code_reserve); } - nacl_global_codeman_validate(&start, code_reserve, &code); - mono_debug_add_delegate_trampoline (start, code - start); + nacl_global_codeman_validate (&start, code_reserve, &code); if (code_len) *code_len = code - start; @@ -6117,6 +6184,7 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod if (!has_target) g_free (buff); } + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_DELEGATE_INVOKE, NULL); return start; } @@ -6228,6 +6296,7 @@ mono_arch_get_delegate_virtual_invoke_impl (MonoMethodSignature *sig, MonoMethod /* Load the vtable */ x86_mov_reg_membase (code, X86_EAX, X86_ECX, MONO_STRUCT_OFFSET (MonoObject, vtable), 4); x86_jump_membase (code, X86_EAX, offset); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_DELEGATE_INVOKE, NULL); return start; } @@ -6710,6 +6779,22 @@ mono_arch_opcode_supported (int opcode) case OP_ATOMIC_ADD_I4: case OP_ATOMIC_EXCHANGE_I4: case OP_ATOMIC_CAS_I4: + case OP_ATOMIC_LOAD_I1: + case OP_ATOMIC_LOAD_I2: + case OP_ATOMIC_LOAD_I4: + case OP_ATOMIC_LOAD_U1: + case OP_ATOMIC_LOAD_U2: + case OP_ATOMIC_LOAD_U4: + case OP_ATOMIC_LOAD_R4: + case OP_ATOMIC_LOAD_R8: + case OP_ATOMIC_STORE_I1: + case OP_ATOMIC_STORE_I2: + case OP_ATOMIC_STORE_I4: + case OP_ATOMIC_STORE_U1: + case OP_ATOMIC_STORE_U2: + case OP_ATOMIC_STORE_U4: + case OP_ATOMIC_STORE_R4: + case OP_ATOMIC_STORE_R8: return TRUE; default: return FALSE; diff --git a/mta-mono/vendor/mono/mini/mini-x86.h b/mta-mono/vendor/mono/mini/mini-x86.h index f6ddc93..836484d 100644 --- a/mta-mono/vendor/mono/mini/mini-x86.h +++ b/mta-mono/vendor/mono/mini/mini-x86.h @@ -134,9 +134,6 @@ struct sigcontext { * reproduceable results for benchmarks */ #define MONO_ARCH_CODE_ALIGNMENT 32 -#define MONO_ARCH_RETREG1 X86_EAX -#define MONO_ARCH_RETREG2 X86_EDX - /*This is the max size of the locals area of a given frame. I think 1MB is a safe default for now*/ #define MONO_ARCH_MAX_FRAME_SIZE 0x100000 @@ -201,7 +198,6 @@ typedef struct { /* Enables OP_LSHL, OP_LSHL_IMM, OP_LSHR, OP_LSHR_IMM, OP_LSHR_UN, OP_LSHR_UN_IMM */ #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS -#define MONO_ARCH_BIGMUL_INTRINS 1 #define MONO_ARCH_NEED_DIV_CHECK 1 #define MONO_ARCH_HAVE_IS_INT_OVERFLOW 1 #define MONO_ARCH_HAVE_INVALIDATE_METHOD 1 @@ -220,6 +216,7 @@ typedef struct { #define MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX 1 #if defined(__linux__) || defined (__APPLE__) #define MONO_ARCH_MONITOR_OBJECT_REG X86_EAX +#define MONO_ARCH_MONITOR_LOCK_TAKEN_REG X86_EDX #endif #if !defined(__native_client_codegen__) #define MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES 1 @@ -236,11 +233,7 @@ typedef struct { #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1 -#ifndef TARGET_WIN32 #define MONO_ARCH_AOT_SUPPORTED 1 -#endif - -#define MONO_ARCH_ENABLE_MONITOR_IL_FASTPATH 1 #define MONO_ARCH_GSHARED_SUPPORTED 1 #define MONO_ARCH_HAVE_LLVM_IMT_TRAMPOLINE 1 diff --git a/mta-mono/vendor/mono/mini/mini.c b/mta-mono/vendor/mono/mini/mini.c index d7ee5ba..5c08891 100644 --- a/mta-mono/vendor/mono/mini/mini.c +++ b/mta-mono/vendor/mono/mini/mini.c @@ -12,7 +12,6 @@ #define MONO_LLVM_IN_MINI 1 #include -#include #ifdef HAVE_ALLOCA_H #include #endif @@ -23,6 +22,9 @@ #ifdef HAVE_SYS_TIME_H #include #endif +#ifdef HAVE_SIGNAL_H +#include +#endif #include @@ -53,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +66,7 @@ #include #include "mini.h" +#include "seq-points.h" #include "mini-llvm.h" #include "tasklets.h" #include @@ -75,6 +79,7 @@ #include "mini-gc.h" #include "debugger-agent.h" +#include "seq-points.h" static gpointer mono_jit_compile_method_with_opt (MonoMethod *method, guint32 opt, MonoException **ex); @@ -136,9 +141,6 @@ mono_breakpoint_info_index [MONO_BREAKPOINT_ARRAY_SIZE]; /* Whenever to check for pending exceptions in managed-to-native wrappers */ gboolean check_for_pending_exc = TRUE; -/* Whenever to disable passing/returning small valuetypes in registers for managed methods */ -gboolean disable_vtypes_in_regs = FALSE; - static GSList *tramp_infos; static void register_icalls (void); @@ -710,10 +712,11 @@ G_GNUC_UNUSED gboolean mono_debug_count (void) { static int count = 0; - count ++; static gboolean inited; static const char *value; + count ++; + if (!inited) { value = g_getenv ("COUNT"); inited = TRUE; @@ -1377,6 +1380,20 @@ mono_compile_make_var_load (MonoCompile *cfg, MonoInst *dest, gssize var_index) dest->klass = dest->inst_i0->klass; } +MonoInst* +mini_get_int_to_float_spill_area (MonoCompile *cfg) +{ +#ifdef TARGET_X86 + if (!cfg->iconv_raw_var) { + cfg->iconv_raw_var = mono_compile_create_var (cfg, &mono_defaults.int32_class->byval_arg, OP_LOCAL); + cfg->iconv_raw_var->flags |= MONO_INST_VOLATILE; /*FIXME, use the don't regalloc flag*/ + } + return cfg->iconv_raw_var; +#else + return NULL; +#endif +} + #endif void @@ -1490,7 +1507,7 @@ mono_add_ins_to_end (MonoBasicBlock *bb, MonoInst *inst) /* Only two instructions */ opcode = bb->code->opcode; - if ((opcode == OP_COMPARE) || (opcode == OP_COMPARE_IMM) || (opcode == OP_ICOMPARE) || (opcode == OP_ICOMPARE_IMM) || (opcode == OP_FCOMPARE) || (opcode == OP_LCOMPARE) || (opcode == OP_LCOMPARE_IMM)) { + if ((opcode == OP_COMPARE) || (opcode == OP_COMPARE_IMM) || (opcode == OP_ICOMPARE) || (opcode == OP_ICOMPARE_IMM) || (opcode == OP_FCOMPARE) || (opcode == OP_LCOMPARE) || (opcode == OP_LCOMPARE_IMM) || (opcode == OP_RCOMPARE)) { /* NEW IR */ mono_bblock_insert_before_ins (bb, bb->code, inst); } else { @@ -1499,7 +1516,7 @@ mono_add_ins_to_end (MonoBasicBlock *bb, MonoInst *inst) } else { opcode = bb->last_ins->prev->opcode; - if ((opcode == OP_COMPARE) || (opcode == OP_COMPARE_IMM) || (opcode == OP_ICOMPARE) || (opcode == OP_ICOMPARE_IMM) || (opcode == OP_FCOMPARE) || (opcode == OP_LCOMPARE) || (opcode == OP_LCOMPARE_IMM)) { + if ((opcode == OP_COMPARE) || (opcode == OP_COMPARE_IMM) || (opcode == OP_ICOMPARE) || (opcode == OP_ICOMPARE_IMM) || (opcode == OP_FCOMPARE) || (opcode == OP_LCOMPARE) || (opcode == OP_LCOMPARE_IMM) || (opcode == OP_RCOMPARE)) { /* NEW IR */ mono_bblock_insert_before_ins (bb, bb->last_ins->prev, inst); } else { @@ -1703,6 +1720,7 @@ mono_icall_get_wrapper_full (MonoJitICallInfo* callinfo, gboolean do_compile) MonoMethod *wrapper; gconstpointer trampoline; MonoDomain *domain = mono_get_root_domain (); + gboolean check_exc = check_for_pending_exc; if (callinfo->wrapper) { return callinfo->wrapper; @@ -1724,8 +1742,12 @@ mono_icall_get_wrapper_full (MonoJitICallInfo* callinfo, gboolean do_compile) return callinfo->trampoline; } + if (!strcmp (callinfo->name, "mono_thread_interruption_checkpoint")) + /* This icall is used to check for exceptions, so don't check in the wrapper */ + check_exc = FALSE; + name = g_strdup_printf ("__icall_wrapper_%s", callinfo->name); - wrapper = mono_marshal_get_icall_wrapper (callinfo->sig, name, callinfo->func, check_for_pending_exc); + wrapper = mono_marshal_get_icall_wrapper (callinfo->sig, name, callinfo->func, check_exc); g_free (name); if (do_compile) @@ -1878,6 +1900,8 @@ mono_allocate_stack_slots2 (MonoCompile *cfg, gboolean backward, guint32 *stack_ if (cfg->disable_reuse_stack_slots) reuse_slot = FALSE; + if (t->byref) + t = &mono_defaults.int_class->byval_arg; switch (t->type) { case MONO_TYPE_GENERICINST: if (!mono_type_generic_inst_is_valuetype (t)) { @@ -2395,7 +2419,8 @@ register_opcode_emulation (int opcode, const char *name, const char *sigstr, gpo g_assert (!sig->hasthis); g_assert (sig->param_count < 3); - info = mono_register_jit_icall_full (func, name, sig, no_throw, symbol); + /* Opcode emulation functions are assumed to don't call mono_raise_exception () */ + info = mono_register_jit_icall_full (func, name, sig, no_throw, TRUE, symbol); if (emul_opcode_num >= emul_opcode_alloced) { int incr = emul_opcode_alloced? emul_opcode_alloced/2: 16; @@ -2425,7 +2450,21 @@ register_icall (gpointer func, const char *name, const char *sigstr, gboolean sa else sig = NULL; - mono_register_jit_icall_full (func, name, sig, save, save ? name : NULL); + mono_register_jit_icall_full (func, name, sig, save, FALSE, save ? name : NULL); +} + +/* Register a jit icall which doesn't throw exceptions through mono_raise_exception () */ +static void +register_icall_noraise (gpointer func, const char *name, const char *sigstr) +{ + MonoMethodSignature *sig; + + if (sigstr) + sig = mono_create_icall_signature (sigstr); + else + sig = NULL; + + mono_register_jit_icall_full (func, name, sig, TRUE, TRUE, name); } static void @@ -3243,6 +3282,7 @@ mono_patch_info_hash (gconstpointer data) case MONO_PATCH_INFO_GC_CARD_TABLE_ADDR: case MONO_PATCH_INFO_JIT_TLS_ID: case MONO_PATCH_INFO_MONITOR_ENTER: + case MONO_PATCH_INFO_MONITOR_ENTER_V4: case MONO_PATCH_INFO_MONITOR_EXIT: case MONO_PATCH_INFO_GOT_OFFSET: return (ji->type << 8); @@ -3257,6 +3297,8 @@ mono_patch_info_hash (gconstpointer data) return g_str_hash (ji->data.target); case MONO_PATCH_INFO_DELEGATE_TRAMPOLINE: return (ji->type << 8) | (gsize)ji->data.del_tramp->klass | (gsize)ji->data.del_tramp->method | (gsize)ji->data.del_tramp->virtual; + case MONO_PATCH_INFO_LDSTR_LIT: + return g_str_hash (ji->data.target); default: printf ("info type: %d\n", ji->type); mono_print_ji (ji); printf ("\n"); @@ -3539,9 +3581,12 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, case MONO_PATCH_INFO_TYPE_FROM_HANDLE: { gpointer handle; MonoClass *handle_class; + MonoError error; - handle = mono_ldtoken (patch_info->data.token->image, - patch_info->data.token->token, &handle_class, patch_info->data.token->has_context ? &patch_info->data.token->context : NULL); + handle = mono_ldtoken_checked (patch_info->data.token->image, + patch_info->data.token->token, &handle_class, patch_info->data.token->has_context ? &patch_info->data.token->context : NULL, &error); + if (!mono_error_ok (&error)) + g_error ("Could not patch ldtoken due to %s", mono_error_get_message (&error)); mono_class_init (handle_class); mono_class_init (mono_class_from_mono_type (handle)); @@ -3552,9 +3597,12 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, case MONO_PATCH_INFO_LDTOKEN: { gpointer handle; MonoClass *handle_class; + MonoError error; - handle = mono_ldtoken (patch_info->data.token->image, - patch_info->data.token->token, &handle_class, patch_info->data.token->has_context ? &patch_info->data.token->context : NULL); + handle = mono_ldtoken_checked (patch_info->data.token->image, + patch_info->data.token->token, &handle_class, patch_info->data.token->has_context ? &patch_info->data.token->context : NULL, &error); + if (!mono_error_ok (&error)) + g_error ("Could not patch ldtoken due to %s", mono_error_get_message (&error)); mono_class_init (handle_class); target = handle; @@ -3659,6 +3707,9 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, case MONO_PATCH_INFO_MONITOR_ENTER: target = mono_create_monitor_enter_trampoline (); break; + case MONO_PATCH_INFO_MONITOR_ENTER_V4: + target = mono_create_monitor_enter_v4_trampoline (); + break; case MONO_PATCH_INFO_MONITOR_EXIT: target = mono_create_monitor_exit_trampoline (); break; @@ -3708,6 +3759,17 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, target = NULL; break; } + case MONO_PATCH_INFO_LDSTR_LIT: { + int len; + char *s; + + len = strlen (patch_info->data.target); + s = mono_domain_alloc0 (domain, len + 1); + memcpy (s, patch_info->data.target, len); + target = s; + + break; + } default: g_assert_not_reached (); } @@ -3919,159 +3981,6 @@ mono_postprocess_patches (MonoCompile *cfg) } } -static void -collect_pred_seq_points (MonoBasicBlock *bb, MonoInst *ins, GSList **next, int depth) -{ - int i; - MonoBasicBlock *in_bb; - GSList *l; - - for (i = 0; i < bb->in_count; ++i) { - in_bb = bb->in_bb [i]; - - if (in_bb->last_seq_point) { - int src_index = in_bb->last_seq_point->backend.size; - int dst_index = ins->backend.size; - - /* bb->in_bb might contain duplicates */ - for (l = next [src_index]; l; l = l->next) - if (GPOINTER_TO_UINT (l->data) == dst_index) - break; - if (!l) - next [src_index] = g_slist_append (next [src_index], GUINT_TO_POINTER (dst_index)); - } else { - /* Have to look at its predecessors */ - if (depth < 5) - collect_pred_seq_points (in_bb, ins, next, depth + 1); - } - } -} - -static void -mono_save_seq_point_info (MonoCompile *cfg) -{ - MonoBasicBlock *bb; - GSList *bb_seq_points, *l; - MonoInst *last; - MonoDomain *domain = cfg->domain; - int i; - MonoSeqPointInfo *info; - GSList **next; - - if (!cfg->seq_points) - return; - - info = g_malloc0 (sizeof (MonoSeqPointInfo) + (cfg->seq_points->len * sizeof (SeqPoint))); - info->len = cfg->seq_points->len; - for (i = 0; i < cfg->seq_points->len; ++i) { - SeqPoint *sp = &info->seq_points [i]; - MonoInst *ins = g_ptr_array_index (cfg->seq_points, i); - - sp->il_offset = ins->inst_imm; - sp->native_offset = ins->inst_offset; - if (ins->flags & MONO_INST_NONEMPTY_STACK) - sp->flags |= MONO_SEQ_POINT_FLAG_NONEMPTY_STACK; - - /* Used below */ - ins->backend.size = i; - } - - /* - * For each sequence point, compute the list of sequence points immediately - * following it, this is needed to implement 'step over' in the debugger agent. - */ - next = g_new0 (GSList*, cfg->seq_points->len); - for (bb = cfg->bb_entry; bb; bb = bb->next_bb) { - bb_seq_points = g_slist_reverse (bb->seq_points); - last = NULL; - for (l = bb_seq_points; l; l = l->next) { - MonoInst *ins = l->data; - - if (ins->inst_imm == METHOD_ENTRY_IL_OFFSET || ins->inst_imm == METHOD_EXIT_IL_OFFSET) - /* Used to implement method entry/exit events */ - continue; - if (ins->inst_offset == SEQ_POINT_NATIVE_OFFSET_DEAD_CODE) - continue; - - if (last != NULL) { - /* Link with the previous seq point in the same bb */ - next [last->backend.size] = g_slist_append (next [last->backend.size], GUINT_TO_POINTER (ins->backend.size)); - } else { - /* Link with the last bb in the previous bblocks */ - collect_pred_seq_points (bb, ins, next, 0); - } - - last = ins; - } - - if (bb->last_ins && bb->last_ins->opcode == OP_ENDFINALLY && bb->seq_points) { - MonoBasicBlock *bb2; - MonoInst *endfinally_seq_point = NULL; - - /* - * The ENDFINALLY branches are not represented in the cfg, so link it with all seq points starting bbs. - */ - l = g_slist_last (bb->seq_points); - if (l) { - endfinally_seq_point = l->data; - - for (bb2 = cfg->bb_entry; bb2; bb2 = bb2->next_bb) { - GSList *l = g_slist_last (bb2->seq_points); - - if (l) { - MonoInst *ins = l->data; - - if (!(ins->inst_imm == METHOD_ENTRY_IL_OFFSET || ins->inst_imm == METHOD_EXIT_IL_OFFSET) && ins != endfinally_seq_point) - next [endfinally_seq_point->backend.size] = g_slist_append (next [endfinally_seq_point->backend.size], GUINT_TO_POINTER (ins->backend.size)); - } - } - } - } - } - - if (cfg->verbose_level > 2) { - printf ("\nSEQ POINT MAP: \n"); - } - - for (i = 0; i < cfg->seq_points->len; ++i) { - SeqPoint *sp = &info->seq_points [i]; - GSList *l; - int j, next_index; - - sp->next_len = g_slist_length (next [i]); - sp->next = g_new (int, sp->next_len); - j = 0; - if (cfg->verbose_level > 2 && next [i]) { - printf ("\tIL0x%x ->", sp->il_offset); - for (l = next [i]; l; l = l->next) { - next_index = GPOINTER_TO_UINT (l->data); - printf (" IL0x%x", info->seq_points [next_index].il_offset); - } - printf ("\n"); - } - for (l = next [i]; l; l = l->next) { - next_index = GPOINTER_TO_UINT (l->data); - sp->next [j ++] = next_index; - } - g_slist_free (next [i]); - } - g_free (next); - - cfg->seq_point_info = info; - - // FIXME: dynamic methods - if (!cfg->compile_aot) { - mono_domain_lock (domain); - // FIXME: How can the lookup succeed ? - if (!g_hash_table_lookup (domain_jit_info (domain)->seq_points, cfg->method_to_register)) - g_hash_table_insert (domain_jit_info (domain)->seq_points, cfg->method_to_register, info); - mono_domain_unlock (domain); - } - - g_ptr_array_free (cfg->seq_points, TRUE); - cfg->seq_points = NULL; -} - void mono_codegen (MonoCompile *cfg) { @@ -4114,6 +4023,9 @@ mono_codegen (MonoCompile *cfg) if (cfg->opt & MONO_OPT_PEEPHOLE) mono_arch_peephole_pass_2 (cfg, bb); + + if (cfg->gen_seq_points && !cfg->gen_seq_points_debug_data) + bb_deduplicate_op_il_seq_points (cfg, bb); } if (cfg->prof_options & MONO_PROFILE_COVERAGE) @@ -4123,6 +4035,8 @@ mono_codegen (MonoCompile *cfg) cfg->code_len = code - cfg->native_code; cfg->prolog_end = cfg->code_len; + cfg->cfa_reg = cfg->cur_cfa_reg; + cfg->cfa_offset = cfg->cur_cfa_offset; mono_debug_open_method (cfg); @@ -4684,7 +4598,7 @@ get_gsharedvt_type (MonoType *t) copy = mono_image_alloc0 (image, sizeof (MonoGenericParamFull)); memcpy (copy, par, sizeof (MonoGenericParamFull)); } else { - copy = g_memdup (par, sizeof (MonoGenericParamFull)); + copy = g_memdup (par, sizeof (MonoGenericParam)); } copy->owner = NULL; // FIXME: @@ -4786,6 +4700,7 @@ get_shared_inst (MonoGenericInst *inst, MonoGenericInst *shared_inst, MonoGeneri MonoMethod* mini_get_shared_method_full (MonoMethod *method, gboolean all_vt, gboolean is_gsharedvt) { + MonoError error; MonoGenericContext shared_context; MonoMethod *declaring_method, *res; gboolean partial = FALSE; @@ -4837,7 +4752,9 @@ mini_get_shared_method_full (MonoMethod *method, gboolean all_vt, gboolean is_gs partial = TRUE; } - res = mono_class_inflate_generic_method (declaring_method, &shared_context); + res = mono_class_inflate_generic_method_checked (declaring_method, &shared_context, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + if (!partial) { /* The result should be an inflated method whose parent is not inflated */ g_assert (!res->klass->is_inflated); @@ -4923,6 +4840,7 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, JitFl gboolean run_cctors = (flags & JIT_FLAG_RUN_CCTORS) ? 1 : 0; gboolean compile_aot = (flags & JIT_FLAG_AOT) ? 1 : 0; gboolean full_aot = (flags & JIT_FLAG_FULL_AOT) ? 1 : 0; + gboolean disable_direct_icalls = (flags & JIT_FLAG_NO_DIRECT_ICALLS) ? 1 : 0; #ifdef ENABLE_LLVM gboolean llvm = (flags & JIT_FLAG_LLVM) ? 1 : 0; #endif @@ -4997,17 +4915,26 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, JitFl cfg->full_aot = full_aot; cfg->skip_visibility = method->skip_visibility; cfg->orig_method = method; - cfg->gen_seq_points = debug_options.gen_seq_points; + cfg->gen_seq_points = debug_options.gen_seq_points_compact_data || debug_options.gen_seq_points_debug_data; + cfg->gen_seq_points_debug_data = debug_options.gen_seq_points_debug_data; + cfg->explicit_null_checks = debug_options.explicit_null_checks; cfg->soft_breakpoints = debug_options.soft_breakpoints; cfg->check_pinvoke_callconv = debug_options.check_pinvoke_callconv; + cfg->disable_direct_icalls = disable_direct_icalls; if (try_generic_shared) cfg->generic_sharing_context = (MonoGenericSharingContext*)&cfg->gsctx; cfg->compile_llvm = try_llvm; cfg->token_info_hash = g_hash_table_new (NULL, NULL); + if (!mono_debug_count ()) + cfg->opt &= ~MONO_OPT_FLOAT32; + cfg->r4fp = (cfg->opt & MONO_OPT_FLOAT32) ? 1 : 0; + cfg->r4_stack_type = cfg->r4fp ? STACK_R4 : STACK_R8; + if (cfg->gen_seq_points) cfg->seq_points = g_ptr_array_new (); + mono_error_init (&cfg->error); if (cfg->compile_aot && !try_generic_shared && (method->is_generic || method->klass->generic_container || method_is_gshared)) { cfg->exception_type = MONO_EXCEPTION_GENERIC_SHARING_FAILED; @@ -5429,7 +5356,7 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, JitFl */ //#define DEBUGSSA "logic_run" -#define DEBUGSSA_CLASS "Tests" +//#define DEBUGSSA_CLASS "Tests" #ifdef DEBUGSSA if (!cfg->disable_ssa) { @@ -6098,6 +6025,10 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, in case MONO_EXCEPTION_OUT_OF_MEMORY: ex = mono_domain_get ()->out_of_memory_ex; break; + case MONO_EXCEPTION_MONO_ERROR: + g_assert (!mono_error_ok (&cfg->error)); + ex = mono_error_convert_to_exception (&cfg->error); + break; default: g_assert_not_reached (); } @@ -6269,8 +6200,11 @@ mono_jit_compile_method_with_opt (MonoMethod *method, guint32 opt, MonoException if (method->is_inflated) ctx = mono_method_get_context (method); method = info->d.synchronized_inner.method; - if (ctx) - method = mono_class_inflate_generic_method (method, ctx); + if (ctx) { + MonoError error; + method = mono_class_inflate_generic_method_checked (method, ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + } } } @@ -6739,7 +6673,7 @@ MONO_SIG_HANDLER_FUNC (, mono_sigfpe_signal_handler) { MonoException *exc = NULL; MonoJitInfo *ji; - void *info = MONO_SIG_HANDLER_GET_INFO (); + MONO_SIG_HANDLER_INFO_TYPE *info = MONO_SIG_HANDLER_GET_INFO (); MONO_SIG_HANDLER_GET_CONTEXT; ji = mono_jit_info_table_find (mono_domain_get (), mono_arch_ip_from_context (ctx)); @@ -6761,7 +6695,7 @@ MONO_SIG_HANDLER_FUNC (, mono_sigfpe_signal_handler) if (!mono_do_crash_chaining && mono_chain_signal (MONO_SIG_HANDLER_PARAMS)) return; - mono_handle_native_sigsegv (SIGSEGV, ctx); + mono_handle_native_sigsegv (SIGSEGV, ctx, info); if (mono_do_crash_chaining) { mono_chain_signal (MONO_SIG_HANDLER_PARAMS); return; @@ -6792,6 +6726,8 @@ MONO_SIG_HANDLER_FUNC (, mono_sigsegv_signal_handler) gpointer fault_addr = NULL; #ifdef HAVE_SIG_INFO MONO_SIG_HANDLER_INFO_TYPE *info = MONO_SIG_HANDLER_GET_INFO (); +#else + void *info = NULL; #endif MONO_SIG_HANDLER_GET_CONTEXT; @@ -6805,7 +6741,8 @@ MONO_SIG_HANDLER_FUNC (, mono_sigsegv_signal_handler) } #endif -#if !defined(HOST_WIN32) && defined(HAVE_SIG_INFO) +#if defined(HAVE_SIG_INFO) +#if !defined(HOST_WIN32) fault_addr = info->si_addr; if (mono_aot_is_pagefault (info->si_addr)) { mono_aot_handle_pagefault (info->si_addr); @@ -6817,17 +6754,18 @@ MONO_SIG_HANDLER_FUNC (, mono_sigsegv_signal_handler) if (!mono_domain_get () || !jit_tls) { if (!mono_do_crash_chaining && mono_chain_signal (MONO_SIG_HANDLER_PARAMS)) return; - mono_handle_native_sigsegv (SIGSEGV, ctx); + mono_handle_native_sigsegv (SIGSEGV, ctx, info); if (mono_do_crash_chaining) { mono_chain_signal (MONO_SIG_HANDLER_PARAMS); return; } } +#endif ji = mono_jit_info_table_find (mono_domain_get (), mono_arch_ip_from_context (ctx)); #ifdef MONO_ARCH_SIGSEGV_ON_ALTSTACK - if (mono_handle_soft_stack_ovf (jit_tls, ji, ctx, (guint8*)info->si_addr)) + if (mono_handle_soft_stack_ovf (jit_tls, ji, ctx, info, (guint8*)info->si_addr)) return; #ifdef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX @@ -6836,7 +6774,7 @@ MONO_SIG_HANDLER_FUNC (, mono_sigsegv_signal_handler) if (fault_addr == NULL) { MonoContext mctx; - mono_arch_sigctx_to_monoctx (ctx, &mctx); + mono_sigctx_to_monoctx (ctx, &mctx); fault_addr = MONO_CONTEXT_GET_SP (&mctx); } @@ -6855,7 +6793,7 @@ MONO_SIG_HANDLER_FUNC (, mono_sigsegv_signal_handler) if (!ji && mono_chain_signal (MONO_SIG_HANDLER_PARAMS)) return; - mono_arch_handle_altstack_exception (ctx, info->si_addr, FALSE); + mono_arch_handle_altstack_exception (ctx, info, info->si_addr, FALSE); } #else @@ -6863,7 +6801,7 @@ MONO_SIG_HANDLER_FUNC (, mono_sigsegv_signal_handler) if (!mono_do_crash_chaining && mono_chain_signal (MONO_SIG_HANDLER_PARAMS)) return; - mono_handle_native_sigsegv (SIGSEGV, ctx); + mono_handle_native_sigsegv (SIGSEGV, ctx, info); if (mono_do_crash_chaining) { mono_chain_signal (MONO_SIG_HANDLER_PARAMS); @@ -7055,7 +6993,9 @@ mini_parse_debug_options (void) else if (!strcmp (arg, "explicit-null-checks")) debug_options.explicit_null_checks = TRUE; else if (!strcmp (arg, "gen-seq-points")) - debug_options.gen_seq_points = TRUE; + debug_options.gen_seq_points_debug_data = TRUE; + else if (!strcmp (arg, "gen-compact-seq-points")) + debug_options.gen_seq_points_compact_data = TRUE; else if (!strcmp (arg, "init-stacks")) debug_options.init_stacks = TRUE; else if (!strcmp (arg, "casts")) @@ -7085,10 +7025,9 @@ mini_get_debug_options (void) static gpointer mini_create_ftnptr (MonoDomain *domain, gpointer addr) { -#if !defined(__ia64__) && !defined(__ppc64__) && !defined(__powerpc64__) +#if !defined(__ia64__) && (!defined(__ppc64__) && !defined(__powerpc64__) || _CALL_ELF == 2) return addr; #else - gpointer* desc = NULL; if ((desc = g_hash_table_lookup (domain->ftnptrs_hash, addr))) @@ -7114,7 +7053,7 @@ mini_create_ftnptr (MonoDomain *domain, gpointer addr) static gpointer mini_get_addr_from_ftnptr (gpointer descr) { -#if defined(__ia64__) || defined(__ppc64__) || defined(__powerpc64__) +#if defined(__ia64__) || ((defined(__ppc64__) || defined(__powerpc64__)) && _CALL_ELF != 2) return *(gpointer*)descr; #else return descr; @@ -7134,6 +7073,7 @@ register_jit_stats (void) mono_counters_register ("Allocated vars", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.allocate_var); mono_counters_register ("Code reallocs", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.code_reallocs); mono_counters_register ("Allocated code size", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.allocated_code_size); + mono_counters_register ("Allocated seq points size", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.allocated_seq_points_size); mono_counters_register ("Inlineable methods", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.inlineable_methods); mono_counters_register ("Inlined methods", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.inlined_methods); mono_counters_register ("Regvars", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.regvars); @@ -7148,7 +7088,6 @@ register_jit_stats (void) } static void runtime_invoke_info_free (gpointer value); -static void seq_point_info_free (gpointer value); static gint class_method_pair_equal (gconstpointer ka, gconstpointer kb) @@ -7219,19 +7158,6 @@ runtime_invoke_info_free (gpointer value) g_free (info); } -static void seq_point_info_free (gpointer value) -{ - int i = 0; - MonoSeqPointInfo* info = (MonoSeqPointInfo*)value; - - for (i = 0; i < info->len; ++i) { - SeqPoint *sp = &info->seq_points [i]; - g_free (sp->next); - } - - g_free (info); -} - static void mini_free_jit_domain_info (MonoDomain *domain) { @@ -7371,6 +7297,8 @@ mini_init (const char *filename, const char *runtime_version) ticallbacks.thread_state_init_from_sigctx = mono_thread_state_init_from_sigctx; ticallbacks.thread_state_init_from_handle = mono_thread_state_init_from_handle; + mono_counters_init (); + mono_threads_runtime_init (&ticallbacks); if (g_getenv ("MONO_DEBUG") != NULL) @@ -7576,7 +7504,8 @@ register_icalls (void) register_dyn_icall (mono_get_rethrow_exception (), "mono_arch_rethrow_exception", "void object", TRUE); register_dyn_icall (mono_get_throw_corlib_exception (), "mono_arch_throw_corlib_exception", "void ptr", TRUE); register_icall (mono_thread_get_undeniable_exception, "mono_thread_get_undeniable_exception", "object", FALSE); - register_icall (mono_thread_interruption_checkpoint, "mono_thread_interruption_checkpoint", "void", FALSE); + register_icall (mono_thread_interruption_checkpoint, "mono_thread_interruption_checkpoint", "object", FALSE); + register_icall (mono_thread_force_interruption_checkpoint_noraise, "mono_thread_force_interruption_checkpoint_noraise", "object", FALSE); register_icall (mono_thread_force_interruption_checkpoint, "mono_thread_force_interruption_checkpoint", "void", FALSE); #ifndef DISABLE_REMOTING register_icall (mono_load_remote_field_new, "mono_load_remote_field_new", "object object ptr ptr", FALSE); @@ -7635,9 +7564,12 @@ register_icalls (void) register_opcode_emulation (OP_FCONV_TO_U4, "__emul_fconv_to_u4", "uint32 double", mono_fconv_u4, "mono_fconv_u4", FALSE); register_opcode_emulation (OP_FCONV_TO_OVF_I8, "__emul_fconv_to_ovf_i8", "long double", mono_fconv_ovf_i8, "mono_fconv_ovf_i8", FALSE); register_opcode_emulation (OP_FCONV_TO_OVF_U8, "__emul_fconv_to_ovf_u8", "ulong double", mono_fconv_ovf_u8, "mono_fconv_ovf_u8", FALSE); + register_opcode_emulation (OP_RCONV_TO_OVF_I8, "__emul_rconv_to_ovf_i8", "long float", mono_rconv_ovf_i8, "mono_rconv_ovf_i8", FALSE); + register_opcode_emulation (OP_RCONV_TO_OVF_U8, "__emul_rconv_to_ovf_u8", "ulong float", mono_rconv_ovf_u8, "mono_rconv_ovf_u8", FALSE); #ifdef MONO_ARCH_EMULATE_FCONV_TO_I8 register_opcode_emulation (OP_FCONV_TO_I8, "__emul_fconv_to_i8", "long double", mono_fconv_i8, "mono_fconv_i8", FALSE); + register_opcode_emulation (OP_RCONV_TO_I8, "__emul_rconv_to_i8", "long float", mono_rconv_i8, "mono_rconv_i8", FALSE); #endif #ifdef MONO_ARCH_EMULATE_CONV_R8_UN register_opcode_emulation (OP_ICONV_TO_R_UN, "__emul_iconv_to_r_un", "double int32", mono_conv_to_r8_un, "mono_conv_to_r8_un", FALSE); diff --git a/mta-mono/vendor/mono/mini/mini.h b/mta-mono/vendor/mono/mini/mini.h index 7190633..be3e020 100644 --- a/mta-mono/vendor/mono/mini/mini.h +++ b/mta-mono/vendor/mono/mini/mini.h @@ -8,7 +8,9 @@ #include "config.h" #include +#ifdef HAVE_SIGNAL_H #include +#endif #ifdef HAVE_SYS_TYPES_H #include #endif @@ -83,14 +85,6 @@ #define COMPILE_SOFT_FLOAT(cfg) (0) #endif -#ifdef ENABLE_LLVM -#define LLVM_CHECK_VERSION(major,minor) \ - ((LLVM_MAJOR_VERSION > (major)) || \ - ((LLVM_MAJOR_VERSION == (major)) && (LLVM_MINOR_VERSION >= (minor)))) -#else -#define LLVM_CHECK_VERSION(major,minor) 0 -#endif - #define NOT_IMPLEMENTED do { g_assert_not_reached (); } while (0) /* for 32 bit systems */ @@ -111,7 +105,7 @@ #endif /* Version number of the AOT file format */ -#define MONO_AOT_FILE_VERSION 104 +#define MONO_AOT_FILE_VERSION 108 //TODO: This is x86/amd64 specific. #define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6)) @@ -121,10 +115,6 @@ #define printf g_print #endif -#if !defined(HAVE_KW_THREAD) || !defined(MONO_ARCH_ENABLE_MONO_LMF_VAR) -#define MONO_JIT_TLS_DATA_HAS_LMF -#endif - #define MONO_TYPE_IS_PRIMITIVE(t) ((!(t)->byref && ((((t)->type >= MONO_TYPE_BOOLEAN && (t)->type <= MONO_TYPE_R8) || ((t)->type >= MONO_TYPE_I && (t)->type <= MONO_TYPE_U))))) /* Constants used to encode different types of methods in AOT */ @@ -176,7 +166,6 @@ typedef enum { MONO_AOT_FILE_FLAG_WITH_LLVM = 1, MONO_AOT_FILE_FLAG_FULL_AOT = 2, MONO_AOT_FILE_FLAG_DEBUG = 4, - MONO_AOT_FILE_FLAG_DIRECT_METHOD_ADDRESSES = 8 } MonoAotFileFlags; /* This structure is stored in the AOT file */ @@ -191,8 +180,12 @@ typedef struct MonoAotFileInfo /* Mono's Global Offset Table */ gpointer got; + /* Global Offset Table for LLVM code */ + gpointer llvm_got; /* Compiled code for methods */ gpointer methods; + gpointer jit_code_start; + gpointer jit_code_end; /* Mono EH Frame created by llc when using LLVM */ gpointer mono_eh_frame; /* Data blob */ @@ -201,12 +194,11 @@ typedef struct MonoAotFileInfo gpointer class_info_offsets; gpointer method_info_offsets; gpointer ex_info_offsets; - gpointer code_offsets; gpointer method_addresses; gpointer extra_method_info_offsets; gpointer extra_method_table; gpointer got_info_offsets; - gpointer methods_end; + gpointer llvm_got_info_offsets; gpointer unwind_info; gpointer mem_end; gpointer image_table; @@ -238,6 +230,8 @@ typedef struct MonoAotFileInfo gpointer unbox_trampolines; /* Points to the end of the previous table */ gpointer unbox_trampolines_end; + /* Points to a table of unbox trampoline addresses/offsets */ + gpointer unbox_trampoline_addresses; /* The index of the first GOT slot used by the PLT */ guint32 plt_got_offset_base; @@ -341,34 +335,13 @@ typedef struct { */ typedef MonoStackFrameInfo StackFrameInfo; -#define MONO_SEQ_POINT_FLAG_NONEMPTY_STACK 1 - -typedef struct { - int il_offset, native_offset, flags; - /* Indexes of successor sequence points */ - int *next; - /* Number of entries in next */ - int next_len; -} SeqPoint; - -typedef struct { - int len; - SeqPoint seq_points [MONO_ZERO_LEN_ARRAY]; -} MonoSeqPointInfo; - #if 0 #define mono_bitset_foreach_bit(set,b,n) \ for (b = 0; b < n; b++)\ if (mono_bitset_test_fast(set,b)) -#define mono_bitset_foreach_bit_rev(set,b,n) \ - for (b = n - 1; b >= 0; b--)\ - if (mono_bitset_test_fast(set,b)) #else #define mono_bitset_foreach_bit(set,b,n) \ for (b = mono_bitset_find_start (set); b < n && b >= 0; b = mono_bitset_find_first (set, b)) -#define mono_bitset_foreach_bit_rev(set,b,n) \ - for (b = mono_bitset_find_last (set, n - 1); b >= 0; b = b ? mono_bitset_find_last (set, b) : -1) - #endif /* @@ -405,11 +378,6 @@ enum { (dest)->inst.cil_code = (cfg)->ip; \ } while (0) -#define MONO_INST_NEW_CALL_ARG(cfg,dest,op) do { \ - (dest) = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoCallArgParm)); \ - (dest)->ins.opcode = (op); \ - } while (0) - #define MONO_ADD_INS(b,inst) do { \ if ((b)->last_ins) { \ (b)->last_ins->next = (inst); \ @@ -458,11 +426,11 @@ enum { #define MONO_IS_SETCC(ins) ((((ins)->opcode >= OP_CEQ) && ((ins)->opcode <= OP_CLT_UN)) || (((ins)->opcode >= OP_ICEQ) && ((ins)->opcode <= OP_ICLT_UN)) || (((ins)->opcode >= OP_LCEQ) && ((ins)->opcode <= OP_LCLT_UN)) || (((ins)->opcode >= OP_FCEQ) && ((ins)->opcode <= OP_FCLT_UN))) -#define MONO_IS_LOAD_MEMBASE(ins) (((ins)->opcode >= OP_LOAD_MEMBASE) && ((ins)->opcode <= OP_LOADV_MEMBASE)) -#define MONO_IS_STORE_MEMBASE(ins) (((ins)->opcode >= OP_STORE_MEMBASE_REG) && ((ins)->opcode <= OP_STOREV_MEMBASE)) +#define MONO_IS_LOAD_MEMBASE(ins) (((ins)->opcode >= OP_LOAD_MEMBASE && (ins)->opcode <= OP_LOADV_MEMBASE) || ((ins)->opcode >= OP_ATOMIC_LOAD_I1 && (ins)->opcode <= OP_ATOMIC_LOAD_R8)) +#define MONO_IS_STORE_MEMBASE(ins) (((ins)->opcode >= OP_STORE_MEMBASE_REG && (ins)->opcode <= OP_STOREV_MEMBASE) || ((ins)->opcode >= OP_ATOMIC_STORE_I1 && (ins)->opcode <= OP_ATOMIC_STORE_R8)) #define MONO_IS_STORE_MEMINDEX(ins) (((ins)->opcode >= OP_STORE_MEMINDEX) && ((ins)->opcode <= OP_STORER8_MEMINDEX)) -#define MONO_IS_CALL(ins) (((ins->opcode >= OP_VOIDCALL) && (ins->opcode <= OP_VOIDCALL_MEMBASE)) || ((ins->opcode >= OP_FCALL) && (ins->opcode <= OP_FCALL_MEMBASE)) || ((ins->opcode >= OP_LCALL) && (ins->opcode <= OP_LCALL_MEMBASE)) || ((ins->opcode >= OP_VCALL) && (ins->opcode <= OP_VCALL_MEMBASE)) || ((ins->opcode >= OP_CALL) && (ins->opcode <= OP_CALL_MEMBASE)) || ((ins->opcode >= OP_VCALL2) && (ins->opcode <= OP_VCALL2_MEMBASE)) || (ins->opcode == OP_TAILCALL)) +#define MONO_IS_CALL(ins) (((ins->opcode >= OP_VOIDCALL) && (ins->opcode <= OP_VOIDCALL_MEMBASE)) || ((ins->opcode >= OP_FCALL) && (ins->opcode <= OP_FCALL_MEMBASE)) || ((ins->opcode >= OP_LCALL) && (ins->opcode <= OP_LCALL_MEMBASE)) || ((ins->opcode >= OP_VCALL) && (ins->opcode <= OP_VCALL_MEMBASE)) || ((ins->opcode >= OP_CALL) && (ins->opcode <= OP_CALL_MEMBASE)) || ((ins->opcode >= OP_VCALL2) && (ins->opcode <= OP_VCALL2_MEMBASE)) || (ins->opcode == OP_TAILCALL) || ((ins->opcode >= OP_RCALL) && (ins->opcode <= OP_RCALL_MEMBASE))) #define MONO_IS_JUMP_TABLE(ins) (((ins)->opcode == OP_JUMP_TABLE) ? TRUE : ((((ins)->opcode == OP_AOTCONST) && (ins->inst_i1 == (gpointer)MONO_PATCH_INFO_SWITCH)) ? TRUE : ((ins)->opcode == OP_SWITCH) ? TRUE : ((((ins)->opcode == OP_GOT_ENTRY) && ((ins)->inst_right->inst_i1 == (gpointer)MONO_PATCH_INFO_SWITCH)) ? TRUE : FALSE))) @@ -470,7 +438,7 @@ enum { /* FIXME: Add more instructions */ /* INEG sets the condition codes, and the OP_LNEG decomposition depends on this on x86 */ -#define MONO_INS_HAS_NO_SIDE_EFFECT(ins) (MONO_IS_MOVE (ins) || (ins->opcode == OP_ICONST) || (ins->opcode == OP_I8CONST) || MONO_IS_ZERO (ins) || (ins->opcode == OP_ADD_IMM) || (ins->opcode == OP_R8CONST) || (ins->opcode == OP_LADD_IMM) || (ins->opcode == OP_ISUB_IMM) || (ins->opcode == OP_IADD_IMM) || (ins->opcode == OP_LNEG) || (ins->opcode == OP_ISUB) || (ins->opcode == OP_CMOV_IGE) || (ins->opcode == OP_ISHL_IMM) || (ins->opcode == OP_ISHR_IMM) || (ins->opcode == OP_ISHR_UN_IMM) || (ins->opcode == OP_IAND_IMM) || (ins->opcode == OP_ICONV_TO_U1) || (ins->opcode == OP_ICONV_TO_I1) || (ins->opcode == OP_SEXT_I4) || (ins->opcode == OP_LCONV_TO_U1) || (ins->opcode == OP_ICONV_TO_U2) || (ins->opcode == OP_ICONV_TO_I2) || (ins->opcode == OP_LCONV_TO_I2) || (ins->opcode == OP_LDADDR) || (ins->opcode == OP_PHI) || (ins->opcode == OP_NOP) || (ins->opcode == OP_ZEXT_I4) || (ins->opcode == OP_NOT_NULL)) +#define MONO_INS_HAS_NO_SIDE_EFFECT(ins) (MONO_IS_MOVE (ins) || (ins->opcode == OP_ICONST) || (ins->opcode == OP_I8CONST) || MONO_IS_ZERO (ins) || (ins->opcode == OP_ADD_IMM) || (ins->opcode == OP_R8CONST) || (ins->opcode == OP_LADD_IMM) || (ins->opcode == OP_ISUB_IMM) || (ins->opcode == OP_IADD_IMM) || (ins->opcode == OP_LNEG) || (ins->opcode == OP_ISUB) || (ins->opcode == OP_CMOV_IGE) || (ins->opcode == OP_ISHL_IMM) || (ins->opcode == OP_ISHR_IMM) || (ins->opcode == OP_ISHR_UN_IMM) || (ins->opcode == OP_IAND_IMM) || (ins->opcode == OP_ICONV_TO_U1) || (ins->opcode == OP_ICONV_TO_I1) || (ins->opcode == OP_SEXT_I4) || (ins->opcode == OP_LCONV_TO_U1) || (ins->opcode == OP_ICONV_TO_U2) || (ins->opcode == OP_ICONV_TO_I2) || (ins->opcode == OP_LCONV_TO_I2) || (ins->opcode == OP_LDADDR) || (ins->opcode == OP_PHI) || (ins->opcode == OP_NOP) || (ins->opcode == OP_ZEXT_I4) || (ins->opcode == OP_NOT_NULL) || (ins->opcode == OP_IL_SEQ_POINT)) #define MONO_METHOD_IS_FINAL(m) (((m)->flags & METHOD_ATTRIBUTE_FINAL) || ((m)->klass && ((m)->klass->flags & TYPE_ATTRIBUTE_SEALED))) @@ -478,9 +446,9 @@ enum { #ifdef MONO_ARCH_SIMD_INTRINSICS #define MONO_IS_PHI(ins) (((ins)->opcode == OP_PHI) || ((ins)->opcode == OP_FPHI) || ((ins)->opcode == OP_VPHI) || ((ins)->opcode == OP_XPHI)) -#define MONO_IS_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_FMOVE) || ((ins)->opcode == OP_VMOVE) || ((ins)->opcode == OP_XMOVE)) +#define MONO_IS_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_FMOVE) || ((ins)->opcode == OP_VMOVE) || ((ins)->opcode == OP_XMOVE) || ((ins)->opcode == OP_RMOVE)) #define MONO_IS_NON_FP_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_VMOVE) || ((ins)->opcode == OP_XMOVE)) -#define MONO_IS_REAL_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_FMOVE) || ((ins)->opcode == OP_XMOVE)) +#define MONO_IS_REAL_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_FMOVE) || ((ins)->opcode == OP_XMOVE) || ((ins)->opcode == OP_RMOVE)) #define MONO_IS_ZERO(ins) (((ins)->opcode == OP_VZERO) || ((ins)->opcode == OP_XZERO)) #define MONO_CLASS_IS_SIMD(cfg, klass) (((cfg)->opt & MONO_OPT_SIMD) && (klass)->simd_type) @@ -488,10 +456,10 @@ enum { #else #define MONO_IS_PHI(ins) (((ins)->opcode == OP_PHI) || ((ins)->opcode == OP_FPHI) || ((ins)->opcode == OP_VPHI)) -#define MONO_IS_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_FMOVE) || ((ins)->opcode == OP_VMOVE)) +#define MONO_IS_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_FMOVE) || ((ins)->opcode == OP_VMOVE) || ((ins)->opcode == OP_RMOVE)) #define MONO_IS_NON_FP_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_VMOVE)) /*A real MOVE is one that isn't decomposed such as a VMOVE or LMOVE*/ -#define MONO_IS_REAL_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_FMOVE)) +#define MONO_IS_REAL_MOVE(ins) (((ins)->opcode == OP_MOVE) || ((ins)->opcode == OP_FMOVE) || ((ins)->opcode == OP_RMOVE)) #define MONO_IS_ZERO(ins) ((ins)->opcode == OP_VZERO) #define MONO_CLASS_IS_SIMD(cfg, klass) (0) @@ -520,7 +488,6 @@ extern int mono_inject_async_exc_pos; extern MonoMethodDesc *mono_break_at_bb_method; extern int mono_break_at_bb_bb_num; extern gboolean check_for_pending_exc; -extern gboolean disable_vtypes_in_regs; extern gboolean mono_verify_all; extern gboolean mono_do_x86_stack_align; extern const char *mono_build_date; @@ -735,13 +702,35 @@ typedef enum { LLVMArgVtypeByVal, LLVMArgVtypeRetAddr, /* On on cinfo->ret */ LLVMArgGSharedVt, + /* Vtype passed as one int array argument */ + LLVMArgAsIArgs, + /* Vtype passed as a set of fp arguments */ + LLVMArgAsFpArgs, + /* + * Only for returns, a structure which + * consists of floats/doubles. + */ + LLVMArgFpStruct, } LLVMArgStorage; typedef struct { LLVMArgStorage storage; - /* Only if storage == ArgValuetypeInReg */ - LLVMArgStorage pair_storage [2]; + /* + * Only if storage == ArgValuetypeInReg/LLVMArgAsFpArgs. + * This contains how the parts of the vtype are passed. + */ + LLVMArgStorage pair_storage [8]; + /* + * Only if storage == LLVMArgAsIArgs/LLVMArgAsFpArgs/LLVMArgFpStruct. + * If storage == LLVMArgAsFpArgs, this is the number of arguments + * used to pass the value. + * If storage == LLVMArgFpStruct, this is the number of fields + * in the structure. + */ + int nslots; + /* Only if storage == LLVMArgAsFpArgs/LLVMArgFpStruct (4/8) */ + int esize; } LLVMArgInfo; typedef struct { @@ -811,10 +800,16 @@ struct MonoInst { gint shift_amount; gboolean is_pinvoke; /* for variables in the unmanaged marshal format */ gboolean record_cast_details; /* For CEE_CASTCLASS */ - MonoInst *spill_var; /* for OP_ICONV_TO_R8_RAW and OP_FCONV_TO_R8_X */ + MonoInst *spill_var; /* for OP_MOVE_I4_TO_F/F_TO_I4 and OP_FCONV_TO_R8_X */ guint16 source_opcode; /*OP_XCONV_R8_TO_I4 needs to know which op was used to do proper widening*/ int pc_offset; /* OP_GC_LIVERANGE_START/END */ - int memory_barrier_kind; /* see mono-memory-model.h for valid values */ + + /* + * memory_barrier: MONO_MEMORY_BARRIER_{ACQ,REL,SEQ} + * atomic_load_*: MONO_MEMORY_BARRIER_{ACQ,SEQ} + * atomic_store_*: MONO_MEMORY_BARRIER_{REL,SEQ} + */ + int memory_barrier_kind; } backend; MonoClass *klass; @@ -1283,6 +1278,7 @@ typedef enum { MONO_TRAMPOLINE_RESTORE_STACK_PROT, MONO_TRAMPOLINE_GENERIC_VIRTUAL_REMOTING, MONO_TRAMPOLINE_MONITOR_ENTER, + MONO_TRAMPOLINE_MONITOR_ENTER_V4, MONO_TRAMPOLINE_MONITOR_EXIT, MONO_TRAMPOLINE_VCALL, MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD, @@ -1296,12 +1292,14 @@ typedef enum { (t) == MONO_TRAMPOLINE_RESTORE_STACK_PROT || \ (t) == MONO_TRAMPOLINE_RGCTX_LAZY_FETCH || \ (t) == MONO_TRAMPOLINE_MONITOR_ENTER || \ + (t) == MONO_TRAMPOLINE_MONITOR_ENTER_V4 || \ (t) == MONO_TRAMPOLINE_MONITOR_EXIT) /* These trampolines receive an argument directly in a register */ #define MONO_TRAMPOLINE_TYPE_HAS_ARG(t) \ ((t) == MONO_TRAMPOLINE_GENERIC_CLASS_INIT || \ (t) == MONO_TRAMPOLINE_MONITOR_ENTER || \ + (t) == MONO_TRAMPOLINE_MONITOR_ENTER_V4 || \ (t) == MONO_TRAMPOLINE_MONITOR_EXIT || \ (t) == MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD) @@ -1322,6 +1320,8 @@ typedef enum { JIT_FLAG_FULL_AOT = (1 << 2), /* Whenever to compile with LLVM */ JIT_FLAG_LLVM = (1 << 3), + /* Whenever to disable direct calls to direct calls to icall functions */ + JIT_FLAG_NO_DIRECT_ICALLS = (1 << 4) } JitFlags; /* Bit-fields in the MonoBasicBlock.region */ @@ -1490,6 +1490,7 @@ typedef struct { guint disable_vreg_to_lvreg : 1; guint disable_deadce_vars : 1; guint disable_out_of_line_bblocks : 1; + guint disable_direct_icalls : 1; guint create_lmf_var : 1; /* * When this is set, the code to push/pop the LMF from the LMF stack is generated as IR @@ -1511,6 +1512,8 @@ typedef struct { guint uses_simd_intrinsics : 1; guint keep_cil_nops : 1; guint gen_seq_points : 1; + /* Generate seq points for use by the debugger */ + guint gen_seq_points_debug_data : 1; guint explicit_null_checks : 1; guint compute_gc_maps : 1; guint soft_breakpoints : 1; @@ -1524,6 +1527,8 @@ typedef struct { guint disable_inline : 1; guint gshared : 1; guint gsharedvt : 1; + guint r4fp : 1; + int r4_stack_type; gpointer debug_info; guint32 lmf_offset; guint16 *intvars; @@ -1584,7 +1589,7 @@ typedef struct { mini-ppc.c. */ MonoInst **tailcall_valuetype_addrs; - /* Used to implement iconv_to_r8_raw on archs that can't do raw + /* Used to implement move_i4_to_f on archs that can't do raw copy between an ireg and a freg. This is an int32 var.*/ MonoInst *iconv_raw_var; @@ -1606,7 +1611,7 @@ typedef struct { GPtrArray *seq_points; /* The encoded sequence point info */ - MonoSeqPointInfo *seq_point_info; + struct MonoSeqPointInfo *seq_point_info; /* Method headers which need to be freed after compilation */ GSList *headers_to_free; @@ -1615,6 +1620,7 @@ typedef struct { guint32 got_offset, ex_info_offset, method_info_offset, method_index; /* Symbol used to refer to this method in generated assembly */ char *asm_symbol; + char *asm_debug_symbol; char *llvm_method_name; int castclass_cache_index; @@ -1635,6 +1641,9 @@ typedef struct { /* The offsets of the locals area relative to the frame pointer */ gint locals_min_stack_offset, locals_max_stack_offset; + /* The current CFA rule */ + int cur_cfa_reg, cur_cfa_offset; + /* The final CFA rule at the end of the prolog */ int cfa_reg, cfa_offset; @@ -1648,6 +1657,9 @@ typedef struct { guint8 *gc_map; guint32 gc_map_size; + /* Error handling */ + MonoError error; + /* Stats */ int stat_allocate_var; int stat_locals_stack_size; @@ -1683,6 +1695,7 @@ typedef struct { gint32 max_code_size_ratio; gint32 biggest_method_size; gint32 allocated_code_size; + gint32 allocated_seq_points_size; gint32 inlineable_methods; gint32 inlined_methods; gint32 basic_blocks; @@ -1795,6 +1808,7 @@ typedef enum { STACK_MP, STACK_OBJ, STACK_VTYPE, + STACK_R4, STACK_MAX } MonoStackType; @@ -1861,7 +1875,12 @@ typedef struct { gboolean suspend_on_unhandled; gboolean dyn_runtime_invoke; gboolean gdb; - gboolean gen_seq_points; + /* + * Whenever data such as next sequence points and flags is required. + * Next sequence points and flags are required by the debugger agent. + */ + gboolean gen_seq_points_debug_data; + gboolean gen_seq_points_compact_data; gboolean explicit_null_checks; /* * Fill stack frames with 0x2a in method prologs. This helps with the @@ -1967,6 +1986,66 @@ enum { typedef void (*MonoInstFunc) (MonoInst *tree, gpointer data); +enum { + FILTER_IL_SEQ_POINT = 1 << 0, + FILTER_NOP = 1 << 1, +}; + +static inline gboolean +mono_inst_filter (MonoInst *ins, int filter) +{ + if (!ins || !filter) + return FALSE; + + if ((filter & FILTER_IL_SEQ_POINT) && ins->opcode == OP_IL_SEQ_POINT) + return TRUE; + + if ((filter & FILTER_NOP) && ins->opcode == OP_NOP) + return TRUE; + + return FALSE; +} + +static inline MonoInst* +mono_inst_next (MonoInst *ins, int filter) +{ + do { + ins = ins->next; + } while (mono_inst_filter (ins, filter)); + + return ins; +} + +static inline MonoInst* +mono_inst_prev (MonoInst *ins, int filter) +{ + do { + ins = ins->prev; + } while (mono_inst_filter (ins, filter)); + + return ins; +} + +static inline MonoInst* +mono_bb_first_inst (MonoBasicBlock *bb, int filter) +{ + MonoInst *ins = bb->code; + if (mono_inst_filter (ins, filter)) + ins = mono_inst_next (ins, filter); + + return ins; +} + +static inline MonoInst* +mono_bb_last_inst (MonoBasicBlock *bb, int filter) +{ + MonoInst *ins = bb->last_ins; + if (mono_inst_filter (ins, filter)) + ins = mono_inst_prev (ins, filter); + + return ins; +} + /* main function */ MONO_API int mono_main (int argc, char* argv[]); MONO_API void mono_set_defaults (int verbose_level, guint32 opts); @@ -2002,6 +2081,7 @@ MonoInst* mono_compile_create_var_for_vreg (MonoCompile *cfg, MonoType *type, i void mono_compile_make_var_load (MonoCompile *cfg, MonoInst *dest, gssize var_index) MONO_INTERNAL; MonoInst* mono_compile_create_var_load (MonoCompile *cfg, gssize var_index) MONO_INTERNAL; MonoInst* mono_compile_create_var_store (MonoCompile *cfg, gssize var_index, MonoInst *value) MONO_INTERNAL; +MonoInst* mini_get_int_to_float_spill_area (MonoCompile *cfg) MONO_INTERNAL; MonoType* mono_type_from_stack_type (MonoInst *ins) MONO_INTERNAL; guint32 mono_alloc_ireg (MonoCompile *cfg) MONO_LLVM_INTERNAL; guint32 mono_alloc_lreg (MonoCompile *cfg) MONO_LLVM_INTERNAL; @@ -2087,6 +2167,7 @@ MonoInst *mono_get_got_var (MonoCompile *cfg) MONO_INTERNAL; void mono_add_seq_point (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *ins, int native_offset) MONO_INTERNAL; void mono_add_var_location (MonoCompile *cfg, MonoInst *var, gboolean is_reg, int reg, int offset, int from, int to) MONO_INTERNAL; MonoInst* mono_emit_jit_icall (MonoCompile *cfg, gconstpointer func, MonoInst **args) MONO_INTERNAL; +MonoInst* mono_emit_jit_icall_by_info (MonoCompile *cfg, MonoJitICallInfo *info, MonoInst **args, MonoBasicBlock **out_cbb) MONO_INTERNAL; MonoInst* mono_emit_method_call (MonoCompile *cfg, MonoMethod *method, MonoInst **args, MonoInst *this) MONO_INTERNAL; void mono_create_helper_signatures (void) MONO_INTERNAL; @@ -2202,10 +2283,11 @@ void mono_llvm_init (void) MONO_LLVM_INTERNAL; void mono_llvm_cleanup (void) MONO_LLVM_INTERNAL; void mono_llvm_emit_method (MonoCompile *cfg) MONO_LLVM_INTERNAL; void mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call) MONO_LLVM_INTERNAL; -void mono_llvm_create_aot_module (const char *got_symbol) MONO_LLVM_INTERNAL; -void mono_llvm_emit_aot_module (const char *filename, int got_size) MONO_LLVM_INTERNAL; +void mono_llvm_create_aot_module (const char *got_symbol, gboolean external_symbols, gboolean emit_dwarf) MONO_LLVM_INTERNAL; +void mono_llvm_emit_aot_module (const char *filename, const char *cu_name) MONO_LLVM_INTERNAL; void mono_llvm_check_method_supported (MonoCompile *cfg) MONO_LLVM_INTERNAL; void mono_llvm_free_domain_info (MonoDomain *domain) MONO_LLVM_INTERNAL; +MONO_API void mono_personality (void); gboolean mini_llvm_init (void); @@ -2240,6 +2322,7 @@ MonoDelegateTrampInfo* mono_create_delegate_trampoline_info (MonoDomain *domain, gpointer mono_create_delegate_virtual_trampoline (MonoDomain *domain, MonoClass *klass, MonoMethod *method) MONO_INTERNAL; gpointer mono_create_rgctx_lazy_fetch_trampoline (guint32 offset) MONO_INTERNAL; gpointer mono_create_monitor_enter_trampoline (void) MONO_INTERNAL; +gpointer mono_create_monitor_enter_v4_trampoline (void) MONO_INTERNAL; gpointer mono_create_monitor_exit_trampoline (void) MONO_INTERNAL; gpointer mono_create_static_rgctx_trampoline (MonoMethod *m, gpointer addr) MONO_INTERNAL; gpointer mono_create_llvm_imt_trampoline (MonoDomain *domain, MonoMethod *m, int vt_offset) MONO_LLVM_INTERNAL; @@ -2257,9 +2340,11 @@ gpointer mono_aot_plt_trampoline (mgreg_t *regs, guint8 *code, guint8 * void mono_class_init_trampoline (mgreg_t *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL; void mono_generic_class_init_trampoline (mgreg_t *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL; void mono_monitor_enter_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL; +void mono_monitor_enter_v4_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL; void mono_monitor_exit_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL; gconstpointer mono_get_trampoline_func (MonoTrampolineType tramp_type); gpointer mini_get_vtable_trampoline (int slot_index) MONO_INTERNAL; +const char* mono_get_generic_trampoline_simple_name (MonoTrampolineType tramp_type) MONO_INTERNAL; char* mono_get_generic_trampoline_name (MonoTrampolineType tramp_type) MONO_INTERNAL; char* mono_get_rgctx_fetch_trampoline_name (int slot) MONO_INTERNAL; gpointer mini_get_nullified_class_init_trampoline (void) MONO_INTERNAL; @@ -2296,12 +2381,13 @@ MonoTrampInfo* mono_tramp_info_create (const char *name, guint8 *code, guint3 void mono_tramp_info_free (MonoTrampInfo *info) MONO_INTERNAL; void mono_tramp_info_register (MonoTrampInfo *info) MONO_INTERNAL; int mini_exception_id_by_name (const char *name) MONO_INTERNAL; +gboolean mini_type_is_hfa (MonoType *t, int *out_nfields, int *out_esize) MONO_LLVM_INTERNAL; int mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_bblock, MonoBasicBlock *end_bblock, MonoInst *return_var, MonoInst **inline_args, guint inline_offset, gboolean is_virtual_call) MONO_INTERNAL; -MonoInst *mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins) MONO_INTERNAL; +MonoInst *mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins, MonoBasicBlock **out_cbb) MONO_INTERNAL; void mono_decompose_long_opts (MonoCompile *cfg) MONO_INTERNAL; void mono_decompose_vtype_opts (MonoCompile *cfg) MONO_INTERNAL; void mono_decompose_vtype_opts_llvm (MonoCompile *cfg) MONO_INTERNAL; @@ -2335,7 +2421,7 @@ gpointer mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampI gpointer mono_arch_create_general_rgctx_lazy_fetch_trampoline (MonoTrampInfo **info, gboolean aot) MONO_INTERNAL; gpointer mono_arch_create_generic_class_init_trampoline (MonoTrampInfo **info, gboolean aot) MONO_INTERNAL; gpointer mono_arch_get_nullified_class_init_trampoline (MonoTrampInfo **info) MONO_INTERNAL; -gpointer mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot) MONO_INTERNAL; +gpointer mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean is_v4, gboolean aot) MONO_INTERNAL; gpointer mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) MONO_INTERNAL; guint8 *mono_arch_create_llvm_native_thunk (MonoDomain *domain, guint8* addr) MONO_LLVM_INTERNAL; GList *mono_arch_get_allocatable_int_vars (MonoCompile *cfg) MONO_INTERNAL; @@ -2437,12 +2523,10 @@ gpointer mono_arch_get_rethrow_exception (MonoTrampInfo **info, gboolean gpointer mono_arch_get_throw_corlib_exception (MonoTrampInfo **info, gboolean aot) MONO_INTERNAL; gpointer mono_arch_get_throw_pending_exception (MonoTrampInfo **info, gboolean aot) MONO_INTERNAL; gboolean mono_arch_handle_exception (void *sigctx, gpointer obj) MONO_INTERNAL; -void mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean stack_ovf) MONO_INTERNAL; -gboolean mono_handle_soft_stack_ovf (MonoJitTlsData *jit_tls, MonoJitInfo *ji, void *ctx, guint8* fault_addr) MONO_INTERNAL; +void mono_arch_handle_altstack_exception (void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *siginfo, gpointer fault_addr, gboolean stack_ovf) MONO_INTERNAL; +gboolean mono_handle_soft_stack_ovf (MonoJitTlsData *jit_tls, MonoJitInfo *ji, void *ctx, MONO_SIG_HANDLER_INFO_TYPE *siginfo, guint8* fault_addr) MONO_INTERNAL; void mono_handle_hard_stack_ovf (MonoJitTlsData *jit_tls, MonoJitInfo *ji, void *ctx, guint8* fault_addr) MONO_INTERNAL; gpointer mono_arch_ip_from_context (void *sigctx) MONO_INTERNAL; -void mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext *ctx) MONO_INTERNAL; -void mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *ctx) MONO_INTERNAL; mgreg_t mono_arch_context_get_int_reg (MonoContext *ctx, int reg) MONO_INTERNAL; void mono_arch_context_set_int_reg (MonoContext *ctx, int reg, mgreg_t val) MONO_INTERNAL; void mono_arch_flush_register_windows (void) MONO_INTERNAL; @@ -2497,7 +2581,7 @@ typedef gboolean (*MonoJitStackWalk) (StackFrameInfo *frame, MonoCont void mono_exceptions_init (void) MONO_INTERNAL; gboolean mono_handle_exception (MonoContext *ctx, gpointer obj) MONO_INTERNAL; -void mono_handle_native_sigsegv (int signal, void *sigctx) MONO_INTERNAL; +void mono_handle_native_sigsegv (int signal, void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *siginfo) MONO_INTERNAL; MONO_API void mono_print_thread_dump (void *sigctx); MONO_API void mono_print_thread_dump_from_ctx (MonoContext *ctx); void mono_walk_stack_with_ctx (MonoJitStackWalk func, MonoContext *start_ctx, MonoUnwindOptions unwind_options, void *user_data) MONO_INTERNAL; @@ -2516,7 +2600,7 @@ void mono_resume_unwind (MonoContext *ctx) MONO_LLVM_INT MonoJitInfo * mono_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInfo *res, MonoJitInfo *prev_ji, MonoContext *ctx, MonoContext *new_ctx, char **trace, MonoLMF **lmf, int *native_offset, gboolean *managed) MONO_INTERNAL; typedef gboolean (*MonoExceptionFrameWalk) (MonoMethod *method, gpointer ip, size_t native_offset, gboolean managed, gpointer user_data); -gboolean mono_exception_walk_trace (MonoException *ex, MonoExceptionFrameWalk func, gpointer user_data); +MONO_API gboolean mono_exception_walk_trace (MonoException *ex, MonoExceptionFrameWalk func, gpointer user_data); void mono_restore_context (MonoContext *ctx) MONO_INTERNAL; guint8* mono_jinfo_get_unwind_info (MonoJitInfo *ji, guint32 *unwind_info_len) MONO_INTERNAL; int mono_jinfo_get_epilog_size (MonoJitInfo *ji) MONO_INTERNAL; @@ -2548,7 +2632,7 @@ void mono_set_cast_details (MonoClass *from, MonoClass *to) * If no hook has been installed, the runtime will print a message before aborting. */ typedef void (*MonoUnhandledExceptionFunc) (MonoObject *exc, gpointer user_data); -void mono_install_unhandled_exception_hook (MonoUnhandledExceptionFunc func, gpointer user_data); +MONO_API void mono_install_unhandled_exception_hook (MonoUnhandledExceptionFunc func, gpointer user_data); void mono_invoke_unhandled_exception_hook (MonoObject *exc); /* Dominator/SSA methods */ @@ -2717,9 +2801,9 @@ void mono_cfg_add_try_hole (MonoCompile *cfg, MonoExceptionClause *clause, guint void mono_cfg_set_exception (MonoCompile *cfg, int type) MONO_INTERNAL; gboolean mini_type_is_reference (MonoCompile *cfg, MonoType *type) MONO_INTERNAL; -gboolean mini_type_is_vtype (MonoCompile *cfg, MonoType *t); /* should be internal but it's used by llvm */ -gboolean mini_type_var_is_vt (MonoCompile *cfg, MonoType *type); /* should be internal but it's used by llvm */ -gboolean mini_is_gsharedvt_klass (MonoCompile *cfg, MonoClass *klass); /* should be internal but it's used by llvm */ +gboolean mini_type_is_vtype (MonoCompile *cfg, MonoType *t) MONO_LLVM_INTERNAL; +gboolean mini_type_var_is_vt (MonoCompile *cfg, MonoType *type) MONO_LLVM_INTERNAL; +gboolean mini_is_gsharedvt_klass (MonoCompile *cfg, MonoClass *klass) MONO_LLVM_INTERNAL; gboolean mini_is_gsharedvt_type (MonoCompile *cfg, MonoType *t) MONO_INTERNAL; gboolean mini_is_gsharedvt_signature (MonoCompile *cfg, MonoMethodSignature *sig) MONO_INTERNAL; gboolean mini_is_gsharedvt_type_gsctx (MonoGenericSharingContext *gsctx, MonoType *t) MONO_INTERNAL; @@ -2765,8 +2849,6 @@ enum { SIMD_VERSION_INDEX_END = 6 }; -#define MASK(x) (1 << x) - enum { SIMD_COMP_EQ, SIMD_COMP_LT, @@ -2792,7 +2874,7 @@ guint32 mono_arch_cpu_enumerate_simd_versions (void) MONO_INTERNAL; void mono_simd_intrinsics_init (void) MONO_INTERNAL; MonoInst* mono_emit_native_types_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args) MONO_INTERNAL; -MonoType* mini_native_type_replace_type (MonoType *type) MONO_INTERNAL; +MonoType* mini_native_type_replace_type (MonoType *type) MONO_LLVM_INTERNAL; #ifdef __linux__ /* maybe enable also for other systems? */ diff --git a/mta-mono/vendor/mono/mini/objects.cs b/mta-mono/vendor/mono/mini/objects.cs index 0e8ea1a..cd931e5 100644 --- a/mta-mono/vendor/mono/mini/objects.cs +++ b/mta-mono/vendor/mono/mini/objects.cs @@ -1639,6 +1639,20 @@ ncells ) { var s = EmptyClass.s; return 0; } + + // #25487 + static int test_0_int_to_r4 () { + return int_to_r4_inner (255); + } + + static int int_to_r4_inner (int value1) { + int sub = -value1; + float mult = sub * 1f; + if (mult != -255.0f) + return 1; + else + return 0; + } } #if MOBILE diff --git a/mta-mono/vendor/mono/mini/optflags-def.h b/mta-mono/vendor/mono/mini/optflags-def.h index bee894b..c811f3e 100644 --- a/mta-mono/vendor/mono/mini/optflags-def.h +++ b/mta-mono/vendor/mono/mini/optflags-def.h @@ -27,3 +27,5 @@ OPTFLAG(GSHAREDVT,24, "gsharedvt", "Generic sharing for valuetypes") OPTFLAG(SIMD ,26, "simd", "Simd intrinsics") OPTFLAG(UNSAFE ,27, "unsafe", "Remove bound checks and perform other dangerous changes") OPTFLAG(ALIAS_ANALYSIS ,28, "alias-analysis", "Alias analysis of locals") +OPTFLAG(FLOAT32 ,29, "float32", "Use 32 bit float arithmetic if possible") + diff --git a/mta-mono/vendor/mono/mini/patch-info.h b/mta-mono/vendor/mono/mini/patch-info.h index 12c5525..eebcd5e 100644 --- a/mta-mono/vendor/mono/mini/patch-info.h +++ b/mta-mono/vendor/mono/mini/patch-info.h @@ -38,6 +38,7 @@ PATCH_INFO(METHOD_RGCTX, "method_rgctx") PATCH_INFO(RGCTX_FETCH, "rgctx_fetch") PATCH_INFO(GENERIC_CLASS_INIT, "generic_class_init") PATCH_INFO(MONITOR_ENTER, "monitor_enter") +PATCH_INFO(MONITOR_ENTER_V4, "monitor_enter_v4") PATCH_INFO(MONITOR_EXIT, "monitor_exit") PATCH_INFO(MSCORLIB_GOT_ADDR, "mscorlib_got_addr") PATCH_INFO(SEQ_POINT_INFO, "seq_point_info") @@ -51,4 +52,5 @@ PATCH_INFO(JIT_TLS_ID, "jit_tls_id") PATCH_INFO(TLS_OFFSET, "tls_offset") PATCH_INFO(OBJC_SELECTOR_REF, "objc_selector_ref") PATCH_INFO(METHOD_CODE_SLOT, "method_code_slot") +PATCH_INFO(LDSTR_LIT, "ldstr_lit") PATCH_INFO(NONE, "none") diff --git a/mta-mono/vendor/mono/mini/seq-points.c b/mta-mono/vendor/mono/mini/seq-points.c new file mode 100644 index 0000000..18a3f27 --- /dev/null +++ b/mta-mono/vendor/mono/mini/seq-points.c @@ -0,0 +1,645 @@ +/* + * seq-points.c: Sequence Points functions + * + * Authors: + * Marcos Henrich (marcos.henrich@xamarin.com) + * + * Copyright 2014 Xamarin, Inc (http://www.xamarin.com) + */ + +#include "mini.h" +#include "seq-points.h" + +typedef struct { + guint8 *data; + int len; + /* When has_debug_data is set to false only il and native deltas are saved */ + gboolean has_debug_data; + /* When alloc_data is set to true data allocation/deallocation is managed by this structure */ + gboolean alloc_data; +} SeqPointInfoInflated; + +static int +encode_var_int (guint8 *buf, guint8 **out_buf, int val) +{ + guint8 size = 0; + + do { + guint8 byte = val & 0x7f; + g_assert (size < 4 && "value has more than 28 bits"); + val >>= 7; + if(val) byte |= 0x80; + *(buf++) = byte; + size++; + } while (val); + + if (out_buf) + *out_buf = buf; + + return size; +} + +static int +decode_var_int (guint8* buf, guint8 **out_buf) +{ + guint8* p = buf; + + int low; + int b; + b = *(p++); low = (b & 0x7f) ; if(!(b & 0x80)) goto done; + b = *(p++); low |= (b & 0x7f) << 7; if(!(b & 0x80)) goto done; + b = *(p++); low |= (b & 0x7f) << 14; if(!(b & 0x80)) goto done; + b = *(p++); low |= (b & 0x7f) << 21; if(!(b & 0x80)) goto done; + + g_assert (FALSE && "value has more than 28 bits"); + +done: + + if (out_buf) + *out_buf = p; + + return low; +} + +static guint32 +encode_zig_zag (int val) +{ + return (val << 1) ^ (val >> 31); +} + +static int +decode_zig_zag (guint32 val) +{ + int n = val; + return (n >> 1) ^ (-(n & 1)); +} + +static SeqPointInfoInflated +seq_point_info_inflate (MonoSeqPointInfo *info) +{ + SeqPointInfoInflated info_inflated; + guint8 *ptr = (guint8*) info; + int value; + + value = decode_var_int (ptr, &ptr); + + info_inflated.len = value >> 2; + info_inflated.has_debug_data = (value & 1) != 0; + info_inflated.alloc_data = (value & 2) != 0; + + if (info_inflated.alloc_data) + info_inflated.data = ptr; + else + memcpy (&info_inflated.data, ptr, sizeof (guint8*)); + + return info_inflated; +} + +static MonoSeqPointInfo* +seq_point_info_new (int len, gboolean alloc_data, guint8 *data, gboolean has_debug_data) +{ + MonoSeqPointInfo *info; + guint8 *info_ptr; + guint8 buffer[4]; + int buffer_len; + int value; + int data_size; + + value = len << 2; + if (has_debug_data) + value |= 1; + if (alloc_data) + value |= 2; + + buffer_len = encode_var_int (buffer, NULL, value); + + data_size = buffer_len + (alloc_data? len : sizeof (guint8*)); + info_ptr = g_new0 (guint8, data_size); + info = (MonoSeqPointInfo*) info_ptr; + + memcpy (info_ptr, buffer, buffer_len); + info_ptr += buffer_len; + + if (alloc_data) + memcpy (info_ptr, data, len); + else + memcpy (info_ptr, &data, sizeof (guint8*)); + + mono_jit_stats.allocated_seq_points_size += data_size; + + return info; +} + +void +seq_point_info_free (gpointer ptr) +{ + MonoSeqPointInfo* info = (MonoSeqPointInfo*) ptr; + g_free (info); +} + +static int +seq_point_read (SeqPoint* seq_point, guint8* ptr, guint8* buffer_ptr, gboolean has_debug_data) +{ + int value, i; + guint8* ptr0 = ptr; + + value = decode_var_int (ptr, &ptr); + seq_point->il_offset += decode_zig_zag (value); + + value = decode_var_int (ptr, &ptr); + seq_point->native_offset += decode_zig_zag (value); + + if (has_debug_data) { + value = decode_var_int (ptr, &ptr); + seq_point->flags = value; + + if (seq_point->flags & MONO_SEQ_POINT_FLAG_EXIT_IL) + seq_point->il_offset = METHOD_EXIT_IL_OFFSET; + + value = decode_var_int (ptr, &ptr); + seq_point->next_len = value; + + if (seq_point->next_len) { + // store next offset and skip it + seq_point->next_offset = ptr - buffer_ptr; + for (i = 0; i < seq_point->next_len; ++i) + decode_var_int (ptr, &ptr); + } + } + + return ptr - ptr0; +} + +static gboolean +seq_point_info_add_seq_point (GByteArray* array, SeqPoint *sp, SeqPoint *last_seq_point, GSList *next, gboolean has_debug_data) +{ + int il_delta, native_delta; + GSList *l; + guint8 buffer[4]; + guint8 len; + int flags; + + if (!has_debug_data && + (sp->il_offset == METHOD_ENTRY_IL_OFFSET || sp->il_offset == METHOD_EXIT_IL_OFFSET)) + return FALSE; + + il_delta = sp->il_offset - last_seq_point->il_offset; + native_delta = sp->native_offset - last_seq_point->native_offset; + + flags = sp->flags; + + if (has_debug_data && sp->il_offset == METHOD_EXIT_IL_OFFSET) { + il_delta = 0; + flags |= MONO_SEQ_POINT_FLAG_EXIT_IL; + } + + len = encode_var_int (buffer, NULL, encode_zig_zag (il_delta)); + g_byte_array_append (array, buffer, len); + + len = encode_var_int (buffer, NULL, encode_zig_zag (native_delta)); + g_byte_array_append (array, buffer, len); + + if (has_debug_data) { + sp->next_offset = array->len; + sp->next_len = g_slist_length (next); + + len = encode_var_int (buffer, NULL, flags); + g_byte_array_append (array, buffer, len); + + len = encode_var_int (buffer, NULL, sp->next_len); + g_byte_array_append (array, buffer, len); + + for (l = next; l; l = l->next) { + int next_index = GPOINTER_TO_UINT (l->data); + guint8 buffer[4]; + int len = encode_var_int (buffer, NULL, next_index); + g_byte_array_append (array, buffer, len); + } + } + + return TRUE; +} + +static void +collect_pred_seq_points (MonoBasicBlock *bb, MonoInst *ins, GSList **next, int depth) +{ + int i; + MonoBasicBlock *in_bb; + GSList *l; + + for (i = 0; i < bb->in_count; ++i) { + in_bb = bb->in_bb [i]; + + if (in_bb->last_seq_point) { + int src_index = in_bb->last_seq_point->backend.size; + int dst_index = ins->backend.size; + + /* bb->in_bb might contain duplicates */ + for (l = next [src_index]; l; l = l->next) + if (GPOINTER_TO_UINT (l->data) == dst_index) + break; + if (!l) + next [src_index] = g_slist_append (next [src_index], GUINT_TO_POINTER (dst_index)); + } else { + /* Have to look at its predecessors */ + if (depth < 5) + collect_pred_seq_points (in_bb, ins, next, depth + 1); + } + } +} + +void +mono_save_seq_point_info (MonoCompile *cfg) +{ + MonoBasicBlock *bb; + GSList *bb_seq_points, *l; + MonoInst *last; + MonoDomain *domain = cfg->domain; + int i; + GSList **next = NULL; + SeqPoint* seq_points; + GByteArray* array; + gboolean has_debug_data = cfg->gen_seq_points_debug_data; + + if (!cfg->seq_points) + return; + + seq_points = g_new0 (SeqPoint, cfg->seq_points->len); + + for (i = 0; i < cfg->seq_points->len; ++i) { + SeqPoint *sp = &seq_points [i]; + MonoInst *ins = g_ptr_array_index (cfg->seq_points, i); + + sp->il_offset = ins->inst_imm; + sp->native_offset = ins->inst_offset; + if (ins->flags & MONO_INST_NONEMPTY_STACK) + sp->flags |= MONO_SEQ_POINT_FLAG_NONEMPTY_STACK; + + /* Used below */ + ins->backend.size = i; + } + + if (has_debug_data) { + /* + * For each sequence point, compute the list of sequence points immediately + * following it, this is needed to implement 'step over' in the debugger agent. + */ + next = g_new0 (GSList*, cfg->seq_points->len); + for (bb = cfg->bb_entry; bb; bb = bb->next_bb) { + bb_seq_points = g_slist_reverse (bb->seq_points); + last = NULL; + for (l = bb_seq_points; l; l = l->next) { + MonoInst *ins = l->data; + + if (ins->inst_imm == METHOD_ENTRY_IL_OFFSET || ins->inst_imm == METHOD_EXIT_IL_OFFSET) + /* Used to implement method entry/exit events */ + continue; + if (ins->inst_offset == SEQ_POINT_NATIVE_OFFSET_DEAD_CODE) + continue; + + if (last != NULL) { + /* Link with the previous seq point in the same bb */ + next [last->backend.size] = g_slist_append (next [last->backend.size], GUINT_TO_POINTER (ins->backend.size)); + } else { + /* Link with the last bb in the previous bblocks */ + collect_pred_seq_points (bb, ins, next, 0); + } + + last = ins; + } + + if (bb->last_ins && bb->last_ins->opcode == OP_ENDFINALLY && bb->seq_points) { + MonoBasicBlock *bb2; + MonoInst *endfinally_seq_point = NULL; + + /* + * The ENDFINALLY branches are not represented in the cfg, so link it with all seq points starting bbs. + */ + l = g_slist_last (bb->seq_points); + if (l) { + endfinally_seq_point = l->data; + + for (bb2 = cfg->bb_entry; bb2; bb2 = bb2->next_bb) { + GSList *l = g_slist_last (bb2->seq_points); + + if (l) { + MonoInst *ins = l->data; + + if (!(ins->inst_imm == METHOD_ENTRY_IL_OFFSET || ins->inst_imm == METHOD_EXIT_IL_OFFSET) && ins != endfinally_seq_point) + next [endfinally_seq_point->backend.size] = g_slist_append (next [endfinally_seq_point->backend.size], GUINT_TO_POINTER (ins->backend.size)); + } + } + } + } + } + + if (cfg->verbose_level > 2) { + printf ("\nSEQ POINT MAP: \n"); + + for (i = 0; i < cfg->seq_points->len; ++i) { + SeqPoint *sp = &seq_points [i]; + GSList *l; + + if (!next [i]) + continue; + + printf ("\tIL0x%x[0x%0x] ->", sp->il_offset, sp->native_offset); + for (l = next [i]; l; l = l->next) { + int next_index = GPOINTER_TO_UINT (l->data); + printf (" IL0x%x", seq_points [next_index].il_offset); + } + printf ("\n"); + } + } + } + + array = g_byte_array_new (); + + { /* Add sequence points to seq_point_info */ + SeqPoint zero_seq_point = {0}; + SeqPoint* last_seq_point = &zero_seq_point; + + for (i = 0; i < cfg->seq_points->len; ++i) { + SeqPoint *sp = &seq_points [i]; + GSList* next_list = NULL; + + if (has_debug_data) + next_list = next[i]; + + if (seq_point_info_add_seq_point (array, sp, last_seq_point, next_list, has_debug_data)) + last_seq_point = sp; + + if (has_debug_data) + g_slist_free (next [i]); + } + } + + if (has_debug_data) + g_free (next); + + cfg->seq_point_info = seq_point_info_new (array->len, TRUE, array->data, has_debug_data); + + g_byte_array_free (array, TRUE); + + // FIXME: dynamic methods + if (!cfg->compile_aot) { + mono_domain_lock (domain); + // FIXME: How can the lookup succeed ? + if (!g_hash_table_lookup (domain_jit_info (domain)->seq_points, cfg->method_to_register)) + g_hash_table_insert (domain_jit_info (domain)->seq_points, cfg->method_to_register, cfg->seq_point_info); + mono_domain_unlock (domain); + } + + g_ptr_array_free (cfg->seq_points, TRUE); + cfg->seq_points = NULL; +} + +MonoSeqPointInfo* +get_seq_points (MonoDomain *domain, MonoMethod *method) +{ + MonoSeqPointInfo *seq_points; + + mono_domain_lock (domain); + seq_points = g_hash_table_lookup (domain_jit_info (domain)->seq_points, method); + if (!seq_points && method->is_inflated) { + /* generic sharing + aot */ + seq_points = g_hash_table_lookup (domain_jit_info (domain)->seq_points, mono_method_get_declaring_generic_method (method)); + if (!seq_points) + seq_points = g_hash_table_lookup (domain_jit_info (domain)->seq_points, mini_get_shared_method (method)); + } + mono_domain_unlock (domain); + + return seq_points; +} + +static gboolean +seq_point_find_next_by_native_offset (MonoSeqPointInfo* info, int native_offset, SeqPoint* seq_point) +{ + SeqPointIterator it; + seq_point_iterator_init (&it, info); + while (seq_point_iterator_next (&it)) { + if (it.seq_point.native_offset >= native_offset) { + memcpy (seq_point, &it.seq_point, sizeof (SeqPoint)); + return TRUE; + } + } + + return FALSE; +} + +static gboolean +seq_point_find_prev_by_native_offset (MonoSeqPointInfo* info, int native_offset, SeqPoint* seq_point) +{ + SeqPoint prev_seq_point; + gboolean is_first = TRUE; + SeqPointIterator it; + seq_point_iterator_init (&it, info); + while (seq_point_iterator_next (&it) && it.seq_point.native_offset <= native_offset) { + memcpy (&prev_seq_point, &it.seq_point, sizeof (SeqPoint)); + is_first = FALSE; + } + + if (!is_first && prev_seq_point.native_offset <= native_offset) { + memcpy (seq_point, &prev_seq_point, sizeof (SeqPoint)); + return TRUE; + } + + return FALSE; +} + +static gboolean +seq_point_find_by_il_offset (MonoSeqPointInfo* info, int il_offset, SeqPoint* seq_point) +{ + SeqPointIterator it; + seq_point_iterator_init (&it, info); + while (seq_point_iterator_next (&it)) { + if (it.seq_point.il_offset == il_offset) { + memcpy (seq_point, &it.seq_point, sizeof (SeqPoint)); + return TRUE; + } + } + + return FALSE; +} + +/* + * find_next_seq_point_for_native_offset: + * + * Find the first sequence point after NATIVE_OFFSET. + */ +gboolean +find_next_seq_point_for_native_offset (MonoDomain *domain, MonoMethod *method, gint32 native_offset, MonoSeqPointInfo **info, SeqPoint* seq_point) +{ + MonoSeqPointInfo *seq_points; + + seq_points = get_seq_points (domain, method); + if (!seq_points) { + if (info) + *info = NULL; + return FALSE; + } + if (info) + *info = seq_points; + + return seq_point_find_next_by_native_offset (seq_points, native_offset, seq_point); +} + +/* + * find_prev_seq_point_for_native_offset: + * + * Find the first sequence point before NATIVE_OFFSET. + */ +gboolean +find_prev_seq_point_for_native_offset (MonoDomain *domain, MonoMethod *method, gint32 native_offset, MonoSeqPointInfo **info, SeqPoint* seq_point) +{ + MonoSeqPointInfo *seq_points; + + seq_points = get_seq_points (domain, method); + if (!seq_points) { + if (info) + *info = NULL; + return FALSE; + } + if (info) + *info = seq_points; + + return seq_point_find_prev_by_native_offset (seq_points, native_offset, seq_point); +} + +/* + * find_seq_point: + * + * Find the sequence point corresponding to the IL offset IL_OFFSET, which + * should be the location of a sequence point. + */ +gboolean +find_seq_point (MonoDomain *domain, MonoMethod *method, gint32 il_offset, MonoSeqPointInfo **info, SeqPoint *seq_point) +{ + MonoSeqPointInfo *seq_points; + + seq_points = get_seq_points (domain, method); + if (!seq_points) { + if (info) + *info = NULL; + return FALSE; + } + if (info) + *info = seq_points; + + return seq_point_find_by_il_offset (seq_points, il_offset, seq_point); +} + +void +seq_point_init_next (MonoSeqPointInfo* info, SeqPoint sp, SeqPoint* next) +{ + int i; + guint8* ptr; + SeqPointIterator it; + GArray* seq_points = g_array_new (FALSE, TRUE, sizeof (SeqPoint)); + SeqPointInfoInflated info_inflated = seq_point_info_inflate (info); + + g_assert (info_inflated.has_debug_data); + + seq_point_iterator_init (&it, info); + while (seq_point_iterator_next (&it)) + g_array_append_vals (seq_points, &it.seq_point, 1); + + ptr = info_inflated.data + sp.next_offset; + for (i = 0; i < sp.next_len; i++) { + int next_index; + next_index = decode_var_int (ptr, &ptr); + g_assert (next_index < seq_points->len); + memcpy (&next[i], seq_points->data + next_index * sizeof (SeqPoint), sizeof (SeqPoint)); + } + + g_array_free (seq_points, TRUE); +} + +gboolean +seq_point_iterator_next (SeqPointIterator* it) +{ + if (it->ptr >= it->end) + return FALSE; + + it->ptr += seq_point_read (&it->seq_point, it->ptr, it->begin, it->has_debug_data); + + return TRUE; +} + +void +seq_point_iterator_init (SeqPointIterator* it, MonoSeqPointInfo* info) +{ + SeqPointInfoInflated info_inflated = seq_point_info_inflate (info); + it->ptr = info_inflated.data; + it->begin = info_inflated.data; + it->end = it->begin + info_inflated.len; + it->has_debug_data = info_inflated.has_debug_data; + memset(&it->seq_point, 0, sizeof(SeqPoint)); +} + +int +seq_point_info_write (MonoSeqPointInfo* info, guint8* buffer) +{ + guint8* buffer0 = buffer; + SeqPointInfoInflated info_inflated = seq_point_info_inflate (info); + + memcpy (buffer, &info_inflated.has_debug_data, 1); + buffer++; + + //Write sequence points + encode_var_int (buffer, &buffer, info_inflated.len); + memcpy (buffer, info_inflated.data, info_inflated.len); + buffer += info_inflated.len; + + return buffer - buffer0; +} + +int +seq_point_info_read (MonoSeqPointInfo** info, guint8* buffer, gboolean copy) +{ + guint8* buffer0 = buffer; + int size; + gboolean has_debug_data; + + memcpy (&has_debug_data, buffer, 1); + buffer++; + + size = decode_var_int (buffer, &buffer); + (*info) = seq_point_info_new (size, copy, buffer, has_debug_data); + buffer += size; + + return buffer - buffer0; +} + +/* + * Returns the maximum size of mono_seq_point_info_write. + */ +int +seq_point_info_get_write_size (MonoSeqPointInfo* info) +{ + SeqPointInfoInflated info_inflated = seq_point_info_inflate (info); + + //4 is the maximum size required to store the size of the data. + //1 is the byte used to store has_debug_data. + int size = 4 + 1 + info_inflated.len; + + return size; +} + +void +bb_deduplicate_op_il_seq_points (MonoCompile *cfg, MonoBasicBlock *bb) +{ + MonoInst *ins, *n, *prev; + + MONO_BB_FOR_EACH_INS_SAFE (bb, n, ins) { + if (ins->opcode != OP_IL_SEQ_POINT) + continue; + + prev = mono_inst_prev (ins, FILTER_NOP); + + if (!prev || ins == prev || prev->opcode != OP_IL_SEQ_POINT) + continue; + + MONO_REMOVE_INS (bb, prev); + }; +} diff --git a/mta-mono/vendor/mono/mini/seq-points.h b/mta-mono/vendor/mono/mini/seq-points.h new file mode 100644 index 0000000..61cdcd8 --- /dev/null +++ b/mta-mono/vendor/mono/mini/seq-points.h @@ -0,0 +1,77 @@ +/* + * Copyright 2014 Xamarin Inc + */ + +#ifndef __MONO_SEQ_POINTS_H__ +#define __MONO_SEQ_POINTS_H__ + +#define MONO_SEQ_POINT_FLAG_NONEMPTY_STACK 1 +#define MONO_SEQ_POINT_FLAG_EXIT_IL 2 + +/* IL offsets used to mark the sequence points belonging to method entry/exit events */ +#define METHOD_ENTRY_IL_OFFSET -1 +#define METHOD_EXIT_IL_OFFSET 0xffffff + +/* Native offset used to mark seq points in dead code */ +#define SEQ_POINT_NATIVE_OFFSET_DEAD_CODE -1 + +typedef struct { + int il_offset, native_offset, flags; + /* Offset of indexes of successor sequence points on the compressed buffer */ + int next_offset; + /* Number of entries in next */ + int next_len; +} SeqPoint; + +typedef struct MonoSeqPointInfo { + int dummy[0]; +} MonoSeqPointInfo; + +typedef struct { + SeqPoint seq_point; + guint8* ptr; + guint8* begin; + guint8* end; + gboolean has_debug_data; +} SeqPointIterator; + +void +seq_point_info_free (gpointer info); + +void +mono_save_seq_point_info (MonoCompile *cfg); + +MonoSeqPointInfo* +get_seq_points (MonoDomain *domain, MonoMethod *method); + +gboolean +find_next_seq_point_for_native_offset (MonoDomain *domain, MonoMethod *method, gint32 native_offset, MonoSeqPointInfo **info, SeqPoint* seq_point); + +gboolean +find_prev_seq_point_for_native_offset (MonoDomain *domain, MonoMethod *method, gint32 native_offset, MonoSeqPointInfo **info, SeqPoint* seq_point); + +gboolean +find_seq_point (MonoDomain *domain, MonoMethod *method, gint32 il_offset, MonoSeqPointInfo **info, SeqPoint *seq_point); + +gboolean +seq_point_iterator_next (SeqPointIterator* it); + +void +seq_point_iterator_init (SeqPointIterator* it, MonoSeqPointInfo* info); + +void +seq_point_init_next (MonoSeqPointInfo* info, SeqPoint sp, SeqPoint* next); + +int +seq_point_info_write (MonoSeqPointInfo* info, guint8* buffer); + +int +seq_point_info_read (MonoSeqPointInfo** info, guint8* buffer, gboolean copy); + +int +seq_point_info_get_write_size (MonoSeqPointInfo* info); + +void +bb_deduplicate_op_il_seq_points (MonoCompile *cfg, MonoBasicBlock *bb); + +#endif /* __MONO_SEQ_POINTS_H__ */ \ No newline at end of file diff --git a/mta-mono/vendor/mono/mini/simd-intrinsics.c b/mta-mono/vendor/mono/mini/simd-intrinsics.c index 2fb8f07..bf1e37d 100644 --- a/mta-mono/vendor/mono/mini/simd-intrinsics.c +++ b/mta-mono/vendor/mono/mini/simd-intrinsics.c @@ -28,7 +28,7 @@ TODO add support for fusing a XMOVE into a simd op in mono_spill_global_vars. TODO add stuff to man pages TODO document this under /docs TODO make passing a xmm as argument not cause it to be LDADDR'ed (introduce an OP_XPUSH) -TODO revamp the .ctor sequence as it looks very fragile, maybe use a var just like iconv_to_r8_raw. (or just pinst sse ops) +TODO revamp the .ctor sequence as it looks very fragile, maybe use a var just like move_i4_to_f. (or just pinst sse ops) TODO figure out what's wrong with OP_STOREX_MEMBASE_REG and OP_STOREX_MEMBASE (the 2nd is for imm operands) TODO maybe add SSE3 emulation on top of SSE2, or just implement the corresponding functions using SSE2 intrinsics. TODO pass simd arguments in registers or, at least, add SSE support for pushing large (>=16) valuetypes @@ -772,13 +772,15 @@ mono_simd_simplify_indirection (MonoCompile *cfg) num_sregs = mono_inst_get_src_registers (ins, sregs); for (j = 0; j < num_sregs; ++j) { - if (sregs [i] == var->dreg) + if (sregs [j] == var->dreg) found = TRUE; } /*We can avoid inserting the XZERO if the first use doesn't depend on the zero'ed value.*/ if (ins->dreg == var->dreg && !found) { + DEBUG (printf ("[simd-simplify] INGORING R%d on BB %d because first op is a def", i, target_bb [var->dreg]->block_num);); break; } else if (found) { + DEBUG (printf ("[simd-simplify] Adding XZERO for R%d on BB %d: ", i, target_bb [var->dreg]->block_num); ); MonoInst *tmp; MONO_INST_NEW (cfg, tmp, OP_XZERO); tmp->dreg = var->dreg; @@ -791,8 +793,10 @@ mono_simd_simplify_indirection (MonoCompile *cfg) } for (ins = first_bb->code; ins; ins = ins->next) { - if (ins->opcode == OP_XZERO && (vreg_flags [ins->dreg] & VREG_SINGLE_BB_USE)) + if (ins->opcode == OP_XZERO && (vreg_flags [ins->dreg] & VREG_SINGLE_BB_USE)) { + DEBUG (printf ("[simd-simplify] Nullify %d on first BB: ", ins->dreg); mono_print_ins(ins)); NULLIFY_INS (ins); + } } g_free (vreg_flags); @@ -849,16 +853,6 @@ load_simd_vreg (MonoCompile *cfg, MonoMethod *cmethod, MonoInst *src, gboolean * g_assert_not_reached (); } -static MonoInst* -get_int_to_float_spill_area (MonoCompile *cfg) -{ - if (!cfg->iconv_raw_var) { - cfg->iconv_raw_var = mono_compile_create_var (cfg, &mono_defaults.int32_class->byval_arg, OP_LOCAL); - cfg->iconv_raw_var->flags |= MONO_INST_VOLATILE; /*FIXME, use the don't regalloc flag*/ - } - return cfg->iconv_raw_var; -} - /*We share the var with fconv_to_r8_x to save some stack space.*/ static MonoInst* get_double_spill_area (MonoCompile *cfg) @@ -926,7 +920,7 @@ get_simd_vreg_or_expanded_scalar (MonoCompile *cfg, MonoMethod *cmethod, MonoIns MONO_ADD_INS (cfg->cbb, ins); if (expand_op == OP_EXPAND_R4) - ins->backend.spill_var = get_int_to_float_spill_area (cfg); + ins->backend.spill_var = mini_get_int_to_float_spill_area (cfg); else if (expand_op == OP_EXPAND_R8) ins->backend.spill_var = get_double_spill_area (cfg); @@ -1088,7 +1082,7 @@ simd_intrinsic_emit_setter (const SimdIntrinsc *intrinsic, MonoCompile *cfg, Mon ins->sreg2 = args [1]->dreg; ins->inst_c0 = intrinsic->opcode; if (sig->params [0]->type == MONO_TYPE_R4) - ins->backend.spill_var = get_int_to_float_spill_area (cfg); + ins->backend.spill_var = mini_get_int_to_float_spill_area (cfg); else if (sig->params [0]->type == MONO_TYPE_R8) ins->backend.spill_var = get_double_spill_area (cfg); MONO_ADD_INS (cfg->cbb, ins); @@ -1153,13 +1147,13 @@ simd_intrinsic_emit_getter (const SimdIntrinsc *intrinsic, MonoCompile *cfg, Mon MONO_ADD_INS (cfg->cbb, ins); if (sig->ret->type == MONO_TYPE_R4) { - MONO_INST_NEW (cfg, ins, OP_ICONV_TO_R8_RAW); + MONO_INST_NEW (cfg, ins, cfg->r4fp ? OP_ICONV_TO_R4_RAW : OP_MOVE_I4_TO_F); ins->klass = mono_defaults.single_class; ins->sreg1 = vreg; - ins->type = STACK_R8; + ins->type = cfg->r4_stack_type; ins->dreg = alloc_freg (cfg); - ins->backend.spill_var = get_int_to_float_spill_area (cfg); - MONO_ADD_INS (cfg->cbb, ins); + ins->backend.spill_var = mini_get_int_to_float_spill_area (cfg); + MONO_ADD_INS (cfg->cbb, ins); } return ins; } @@ -1219,7 +1213,7 @@ simd_intrinsic_emit_ctor (const SimdIntrinsc *intrinsic, MonoCompile *cfg, MonoM MONO_ADD_INS (cfg->cbb, ins); if (sig->params [0]->type == MONO_TYPE_R4) - ins->backend.spill_var = get_int_to_float_spill_area (cfg); + ins->backend.spill_var = mini_get_int_to_float_spill_area (cfg); else if (sig->params [0]->type == MONO_TYPE_R8) ins->backend.spill_var = get_double_spill_area (cfg); @@ -1580,7 +1574,7 @@ mono_emit_vector_ldelema (MonoCompile *cfg, MonoType *array_type, MonoInst *arr, static MonoInst* emit_array_extension_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args) { - if (!strcmp ("GetVector", cmethod->name) || !strcmp ("GetVectorAligned", cmethod->name)) { + if ((!strcmp ("GetVector", cmethod->name) || !strcmp ("GetVectorAligned", cmethod->name)) && fsig->param_count == 2) { MonoInst *load; int addr = mono_emit_vector_ldelema (cfg, fsig->params [0], args [0], args [1], TRUE); @@ -1593,7 +1587,7 @@ emit_array_extension_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMeth return load; } - if (!strcmp ("SetVector", cmethod->name) || !strcmp ("SetVectorAligned", cmethod->name)) { + if ((!strcmp ("SetVector", cmethod->name) || !strcmp ("SetVectorAligned", cmethod->name)) && fsig->param_count == 3) { MonoInst *store; int vreg = get_simd_vreg (cfg, cmethod, args [1]); int addr = mono_emit_vector_ldelema (cfg, fsig->params [0], args [0], args [2], TRUE); @@ -1606,7 +1600,7 @@ emit_array_extension_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMeth return store; } - if (!strcmp ("IsAligned", cmethod->name)) { + if (!strcmp ("IsAligned", cmethod->name) && fsig->param_count == 2) { MonoInst *ins; int addr = mono_emit_vector_ldelema (cfg, fsig->params [0], args [0], args [1], FALSE); @@ -1623,7 +1617,7 @@ emit_array_extension_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMeth static MonoInst* emit_simd_runtime_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args) { - if (!strcmp ("get_AccelMode", cmethod->name)) { + if (!strcmp ("get_AccelMode", cmethod->name) && fsig->param_count == 0) { MonoInst *ins; EMIT_NEW_ICONST (cfg, ins, simd_supported_versions); return ins; @@ -1636,7 +1630,8 @@ mono_emit_simd_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign { const char *class_name; - if (strcmp ("Mono.Simd", cmethod->klass->name_space)) + if (strcmp ("Mono.Simd", cmethod->klass->image->assembly->aname.name) || + strcmp ("Mono.Simd", cmethod->klass->name_space)) return NULL; class_name = cmethod->klass->name; diff --git a/mta-mono/vendor/mono/mini/ssa.c b/mta-mono/vendor/mono/mini/ssa.c index 160db5f..8f804b8 100644 --- a/mta-mono/vendor/mono/mini/ssa.c +++ b/mta-mono/vendor/mono/mini/ssa.c @@ -20,7 +20,6 @@ #include #endif -#define USE_ORIGINAL_VARS #define CREATE_PRUNED_SSA //#define DEBUG_SSA 1 diff --git a/mta-mono/vendor/mono/mini/test_op_il_seq_point.sh b/mta-mono/vendor/mono/mini/test_op_il_seq_point.sh new file mode 100644 index 0000000..d29b282 --- /dev/null +++ b/mta-mono/vendor/mono/mini/test_op_il_seq_point.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +TEST_FILE=$1 +USE_AOT=$2 + +TMP_FILE_PREFIX=$(basename $0).tmp +BASEDIR=$(dirname $0) + +MONO_PATH=$BASEDIR/../../mcs/class/lib/net_4_5:$BASEDIR +RUNTIME=$BASEDIR/../../runtime/mono-wrapper + +trap "rm -rf ${TMP_FILE_PREFIX}*" EXIT + +tmp_file () { + mktemp ./${TMP_FILE_PREFIX}XXXX +} + +clean_aot () { + rm -rf *.exe..so *.exe.dylib *.exe.dylib.dSYM +} + +get_methods () { + if [ -z $4 ]; then + MONO_PATH=$1 $2 -v --compile-all=1 $3 | grep '^Method .*code length' | sed 's/emitted[^()]*//' | sort + else + clean_aot + MONO_PATH=$1 $2 -v --aot $3 | grep '^Method .*code length' | sed 's/emitted[^()]*//' | sort + fi +} + +get_method () { + if [ -z $5 ]; then + MONO_VERBOSE_METHOD="$4" MONO_PATH=$1 $2 --compile-all=1 $3 | sed 's/0x[0-9a-fA-F]*/0x0/g' + else + clean_aot + MONO_VERBOSE_METHOD="$4" MONO_PATH=$1 $2 --aot $3 | sed 's/0x[0-9a-fA-F]*/0x0/g' + fi +} + +diff_methods () { + TMP_FILE=$(tmp_file) + echo "$(get_methods $1 $2 $3 $4)" >$TMP_FILE + diff <(cat $TMP_FILE) <(echo "$(MONO_DEBUG=gen-compact-seq-points get_methods $1 $2 $3 $4)") +} + +diff_method () { + TMP_FILE=$(tmp_file) + echo "$(get_method $1 $2 $3 $4 $5)" >$TMP_FILE + sdiff -w 150 <(cat $TMP_FILE) <(echo "$(MONO_DEBUG=gen-compact-seq-points get_method $1 $2 $3 $4 $5 | grep -Ev il_seq_point)") +} + +get_method_name () { + echo $1 | sed -E 's/.*Method (\([^)]*\) )?([^ ]*).*/\2/g' +} + +get_method_length () { + echo $1 | sed 's/.*code length \([0-9]*\).*/\1/' +} + +if [ -z $USE_AOT ]; then + echo "Checking unintended native code changes in $TEST_FILE without AOT" +else + echo "Checking unintended native code changes in $TEST_FILE with AOT" +fi + +TMP_FILE=$(tmp_file) + +echo "$(diff_methods $MONO_PATH $RUNTIME $TEST_FILE $USE_AOT)" > $TMP_FILE + +CHANGES=0 +METHOD="" +MIN_SIZE=10000 + +while read line; do + if [ "$line" != "" ]; then + echo $line + if [[ ${line:0:1} == "<" ]]; then + CHANGES=$((CHANGES+1)) + SIZE=$(get_method_length "$line") + if [[ SIZE -lt MIN_SIZE ]]; then + MIN_SIZE=$SIZE + METHOD="$line" + fi + fi + fi +done < $TMP_FILE + +echo -n " > TestResults_op_il_seq_point.xml + +if [ $CHANGES != 0 ] +then + METHOD_NAME=$(get_method_name "$METHOD") + + echo "False\">" >> TestResults_op_il_seq_point.xml + echo " " >> TestResults_op_il_seq_point.xml + echo -n " > TestResults_op_il_seq_point.xml + echo "Detected OP_IL_SEQ_POINT incompatibility on $TEST_FILE" >> TestResults_op_il_seq_point.xml + echo " $CHANGES methods differ when sequence points are enabled." >> TestResults_op_il_seq_point.xml + echo ' This is probably caused by a runtime optimization that is not handling OP_IL_SEQ_POINT' >> TestResults_op_il_seq_point.xml + echo '' >> TestResults_op_il_seq_point.xml + echo "Diff $METHOD_NAME" >> TestResults_op_il_seq_point.xml + echo "Without IL_OP_SEQ_POINT With IL_OP_SEQ_POINT" >> TestResults_op_il_seq_point.xml + echo -n "$(diff_method $MONO_PATH $RUNTIME $TEST_FILE $METHOD_NAME $USE_AOT)" >> TestResults_op_il_seq_point.xml + echo "]]>" >> TestResults_op_il_seq_point.xml + echo " " >> TestResults_op_il_seq_point.xml + echo " " >> TestResults_op_il_seq_point.xml + echo " " >> TestResults_op_il_seq_point.xml + echo " " >> TestResults_op_il_seq_point.xml + + echo '' + echo "Detected OP_IL_SEQ_POINT incompatibility on $TEST_FILE" + echo " $CHANGES methods differ when sequence points are enabled." + echo ' This is probably caused by a runtime optimization that is not handling OP_IL_SEQ_POINT' + + echo '' + echo "Diff $METHOD_NAME" + echo "Without IL_OP_SEQ_POINT With IL_OP_SEQ_POINT" + echo "$(diff_method $MONO_PATH $RUNTIME $TEST_FILE $METHOD_NAME $USE_AOT)" + exit 1 +else + echo "True\" />" >> TestResults_op_il_seq_point.xml +fi diff --git a/mta-mono/vendor/mono/mini/test_op_il_seq_point_headerfooter.sh b/mta-mono/vendor/mono/mini/test_op_il_seq_point_headerfooter.sh new file mode 100644 index 0000000..2eea27b --- /dev/null +++ b/mta-mono/vendor/mono/mini/test_op_il_seq_point_headerfooter.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +TOTAL=$(grep -c "" TestResults_op_il_seq_point.xml) +if [ "$FAILURES" -eq "0" ] +then + PASS="True" +else + PASS="False" +fi +MYLOCALE=$(echo $LANG | cut -f1 -d'.') +MYUNAME=$(uname -r) +MYHOSTNAME=$(hostname -s) +MYFQDN=$(hostname -f) +MYDATE=$(date +%F) +MYTIME=$(date +%T) + +echo " " >> TestResults_op_il_seq_point.xml +echo " " >> TestResults_op_il_seq_point.xml +echo " " >> TestResults_op_il_seq_point.xml +echo " " >> TestResults_op_il_seq_point.xml +echo " " >> TestResults_op_il_seq_point.xml +echo " " >> TestResults_op_il_seq_point.xml +echo "" >> TestResults_op_il_seq_point.xml + +echo "" > TestResults_op_il_seq_point.xml.header +echo "" >> TestResults_op_il_seq_point.xml.header +echo "" >> TestResults_op_il_seq_point.xml.header +echo " " >> TestResults_op_il_seq_point.xml.header +echo " " >> TestResults_op_il_seq_point.xml.header +echo " " >> TestResults_op_il_seq_point.xml.header +echo " " >> TestResults_op_il_seq_point.xml.header +echo " " >> TestResults_op_il_seq_point.xml.header +echo " " >> TestResults_op_il_seq_point.xml.header +echo " " >> TestResults_op_il_seq_point.xml.header +echo " " >> TestResults_op_il_seq_point.xml.header + +cat TestResults_op_il_seq_point.xml.header TestResults_op_il_seq_point.xml > TestResults_op_il_seq_point.xml.new +mv TestResults_op_il_seq_point.xml.new TestResults_op_il_seq_point.xml +rm -f TestResults_op_il_seq_point.xml.header diff --git a/mta-mono/vendor/mono/mini/trace.c b/mta-mono/vendor/mono/mini/trace.c index cbc3b3b..e0fa41e 100644 --- a/mta-mono/vendor/mono/mini/trace.c +++ b/mta-mono/vendor/mono/mini/trace.c @@ -10,7 +10,6 @@ */ #include -#include #ifdef HAVE_ALLOCA_H #include #endif @@ -140,7 +139,7 @@ static int is_filenamechar (char p) return TRUE; if (p >= '0' && p <= '9') return TRUE; - if (p == '.' || p == ':' || p == '_' || p == '-') + if (p == '.' || p == ':' || p == '_' || p == '-' || p == '`') return TRUE; return FALSE; } diff --git a/mta-mono/vendor/mono/mini/tramp-amd64.c b/mta-mono/vendor/mono/mini/tramp-amd64.c index cfc14ee..d9c2ee0 100644 --- a/mta-mono/vendor/mono/mini/tramp-amd64.c +++ b/mta-mono/vendor/mono/mini/tramp-amd64.c @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include @@ -65,6 +65,7 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) nacl_domain_code_validate (domain, &start, size, &code); mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, m); return start; } @@ -100,6 +101,7 @@ mono_arch_get_static_rgctx_trampoline (MonoMethod *m, MonoMethodRuntimeGenericCo nacl_domain_code_validate (domain, &start, buf_len, &code); mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); return start; } @@ -129,6 +131,7 @@ mono_arch_get_llvm_imt_trampoline (MonoDomain *domain, MonoMethod *m, int vt_off nacl_domain_code_validate (domain, &start, buf_len, &code); mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, NULL); return start; } @@ -182,6 +185,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr) addr = thunk_start; g_assert ((((guint64)(addr)) >> 32) == 0); mono_arch_flush_icache (thunk_start, thunk_code - thunk_start); + mono_profiler_code_buffer_new (thunk_start, thunk_code - thunk_start, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); #endif } if (can_write) { @@ -248,6 +252,7 @@ mono_arch_create_llvm_native_thunk (MonoDomain *domain, guint8 *addr) *(guint64*)thunk_code = (guint64)addr; addr = thunk_start; mono_arch_flush_icache (thunk_start, thunk_code - thunk_start); + mono_profiler_code_buffer_new (thunk_start, thunk_code - thunk_start, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); return addr; } @@ -532,6 +537,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf if (tramp_type != MONO_TRAMPOLINE_GENERIC_CLASS_INIT && tramp_type != MONO_TRAMPOLINE_MONITOR_ENTER && + tramp_type != MONO_TRAMPOLINE_MONITOR_ENTER_V4 && tramp_type != MONO_TRAMPOLINE_MONITOR_EXIT && tramp_type != MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD) { /* Obtain the trampoline argument which is encoded in the instruction stream */ @@ -539,7 +545,13 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf /* Load the GOT offset */ amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, tramp_offset, sizeof(gpointer)); #if defined(__default_codegen__) - amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11, 7, 4); + /* + * r11 points to a call *(%rip) instruction, load the + * pc-relative offset from the instruction itself. + */ + amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11, 3, 4); + /* 7 is the length of the call, 8 is the offset to the next got slot */ + amd64_alu_reg_imm_size (code, X86_ADD, AMD64_RAX, 7 + sizeof (gpointer), sizeof(gpointer)); #elif defined(__native_client_codegen__) /* The arg is hidden in a "push imm32" instruction, */ /* add one to skip the opcode. */ @@ -696,6 +708,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf nacl_global_codeman_validate (&buf, kMaxCodeSize, &code); mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); if (info) { tramp_name = mono_get_generic_trampoline_name (tramp_type); @@ -718,6 +731,7 @@ mono_arch_get_nullified_class_init_trampoline (MonoTrampInfo **info) nacl_global_codeman_validate(&buf, size, &code); mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); if (info) *info = mono_tramp_info_create ("nullified_class_init_trampoline", buf, code - buf, NULL, NULL); @@ -792,6 +806,7 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty nacl_domain_code_validate(domain, &buf, size, &code); mono_arch_flush_icache (buf, size); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_SPECIFIC_TRAMPOLINE, mono_get_generic_trampoline_simple_name (tramp_type)); return buf; } @@ -885,6 +900,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info nacl_global_codeman_validate (&buf, tramp_size, &code); mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); g_assert (code - buf <= tramp_size); @@ -937,6 +953,7 @@ mono_arch_create_generic_class_init_trampoline (MonoTrampInfo **info, gboolean a nacl_global_codeman_validate (&buf, tramp_size, &code); mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); g_assert (code - buf <= tramp_size); @@ -946,26 +963,36 @@ mono_arch_create_generic_class_init_trampoline (MonoTrampInfo **info, gboolean a return buf; } +#ifdef MONO_ARCH_MONITOR_OBJECT_REG + gpointer -mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot) +mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean is_v4, gboolean aot) { guint8 *tramp; guint8 *code, *buf; guint8 *jump_obj_null, *jump_sync_null, *jump_cmpxchg_failed, *jump_other_owner, *jump_tid, *jump_sync_thin_hash = NULL; + guint8 *jump_lock_taken_true = NULL; int tramp_size; - int owner_offset, nest_offset, dummy; + int status_offset, nest_offset; MonoJumpInfo *ji = NULL; GSList *unwind_ops = NULL; int obj_reg = MONO_AMD64_ARG_REG1; - int sync_reg = MONO_AMD64_ARG_REG2; - int tid_reg = MONO_AMD64_ARG_REG3; + int lock_taken_reg = MONO_AMD64_ARG_REG2; + int sync_reg = MONO_AMD64_ARG_REG3; + int tid_reg = MONO_AMD64_ARG_REG4; + int status_reg = AMD64_RAX; g_assert (MONO_ARCH_MONITOR_OBJECT_REG == obj_reg); +#ifdef MONO_ARCH_MONITOR_LOCK_TAKEN_REG + g_assert (MONO_ARCH_MONITOR_LOCK_TAKEN_REG == lock_taken_reg); +#else + g_assert (!is_v4); +#endif - mono_monitor_threads_sync_members_offset (&owner_offset, &nest_offset, &dummy); - g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (owner_offset) == sizeof (gpointer)); + mono_monitor_threads_sync_members_offset (&status_offset, &nest_offset); + g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (status_offset) == sizeof (guint32)); g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (nest_offset) == sizeof (guint32)); - owner_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (owner_offset); + status_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (status_offset); nest_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (nest_offset); tramp_size = 96; @@ -982,6 +1009,13 @@ mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot) jump_obj_null = code; amd64_branch8 (code, X86_CC_Z, -1, 1); + if (is_v4) { + amd64_test_membase_imm (code, lock_taken_reg, 0, 1); + /* if *lock_taken is 1, jump to actual trampoline */ + jump_lock_taken_true = code; + x86_branch8 (code, X86_CC_NZ, -1, 1); + } + /* load obj->synchronization to sync_reg */ amd64_mov_reg_membase (code, sync_reg, obj_reg, MONO_STRUCT_OFFSET (MonoObject, synchronisation), 8); @@ -1005,37 +1039,43 @@ mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot) /* load MonoInternalThread* into tid_reg */ code = mono_amd64_emit_tls_get (code, tid_reg, mono_thread_get_tls_offset ()); /* load TID into tid_reg */ - amd64_mov_reg_membase (code, tid_reg, tid_reg, MONO_STRUCT_OFFSET (MonoInternalThread, tid), 8); + amd64_mov_reg_membase (code, tid_reg, tid_reg, MONO_STRUCT_OFFSET (MonoInternalThread, small_id), 4); - /* is synchronization->owner null? */ - amd64_alu_membase_imm_size (code, X86_CMP, sync_reg, owner_offset, 0, 8); + /* is synchronization->owner free */ + amd64_mov_reg_membase (code, status_reg, sync_reg, status_offset, 4); + amd64_test_reg_imm_size (code, status_reg, OWNER_MASK, 4); /* if not, jump to next case */ jump_tid = code; amd64_branch8 (code, X86_CC_NZ, -1, 1); /* if yes, try a compare-exchange with the TID */ g_assert (tid_reg != X86_EAX); - /* zero RAX */ - amd64_alu_reg_reg (code, X86_XOR, AMD64_RAX, AMD64_RAX); + /* Form new status in tid_reg */ + amd64_alu_reg_reg_size (code, X86_OR, tid_reg, status_reg, 4); /* compare and exchange */ amd64_prefix (code, X86_LOCK_PREFIX); - amd64_cmpxchg_membase_reg_size (code, sync_reg, owner_offset, tid_reg, 8); + amd64_cmpxchg_membase_reg_size (code, sync_reg, status_offset, tid_reg, 4); /* if not successful, jump to actual trampoline */ jump_cmpxchg_failed = code; amd64_branch8 (code, X86_CC_NZ, -1, 1); /* if successful, return */ + if (is_v4) + amd64_mov_membase_imm (code, lock_taken_reg, 0, 1, 1); amd64_ret (code); /* next case: synchronization->owner is not null */ x86_patch (jump_tid, code); /* is synchronization->owner == TID? */ - amd64_alu_membase_reg_size (code, X86_CMP, sync_reg, owner_offset, tid_reg, 8); + amd64_alu_reg_imm_size (code, X86_AND, status_reg, OWNER_MASK, 4); + amd64_alu_reg_reg_size (code, X86_CMP, status_reg, tid_reg, 4); /* if not, jump to actual trampoline */ jump_other_owner = code; amd64_branch8 (code, X86_CC_NZ, -1, 1); /* if yes, increment nest */ amd64_inc_membase_size (code, sync_reg, nest_offset, 4); /* return */ + if (is_v4) + amd64_mov_membase_imm (code, lock_taken_reg, 0, 1, 1); amd64_ret (code); x86_patch (jump_obj_null, code); @@ -1044,6 +1084,8 @@ mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot) x86_patch (jump_sync_null, code); x86_patch (jump_cmpxchg_failed, code); x86_patch (jump_other_owner, code); + if (is_v4) + x86_patch (jump_lock_taken_true, code); } /* jump to the actual trampoline */ @@ -1051,10 +1093,16 @@ mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot) amd64_mov_reg_reg (code, MONO_AMD64_ARG_REG1, obj_reg, sizeof (mgreg_t)); if (aot) { - code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "specific_trampoline_monitor_enter"); + if (is_v4) + code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "specific_trampoline_monitor_enter_v4"); + else + code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "specific_trampoline_monitor_enter"); amd64_jump_reg (code, AMD64_R11); } else { - tramp = mono_arch_create_specific_trampoline (NULL, MONO_TRAMPOLINE_MONITOR_ENTER, mono_get_root_domain (), NULL); + if (is_v4) + tramp = mono_arch_create_specific_trampoline (NULL, MONO_TRAMPOLINE_MONITOR_ENTER_V4, mono_get_root_domain (), NULL); + else + tramp = mono_arch_create_specific_trampoline (NULL, MONO_TRAMPOLINE_MONITOR_ENTER, mono_get_root_domain (), NULL); /* jump to the actual trampoline */ amd64_jump_code (code, tramp); @@ -1063,10 +1111,15 @@ mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot) nacl_global_codeman_validate (&buf, tramp_size, &code); mono_arch_flush_icache (code, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_MONITOR, NULL); g_assert (code - buf <= tramp_size); - if (info) - *info = mono_tramp_info_create ("monitor_enter_trampoline", buf, code - buf, ji, unwind_ops); + if (info) { + if (is_v4) + *info = mono_tramp_info_create ("monitor_enter_v4_trampoline", buf, code - buf, ji, unwind_ops); + else + *info = mono_tramp_info_create ("monitor_enter_trampoline", buf, code - buf, ji, unwind_ops); + } return buf; } @@ -1076,24 +1129,23 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) { guint8 *tramp; guint8 *code, *buf; - guint8 *jump_obj_null, *jump_have_waiters, *jump_sync_null, *jump_not_owned, *jump_sync_thin_hash = NULL; + guint8 *jump_obj_null, *jump_have_waiters, *jump_sync_null, *jump_not_owned, *jump_cmpxchg_failed, *jump_sync_thin_hash = NULL; guint8 *jump_next; int tramp_size; - int owner_offset, nest_offset, entry_count_offset; + int status_offset, nest_offset; MonoJumpInfo *ji = NULL; GSList *unwind_ops = NULL; int obj_reg = MONO_AMD64_ARG_REG1; int sync_reg = MONO_AMD64_ARG_REG2; + int status_reg = MONO_AMD64_ARG_REG3; g_assert (obj_reg == MONO_ARCH_MONITOR_OBJECT_REG); - mono_monitor_threads_sync_members_offset (&owner_offset, &nest_offset, &entry_count_offset); - g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (owner_offset) == sizeof (gpointer)); + mono_monitor_threads_sync_members_offset (&status_offset, &nest_offset); + g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (status_offset) == sizeof (guint32)); g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (nest_offset) == sizeof (guint32)); - g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (entry_count_offset) == sizeof (gint32)); - owner_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (owner_offset); + status_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (status_offset); nest_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (nest_offset); - entry_count_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (entry_count_offset); tramp_size = 112; @@ -1133,9 +1185,12 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) /* load MonoInternalThread* into RAX */ code = mono_amd64_emit_tls_get (code, AMD64_RAX, mono_thread_get_tls_offset ()); /* load TID into RAX */ - amd64_mov_reg_membase (code, AMD64_RAX, AMD64_RAX, MONO_STRUCT_OFFSET (MonoInternalThread, tid), 8); + amd64_mov_reg_membase (code, AMD64_RAX, AMD64_RAX, MONO_STRUCT_OFFSET (MonoInternalThread, small_id), 4); /* is synchronization->owner == TID */ - amd64_alu_membase_reg_size (code, X86_CMP, sync_reg, owner_offset, AMD64_RAX, 8); + amd64_mov_reg_membase (code, status_reg, sync_reg, status_offset, 4); + amd64_alu_reg_reg_size (code, X86_XOR, AMD64_RAX, status_reg, 4); + amd64_test_reg_imm_size (code, AMD64_RAX, OWNER_MASK, 4); + /* if no, jump to actual trampoline */ jump_not_owned = code; amd64_branch8 (code, X86_CC_NZ, -1, 1); @@ -1146,13 +1201,23 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) /* if not, jump to next case */ jump_next = code; amd64_branch8 (code, X86_CC_NZ, -1, 1); - /* if yes, is synchronization->entry_count zero? */ - amd64_alu_membase_imm_size (code, X86_CMP, sync_reg, entry_count_offset, 0, 4); + /* if yes, is synchronization->entry_count greater than zero */ + amd64_test_reg_imm_size (code, status_reg, ENTRY_COUNT_WAITERS, 4); /* if not, jump to actual trampoline */ jump_have_waiters = code; amd64_branch8 (code, X86_CC_NZ, -1 , 1); - /* if yes, set synchronization->owner to null and return */ - amd64_mov_membase_imm (code, sync_reg, owner_offset, 0, 8); + /* if yes, try to set synchronization->owner to null and return */ + g_assert (status_reg != AMD64_RAX); + /* old status in RAX */ + amd64_mov_reg_reg (code, AMD64_RAX, status_reg, 4); + /* form new status */ + amd64_alu_reg_imm_size (code, X86_AND, status_reg, ENTRY_COUNT_MASK, 4); + /* compare and exchange */ + amd64_prefix (code, X86_LOCK_PREFIX); + amd64_cmpxchg_membase_reg_size (code, sync_reg, status_offset, status_reg, 4); + /* if not successful, jump to actual trampoline */ + jump_cmpxchg_failed = code; + amd64_branch8 (code, X86_CC_NZ, -1, 1); amd64_ret (code); /* next case: synchronization->nest is not 1 */ @@ -1164,6 +1229,7 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) x86_patch (jump_obj_null, code); x86_patch (jump_have_waiters, code); x86_patch (jump_not_owned, code); + x86_patch (jump_cmpxchg_failed, code); x86_patch (jump_sync_null, code); } @@ -1182,6 +1248,7 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) nacl_global_codeman_validate (&buf, tramp_size, &code); mono_arch_flush_icache (code, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_MONITOR, NULL); g_assert (code - buf <= tramp_size); if (info) @@ -1190,6 +1257,24 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) return buf; } +#else + +gpointer +mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean is_v4, gboolean aot) +{ + g_assert_not_reached (); + return NULL; +} + +gpointer +mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) +{ + g_assert_not_reached (); + return NULL; +} + +#endif + void mono_arch_invalidate_method (MonoJitInfo *ji, void *func, gpointer func_arg) { @@ -1243,6 +1328,7 @@ mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot) } mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); g_assert (code - buf <= tramp_size); if (info) diff --git a/mta-mono/vendor/mono/mini/tramp-arm.c b/mta-mono/vendor/mono/mini/tramp-arm.c index f9e6510..bbc70fc 100644 --- a/mta-mono/vendor/mono/mini/tramp-arm.c +++ b/mta-mono/vendor/mono/mini/tramp-arm.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -461,6 +462,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf /* Flush instruction cache, since we've generated code */ mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); /* Sanity check */ g_assert ((code - buf) <= buf_len); @@ -484,6 +486,7 @@ mono_arch_get_nullified_class_init_trampoline (MonoTrampInfo **info) code = emit_bx (code, ARMREG_LR); mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); if (info) *info = mono_tramp_info_create ("nullified_class_init_trampoline", buf, code - buf, NULL, NULL); @@ -499,7 +502,7 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty guint8 *code, *buf, *tramp; gpointer *constants; #ifndef USE_JUMP_TABLES - guint32 short_branch; + guint32 short_branch = FALSE; #endif guint32 size = SPEC_TRAMP_SIZE; @@ -519,6 +522,7 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty mono_domain_unlock (domain); } else { code = buf = mono_global_codeman_reserve (size); + short_branch = FALSE; } #ifdef USE_JUMP_TABLES @@ -571,6 +575,7 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty /* Flush instruction cache, since we've generated code */ mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_SPECIFIC_TRAMPOLINE, mono_get_generic_trampoline_simple_name (tramp_type)); g_assert ((code - buf) <= size); @@ -617,6 +622,7 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) code += 4; #endif mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, m); g_assert ((code - start) <= size); /*g_print ("unbox trampoline at %d for %s:%s\n", this_pos, m->klass->name, m->name); g_print ("unbox code is at %p for method at %p\n", start, addr);*/ @@ -658,6 +664,7 @@ mono_arch_get_static_rgctx_trampoline (MonoMethod *m, MonoMethodRuntimeGenericCo g_assert ((code - start) <= buf_len); mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); return start; } @@ -779,6 +786,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info } mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); g_assert (code - buf <= tramp_size); @@ -815,6 +823,7 @@ mono_arch_create_general_rgctx_lazy_fetch_trampoline (MonoTrampInfo **info, gboo code = emit_bx (code, ARMREG_R1); mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); g_assert (code - buf <= tramp_size); @@ -889,6 +898,7 @@ mono_arch_create_generic_class_init_trampoline (MonoTrampInfo **info, gboolean a } mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); g_assert (code - buf <= tramp_size); @@ -943,6 +953,7 @@ mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot) code += 4; mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); g_assert (code - buf <= tramp_size); if (info) @@ -1023,7 +1034,7 @@ mono_arch_get_call_target (guint8 *code) /* Should be a 'bl' */ if ((((ins >> 25) & 0x7) == 0x5) && (((ins >> 24) & 0x1) == 0x1)) { #endif - gint32 disp = ((gint32)ins) & 0xffffff; + gint32 disp = ((((gint32)ins) & 0xffffff) << 8) >> 8; guint8 *target = code - 4 + 8 + (disp * 4); return target; @@ -1069,8 +1080,9 @@ mono_arm_get_thumb_plt_entry (guint8 *code) i2 = (s ^ j2) ? 0 : 1; imm32 = (imm11 << 1) | (imm10 << 12) | (i2 << 22) | (i1 << 23); - // FIXME: - g_assert (s == 0); + if (s) + /* Sign extend from 24 bits to 32 bits */ + imm32 = ((gint32)imm32 << 8) >> 8; target = code + imm32; @@ -1098,13 +1110,13 @@ mono_arm_get_thumb_plt_entry (guint8 *code) gpointer mono_arch_get_gsharedvt_arg_trampoline (MonoDomain *domain, gpointer arg, gpointer addr) { - guint8 *code, *start; + guint8 *code, *buf; int buf_len; gpointer *constants; buf_len = 24; - start = code = mono_domain_code_reserve (domain, buf_len); + buf = code = mono_domain_code_reserve (domain, buf_len); /* Similar to the specialized trampoline code */ ARM_PUSH (code, (1 << ARMREG_R0) | (1 << ARMREG_R1) | (1 << ARMREG_R2) | (1 << ARMREG_R3) | (1 << ARMREG_LR)); @@ -1117,12 +1129,13 @@ mono_arch_get_gsharedvt_arg_trampoline (MonoDomain *domain, gpointer arg, gpoint constants [1] = addr; code += 8; - g_assert ((code - start) <= buf_len); + g_assert ((code - buf) <= buf_len); - nacl_domain_code_validate (domain, &start, buf_len, &code); - mono_arch_flush_icache (start, code - start); + nacl_domain_code_validate (domain, &buf, buf_len, &code); + mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); - return start; + return buf; } #else diff --git a/mta-mono/vendor/mono/mini/tramp-ppc.c b/mta-mono/vendor/mono/mini/tramp-ppc.c index 6fac1a1..1b2cc1d 100644 --- a/mta-mono/vendor/mono/mini/tramp-ppc.c +++ b/mta-mono/vendor/mono/mini/tramp-ppc.c @@ -295,44 +295,44 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf if (aot) { code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_get_lmf_addr"); #ifdef PPC_USES_FUNCTION_DESCRIPTOR - ppc_ldptr (code, ppc_r2, sizeof (gpointer), ppc_r11); - ppc_ldptr (code, ppc_r11, 0, ppc_r11); + ppc_ldptr (code, ppc_r2, sizeof (gpointer), ppc_r12); + ppc_ldptr (code, ppc_r12, 0, ppc_r12); #endif - ppc_mtlr (code, ppc_r11); + ppc_mtlr (code, ppc_r12); ppc_blrl (code); } else { - ppc_load_func (code, ppc_r0, mono_get_lmf_addr); - ppc_mtlr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, mono_get_lmf_addr); + ppc_mtlr (code, PPC_CALL_REG); ppc_blrl (code); } /* we build the MonoLMF structure on the stack - see mini-ppc.h - * The pointer to the struct is put in ppc_r11. + * The pointer to the struct is put in ppc_r12. */ - ppc_addi (code, ppc_r11, ppc_sp, STACK - sizeof (MonoLMF)); - ppc_stptr (code, ppc_r3, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); + ppc_addi (code, ppc_r12, ppc_sp, STACK - sizeof (MonoLMF)); + ppc_stptr (code, ppc_r3, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r12); /* new_lmf->previous_lmf = *lmf_addr */ ppc_ldptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); - ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); - /* *(lmf_addr) = r11 */ - ppc_stptr (code, ppc_r11, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); + ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r12); + /* *(lmf_addr) = r12 */ + ppc_stptr (code, ppc_r12, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); /* save method info (it's stored on the stack, so get it first). */ if ((tramp_type == MONO_TRAMPOLINE_JIT) || (tramp_type == MONO_TRAMPOLINE_JUMP)) { ppc_ldr (code, ppc_r0, GREGS_OFFSET, ppc_r1); - ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, method), ppc_r11); + ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, method), ppc_r12); } else { ppc_load (code, ppc_r0, 0); - ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, method), ppc_r11); + ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, method), ppc_r12); } /* store the frame pointer of the calling method */ ppc_addi (code, ppc_r0, ppc_sp, STACK); - ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, ebp), ppc_r11); + ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, ebp), ppc_r12); /* save the IP (caller ip) */ if (tramp_type == MONO_TRAMPOLINE_JUMP) { ppc_li (code, ppc_r0, 0); } else { ppc_ldr (code, ppc_r0, STACK + PPC_RET_ADDR_OFFSET, ppc_r1); } - ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, eip), ppc_r11); + ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, eip), ppc_r12); /* * Now we're ready to call trampoline (mgreg_t *regs, guint8 *code, gpointer value, guint8 *tramp) @@ -356,15 +356,15 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf if (aot) { code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, g_strdup_printf ("trampoline_func_%d", tramp_type)); #ifdef PPC_USES_FUNCTION_DESCRIPTOR - ppc_ldptr (code, ppc_r2, sizeof (gpointer), ppc_r11); - ppc_ldptr (code, ppc_r11, 0, ppc_r11); + ppc_ldptr (code, ppc_r2, sizeof (gpointer), ppc_r12); + ppc_ldptr (code, ppc_r12, 0, ppc_r12); #endif - ppc_mtlr (code, ppc_r11); + ppc_mtlr (code, ppc_r12); ppc_blrl (code); } else { tramp_handler = mono_get_trampoline_func (tramp_type); - ppc_load_func (code, ppc_r0, tramp_handler); - ppc_mtlr (code, ppc_r0); + ppc_load_func (code, PPC_CALL_REG, tramp_handler); + ppc_mtlr (code, PPC_CALL_REG); ppc_blrl (code); } @@ -384,20 +384,20 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf * Now we restore the MonoLMF (see emit_epilogue in mini-ppc.c) * and the rest of the registers, so the method called will see * the same state as before we executed. - * The pointer to MonoLMF is in ppc_r11. + * The pointer to MonoLMF is in ppc_r12. */ - ppc_addi (code, ppc_r11, ppc_r1, STACK - sizeof (MonoLMF)); + ppc_addi (code, ppc_r12, ppc_r1, STACK - sizeof (MonoLMF)); /* r5 = previous_lmf */ - ppc_ldptr (code, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); + ppc_ldptr (code, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r12); /* r6 = lmf_addr */ - ppc_ldptr (code, ppc_r6, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); + ppc_ldptr (code, ppc_r6, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r12); /* *(lmf_addr) = previous_lmf */ ppc_stptr (code, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r6); /* restore iregs */ - ppc_ldr_multiple (code, ppc_r13, G_STRUCT_OFFSET(MonoLMF, iregs), ppc_r11); + ppc_ldr_multiple (code, ppc_r13, G_STRUCT_OFFSET(MonoLMF, iregs), ppc_r12); /* restore fregs */ for (i = 14; i < 32; i++) - ppc_lfd (code, i, G_STRUCT_OFFSET(MonoLMF, fregs) + ((i-14) * sizeof (gdouble)), ppc_r11); + ppc_lfd (code, i, G_STRUCT_OFFSET(MonoLMF, fregs) + ((i-14) * sizeof (gdouble)), ppc_r12); /* restore the volatile registers, we skip r1, of course */ offset = STACK - sizeof (MonoLMF) - (14 * sizeof (double)); @@ -419,8 +419,8 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf */ /* Restore stack pointer and LR and jump to the code */ ppc_ldr (code, ppc_r1, 0, ppc_r1); - ppc_ldr (code, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_r1); - ppc_mtlr (code, ppc_r11); + ppc_ldr (code, ppc_r12, PPC_RET_ADDR_OFFSET, ppc_r1); + ppc_mtlr (code, ppc_r12); if (MONO_TRAMPOLINE_TYPE_MUST_RETURN (tramp_type)) ppc_blr (code); else @@ -591,9 +591,9 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, g_strdup_printf ("specific_trampoline_lazy_fetch_%u", slot)); /* Branch to the trampoline */ #ifdef PPC_USES_FUNCTION_DESCRIPTOR - ppc_ldptr (code, ppc_r11, 0, ppc_r11); + ppc_ldptr (code, ppc_r12, 0, ppc_r12); #endif - ppc_mtctr (code, ppc_r11); + ppc_mtctr (code, ppc_r12); ppc_bcctr (code, PPC_BR_ALWAYS, 0); } else { tramp = mono_arch_create_specific_trampoline (GUINT_TO_POINTER (slot), @@ -653,9 +653,9 @@ mono_arch_create_generic_class_init_trampoline (MonoTrampInfo **info, gboolean a code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "specific_trampoline_generic_class_init"); /* Branch to the trampoline */ #ifdef PPC_USES_FUNCTION_DESCRIPTOR - ppc_ldptr (code, ppc_r11, 0, ppc_r11); + ppc_ldptr (code, ppc_r12, 0, ppc_r12); #endif - ppc_mtctr (code, ppc_r11); + ppc_mtctr (code, ppc_r12); ppc_bcctr (code, PPC_BR_ALWAYS, 0); } else { tramp = mono_arch_create_specific_trampoline (NULL, MONO_TRAMPOLINE_GENERIC_CLASS_INIT, diff --git a/mta-mono/vendor/mono/mini/tramp-s390x.c b/mta-mono/vendor/mono/mini/tramp-s390x.c index fa664e1..e6bbe8c 100644 --- a/mta-mono/vendor/mono/mini/tramp-s390x.c +++ b/mta-mono/vendor/mono/mini/tramp-s390x.c @@ -50,6 +50,7 @@ #include #include #include +#include #include #include "mini.h" @@ -108,6 +109,7 @@ mono_arch_get_unbox_trampoline (MonoMethod *method, gpointer addr) g_assert ((code - start) <= 28); mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, method); return start; } @@ -134,9 +136,6 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr) S390_EMIT_CALL((orig_code - 14), addr); mono_arch_flush_icache (orig_code - 14, 12); } else { -fprintf(stderr, "%p %02x %02x %02x %02x\n", -&orig_code[-14], orig_code[-12], orig_code[-11], orig_code[-6], orig_code[-5]); -fflush(stderr); /* This is the 'brasl' instruction */ orig_code -= 4; displace = ((gssize) addr - (gssize) (orig_code - 2)) / 2; @@ -200,6 +199,9 @@ mono_arch_get_nullified_class_init_trampoline (MonoTrampInfo **info) s390_br (code, s390_r14); + mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); + if (info) *info = mono_tramp_info_create ("nullified_class_init_trampoline", buf, code - buf, NULL, NULL); @@ -402,6 +404,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf /* Flush instruction cache, since we've generated code */ mono_arch_flush_icache (code, buf - code); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); if (info) { tramp_name = mono_get_generic_trampoline_name (tramp_type); @@ -468,6 +471,8 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty /* Flush instruction cache, since we've generated code */ mono_arch_flush_icache (code, buf - code); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_SPECIFIC_TRAMPOLINE, + (void *) mono_get_generic_trampoline_simple_name (tramp_type)); /* Sanity check */ g_assert ((buf - code) <= SPECIFIC_TRAMPOLINE_SIZE); @@ -583,6 +588,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info s390_jg (code, displace); mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); g_assert (code - buf <= tramp_size); @@ -631,6 +637,7 @@ mono_arch_get_static_rgctx_trampoline (MonoMethod *m, g_assert ((code - start) < buf_len); mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); return(start); } @@ -701,6 +708,7 @@ mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot) } mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); g_assert (code - buf <= tramp_size); if (info) diff --git a/mta-mono/vendor/mono/mini/tramp-x86.c b/mta-mono/vendor/mono/mini/tramp-x86.c index 4b3b5b6..3b29b4d 100644 --- a/mta-mono/vendor/mono/mini/tramp-x86.c +++ b/mta-mono/vendor/mono/mini/tramp-x86.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -51,6 +52,7 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) g_assert ((code - start) < size); nacl_domain_code_validate (domain, &start, size, &code); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, m); return start; } @@ -73,6 +75,7 @@ mono_arch_get_static_rgctx_trampoline (MonoMethod *m, MonoMethodRuntimeGenericCo nacl_domain_code_validate (domain, &start, buf_len, &code); mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); return start; } @@ -103,6 +106,7 @@ mono_arch_get_llvm_imt_trampoline (MonoDomain *domain, MonoMethod *m, int vt_off nacl_domain_code_validate (domain, &start, buf_len, &code); mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, NULL); return start; } @@ -489,6 +493,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf nacl_global_codeman_validate (&buf, 256, &code); g_assert ((code - buf) <= 256); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); if (info) { tramp_name = mono_get_generic_trampoline_name (tramp_type); @@ -511,6 +516,7 @@ mono_arch_get_nullified_class_init_trampoline (MonoTrampInfo **info) nacl_global_codeman_validate (&buf, tramp_size, &code); mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); if (info) *info = mono_tramp_info_create ("nullified_class_init_trampoline", buf, code - buf, NULL, NULL); @@ -536,6 +542,7 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty nacl_domain_code_validate (domain, &code, NACL_SIZE (4, kNaClAlignment), &buf); mono_arch_flush_icache (code, buf - code); + mono_profiler_code_buffer_new (code, buf - code, MONO_PROFILER_CODE_BUFFER_SPECIFIC_TRAMPOLINE, mono_get_generic_trampoline_simple_name (tramp_type)); if (code_len) *code_len = buf - code; @@ -635,6 +642,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info nacl_global_codeman_validate (&buf, tramp_size, &code); mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); g_assert (code - buf <= tramp_size); @@ -680,6 +688,7 @@ mono_arch_create_general_rgctx_lazy_fetch_trampoline (MonoTrampInfo **info, gboo nacl_global_codeman_validate (&buf, tramp_size, &code); mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); g_assert (code - buf <= tramp_size); @@ -739,6 +748,7 @@ mono_arch_create_generic_class_init_trampoline (MonoTrampInfo **info, gboolean a #endif nacl_global_codeman_validate (&buf, tramp_size, &code); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); if (info) *info = mono_tramp_info_create ("generic_class_init_trampoline", buf, code - buf, ji, unwind_ops); @@ -766,29 +776,42 @@ mono_arch_create_generic_class_init_trampoline (MonoTrampInfo **info, gboolean a * */ gpointer -mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot) +mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean is_v4, gboolean aot) { - guint8 *tramp = mono_get_trampoline_code (MONO_TRAMPOLINE_MONITOR_ENTER); guint8 *code, *buf; guint8 *jump_obj_null, *jump_sync_null, *jump_other_owner, *jump_cmpxchg_failed, *jump_tid, *jump_sync_thin_hash = NULL; + guint8 *jump_lock_taken_true = NULL; int tramp_size; - int owner_offset, nest_offset, dummy; + int status_offset, nest_offset; MonoJumpInfo *ji = NULL; GSList *unwind_ops = NULL; g_assert (MONO_ARCH_MONITOR_OBJECT_REG == X86_EAX); +#ifdef MONO_ARCH_MONITOR_LOCK_TAKEN_REG + g_assert (MONO_ARCH_MONITOR_LOCK_TAKEN_REG == X86_EDX); +#else + g_assert (!is_v4); +#endif - mono_monitor_threads_sync_members_offset (&owner_offset, &nest_offset, &dummy); - g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (owner_offset) == sizeof (gpointer)); + mono_monitor_threads_sync_members_offset (&status_offset, &nest_offset); + g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (status_offset) == sizeof (guint32)); g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (nest_offset) == sizeof (guint32)); - owner_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (owner_offset); + status_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (status_offset); nest_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (nest_offset); - tramp_size = NACL_SIZE (96, 128); + tramp_size = NACL_SIZE (128, 192); code = buf = mono_global_codeman_reserve (tramp_size); + x86_push_reg (code, X86_EAX); if (mono_thread_get_tls_offset () != -1) { + if (is_v4) { + x86_test_membase_imm (code, X86_EDX, 0, 1); + /* if *lock_taken is 1, jump to actual trampoline */ + jump_lock_taken_true = code; + x86_branch8 (code, X86_CC_NZ, -1, 1); + x86_push_reg (code, X86_EDX); + } /* MonoObject* obj is in EAX */ /* is obj null? */ x86_test_reg_reg (code, X86_EAX, X86_EAX); @@ -828,77 +851,92 @@ mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot) code = mono_x86_emit_tls_get (code, X86_EDX, mono_thread_get_tls_offset ()); } /* load TID into EDX */ - x86_mov_reg_membase (code, X86_EDX, X86_EDX, MONO_STRUCT_OFFSET (MonoInternalThread, tid), 4); + x86_mov_reg_membase (code, X86_EDX, X86_EDX, MONO_STRUCT_OFFSET (MonoInternalThread, small_id), 4); - /* is synchronization->owner null? */ - x86_alu_membase_imm (code, X86_CMP, X86_ECX, owner_offset, 0); + /* is synchronization->owner free */ + x86_mov_reg_membase (code, X86_EAX, X86_ECX, status_offset, 4); + x86_test_reg_imm (code, X86_EAX, OWNER_MASK); /* if not, jump to next case */ jump_tid = code; x86_branch8 (code, X86_CC_NZ, -1, 1); /* if yes, try a compare-exchange with the TID */ - /* free up register EAX, needed for the zero */ - x86_push_reg (code, X86_EAX); - /* zero EAX */ - x86_alu_reg_reg (code, X86_XOR, X86_EAX, X86_EAX); + /* Form new status */ + x86_alu_reg_reg (code, X86_OR, X86_EDX, X86_EAX); /* compare and exchange */ x86_prefix (code, X86_LOCK_PREFIX); - x86_cmpxchg_membase_reg (code, X86_ECX, owner_offset, X86_EDX); + x86_cmpxchg_membase_reg (code, X86_ECX, status_offset, X86_EDX); /* if not successful, jump to actual trampoline */ jump_cmpxchg_failed = code; x86_branch8 (code, X86_CC_NZ, -1, 1); /* if successful, pop and return */ + if (is_v4) { + x86_pop_reg (code, X86_EDX); + x86_mov_membase_imm (code, X86_EDX, 0, 1, 1); + } x86_pop_reg (code, X86_EAX); x86_ret (code); /* next case: synchronization->owner is not null */ x86_patch (jump_tid, code); /* is synchronization->owner == TID? */ - x86_alu_membase_reg (code, X86_CMP, X86_ECX, owner_offset, X86_EDX); + x86_alu_reg_imm (code, X86_AND, X86_EAX, OWNER_MASK); + x86_alu_reg_reg (code, X86_CMP, X86_EAX, X86_EDX); /* if not, jump to actual trampoline */ jump_other_owner = code; x86_branch8 (code, X86_CC_NZ, -1, 1); /* if yes, increment nest */ x86_inc_membase (code, X86_ECX, nest_offset); + if (is_v4) { + x86_pop_reg (code, X86_EDX); + x86_mov_membase_imm (code, X86_EDX, 0, 1, 1); + } + x86_pop_reg (code, X86_EAX); /* return */ x86_ret (code); - /* push obj */ + /* obj is pushed, jump to the actual trampoline */ x86_patch (jump_obj_null, code); if (jump_sync_thin_hash) x86_patch (jump_sync_thin_hash, code); x86_patch (jump_sync_null, code); x86_patch (jump_other_owner, code); - x86_push_reg (code, X86_EAX); - /* jump to the actual trampoline */ x86_patch (jump_cmpxchg_failed, code); - if (aot) { - /* We are calling the generic trampoline directly, the argument is pushed - * on the stack just like a specific trampoline. - */ - code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "generic_trampoline_monitor_enter"); - x86_jump_reg (code, X86_EAX); - } else { - x86_jump_code (code, tramp); + + if (is_v4) { + x86_pop_reg (code, X86_EDX); + x86_patch (jump_lock_taken_true, code); } + } + + if (aot) { + /* We are calling the generic trampoline directly, the argument is pushed + * on the stack just like a specific trampoline. + */ + if (is_v4) + code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "generic_trampoline_monitor_enter_v4"); + else + code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "generic_trampoline_monitor_enter"); + x86_jump_reg (code, X86_EAX); } else { - /* push obj and jump to the actual trampoline */ - x86_push_reg (code, X86_EAX); - if (aot) { - code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "generic_trampoline_monitor_enter"); - x86_jump_reg (code, X86_EAX); - } else { - x86_jump_code (code, tramp); - } + if (is_v4) + x86_jump_code (code, mono_get_trampoline_code (MONO_TRAMPOLINE_MONITOR_ENTER_V4)); + else + x86_jump_code (code, mono_get_trampoline_code (MONO_TRAMPOLINE_MONITOR_ENTER)); } mono_arch_flush_icache (buf, code - buf); g_assert (code - buf <= tramp_size); nacl_global_codeman_validate (&buf, tramp_size, &code); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_MONITOR, NULL); - if (info) - *info = mono_tramp_info_create ("monitor_enter_trampoline", buf, code - buf, ji, unwind_ops); + if (info) { + if (is_v4) + *info = mono_tramp_info_create ("monitor_enter_v4_trampoline", buf, code - buf, ji, unwind_ops); + else + *info = mono_tramp_info_create ("monitor_enter_trampoline", buf, code - buf, ji, unwind_ops); + } return buf; } @@ -909,26 +947,25 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) guint8 *tramp = mono_get_trampoline_code (MONO_TRAMPOLINE_MONITOR_EXIT); guint8 *code, *buf; guint8 *jump_obj_null, *jump_have_waiters, *jump_sync_null, *jump_not_owned, *jump_sync_thin_hash = NULL; - guint8 *jump_next; + guint8 *jump_next, *jump_cmpxchg_failed; int tramp_size; - int owner_offset, nest_offset, entry_count_offset; + int status_offset, nest_offset; MonoJumpInfo *ji = NULL; GSList *unwind_ops = NULL; g_assert (MONO_ARCH_MONITOR_OBJECT_REG == X86_EAX); - mono_monitor_threads_sync_members_offset (&owner_offset, &nest_offset, &entry_count_offset); - g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (owner_offset) == sizeof (gpointer)); + mono_monitor_threads_sync_members_offset (&status_offset, &nest_offset); + g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (status_offset) == sizeof (guint32)); g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (nest_offset) == sizeof (guint32)); - g_assert (MONO_THREADS_SYNC_MEMBER_SIZE (entry_count_offset) == sizeof (gint32)); - owner_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (owner_offset); + status_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (status_offset); nest_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (nest_offset); - entry_count_offset = MONO_THREADS_SYNC_MEMBER_OFFSET (entry_count_offset); - tramp_size = NACL_SIZE (96, 128); + tramp_size = NACL_SIZE (128, 192); code = buf = mono_global_codeman_reserve (tramp_size); + x86_push_reg (code, X86_EAX); if (mono_thread_get_tls_offset () != -1) { /* MonoObject* obj is in EAX */ /* is obj null? */ @@ -969,9 +1006,11 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) code = mono_x86_emit_tls_get (code, X86_EDX, mono_thread_get_tls_offset ()); } /* load TID into EDX */ - x86_mov_reg_membase (code, X86_EDX, X86_EDX, MONO_STRUCT_OFFSET (MonoInternalThread, tid), 4); + x86_mov_reg_membase (code, X86_EDX, X86_EDX, MONO_STRUCT_OFFSET (MonoInternalThread, small_id), 4); /* is synchronization->owner == TID */ - x86_alu_membase_reg (code, X86_CMP, X86_ECX, owner_offset, X86_EDX); + x86_mov_reg_membase (code, X86_EAX, X86_ECX, status_offset, 4); + x86_alu_reg_reg (code, X86_XOR, X86_EDX, X86_EAX); + x86_test_reg_imm (code, X86_EDX, OWNER_MASK); /* if no, jump to actual trampoline */ jump_not_owned = code; x86_branch8 (code, X86_CC_NZ, -1, 1); @@ -982,19 +1021,30 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) /* if not, jump to next case */ jump_next = code; x86_branch8 (code, X86_CC_NZ, -1, 1); - /* if yes, is synchronization->entry_count zero? */ - x86_alu_membase_imm (code, X86_CMP, X86_ECX, entry_count_offset, 0); - /* if not, jump to actual trampoline */ + /* if yes, is synchronization->entry_count greater than zero? */ + x86_test_reg_imm (code, X86_EAX, ENTRY_COUNT_WAITERS); + /* if yes, jump to actual trampoline */ jump_have_waiters = code; x86_branch8 (code, X86_CC_NZ, -1 , 1); - /* if yes, set synchronization->owner to null and return */ - x86_mov_membase_imm (code, X86_ECX, owner_offset, 0, 4); + /* if not, try to set synchronization->owner to null and return */ + x86_mov_reg_reg (code, X86_EDX, X86_EAX, 4); + x86_alu_reg_imm (code, X86_AND, X86_EDX, ENTRY_COUNT_MASK); + /* compare and exchange */ + x86_prefix (code, X86_LOCK_PREFIX); + /* EAX contains the previous status */ + x86_cmpxchg_membase_reg (code, X86_ECX, status_offset, X86_EDX); + /* if not successful, jump to actual trampoline */ + jump_cmpxchg_failed = code; + x86_branch8 (code, X86_CC_NZ, -1, 1); + + x86_pop_reg (code, X86_EAX); x86_ret (code); /* next case: synchronization->nest is not 1 */ x86_patch (jump_next, code); /* decrease synchronization->nest and return */ x86_dec_membase (code, X86_ECX, nest_offset); + x86_pop_reg (code, X86_EAX); x86_ret (code); /* push obj and jump to the actual trampoline */ @@ -1002,12 +1052,12 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) if (jump_sync_thin_hash) x86_patch (jump_sync_thin_hash, code); x86_patch (jump_have_waiters, code); + x86_patch (jump_cmpxchg_failed, code); x86_patch (jump_not_owned, code); x86_patch (jump_sync_null, code); } - /* push obj and jump to the actual trampoline */ - x86_push_reg (code, X86_EAX); + /* obj is pushed, jump to the actual trampoline */ if (aot) { code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "generic_trampoline_monitor_exit"); x86_jump_reg (code, X86_EAX); @@ -1019,6 +1069,7 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) mono_arch_flush_icache (buf, code - buf); g_assert (code - buf <= tramp_size); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_MONITOR, NULL); if (info) *info = mono_tramp_info_create ("monitor_exit_trampoline", buf, code - buf, ji, unwind_ops); @@ -1029,7 +1080,7 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot) #else gpointer -mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot) +mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean is_v4, gboolean aot) { g_assert_not_reached (); return NULL; @@ -1101,6 +1152,7 @@ mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot) nacl_global_codeman_validate (&buf, tramp_size, &code); mono_arch_flush_icache (buf, code - buf); + mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); g_assert (code - buf <= tramp_size); if (info) @@ -1149,6 +1201,7 @@ mono_arch_get_gsharedvt_arg_trampoline (MonoDomain *domain, gpointer arg, gpoint nacl_domain_code_validate (domain, &start, buf_len, &code); mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); return start; } diff --git a/mta-mono/vendor/mono/mini/xdebug.c b/mta-mono/vendor/mono/mini/xdebug.c index 167b2b9..10f73de 100644 --- a/mta-mono/vendor/mono/mini/xdebug.c +++ b/mta-mono/vendor/mono/mini/xdebug.c @@ -290,7 +290,8 @@ mono_save_xdebug_info (MonoCompile *cfg) xdebug_method_count ++; dmji = mono_debug_find_method (jinfo_get_method (cfg->jit_info), mono_domain_get ());; - mono_dwarf_writer_emit_method (xdebug_writer, cfg, jinfo_get_method (cfg->jit_info), NULL, NULL, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, dmji); + mono_dwarf_writer_emit_method (xdebug_writer, cfg, jinfo_get_method (cfg->jit_info), NULL, NULL, NULL, + cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, dmji); mono_debug_free_method_jit_info (dmji); #if 0 @@ -319,7 +320,8 @@ mono_save_xdebug_info (MonoCompile *cfg) mono_loader_lock (); dmji = mono_debug_find_method (jinfo_get_method (cfg->jit_info), mono_domain_get ()); - mono_dwarf_writer_emit_method (xdebug_writer, cfg, jinfo_get_method (cfg->jit_info), NULL, NULL, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, dmji); + mono_dwarf_writer_emit_method (xdebug_writer, cfg, jinfo_get_method (cfg->jit_info), NULL, NULL, NULL, + cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, dmji); mono_debug_free_method_jit_info (dmji); fflush (xdebug_fp); mono_loader_unlock (); diff --git a/mta-mono/vendor/mono/utils/Makefile.am b/mta-mono/vendor/mono/utils/Makefile.am index c2c8a0d..8003b56 100644 --- a/mta-mono/vendor/mono/utils/Makefile.am +++ b/mta-mono/vendor/mono/utils/Makefile.am @@ -1,6 +1,6 @@ noinst_LTLIBRARIES = libmonoutils.la -AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/mono $(LIBGC_CPPFLAGS) $(GLIB_CFLAGS) +AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/mono $(LIBGC_CPPFLAGS) $(GLIB_CFLAGS) $(SHARED_CFLAGS) if ENABLE_DTRACE @@ -22,6 +22,9 @@ monoutils_sources = \ mono-counters.c \ mono-compiler.h \ mono-dl.c \ + mono-dl-windows.c \ + mono-dl-darwin.c \ + mono-dl-posix.c \ mono-dl.h \ mono-internal-hash.c \ mono-internal-hash.h \ @@ -119,7 +122,15 @@ monoutils_sources = \ mono-conc-hashtable.h \ mono-conc-hashtable.c \ sha1.h \ - sha1.c + sha1.c \ + json.h \ + json.c \ + networking.c \ + networking-posix.c \ + networking-fallback.c \ + networking-missing.c \ + networking-windows.c \ + networking.h arch_sources = diff --git a/mta-mono/vendor/mono/utils/gc_wrapper.h b/mta-mono/vendor/mono/utils/gc_wrapper.h index 6da0fb2..504e599 100644 --- a/mta-mono/vendor/mono/utils/gc_wrapper.h +++ b/mta-mono/vendor/mono/utils/gc_wrapper.h @@ -69,7 +69,6 @@ /* pthread function wrappers */ #include -#include int mono_gc_pthread_create (pthread_t *new_thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); int mono_gc_pthread_join (pthread_t thread, void **retval); diff --git a/mta-mono/vendor/mono/utils/json.c b/mta-mono/vendor/mono/utils/json.c new file mode 100644 index 0000000..4de3e9f --- /dev/null +++ b/mta-mono/vendor/mono/utils/json.c @@ -0,0 +1,104 @@ +/* + * json.c: JSON writer + * + * Author: + * Joao Matos (joao.matos@xamarin.com) + * + * Copyright 2015 Xamarin Inc (http://www.xamarin.com) + */ + +#include + +void json_writer_init (JsonWriter* writer) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + + writer->text = g_string_new (""); + writer->indent = 0; +} + +void json_writer_destroy (JsonWriter* writer) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + g_string_free (writer->text, /*free_segment=*/TRUE); +} + +void json_writer_indent_push(JsonWriter* writer) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + writer->indent += JSON_INDENT_VALUE; +} + +void json_writer_indent_pop(JsonWriter* writer) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + writer->indent -= JSON_INDENT_VALUE; +} + +void json_writer_indent(JsonWriter* writer) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + + int i = 0; + for (i = 0; i < writer->indent; ++i) + g_string_append_c (writer->text, ' '); +} + +void json_writer_vprintf(JsonWriter* writer, const gchar *format, va_list args) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + g_string_append_vprintf (writer->text, format, args); +} + +void json_writer_printf(JsonWriter* writer, const gchar *format, ...) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + + va_list args; + va_start (args, format); + + g_string_append_vprintf (writer->text, format, args); + + va_end (args); +} + +void json_writer_array_begin(JsonWriter* writer) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + g_string_append_printf (writer->text, "[\n"); + writer->indent += JSON_INDENT_VALUE; +} + +void json_writer_array_end(JsonWriter* writer) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + g_string_append_printf (writer->text, "]"); + writer->indent -= JSON_INDENT_VALUE; +} + +void json_writer_object_begin(JsonWriter* writer) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + json_writer_printf (writer, "{\n"); + writer->indent += JSON_INDENT_VALUE; +} + +void json_writer_object_end(JsonWriter* writer) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + json_writer_printf (writer, "}"); +} + +void json_writer_object_key(JsonWriter* writer, const gchar* format, ...) +{ + g_assert (writer && "Expected a valid JSON writer instance"); + + va_list args; + va_start (args, format); + + g_string_append_printf (writer->text, "\""); + json_writer_vprintf (writer, format, args); + g_string_append_printf (writer->text, "\" : "); + + va_end (args); +} diff --git a/mta-mono/vendor/mono/utils/json.h b/mta-mono/vendor/mono/utils/json.h new file mode 100644 index 0000000..5e5a06a --- /dev/null +++ b/mta-mono/vendor/mono/utils/json.h @@ -0,0 +1,35 @@ +/* + * json.h: JSON writer + * + * Author: + * Joao Matos (joao.matos@xamarin.com) + * + * Copyright 2015 Xamarin Inc (http://www.xamarin.com) + */ + +#ifndef __MONO_UTILS_JSON_H__ +#define __MONO_UTILS_JSON_H__ + + #include + +#define JSON_INDENT_VALUE 2 + +typedef struct JsonWriter { + GString* text; + int indent; +} JsonWriter; + +void json_writer_init (JsonWriter* writer); +void json_writer_destroy (JsonWriter* writer); +void json_writer_indent(JsonWriter* writer); +void json_writer_indent_push(JsonWriter* writer); +void json_writer_indent_pop(JsonWriter* writer); +void json_writer_vprintf(JsonWriter* writer, const gchar *format, va_list args); +void json_writer_printf(JsonWriter* writer, const gchar *format, ...); +void json_writer_array_begin(JsonWriter* writer); +void json_writer_array_end(JsonWriter* writer); +void json_writer_object_begin(JsonWriter* writer); +void json_writer_object_end(JsonWriter* writer); +void json_writer_object_key(JsonWriter* writer, const gchar* format, ...); + +#endif diff --git a/mta-mono/vendor/mono/utils/mach-support.c b/mta-mono/vendor/mono/utils/mach-support.c index 5adc0c9..19e745f 100644 --- a/mta-mono/vendor/mono/utils/mach-support.c +++ b/mta-mono/vendor/mono/utils/mach-support.c @@ -16,9 +16,6 @@ #include #include -#include -#include -#include #include #include "mach-support.h" diff --git a/mta-mono/vendor/mono/utils/memcheck.h b/mta-mono/vendor/mono/utils/memcheck.h index fcc7644..2740578 100644 --- a/mta-mono/vendor/mono/utils/memcheck.h +++ b/mta-mono/vendor/mono/utils/memcheck.h @@ -13,7 +13,7 @@ This file is part of MemCheck, a heavyweight Valgrind tool for detecting memory errors. - Copyright (C) 2000-2012 Julian Seward. All rights reserved. + Copyright (C) 2000-2013 Julian Seward. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -96,6 +96,9 @@ typedef /* Not next to VG_USERREQ__COUNT_LEAKS because it was added later. */ VG_USERREQ__COUNT_LEAK_BLOCKS, + VG_USERREQ__ENABLE_ADDR_ERROR_REPORTING_IN_RANGE, + VG_USERREQ__DISABLE_ADDR_ERROR_REPORTING_IN_RANGE, + /* This is just for memcheck's internal use - don't use it */ _VG_USERREQ__MEMCHECK_RECORD_OVERLAP_ERROR = VG_USERREQ_TOOL_BASE('M','C') + 256 @@ -283,5 +286,17 @@ typedef (const char*)(zzvbits), \ (zznbytes), 0, 0 ) +/* Disable and re-enable reporting of addressing errors in the + specified address range. */ +#define VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__DISABLE_ADDR_ERROR_REPORTING_IN_RANGE, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +#define VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__ENABLE_ADDR_ERROR_REPORTING_IN_RANGE, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + #endif diff --git a/mta-mono/vendor/mono/utils/mono-codeman.c b/mta-mono/vendor/mono/utils/mono-codeman.c index 5c2a83b..f027e0f 100644 --- a/mta-mono/vendor/mono/utils/mono-codeman.c +++ b/mta-mono/vendor/mono/utils/mono-codeman.c @@ -529,15 +529,21 @@ new_codechunk (CodeChunk *last, int dynamic, int size) } } #ifdef BIND_ROOM - bsize = chunk_size / BIND_ROOM; + if (dynamic) + /* Reserve more space since there are no other chunks we might use if this one gets full */ + bsize = (chunk_size * 2) / BIND_ROOM; + else + bsize = chunk_size / BIND_ROOM; if (bsize < MIN_BSIZE) bsize = MIN_BSIZE; bsize += MIN_ALIGN -1; bsize &= ~ (MIN_ALIGN - 1); if (chunk_size - size < bsize) { chunk_size = size + bsize; - chunk_size += pagesize - 1; - chunk_size &= ~ (pagesize - 1); + if (!dynamic) { + chunk_size += pagesize - 1; + chunk_size &= ~ (pagesize - 1); + } } #endif diff --git a/mta-mono/vendor/mono/utils/mono-compiler.h b/mta-mono/vendor/mono/utils/mono-compiler.h index bad994c..51d3a4f 100644 --- a/mta-mono/vendor/mono/utils/mono-compiler.h +++ b/mta-mono/vendor/mono/utils/mono-compiler.h @@ -7,13 +7,19 @@ */ #include +#ifdef __GNUC__ +#define MONO_ATTR_USED __attribute__ ((used)) +#else +#define MONO_ATTR_USED +#endif + #ifdef HAVE_KW_THREAD #define MONO_HAVE_FAST_TLS #define MONO_FAST_TLS_SET(x,y) x = y #define MONO_FAST_TLS_GET(x) x #define MONO_FAST_TLS_INIT(x) -#define MONO_FAST_TLS_DECLARE(x) static __thread gpointer x MONO_TLS_FAST; +#define MONO_FAST_TLS_DECLARE(x) static __thread gpointer x MONO_TLS_FAST MONO_ATTR_USED; #if HAVE_TLS_MODEL_ATTR @@ -171,7 +177,7 @@ #define MONO_FAST_TLS_DECLARE(x) static pthread_key_t x; #define MONO_THREAD_VAR_OFFSET(x,y) ({ \ - typeof(x) _x = (x); \ + __typeof__(x) _x = (x); \ pthread_key_t _y; \ (void) (&_x == &_y); \ y = (gint32) x; }) @@ -238,7 +244,7 @@ typedef SSIZE_T ssize_t; #if !defined(_MSC_VER) && !defined(PLATFORM_SOLARIS) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(MONOTOUCH) && HAVE_VISIBILITY_HIDDEN #define MONO_INTERNAL __attribute__ ((visibility ("hidden"))) #if MONO_LLVM_LOADED -#define MONO_LLVM_INTERNAL +#define MONO_LLVM_INTERNAL MONO_API #else #define MONO_LLVM_INTERNAL MONO_INTERNAL #endif @@ -269,5 +275,11 @@ typedef SSIZE_T ssize_t; #define MONO_NEVER_INLINE #endif +#ifdef __GNUC__ +#define MONO_COLD __attribute__((cold)) +#else +#define MONO_COLD __attribute__((cold)) +#endif + #endif /* __UTILS_MONO_COMPILER_H__*/ diff --git a/mta-mono/vendor/mono/utils/mono-context.c b/mta-mono/vendor/mono/utils/mono-context.c index c52d044..0db9dce 100644 --- a/mta-mono/vendor/mono/utils/mono-context.c +++ b/mta-mono/vendor/mono/utils/mono-context.c @@ -421,4 +421,31 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) } } +#elif (((defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__)) && !defined(MONO_CROSS_COMPILE))) || (defined(TARGET_POWERPC)) + +#include +#include + +void +mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) +{ + os_ucontext *uc = sigctx; + + mctx->sc_ir = UCONTEXT_REG_NIP(uc); + mctx->sc_sp = UCONTEXT_REG_Rn(uc, 1); + memcpy (&mctx->regs, &UCONTEXT_REG_Rn(uc, 13), sizeof (mgreg_t) * MONO_SAVED_GREGS); + memcpy (&mctx->fregs, &UCONTEXT_REG_FPRn(uc, 14), sizeof (double) * MONO_SAVED_FREGS); +} + +void +mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) +{ + os_ucontext *uc = sigctx; + + UCONTEXT_REG_NIP(uc) = mctx->sc_ir; + UCONTEXT_REG_Rn(uc, 1) = mctx->sc_sp; + memcpy (&UCONTEXT_REG_Rn(uc, 13), &mctx->regs, sizeof (mgreg_t) * MONO_SAVED_GREGS); + memcpy (&UCONTEXT_REG_FPRn(uc, 14), &mctx->fregs, sizeof (double) * MONO_SAVED_FREGS); +} + #endif /* #if defined(__i386__) */ diff --git a/mta-mono/vendor/mono/utils/mono-context.h b/mta-mono/vendor/mono/utils/mono-context.h index 3b01b49..ad56e2c 100644 --- a/mta-mono/vendor/mono/utils/mono-context.h +++ b/mta-mono/vendor/mono/utils/mono-context.h @@ -30,7 +30,9 @@ /*HACK, move this to an eventual mono-signal.c*/ #if defined( __linux__) || defined(__sun) || defined(__APPLE__) || defined(__NetBSD__) || \ defined(__FreeBSD__) || defined(__OpenBSD__) -#define MONO_SIGNAL_USE_SIGACTION +#ifdef HAVE_SIGACTION +#define MONO_SIGNAL_USE_SIGACTION 1 +#endif #endif #if defined(__native_client__) @@ -148,7 +150,9 @@ typedef struct { #if !defined( HOST_WIN32 ) && !defined(__native_client__) && !defined(__native_client_codegen__) +#ifdef HAVE_SIGACTION #define MONO_SIGNAL_USE_SIGACTION 1 +#endif #endif @@ -460,6 +464,8 @@ mono_ia64_context_get_fp (MonoContext *ctx) #elif ((defined(__mips__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_MIPS))) && SIZEOF_REGISTER == 4 /* defined(__ia64__) */ +#include + typedef struct { mgreg_t sc_pc; mgreg_t sc_regs [32]; diff --git a/mta-mono/vendor/mono/utils/mono-counters.c b/mta-mono/vendor/mono/utils/mono-counters.c index 8ab2014..effc17c 100644 --- a/mta-mono/vendor/mono/utils/mono-counters.c +++ b/mta-mono/vendor/mono/utils/mono-counters.c @@ -8,6 +8,7 @@ #include "config.h" #include "mono-counters.h" #include "mono-proclib.h" +#include "mono-mutex.h" #ifdef HAVE_UNISTD_H #include @@ -22,9 +23,17 @@ struct _MonoCounter { }; static MonoCounter *counters = NULL; +static mono_mutex_t counters_mutex; + +static volatile gboolean initialized = FALSE; + static int valid_mask = 0; static int set_mask = 0; +static GSList *register_callbacks = NULL; + +static void initialize_system_counters (void); + /** * mono_counter_get_variance: * @counter: counter to get the variance @@ -123,6 +132,68 @@ mono_counters_enable (int section_mask) valid_mask = section_mask & MONO_COUNTER_SECTION_MASK; } +void +mono_counters_init (void) +{ + if (initialized) + return; + + mono_mutex_init (&counters_mutex); + + initialize_system_counters (); + + initialized = TRUE; +} + +static void +register_internal (const char *name, int type, void *addr, int size) +{ + MonoCounter *counter; + GSList *register_callback; + + g_assert (size >= 0); + if ((type & MONO_COUNTER_VARIANCE_MASK) == 0) + type |= MONO_COUNTER_MONOTONIC; + + mono_mutex_lock (&counters_mutex); + + for (counter = counters; counter; counter = counter->next) { + if (counter->addr == addr) { + g_warning ("you are registering twice the same counter address"); + mono_mutex_unlock (&counters_mutex); + return; + } + } + + counter = malloc (sizeof (MonoCounter)); + if (!counter) { + mono_mutex_unlock (&counters_mutex); + return; + } + counter->name = g_strdup (name); + counter->type = type; + counter->addr = addr; + counter->next = NULL; + counter->size = size; + + set_mask |= type; + + /* Append */ + if (counters) { + MonoCounter *item = counters; + while (item->next) + item = item->next; + item->next = counter; + } else { + counters = counter; + } + + for (register_callback = register_callbacks; register_callback; register_callback = register_callback->next) + ((MonoCounterRegisterCallback)register_callback->data) (counter); + + mono_mutex_unlock (&counters_mutex); +} + /** * mono_counters_register: * @name: The name for this counters. @@ -170,7 +241,11 @@ mono_counters_register (const char* name, int type, void *addr) default: g_assert_not_reached (); } - mono_counters_register_with_size (name, type, addr, size); + + if (!initialized) + g_debug ("counters not enabled"); + else + register_internal (name, type, addr, size); } /** @@ -196,33 +271,29 @@ mono_counters_register (const char* name, int type, void *addr) void mono_counters_register_with_size (const char *name, int type, void *addr, int size) { - MonoCounter *counter; + if (!initialized) + g_debug ("counters not enabled"); + else + register_internal (name, type, addr, size); +} - if ((type & MONO_COUNTER_VARIANCE_MASK) == 0) - type |= MONO_COUNTER_MONOTONIC; - if (size < 0) - size = 0; - - counter = malloc (sizeof (MonoCounter)); - if (!counter) +/** + * mono_counters_on_register + * @callback : function to callback when a counter is registered + * + * Add a callback that is going to be called when a counter is registered + */ +void +mono_counters_on_register (MonoCounterRegisterCallback callback) +{ + if (!initialized) { + g_debug ("counters not enabled"); return; - counter->name = name; - counter->type = type; - counter->addr = addr; - counter->next = NULL; - counter->size = size; - - set_mask |= type; - - /* Append */ - if (counters) { - MonoCounter *item = counters; - while (item->next) - item = item->next; - item->next = counter; - } else { - counters = counter; } + + mono_mutex_lock (&counters_mutex); + register_callbacks = g_slist_append (register_callbacks, callback); + mono_mutex_unlock (&counters_mutex); } typedef int (*IntFunc) (void); @@ -233,45 +304,6 @@ typedef gssize (*PtrFunc) (void); typedef double (*DoubleFunc) (void); typedef char* (*StrFunc) (void); -#define ENTRY_FMT "%-36s: " -static void -dump_counter (MonoCounter *counter, FILE *outfile) { - void *buffer = g_malloc0 (counter->size); - mono_counters_sample (counter, buffer, counter->size); - - switch (counter->type & MONO_COUNTER_TYPE_MASK) { - case MONO_COUNTER_INT: - fprintf (outfile, ENTRY_FMT "%d\n", counter->name, *(int*)buffer); - break; - case MONO_COUNTER_UINT: - fprintf (outfile, ENTRY_FMT "%u\n", counter->name, *(guint*)buffer); - break; - case MONO_COUNTER_LONG: - if ((counter->type & MONO_COUNTER_UNIT_MASK) == MONO_COUNTER_TIME) - fprintf (outfile, ENTRY_FMT "%.2f ms\n", counter->name, (double)(*(gint64*)buffer) / 10000.0); - else - fprintf (outfile, ENTRY_FMT "%lld\n", counter->name, *(long long *)buffer); - break; - case MONO_COUNTER_ULONG: - fprintf (outfile, ENTRY_FMT "%llu\n", counter->name, *(unsigned long long *)buffer); - break; - case MONO_COUNTER_WORD: - fprintf (outfile, ENTRY_FMT "%zd\n", counter->name, *(gssize*)buffer); - break; - case MONO_COUNTER_DOUBLE: - fprintf (outfile, ENTRY_FMT "%.4f\n", counter->name, *(double*)buffer); - break; - case MONO_COUNTER_STRING: - fprintf (outfile, ENTRY_FMT "%s\n", counter->name, (counter->size == 0) ? "(null)" : (char*)buffer); - break; - case MONO_COUNTER_TIME_INTERVAL: - fprintf (outfile, ENTRY_FMT "%.2f ms\n", counter->name, (double)(*(gint64*)buffer) / 1000.0); - break; - } - - g_free (buffer); -} - static gint64 user_time (void) { @@ -328,6 +360,7 @@ cpu_load (int kind) FILE *f = fopen ("/proc/loadavg", "r"); if (f) { len = fread (buffer, 1, sizeof (buffer) - 1, f); + fclose (f); if (len > 0) { buffer [len < 511 ? len : 511] = 0; b = buffer; @@ -342,7 +375,6 @@ cpu_load (int kind) } } } - fclose (f); } #endif return 0; @@ -366,8 +398,6 @@ cpu_load_15min (void) return cpu_load (2); } -static gboolean system_counters_initialized = FALSE; - #define SYSCOUNTER_TIME (MONO_COUNTER_SYSTEM | MONO_COUNTER_LONG | MONO_COUNTER_TIME | MONO_COUNTER_MONOTONIC | MONO_COUNTER_CALLBACK) #define SYSCOUNTER_BYTES (MONO_COUNTER_SYSTEM | MONO_COUNTER_LONG | MONO_COUNTER_BYTES | MONO_COUNTER_VARIABLE | MONO_COUNTER_CALLBACK) #define SYSCOUNTER_COUNT (MONO_COUNTER_SYSTEM | MONO_COUNTER_LONG | MONO_COUNTER_COUNT | MONO_COUNTER_MONOTONIC | MONO_COUNTER_CALLBACK) @@ -376,18 +406,16 @@ static gboolean system_counters_initialized = FALSE; static void initialize_system_counters (void) { - mono_counters_register ("User Time", SYSCOUNTER_TIME, &user_time); - mono_counters_register ("System Time", SYSCOUNTER_TIME, &system_time); - mono_counters_register ("Total Time", SYSCOUNTER_TIME, &total_time); - mono_counters_register ("Working Set", SYSCOUNTER_BYTES, &working_set); - mono_counters_register ("Private Bytes", SYSCOUNTER_BYTES, &private_bytes); - mono_counters_register ("Virtual Bytes", SYSCOUNTER_BYTES, &virtual_bytes); - mono_counters_register ("Page Faults", SYSCOUNTER_COUNT, &page_faults); - mono_counters_register ("CPU Load Average - 1min", SYSCOUNTER_LOAD, &cpu_load_1min); - mono_counters_register ("CPU Load Average - 5min", SYSCOUNTER_LOAD, &cpu_load_5min); - mono_counters_register ("CPU Load Average - 15min", SYSCOUNTER_LOAD, &cpu_load_15min); - - system_counters_initialized = TRUE; + register_internal ("User Time", SYSCOUNTER_TIME, &user_time, sizeof (gint64)); + register_internal ("System Time", SYSCOUNTER_TIME, &system_time, sizeof (gint64)); + register_internal ("Total Time", SYSCOUNTER_TIME, &total_time, sizeof (gint64)); + register_internal ("Working Set", SYSCOUNTER_BYTES, &working_set, sizeof (gint64)); + register_internal ("Private Bytes", SYSCOUNTER_BYTES, &private_bytes, sizeof (gint64)); + register_internal ("Virtual Bytes", SYSCOUNTER_BYTES, &virtual_bytes, sizeof (gint64)); + register_internal ("Page Faults", SYSCOUNTER_COUNT, &page_faults, sizeof (gint64)); + register_internal ("CPU Load Average - 1min", SYSCOUNTER_LOAD, &cpu_load_1min, sizeof (double)); + register_internal ("CPU Load Average - 5min", SYSCOUNTER_LOAD, &cpu_load_5min, sizeof (double)); + register_internal ("CPU Load Average - 15min", SYSCOUNTER_LOAD, &cpu_load_15min, sizeof (double)); } /** @@ -404,24 +432,34 @@ mono_counters_foreach (CountersEnumCallback cb, gpointer user_data) { MonoCounter *counter; - if (!system_counters_initialized) - initialize_system_counters (); + if (!initialized) { + g_debug ("counters not enabled"); + return; + } + + mono_mutex_lock (&counters_mutex); for (counter = counters; counter; counter = counter->next) { - if (!cb (counter, user_data)) + if (!cb (counter, user_data)) { + mono_mutex_unlock (&counters_mutex); return; + } } + + mono_mutex_unlock (&counters_mutex); } #define COPY_COUNTER(type,functype) do { \ size = sizeof (type); \ if (buffer_size < size) \ - return -1; \ - *(type*)buffer = cb ? ((functype)counter->addr) () : *(type*)counter->addr; \ + size = -1; \ + else \ + *(type*)buffer = cb ? ((functype)counter->addr) () : *(type*)counter->addr; \ } while (0); -int -mono_counters_sample (MonoCounter *counter, void *buffer, int buffer_size) +/* lockless */ +static int +sample_internal (MonoCounter *counter, void *buffer, int buffer_size) { int cb = counter->type & MONO_COUNTER_CALLBACK; int size = -1; @@ -449,21 +487,78 @@ mono_counters_sample (MonoCounter *counter, void *buffer, int buffer_size) COPY_COUNTER (double, DoubleFunc); break; case MONO_COUNTER_STRING: - if (buffer_size < counter->size) - return -1; - if (counter->size == 0) - return 0; - strval = cb ? ((StrFunc)counter->addr) () : (char*)counter->addr; - if (!strval) - return 0; - size = counter->size; - strncpy (buffer, strval, size - 1); - ((char*)buffer)[size - 1] = '\0'; + if (buffer_size < counter->size) { + size = -1; + } else if (counter->size == 0) { + size = 0; + } else { + strval = cb ? ((StrFunc)counter->addr) () : (char*)counter->addr; + if (!strval) { + size = 0; + } else { + size = counter->size; + strncpy (buffer, strval, size - 1); + ((char*)buffer)[size - 1] = '\0'; + } + } } return size; } +int +mono_counters_sample (MonoCounter *counter, void *buffer, int buffer_size) +{ + if (!initialized) { + g_debug ("counters not enabled"); + return -1; + } + + return sample_internal (counter, buffer, buffer_size); +} + +#define ENTRY_FMT "%-36s: " +static void +dump_counter (MonoCounter *counter, FILE *outfile) { + void *buffer = g_malloc0 (counter->size); + int size = sample_internal (counter, buffer, counter->size); + + switch (counter->type & MONO_COUNTER_TYPE_MASK) { + case MONO_COUNTER_INT: + fprintf (outfile, ENTRY_FMT "%d\n", counter->name, *(int*)buffer); + break; + case MONO_COUNTER_UINT: + fprintf (outfile, ENTRY_FMT "%u\n", counter->name, *(guint*)buffer); + break; + case MONO_COUNTER_LONG: + if ((counter->type & MONO_COUNTER_UNIT_MASK) == MONO_COUNTER_TIME) + fprintf (outfile, ENTRY_FMT "%.2f ms\n", counter->name, (double)(*(gint64*)buffer) / 10000.0); + else + fprintf (outfile, ENTRY_FMT "%lld\n", counter->name, *(long long *)buffer); + break; + case MONO_COUNTER_ULONG: + if ((counter->type & MONO_COUNTER_UNIT_MASK) == MONO_COUNTER_TIME) + fprintf (outfile, ENTRY_FMT "%.2f ms\n", counter->name, (double)(*(guint64*)buffer) / 10000.0); + else + fprintf (outfile, ENTRY_FMT "%llu\n", counter->name, *(unsigned long long *)buffer); + break; + case MONO_COUNTER_WORD: + fprintf (outfile, ENTRY_FMT "%zd\n", counter->name, *(gssize*)buffer); + break; + case MONO_COUNTER_DOUBLE: + fprintf (outfile, ENTRY_FMT "%.4f\n", counter->name, *(double*)buffer); + break; + case MONO_COUNTER_STRING: + fprintf (outfile, ENTRY_FMT "%s\n", counter->name, (size == 0) ? "(null)" : (char*)buffer); + break; + case MONO_COUNTER_TIME_INTERVAL: + fprintf (outfile, ENTRY_FMT "%.2f ms\n", counter->name, (double)(*(gint64*)buffer) / 1000.0); + break; + } + + g_free (buffer); +} + static const char section_names [][10] = { "JIT", @@ -501,9 +596,17 @@ mono_counters_dump (int section_mask, FILE *outfile) int i, j; int variance; section_mask &= valid_mask; - if (!counters) + + if (!initialized) return; + mono_mutex_lock (&counters_mutex); + + if (!counters) { + mono_mutex_unlock (&counters_mutex); + return; + } + variance = section_mask & MONO_COUNTER_VARIANCE_MASK; /* If no variance mask is supplied, we default to all kinds. */ @@ -519,6 +622,7 @@ mono_counters_dump (int section_mask, FILE *outfile) } fflush (outfile); + mono_mutex_unlock (&counters_mutex); } /** @@ -529,13 +633,23 @@ mono_counters_dump (int section_mask, FILE *outfile) void mono_counters_cleanup (void) { - MonoCounter *counter = counters; + MonoCounter *counter; + + if (!initialized) + return; + + mono_mutex_lock (&counters_mutex); + + counter = counters; counters = NULL; while (counter) { MonoCounter *tmp = counter; counter = counter->next; + free ((void*)tmp->name); free (tmp); } + + mono_mutex_unlock (&counters_mutex); } static MonoResourceCallback limit_reached = NULL; diff --git a/mta-mono/vendor/mono/utils/mono-counters.h b/mta-mono/vendor/mono/utils/mono-counters.h index 20676c2..a8e6928 100644 --- a/mta-mono/vendor/mono/utils/mono-counters.h +++ b/mta-mono/vendor/mono/utils/mono-counters.h @@ -25,6 +25,7 @@ enum { MONO_COUNTER_SECURITY = 1 << 12, MONO_COUNTER_RUNTIME = 1 << 13, MONO_COUNTER_SYSTEM = 1 << 14, + MONO_COUNTER_PERFCOUNTERS = 1 << 15, MONO_COUNTER_LAST_SECTION, /* Unit, bits 24-27 (4 bits) */ @@ -46,8 +47,8 @@ enum { typedef struct _MonoCounter MonoCounter; - MONO_API void mono_counters_enable (int section_mask); +MONO_API void mono_counters_init (void); /* * register addr as the address of a counter of type type. @@ -57,6 +58,9 @@ MONO_API void mono_counters_enable (int section_mask); MONO_API void mono_counters_register (const char* descr, int type, void *addr); MONO_API void mono_counters_register_with_size (const char *name, int type, void *addr, int size); +typedef void (*MonoCounterRegisterCallback) (MonoCounter*); +MONO_API void mono_counters_on_register (MonoCounterRegisterCallback callback); + /* * Create a readable dump of the counters for section_mask sections (ORed section values) */ diff --git a/mta-mono/vendor/mono/utils/mono-dl-darwin.c b/mta-mono/vendor/mono/utils/mono-dl-darwin.c new file mode 100644 index 0000000..b1cd30f --- /dev/null +++ b/mta-mono/vendor/mono/utils/mono-dl-darwin.c @@ -0,0 +1,53 @@ +/* + * mono-dl.c: Interface to the dynamic linker + * + * Author: + * Mono Team (http://www.mono-project.com) + * + * Copyright 2001-2004 Ximian, Inc. + * Copyright 2004-2009 Novell, Inc. + */ +#include + +#if defined (TARGET_MACH) + +#include "mono/utils/mono-dl.h" +#include "mono/utils/mono-embed.h" +#include "mono/utils/mono-path.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +const char * +mono_dl_get_so_prefix (void) +{ + return "lib"; +} +const char ** +mono_dl_get_so_suffixes (void) +{ + static const char *suffixes[] = { + ".dylib", + ".so", + ".bundle", + "", + }; + return suffixes; +} + +int +mono_dl_get_executable_path (char *buf, int buflen) +{ + uint32_t bsize = buflen; + if (_NSGetExecutablePath (buf, &bsize) == 0) + return strlen (buf); + return -1; +} + +#endif diff --git a/mta-mono/vendor/mono/utils/mono-dl-posix.c b/mta-mono/vendor/mono/utils/mono-dl-posix.c new file mode 100644 index 0000000..be52a3e --- /dev/null +++ b/mta-mono/vendor/mono/utils/mono-dl-posix.c @@ -0,0 +1,93 @@ +/* + * mono-dl.c: Interface to the dynamic linker + * + * Author: + * Mono Team (http://www.mono-project.com) + * + * Copyright 2001-2004 Ximian, Inc. + * Copyright 2004-2009 Novell, Inc. + */ +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#if defined(_POSIX_VERSION) + +#include "mono/utils/mono-dl.h" +#include "mono/utils/mono-embed.h" +#include "mono/utils/mono-path.h" + +#include +#include +#include +#include +#include +#include + +#if !defined (TARGET_MACH) +const char * +mono_dl_get_so_prefix (void) +{ + return "lib"; +} +const char ** +mono_dl_get_so_suffixes (void) +{ + static const char *suffixes[] = { + ".so", + "", + }; + return suffixes; +} + +int +mono_dl_get_executable_path (char *buf, int buflen) +{ + return readlink ("/proc/self/exe", buf, buflen - 1); +} +#endif + +void * +mono_dl_open_file (const char *file, int flags) +{ +#ifdef PLATFORM_ANDROID + /* Bionic doesn't support NULL filenames */ + if (!file) + return NULL; +#endif + return dlopen (file, flags); +} + +void +mono_dl_close_handle (MonoDl *module) +{ + dlclose (module->handle); +} + +void* +mono_dl_lookup_symbol (MonoDl *module, const char *name) +{ + return dlsym (module->handle, name); +} + +int +mono_dl_convert_flags (int flags) +{ + int lflags = flags & MONO_DL_LOCAL? 0: RTLD_GLOBAL; + + if (flags & MONO_DL_LAZY) + lflags |= RTLD_LAZY; + else + lflags |= RTLD_NOW; + return lflags; +} + +char* +mono_dl_current_error_string (void) +{ + return g_strdup (dlerror ()); +} + +#endif diff --git a/mta-mono/vendor/mono/utils/mono-dl-windows.c b/mta-mono/vendor/mono/utils/mono-dl-windows.c new file mode 100644 index 0000000..5dabce4 --- /dev/null +++ b/mta-mono/vendor/mono/utils/mono-dl-windows.c @@ -0,0 +1,162 @@ +/* + * mono-dl.c: Interface to the dynamic linker + * + * Author: + * Mono Team (http://www.mono-project.com) + * + * Copyright 2001-2004 Ximian, Inc. + * Copyright 2004-2009 Novell, Inc. + */ +#include + +#if defined(HOST_WIN32) + +#include "mono/utils/mono-dl.h" +#include "mono/utils/mono-embed.h" +#include "mono/utils/mono-path.h" + +#include +#include +#include +#include +#include + +#include +#include + + +const char* +mono_dl_get_so_prefix (void) +{ + return ""; +} + +const char** +mono_dl_get_so_suffixes (void) +{ + static const char *suffixes[] = { + ".dll", + "", + }; + return suffixes; +} + +void* +mono_dl_open_file (const char *file, int flags) +{ + gpointer hModule = NULL; + if (file) { + gunichar2* file_utf16 = g_utf8_to_utf16 (file, strlen (file), NULL, NULL, NULL); + guint last_sem = SetErrorMode (SEM_FAILCRITICALERRORS); + guint32 last_error = 0; + + hModule = LoadLibrary (file_utf16); + if (!hModule) + last_error = GetLastError (); + + SetErrorMode (last_sem); + g_free (file_utf16); + + if (!hModule) + SetLastError (last_error); + } else { + hModule = GetModuleHandle (NULL); + } + return hModule; +} + +void +mono_dl_close_handle (MonoDl *module) +{ + if (!module->main_module) + FreeLibrary (module->handle); +} + +void* +mono_dl_lookup_symbol (MonoDl *module, const char *symbol_name) +{ + HMODULE *modules; + DWORD buffer_size = sizeof (HMODULE) * 1024; + DWORD needed, i; + gpointer proc = NULL; + + /* get the symbol directly from the specified module */ + if (!module->main_module) + return GetProcAddress (module->handle, symbol_name); + + /* get the symbol from the main module */ + proc = GetProcAddress (module->handle, symbol_name); + if (proc != NULL) + return proc; + + /* get the symbol from the loaded DLLs */ + modules = (HMODULE *) g_malloc (buffer_size); + if (modules == NULL) + return NULL; + + if (!EnumProcessModules (GetCurrentProcess (), modules, + buffer_size, &needed)) { + g_free (modules); + return NULL; + } + + /* check whether the supplied buffer was too small, realloc, retry */ + if (needed > buffer_size) { + g_free (modules); + + buffer_size = needed; + modules = (HMODULE *) g_malloc (buffer_size); + + if (modules == NULL) + return NULL; + + if (!EnumProcessModules (GetCurrentProcess (), modules, + buffer_size, &needed)) { + g_free (modules); + return NULL; + } + } + + for (i = 0; i < needed / sizeof (HANDLE); i++) { + proc = GetProcAddress (modules [i], symbol_name); + if (proc != NULL) { + g_free (modules); + return proc; + } + } + + g_free (modules); + return NULL; +} + +int +mono_dl_convert_flags (int flags) +{ + return 0; +} + +char* +mono_dl_current_error_string (void) +{ + char* ret = NULL; + wchar_t* buf = NULL; + DWORD code = GetLastError (); + + if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, + code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&buf, 0, NULL)) + { + ret = g_utf16_to_utf8 (buf, wcslen(buf), NULL, NULL, NULL); + LocalFree (buf); + } else { + g_assert_not_reached (); + } + return ret; +} + +int +mono_dl_get_executable_path (char *buf, int buflen) +{ + return -1; //TODO +} + +#endif diff --git a/mta-mono/vendor/mono/utils/mono-dl.c b/mta-mono/vendor/mono/utils/mono-dl.c index 04e9165..7adfa9d 100644 --- a/mta-mono/vendor/mono/utils/mono-dl.c +++ b/mta-mono/vendor/mono/utils/mono-dl.c @@ -18,205 +18,14 @@ #include #include -#ifdef TARGET_WIN32 -#define SOPREFIX "" -static const char suffixes [][5] = { - ".dll" -}; -#elif defined(__APPLE__) -#define SOPREFIX "lib" -static const char suffixes [][8] = { - ".dylib", - ".so", - ".bundle" -}; -#else -#define SOPREFIX "lib" -static const char suffixes [][4] = { - ".so" -}; -#endif - -#ifdef TARGET_WIN32 - -#include -#include - -#define SO_HANDLE_TYPE HMODULE -#define LL_SO_OPEN(file,flags) w32_load_module ((file), (flags)) -#define LL_SO_CLOSE(module) do { if (!(module)->main_module) FreeLibrary ((module)->handle); } while (0) -#define LL_SO_SYMBOL(module, name) w32_find_symbol ((module), (name)) -#define LL_SO_TRFLAGS(flags) 0 -#define LL_SO_ERROR() w32_dlerror () - -#elif defined (HAVE_DL_LOADER) - -#include -#include - -#ifdef __MACH__ -#include -#endif - - -#ifndef RTLD_LAZY -#define RTLD_LAZY 1 -#endif /* RTLD_LAZY */ - -#define SO_HANDLE_TYPE void* -#ifdef PLATFORM_ANDROID -/* Bionic doesn't support NULL filenames */ -# define LL_SO_OPEN(file,flags) ((file) ? dlopen ((file), (flags)) : NULL) -#else -# define LL_SO_OPEN(file,flags) dlopen ((file), (flags)) -#endif -#define LL_SO_CLOSE(module) dlclose ((module)->handle) -#define LL_SO_SYMBOL(module, name) dlsym ((module)->handle, (name)) -#define LL_SO_TRFLAGS(flags) convert_flags ((flags)) -#define LL_SO_ERROR() g_strdup (dlerror ()) - -static int -convert_flags (int flags) -{ - int lflags = flags & MONO_DL_LOCAL? 0: RTLD_GLOBAL; - - if (flags & MONO_DL_LAZY) - lflags |= RTLD_LAZY; - else - lflags |= RTLD_NOW; - return lflags; -} - -#else -/* no dynamic loader supported */ -#define SO_HANDLE_TYPE void* -#define LL_SO_OPEN(file,flags) NULL -#define LL_SO_CLOSE(module) -#define LL_SO_SYMBOL(module, name) NULL -#define LL_SO_TRFLAGS(flags) (flags) -#define LL_SO_ERROR() g_strdup ("No support for dynamic loader") - -#endif - -static GSList *fallback_handlers; - struct MonoDlFallbackHandler { MonoDlFallbackLoad load_func; MonoDlFallbackSymbol symbol_func; MonoDlFallbackClose close_func; void *user_data; }; - -struct _MonoDl { - SO_HANDLE_TYPE handle; - int main_module; - /* If not NULL, use the methods in MonoDlFallbackHandler instead of the LL_* methods */ - MonoDlFallbackHandler *dl_fallback; -}; - -#ifdef TARGET_WIN32 - -static char* -w32_dlerror (void) -{ - char* ret = NULL; - wchar_t* buf = NULL; - DWORD code = GetLastError (); - - if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, - code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&buf, 0, NULL)) - { - ret = g_utf16_to_utf8 (buf, wcslen(buf), NULL, NULL, NULL); - LocalFree (buf); - } else { - g_assert_not_reached (); - } - return ret; -} - -static gpointer -w32_find_symbol (MonoDl *module, const gchar *symbol_name) -{ - HMODULE *modules; - DWORD buffer_size = sizeof (HMODULE) * 1024; - DWORD needed, i; - gpointer proc = NULL; - - /* get the symbol directly from the specified module */ - if (!module->main_module) - return GetProcAddress (module->handle, symbol_name); - - /* get the symbol from the main module */ - proc = GetProcAddress (module->handle, symbol_name); - if (proc != NULL) - return proc; - - /* get the symbol from the loaded DLLs */ - modules = (HMODULE *) g_malloc (buffer_size); - if (modules == NULL) - return NULL; - - if (!EnumProcessModules (GetCurrentProcess (), modules, - buffer_size, &needed)) { - g_free (modules); - return NULL; - } - - /* check whether the supplied buffer was too small, realloc, retry */ - if (needed > buffer_size) { - g_free (modules); - - buffer_size = needed; - modules = (HMODULE *) g_malloc (buffer_size); - - if (modules == NULL) - return NULL; - - if (!EnumProcessModules (GetCurrentProcess (), modules, - buffer_size, &needed)) { - g_free (modules); - return NULL; - } - } - - for (i = 0; i < needed / sizeof (HANDLE); i++) { - proc = GetProcAddress (modules [i], symbol_name); - if (proc != NULL) { - g_free (modules); - return proc; - } - } - - g_free (modules); - return NULL; -} - - -static gpointer -w32_load_module (const char* file, int flags) -{ - gpointer hModule = NULL; - if (file) { - gunichar2* file_utf16 = g_utf8_to_utf16 (file, strlen (file), NULL, NULL, NULL); - guint last_sem = SetErrorMode (SEM_FAILCRITICALERRORS); - guint32 last_error = 0; - - hModule = LoadLibrary (file_utf16); - if (!hModule) - last_error = GetLastError (); - - SetErrorMode (last_sem); - g_free (file_utf16); - - if (!hModule) - SetLastError (last_error); - } else { - hModule = GetModuleHandle (NULL); - } - return hModule; -} -#endif +static GSList *fallback_handlers; /* * read a value string from line with any of the following formats: @@ -325,7 +134,7 @@ mono_dl_open (const char *name, int flags, char **error_msg) MonoDl *module; void *lib; MonoDlFallbackHandler *dl_fallback = NULL; - int lflags = LL_SO_TRFLAGS (flags); + int lflags = mono_dl_convert_flags (flags); if (error_msg) *error_msg = NULL; @@ -337,7 +146,9 @@ mono_dl_open (const char *name, int flags, char **error_msg) return NULL; } module->main_module = name == NULL? TRUE: FALSE; - lib = LL_SO_OPEN (name, lflags); + + lib = mono_dl_open_file (name, lflags); + if (!lib) { GSList *node; for (node = fallback_handlers; node != NULL; node = node->next){ @@ -374,12 +185,12 @@ mono_dl_open (const char *name, int flags, char **error_msg) llname = get_dl_name_from_libtool (lname); g_free (lname); if (llname) { - lib = LL_SO_OPEN (llname, lflags); + lib = mono_dl_open_file (llname, lflags); g_free (llname); } if (!lib) { if (error_msg) { - *error_msg = LL_SO_ERROR (); + *error_msg = mono_dl_current_error_string (); } free (module); return NULL; @@ -415,11 +226,11 @@ mono_dl_symbol (MonoDl *module, const char *name, void **symbol) char *usname = malloc (strlen (name) + 2); *usname = '_'; strcpy (usname + 1, name); - sym = LL_SO_SYMBOL (module, usname); + sym = mono_dl_lookup_symbol (module, usname); free (usname); } #else - sym = LL_SO_SYMBOL (module, name); + sym = mono_dl_lookup_symbol (module, name); #endif } @@ -430,7 +241,7 @@ mono_dl_symbol (MonoDl *module, const char *name, void **symbol) } if (symbol) *symbol = NULL; - return (module->dl_fallback != NULL) ? err : LL_SO_ERROR (); + return (module->dl_fallback != NULL) ? err : mono_dl_current_error_string (); } /** @@ -450,7 +261,7 @@ mono_dl_close (MonoDl *module) if (dl_fallback->close_func != NULL) dl_fallback->close_func (module->handle, dl_fallback->user_data); } else - LL_SO_CLOSE (module); + mono_dl_close_handle (module); free (module); } @@ -500,16 +311,16 @@ mono_dl_build_path (const char *directory, const char *name, void **iter) suffixlen = 0; } else { idx--; - if (idx >= G_N_ELEMENTS (suffixes)) + if (mono_dl_get_so_suffixes () [idx][0] == '\0') return NULL; first_call = FALSE; - suffix = suffixes [idx]; + suffix = mono_dl_get_so_suffixes () [idx]; suffixlen = strlen (suffix); } - prlen = strlen (SOPREFIX); - if (prlen && strncmp (name, SOPREFIX, prlen) != 0) - prefix = SOPREFIX; + prlen = strlen (mono_dl_get_so_prefix ()); + if (prlen && strncmp (name, mono_dl_get_so_prefix (), prlen) != 0) + prefix = mono_dl_get_so_prefix (); else prefix = ""; @@ -559,9 +370,6 @@ mono_dl_fallback_unregister (MonoDlFallbackHandler *handler) g_free (handler); } - -#if defined (HAVE_DL_LOADER) - static MonoDl* try_load (const char *lib_name, char *dir, int flags, char **err) { @@ -586,17 +394,10 @@ mono_dl_open_runtime_lib (const char* lib_name, int flags, char **error_msg) MonoDl *runtime_lib = NULL; char buf [4096]; int binl; - binl = readlink ("/proc/self/exe", buf, sizeof (buf)-1); *error_msg = NULL; -#ifdef __MACH__ - if (binl == -1) { - uint32_t bsize = sizeof (buf); - if (_NSGetExecutablePath (buf, &bsize) == 0) { - binl = strlen (buf); - } - } -#endif + binl = mono_dl_get_executable_path (buf, sizeof (buf)); + if (binl != -1) { char *base; char *resolvedname, *name; @@ -628,13 +429,3 @@ mono_dl_open_runtime_lib (const char* lib_name, int flags, char **error_msg) return runtime_lib; } - -#else - -MonoDl* -mono_dl_open_runtime_lib (const char* lib_name, int flags, char **error_msg) -{ - return NULL; -} - -#endif diff --git a/mta-mono/vendor/mono/utils/mono-dl.h b/mta-mono/vendor/mono/utils/mono-dl.h index 869495c..4b972ef 100644 --- a/mta-mono/vendor/mono/utils/mono-dl.h +++ b/mta-mono/vendor/mono/utils/mono-dl.h @@ -4,7 +4,26 @@ #include "mono/utils/mono-compiler.h" #include "mono/utils/mono-dl-fallback.h" -typedef struct _MonoDl MonoDl; +#ifdef TARGET_WIN32 +#define MONO_SOLIB_EXT ".dll" +#elif defined(__ppc__) && defined(TARGET_MACH) +#define MONO_SOLIB_EXT ".dylib" +#elif defined(TARGET_MACH) && defined(TARGET_X86) && !defined(__native_client_codegen__) +#define MONO_SOLIB_EXT ".dylib" +#elif defined(TARGET_MACH) && defined(TARGET_AMD64) && !defined(__native_client_codegen__) +#define MONO_SOLIB_EXT ".dylib" +#else +#define MONO_SOLIB_EXT ".so" +#endif + +typedef struct { + void *handle; + int main_module; + + /* If not NULL, use the methods in MonoDlFallbackHandler instead of the LL_* methods */ + MonoDlFallbackHandler *dl_fallback; +} MonoDl; + MonoDl* mono_dl_open (const char *name, int flags, char **error_msg) MONO_LLVM_INTERNAL; char* mono_dl_symbol (MonoDl *module, const char *name, void **symbol) MONO_LLVM_INTERNAL; @@ -14,5 +33,16 @@ char* mono_dl_build_path (const char *directory, const char *name, void ** MonoDl* mono_dl_open_runtime_lib (const char *lib_name, int flags, char **error_msg) MONO_INTERNAL; + +//Platform API for mono_dl +const char* mono_dl_get_so_prefix (void) MONO_INTERNAL; +const char** mono_dl_get_so_suffixes (void) MONO_INTERNAL; +void* mono_dl_open_file (const char *file, int flags) MONO_INTERNAL; +void mono_dl_close_handle (MonoDl *module) MONO_INTERNAL; +void* mono_dl_lookup_symbol (MonoDl *module, const char *name) MONO_INTERNAL; +int mono_dl_convert_flags (int flags) MONO_INTERNAL; +char* mono_dl_current_error_string (void) MONO_INTERNAL; +int mono_dl_get_executable_path (char *buf, int buflen) MONO_INTERNAL; + #endif /* __MONO_UTILS_DL_H__ */ diff --git a/mta-mono/vendor/mono/utils/mono-io-portability.c b/mta-mono/vendor/mono/utils/mono-io-portability.c index 979bb60..4304851 100644 --- a/mta-mono/vendor/mono/utils/mono-io-portability.c +++ b/mta-mono/vendor/mono/utils/mono-io-portability.c @@ -6,12 +6,6 @@ #endif #include #include -#include -#include -#include -#include -#include -#include #include #ifndef DISABLE_PORTABILITY diff --git a/mta-mono/vendor/mono/utils/mono-memory-model.h b/mta-mono/vendor/mono/utils/mono-memory-model.h index a97a7cc..9762dc5 100644 --- a/mta-mono/vendor/mono/utils/mono-memory-model.h +++ b/mta-mono/vendor/mono/utils/mono-memory-model.h @@ -34,18 +34,20 @@ TODO: if we find places where a data depencency could replace barriers, add macr TODO: some arch with strong consistency, such as x86, support weaker access. We might need to expose more kinds of barriers once we exploit this. */ +/* + * Keep in sync with the enum in mini/mini-llvm-cpp.h. + */ +enum { + MONO_MEMORY_BARRIER_NONE = 0, + MONO_MEMORY_BARRIER_ACQ = 1, + MONO_MEMORY_BARRIER_REL = 2, + MONO_MEMORY_BARRIER_SEQ = 3, +}; + #define MEMORY_BARRIER mono_memory_barrier () #define LOAD_BARRIER mono_memory_read_barrier () #define STORE_BARRIER mono_memory_write_barrier () -enum { - StoreStoreBarrier, - LoadLoadBarrier, - StoreLoadBarrier, - LoadStoreBarrier, - FullBarrier -}; - #if defined(__i386__) || defined(__x86_64__) /* Both x86 and amd64 follow the SPO memory model: diff --git a/mta-mono/vendor/mono/utils/mono-mmap.c b/mta-mono/vendor/mono/utils/mono-mmap.c index ed11c9f..0610660 100644 --- a/mta-mono/vendor/mono/utils/mono-mmap.c +++ b/mta-mono/vendor/mono/utils/mono-mmap.c @@ -20,11 +20,13 @@ #if HAVE_SYS_MMAN_H #include #endif +#ifdef HAVE_SIGNAL_H +#include +#endif #include #include #include #include -#include #include #endif @@ -244,12 +246,6 @@ mono_shared_area_instances (void **array, int count) return 0; } -int -mono_pages_not_faulted (void *addr, size_t length) -{ - return -1; -} - #else #if defined(HAVE_MMAP) @@ -450,30 +446,6 @@ mono_mprotect (void *addr, size_t length, int flags) } #endif // __native_client__ -int -mono_pages_not_faulted (void *addr, size_t size) -{ - int i; - gint64 count; - int pagesize = mono_pagesize (); - int npages = (size + pagesize - 1) / pagesize; - char *faulted = g_malloc0 (sizeof (char*) * npages); - - if (mincore (addr, size, faulted) != 0) { - count = -1; - } else { - count = 0; - for (i = 0; i < npages; ++i) { - if (faulted [i] != 0) - ++count; - } - } - - g_free (faulted); - - return count; -} - #else /* dummy malloc-based implementation */ @@ -513,12 +485,6 @@ mono_mprotect (void *addr, size_t length, int flags) return 0; } -int -mono_pages_not_faulted (void *addr, size_t length) -{ - return -1; -} - #endif // HAVE_MMAP #if defined(HAVE_SHM_OPEN) && !defined (DISABLE_SHARED_PERFCOUNTERS) @@ -766,3 +732,31 @@ mono_valloc_aligned (size_t size, size_t alignment, int flags) return aligned; } #endif + +int +mono_pages_not_faulted (void *addr, size_t size) +{ +#ifdef HAVE_MINCORE + int i; + gint64 count; + int pagesize = mono_pagesize (); + int npages = (size + pagesize - 1) / pagesize; + char *faulted = g_malloc0 (sizeof (char*) * npages); + + if (mincore (addr, size, faulted) != 0) { + count = -1; + } else { + count = 0; + for (i = 0; i < npages; ++i) { + if (faulted [i] != 0) + ++count; + } + } + + g_free (faulted); + + return count; +#else + return -1; +#endif +} diff --git a/mta-mono/vendor/mono/utils/mono-mutex.h b/mta-mono/vendor/mono/utils/mono-mutex.h index 864c660..7a104bb 100644 --- a/mta-mono/vendor/mono/utils/mono-mutex.h +++ b/mta-mono/vendor/mono/utils/mono-mutex.h @@ -86,7 +86,7 @@ typedef HANDLE mono_cond_t; #define mono_mutex_init(mutex) (InitializeCriticalSection((mutex)), 0) #define mono_mutex_init_recursive(mutex) (InitializeCriticalSection((mutex)), 0) #define mono_mutex_lock(mutex) EnterCriticalSection((mutex)) -#define mono_mutex_trylock(mutex) TryEnterCriticalSection((mutex)) +#define mono_mutex_trylock(mutex) (!TryEnterCriticalSection((mutex))) #define mono_mutex_unlock(mutex) LeaveCriticalSection((mutex)) #define mono_mutex_destroy(mutex) DeleteCriticalSection((mutex)) diff --git a/mta-mono/vendor/mono/utils/mono-proclib.c b/mta-mono/vendor/mono/utils/mono-proclib.c index 1dc2615..ee44ad8 100644 --- a/mta-mono/vendor/mono/utils/mono-proclib.c +++ b/mta-mono/vendor/mono/utils/mono-proclib.c @@ -99,7 +99,7 @@ mono_process_list (int *size) if (res) return NULL; processes = malloc (data_len); - res = sysctl (mib, 4, NULL, &data_len, NULL, 0); + res = sysctl (mib, 4, processes, &data_len, NULL, 0); if (res < 0) { free (processes); if (errno != ENOMEM) @@ -516,6 +516,8 @@ mono_process_get_data_with_error (gpointer pid, MonoProcessData data, MonoProces return get_process_stat_item (rpid, 18, FALSE, error) / get_user_hz (); case MONO_PROCESS_PPID: return get_process_stat_time (rpid, 0, FALSE, error); + case MONO_PROCESS_PAGED_BYTES: + return get_pid_status_item (rpid, "VmSwap", error, 1024); /* Nothing yet */ case MONO_PROCESS_END: diff --git a/mta-mono/vendor/mono/utils/mono-proclib.h b/mta-mono/vendor/mono/utils/mono-proclib.h index 95783ed..6a8f6bf 100644 --- a/mta-mono/vendor/mono/utils/mono-proclib.h +++ b/mta-mono/vendor/mono/utils/mono-proclib.h @@ -20,8 +20,9 @@ typedef enum { MONO_PROCESS_VIRTUAL_BYTES, MONO_PROCESS_VIRTUAL_BYTES_PEAK, MONO_PROCESS_FAULTS, - MONO_PROCESS_ELAPSED, + MONO_PROCESS_ELAPSED, /* 10 */ MONO_PROCESS_PPID, + MONO_PROCESS_PAGED_BYTES, MONO_PROCESS_END } MonoProcessData; diff --git a/mta-mono/vendor/mono/utils/mono-publib.h b/mta-mono/vendor/mono/utils/mono-publib.h index cc1e136..c9becb2 100644 --- a/mta-mono/vendor/mono/utils/mono-publib.h +++ b/mta-mono/vendor/mono/utils/mono-publib.h @@ -44,14 +44,18 @@ typedef unsigned __int64 uint64_t; #include +#ifdef __GNUC__ +#define MONO_API_EXPORT __attribute__ ((visibility ("default"))) +#else #define MONO_API_EXPORT +#endif #define MONO_API_IMPORT #endif /* end of compiler-specific stuff */ -#if !defined(MONO_STATIC_BUILD) && defined(MONO_DLL_EXPORT) +#if defined(MONO_DLL_EXPORT) #define MONO_API MONO_API_EXPORT -#elif !defined(MONO_STATIC_BUILD) +#elif defined(MONO_DLL_IMPORT) #define MONO_API MONO_API_IMPORT #else #define MONO_API diff --git a/mta-mono/vendor/mono/utils/mono-semaphore.h b/mta-mono/vendor/mono/utils/mono-semaphore.h index 17dce62..b4e9f26 100644 --- a/mta-mono/vendor/mono/utils/mono-semaphore.h +++ b/mta-mono/vendor/mono/utils/mono-semaphore.h @@ -38,7 +38,7 @@ typedef sem_t MonoSemType; # define MONO_HAS_SEMAPHORES typedef HANDLE MonoSemType; # define MONO_SEM_INIT(addr,initial) do {*(addr) = CreateSemaphore ( NULL,(initial),0x7FFFFFFF,NULL);} while(0) -# define MONO_SEM_DESTROY(sem) CloseHandle (*(sem)) +# define MONO_SEM_DESTROY(sem) do { CloseHandle (*(sem)); (*(sem))=0; } while(0) #endif #define MONO_SEM_WAIT(sem) MONO_SEM_WAIT_ALERTABLE(sem, FALSE) diff --git a/mta-mono/vendor/mono/utils/mono-sigcontext.h b/mta-mono/vendor/mono/utils/mono-sigcontext.h index f61f3dd..de4f6c4 100644 --- a/mta-mono/vendor/mono/utils/mono-sigcontext.h +++ b/mta-mono/vendor/mono/utils/mono-sigcontext.h @@ -4,10 +4,11 @@ #include #if defined(PLATFORM_ANDROID) #include +#endif + #ifdef HAVE_UCONTEXT_H #include #endif -#endif #ifdef HAVE_UNISTD_H #include @@ -154,10 +155,6 @@ typedef struct ucontext { #elif defined(TARGET_AMD64) -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) -#include -#endif - #if defined(__APPLE__) #define UCONTEXT_REG_RAX(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__rax) #define UCONTEXT_REG_RBX(ctx) (((ucontext_t*)(ctx))->uc_mcontext->__ss.__rbx) diff --git a/mta-mono/vendor/mono/utils/mono-threads-mach.c b/mta-mono/vendor/mono/utils/mono-threads-mach.c index 4ed6820..c0b28a1 100644 --- a/mta-mono/vendor/mono/utils/mono-threads-mach.c +++ b/mta-mono/vendor/mono/utils/mono-threads-mach.c @@ -20,9 +20,6 @@ #include #include #include -#include -#include -#include void mono_threads_init_platform (void) @@ -48,7 +45,7 @@ mono_threads_core_needs_abort_syscall (void) } gboolean -mono_threads_core_suspend (MonoThreadInfo *info) +mono_threads_core_suspend (MonoThreadInfo *info, gboolean interrupt_kernel) { kern_return_t ret; gboolean res; diff --git a/mta-mono/vendor/mono/utils/mono-threads-posix.c b/mta-mono/vendor/mono/utils/mono-threads-posix.c index 4846a44..9aa28fb 100644 --- a/mta-mono/vendor/mono/utils/mono-threads-posix.c +++ b/mta-mono/vendor/mono/utils/mono-threads-posix.c @@ -19,7 +19,7 @@ #include -#if defined(PLATFORM_ANDROID) && !defined(TARGET_ARM64) +#if defined(PLATFORM_ANDROID) && !defined(TARGET_ARM64) && !defined(TARGET_AMD64) #define USE_TKILL_ON_ANDROID 1 #endif @@ -43,6 +43,10 @@ typedef struct { HANDLE handle; } StartInfo; +#ifdef PLATFORM_ANDROID +static int no_interrupt_signo; +#endif + static void* inner_start_thread (void *arg) { @@ -329,7 +333,7 @@ suspend_signal_handler (int _dummy, siginfo_t *info, void *context) #endif static void -mono_posix_add_signal_handler (int signo, gpointer handler) +mono_posix_add_signal_handler (int signo, gpointer handler, int flags) { #if !defined(__native_client__) /*FIXME, move the code from mini to utils and do the right thing!*/ @@ -339,7 +343,7 @@ mono_posix_add_signal_handler (int signo, gpointer handler) sa.sa_sigaction = handler; sigemptyset (&sa.sa_mask); - sa.sa_flags = SA_SIGINFO; + sa.sa_flags = SA_SIGINFO | flags; ret = sigaction (signo, &sa, &previous_sa); g_assert (ret != -1); @@ -350,19 +354,36 @@ void mono_threads_init_platform (void) { #if !defined(__native_client__) + int abort_signo; + /* FIXME we should use all macros from mini to make this more portable FIXME it would be very sweet if sgen could end up using this too. */ - if (mono_thread_info_new_interrupt_enabled ()) - mono_posix_add_signal_handler (mono_thread_get_abort_signal (), suspend_signal_handler); + if (!mono_thread_info_new_interrupt_enabled ()) + return; + abort_signo = mono_thread_get_abort_signal (); + mono_posix_add_signal_handler (abort_signo, suspend_signal_handler, 0); + +#ifdef PLATFORM_ANDROID + /* + * Lots of android native code can't handle the EINTR caused by + * the normal abort signal, so use a different signal for the + * no interruption case, which is used by sdb. + * FIXME: Use this on all platforms. + * SIGUSR1 is used by dalvik/art. + */ + no_interrupt_signo = SIGWINCH; + g_assert (abort_signo != no_interrupt_signo); + mono_posix_add_signal_handler (no_interrupt_signo, suspend_signal_handler, SA_RESTART); +#endif #endif } -/*nothing to be done here since suspend always abort syscalls due using signals*/ void mono_threads_core_interrupt (MonoThreadInfo *info) { + /* Handled in mono_threads_core_suspend () */ } void @@ -383,10 +404,17 @@ mono_threads_core_needs_abort_syscall (void) } gboolean -mono_threads_core_suspend (MonoThreadInfo *info) +mono_threads_core_suspend (MonoThreadInfo *info, gboolean interrupt_kernel) { /*FIXME, check return value*/ - mono_threads_pthread_kill (info, mono_thread_get_abort_signal ()); +#ifdef PLATFORM_ANDROID + if (!interrupt_kernel) + mono_threads_pthread_kill (info, no_interrupt_signo); + else + mono_threads_pthread_kill (info, mono_thread_get_abort_signal ()); +#else + mono_threads_pthread_kill (info, mono_thread_get_abort_signal ()); +#endif while (MONO_SEM_WAIT (&info->begin_suspend_semaphore) != 0) { /* g_assert (errno == EINTR); */ } @@ -410,7 +438,7 @@ mono_threads_platform_register (MonoThreadInfo *info) MONO_SEM_INIT (&info->begin_suspend_semaphore, 0); #if defined (PLATFORM_ANDROID) - info->native_handle = (gpointer) gettid (); + info->native_handle = gettid (); #endif } diff --git a/mta-mono/vendor/mono/utils/mono-threads-windows.c b/mta-mono/vendor/mono/utils/mono-threads-windows.c index 04430fb..e5de151 100644 --- a/mta-mono/vendor/mono/utils/mono-threads-windows.c +++ b/mta-mono/vendor/mono/utils/mono-threads-windows.c @@ -58,7 +58,7 @@ mono_threads_core_self_suspend (MonoThreadInfo *info) } gboolean -mono_threads_core_suspend (MonoThreadInfo *info) +mono_threads_core_suspend (MonoThreadInfo *info, gboolean interrupt_kernel) { DWORD id = mono_thread_info_get_tid (info); HANDLE handle; @@ -264,7 +264,7 @@ void mono_threads_core_get_stack_bounds (guint8 **staddr, size_t *stsize) { MEMORY_BASIC_INFORMATION meminfo; -#ifdef TARGET_AMD64 +#ifdef _WIN64 /* win7 apis */ NT_TIB* tib = (NT_TIB*)NtCurrentTeb(); guint8 *stackTop = (guint8*)tib->StackBase; diff --git a/mta-mono/vendor/mono/utils/mono-threads.c b/mta-mono/vendor/mono/utils/mono-threads.c index 83bc94a..b38ec5e 100644 --- a/mta-mono/vendor/mono/utils/mono-threads.c +++ b/mta-mono/vendor/mono/utils/mono-threads.c @@ -8,6 +8,8 @@ * Copyright 2011 Xamarin, Inc (http://www.xamarin.com) */ +#include + #include #include #include @@ -43,7 +45,12 @@ static MonoSemType global_suspend_semaphore; static size_t thread_info_size; static MonoThreadInfoCallbacks threads_callbacks; static MonoThreadInfoRuntimeCallbacks runtime_callbacks; -static MonoNativeTlsKey thread_info_key, thread_exited_key, small_id_key; +static MonoNativeTlsKey thread_info_key, thread_exited_key; +#ifdef HAVE_KW_THREAD +static __thread guint32 tls_small_id MONO_TLS_FAST; +#else +static MonoNativeTlsKey small_id_key; +#endif static MonoLinkedListSet thread_list; static gboolean disable_new_interrupt = FALSE; static gboolean mono_threads_inited = FALSE; @@ -122,7 +129,11 @@ int mono_thread_info_register_small_id (void) { int small_id = mono_thread_small_id_alloc (); +#ifdef HAVE_KW_THREAD + tls_small_id = small_id; +#else mono_native_tls_set_value (small_id_key, GUINT_TO_POINTER (small_id + 1)); +#endif return small_id; } @@ -178,7 +189,9 @@ unregister_thread (void *arg) * TLS destruction order is not reliable so small_id might be cleaned up * before us. */ +#ifndef HAVE_KW_THREAD mono_native_tls_set_value (small_id_key, GUINT_TO_POINTER (info->small_id + 1)); +#endif info->thread_state = STATE_SHUTTING_DOWN; @@ -275,10 +288,14 @@ mono_thread_info_current (void) int mono_thread_info_get_small_id (void) { +#ifdef HAVE_KW_THREAD + return tls_small_id; +#else gpointer val = mono_native_tls_get_value (small_id_key); if (!val) return -1; return GPOINTER_TO_INT (val) - 1; +#endif } MonoLinkedListSet* @@ -385,7 +402,9 @@ mono_threads_init (MonoThreadInfoCallbacks *callbacks, size_t info_size) #endif g_assert (res); +#ifndef HAVE_KW_THREAD res = mono_native_tls_alloc (&small_id_key, NULL); +#endif g_assert (res); MONO_SEM_INIT (&global_suspend_semaphore, 1); @@ -452,7 +471,7 @@ mono_thread_info_suspend_sync (MonoNativeThreadId tid, gboolean interrupt_kernel return info; } - if (!mono_threads_core_suspend (info)) { + if (!mono_threads_core_suspend (info, interrupt_kernel)) { MONO_SEM_POST (&info->suspend_semaphore); mono_hazard_pointer_clear (hp, 1); *error_condition = "Could not suspend thread"; @@ -763,7 +782,7 @@ mono_thread_info_new_interrupt_enabled (void) #if defined (__i386__) || defined(__x86_64__) return !disable_new_interrupt; #endif -#if defined(__arm__) +#if defined(__arm__) || defined(__aarch64__) return !disable_new_interrupt; #endif return FALSE; diff --git a/mta-mono/vendor/mono/utils/mono-threads.h b/mta-mono/vendor/mono/utils/mono-threads.h index ac4c344..03dbff8 100644 --- a/mta-mono/vendor/mono/utils/mono-threads.h +++ b/mta-mono/vendor/mono/utils/mono-threads.h @@ -359,7 +359,7 @@ mono_threads_add_async_job (THREAD_INFO_TYPE *info, MonoAsyncJob job) MONO_INTER MonoAsyncJob mono_threads_consume_async_jobs (void) MONO_INTERNAL; -void +MONO_API void mono_threads_attach_tools_thread (void); @@ -373,7 +373,7 @@ mono_threads_pthread_kill (THREAD_INFO_TYPE *info, int signum) MONO_INTERNAL; /* Plartform specific functions DON'T use them */ void mono_threads_init_platform (void) MONO_INTERNAL; //ok -gboolean mono_threads_core_suspend (THREAD_INFO_TYPE *info) MONO_INTERNAL; +gboolean mono_threads_core_suspend (THREAD_INFO_TYPE *info, gboolean interrupt_kernel) MONO_INTERNAL; gboolean mono_threads_core_resume (THREAD_INFO_TYPE *info) MONO_INTERNAL; void mono_threads_platform_register (THREAD_INFO_TYPE *info) MONO_INTERNAL; //ok void mono_threads_platform_free (THREAD_INFO_TYPE *info) MONO_INTERNAL; diff --git a/mta-mono/vendor/mono/utils/mono-time.c b/mta-mono/vendor/mono/utils/mono-time.c index 2bf306e..cd34754 100644 --- a/mta-mono/vendor/mono/utils/mono-time.c +++ b/mta-mono/vendor/mono/utils/mono-time.c @@ -41,12 +41,7 @@ mono_100ns_ticks (void) return (cur_time - start_time) * (double)MTICKS_PER_SEC / freq.QuadPart; } -/* - * Magic number to convert FILETIME base Jan 1, 1601 to DateTime - base Jan, 1, 0001 - */ -#define FILETIME_ADJUST ((guint64)504911232000000000LL) - -/* Returns the number of 100ns ticks since 1/1/1, UTC timezone */ +/* Returns the number of 100ns ticks since Jan 1, 1601, UTC timezone */ gint64 mono_100ns_datetime (void) { @@ -56,7 +51,7 @@ mono_100ns_datetime (void) g_assert_not_reached (); GetSystemTimeAsFileTime ((FILETIME*) &ft); - return FILETIME_ADJUST + ft.QuadPart; + return ft.QuadPart; } #else @@ -65,8 +60,10 @@ mono_100ns_datetime (void) #include #endif -#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) +#if defined (HAVE_SYS_PARAM_H) #include +#endif +#if defined(HAVE_SYS_SYSCTL_H) #include #endif @@ -80,7 +77,7 @@ mono_100ns_datetime (void) static gint64 get_boot_time (void) { -#if defined(PLATFORM_MACOSX) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) +#if defined (HAVE_SYS_PARAM_H) && defined (KERN_BOOTTIME) int mib [2]; size_t size; time_t now; @@ -160,12 +157,12 @@ mono_100ns_ticks (void) } /* - * Magic number to convert a time which is relative to - * Jan 1, 1970 into a value which is relative to Jan 1, 0001. + * Magic number to convert unix epoch start to windows epoch start + * Jan 1, 1970 into a value which is relative to Jan 1, 1601. */ -#define EPOCH_ADJUST ((guint64)62135596800LL) +#define EPOCH_ADJUST ((guint64)11644473600LL) -/* Returns the number of 100ns ticks since 1/1/1, UTC timezone */ +/* Returns the number of 100ns ticks since 1/1/1601, UTC timezone */ gint64 mono_100ns_datetime (void) { diff --git a/mta-mono/vendor/mono/utils/networking-fallback.c b/mta-mono/vendor/mono/utils/networking-fallback.c new file mode 100644 index 0000000..992db15 --- /dev/null +++ b/mta-mono/vendor/mono/utils/networking-fallback.c @@ -0,0 +1,81 @@ +/* + * networking-fallbacks.c: Fallback networking code that rely on old BSD apis or whatever else is available. + * + * Author: + * Rodrigo Kumpera (kumpera@gmail.com) + * + * (C) 2015 Xamarin + */ + +#include +#include + +#ifdef HAVE_NETDB_H +#include +#endif + +#if !defined (HAVE_GETADDRINFO) + +#if defined (HAVE_GETHOSTBYNAME) || defined (HAVE_GETHOSTBYNAME2) + +static void +add_hostent (MonoAddressInfo *info, int flags, struct hostent *h) +{ + MonoAddressEntry *cur, *prev = info->entries; + int idx = 0; + + if (!h) + return; + + if (!info->aliases) + info->aliases = g_strdupv (h->h_aliases); + + while (h->h_addr_list [idx]) { + cur = g_new0 (MonoAddressEntry, 1); + if (prev) + prev->next = cur; + else + info->entries = cur; + + if (flags & MONO_HINT_CANONICAL_NAME && h->h_name) + cur->canonical_name = g_strdup (h->h_name); + + cur->family = h->h_addrtype; + cur->socktype = SOCK_STREAM; + cur->protocol = 0; /* Zero means the default stream protocol */ + cur->address_len = h->h_length; + memcpy (&cur->address, h->h_addr_list [idx], h->h_length); + + prev = cur; + ++idx; + } +} + +int +mono_get_address_info (const char *hostname, int port, int flags, MonoAddressInfo **result) +{ + MonoAddressInfo *addr_info; + addr_info = g_new0 (MonoAddressInfo, 1); + +#ifdef HAVE_GETHOSTBYNAME2 + if (flags & MONO_HINT_IPV6 || flags & MONO_HINT_UNSPECIFIED) + add_hostent (addr_info, flags, gethostbyname2 (hostname, AF_INET6)); + if (flags & MONO_HINT_IPV4 || flags & MONO_HINT_UNSPECIFIED) + add_hostent (addr_info, flags, gethostbyname2 (hostname, AF_INET)); +#else + add_hostent (addr_info, flags, gethostbyname (hostname)) +#endif + + if (!addr_info->entries) { + *result = NULL; + mono_free_address_info (addr_info); + return 1; + } + + *result = addr_info; + return 0; +} + +#endif /* defined (HAVE_GETHOSTBYNAME) || defined (HAVE_GETHOSTBYNAME2) */ + +#endif /* !defined (HAVE_GETADDRINFO) */ diff --git a/mta-mono/vendor/mono/utils/networking-missing.c b/mta-mono/vendor/mono/utils/networking-missing.c new file mode 100644 index 0000000..c3501f2 --- /dev/null +++ b/mta-mono/vendor/mono/utils/networking-missing.c @@ -0,0 +1,56 @@ +/* + * networking-missing.c: Implements missing standard socket functions. + * + * Author: + * Rodrigo Kumpera (kumpera@gmail.com) + * + * (C) 2015 Xamarin + */ + +#include +#include + +#ifdef HAVE_NETDB_H +#include +#endif + +#ifndef HAVE_INET_PTON + +int +inet_pton (int family, const char *address, void *inaddrp) +{ + if (family == AF_INET) { +#ifdef HAVE_INET_ATON + struct in_addr inaddr; + + if (!inet_aton (address, &inaddr)) + return 0; + + memcpy (inaddrp, &inaddr, sizeof (struct in_addr)); + return 1; +#else + /* assume the system has inet_addr(), if it doesn't + have that we're pretty much screwed... */ + guint32 inaddr; + + if (!strcmp (address, "255.255.255.255")) { + /* special-case hack */ + inaddr = 0xffffffff; + } else { + inaddr = inet_addr (address); +#ifndef INADDR_NONE +#define INADDR_NONE ((in_addr_t) -1) +#endif + if (inaddr == INADDR_NONE) + return 0; + } + + memcpy (inaddrp, &inaddr, sizeof (guint32)); + return 1; +#endif /* HAVE_INET_ATON */ + } + + return -1; +} + +#endif /* !HAVE_INET_PTON */ diff --git a/mta-mono/vendor/mono/utils/networking-posix.c b/mta-mono/vendor/mono/utils/networking-posix.c new file mode 100644 index 0000000..2fe8da9 --- /dev/null +++ b/mta-mono/vendor/mono/utils/networking-posix.c @@ -0,0 +1,342 @@ +/* + * networking-posix.c: Modern posix networking code + * + * Author: + * Rodrigo Kumpera (kumpera@gmail.com) + * + * (C) 2015 Xamarin + */ + +#include +#include + +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_SYS_IOCTL_H +#include +#endif +#ifdef HAVE_NET_IF_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_GETIFADDRS +#include +#endif + +static void* +get_address_from_sockaddr (struct sockaddr *sa) +{ + switch (sa->sa_family) { + case AF_INET: + return &((struct sockaddr_in*)sa)->sin_addr; + case AF_INET6: + return &((struct sockaddr_in6*)sa)->sin6_addr; + } + return NULL; +} + +#ifdef HAVE_GETADDRINFO + +int +mono_get_address_info (const char *hostname, int port, int flags, MonoAddressInfo **result) +{ + char service_name [16]; + struct addrinfo hints, *res = NULL, *info; + MonoAddressEntry *cur = NULL, *prev = NULL; + MonoAddressInfo *addr_info; + + memset (&hints, 0, sizeof (struct addrinfo)); + *result = NULL; + + hints.ai_family = PF_UNSPEC; + if (flags & MONO_HINT_IPV4) + hints.ai_family = PF_INET; + else if (flags & MONO_HINT_IPV6) + hints.ai_family = PF_INET6; + + hints.ai_socktype = SOCK_STREAM; + + if (flags & MONO_HINT_CANONICAL_NAME) + hints.ai_flags = AI_CANONNAME; + +/* Some ancient libc don't define AI_ADDRCONFIG */ +#ifdef AI_ADDRCONFIG + if (flags & MONO_HINT_CONFIGURED_ONLY) + hints.ai_flags = AI_ADDRCONFIG; +#endif + sprintf (service_name, "%d", port); + if (getaddrinfo (hostname, service_name, &hints, &info)) + return 1; /* FIXME propagate the error */ + + res = info; + *result = addr_info = g_new0 (MonoAddressInfo, 1); + + while (res) { + cur = g_new0 (MonoAddressEntry, 1); + if (prev) + prev->next = cur; + else + addr_info->entries = cur; + + cur->family = res->ai_family; + cur->socktype = res->ai_socktype; + cur->protocol = res->ai_protocol; + if (cur->family == PF_INET) { + cur->address_len = sizeof (struct in_addr); + cur->address.v4 = ((struct sockaddr_in*)res->ai_addr)->sin_addr; + } else if (cur->family == PF_INET6) { + cur->address_len = sizeof (struct in6_addr); + cur->address.v6 = ((struct sockaddr_in6*)res->ai_addr)->sin6_addr; + } else { + g_error ("Cannot handle address family %d", cur->family); + } + + if (res->ai_canonname) + cur->canonical_name = g_strdup (res->ai_canonname); + + prev = cur; + res = res->ai_next; + } + + freeaddrinfo (info); + return 0; +} + +#endif + +#ifdef HAVE_GETPROTOBYNAME + +static int +fetch_protocol (const char *proto_name, int *cache, int *proto, int default_val) +{ + if (!*cache) { + struct protoent *pent; + + pent = getprotobyname (proto_name); + *proto = pent ? pent->p_proto : default_val; + *cache = 1; + } + return *proto; +} + +int +mono_networking_get_tcp_protocol (void) +{ + static int cache, proto; + return fetch_protocol ("tcp", &cache, &proto, 6); //6 is SOL_TCP on linux +} + +int +mono_networking_get_ip_protocol (void) +{ + static int cache, proto; + return fetch_protocol ("ip", &cache, &proto, 0); //0 is SOL_IP on linux +} + +int +mono_networking_get_ipv6_protocol (void) +{ + static int cache, proto; + return fetch_protocol ("ipv6", &cache, &proto, 41); //41 is SOL_IPV6 on linux +} + +#endif + +#if defined (HAVE_SIOCGIFCONF) + +#define IFCONF_BUFF_SIZE 1024 +#ifndef _SIZEOF_ADDR_IFREQ +#define _SIZEOF_ADDR_IFREQ(ifr) (sizeof (struct ifreq)) +#endif + +#define FOREACH_IFR(IFR, IFC) \ + for (IFR = (IFC).ifc_req; \ + ifr < (struct ifreq*)((char*)(IFC).ifc_req + (IFC).ifc_len); \ + ifr = (struct ifreq*)((char*)(IFR) + _SIZEOF_ADDR_IFREQ (*(IFR)))) + +void * +mono_get_local_interfaces (int family, int *interface_count) +{ + int fd; + struct ifconf ifc; + struct ifreq *ifr; + int if_count = 0; + gboolean ignore_loopback = FALSE; + void *result = NULL; + char *result_ptr; + + *interface_count = 0; + + if (!mono_address_size_for_family (family)) + return NULL; + + fd = socket (family, SOCK_STREAM, 0); + if (fd == -1) + return NULL; + + memset (&ifc, 0, sizeof (ifc)); + ifc.ifc_len = IFCONF_BUFF_SIZE; + ifc.ifc_buf = g_malloc (IFCONF_BUFF_SIZE); /* We can't have such huge buffers on the stack. */ + if (ioctl (fd, SIOCGIFCONF, &ifc) < 0) + goto done; + + FOREACH_IFR (ifr, ifc) { + struct ifreq iflags; + + //only return addresses of the same type as @family + if (ifr->ifr_addr.sa_family != family) { + ifr->ifr_name [0] = '\0'; + continue; + } + + strcpy (iflags.ifr_name, ifr->ifr_name); + + //ignore interfaces we can't get props for + if (ioctl (fd, SIOCGIFFLAGS, &iflags) < 0) { + ifr->ifr_name [0] = '\0'; + continue; + } + + //ignore interfaces that are down + if ((iflags.ifr_flags & IFF_UP) == 0) { + ifr->ifr_name [0] = '\0'; + continue; + } + + //If we have a non-loopback iface, don't return any loopback + if ((iflags.ifr_flags & IFF_LOOPBACK) == 0) { + ignore_loopback = TRUE; + ifr->ifr_name [0] = 1;//1 means non-loopback + } else { + ifr->ifr_name [0] = 2; //2 means loopback + } + ++if_count; + } + + result_ptr = result = g_malloc (if_count * mono_address_size_for_family (family)); + FOREACH_IFR (ifr, ifc) { + if (ifr->ifr_name [0] == '\0') + continue; + + if (ignore_loopback && ifr->ifr_name [0] == 2) { + --if_count; + continue; + } + + memcpy (result_ptr, get_address_from_sockaddr (&ifr->ifr_addr), mono_address_size_for_family (family)); + result_ptr += mono_address_size_for_family (family); + } + g_assert (result_ptr <= (char*)result + if_count * mono_address_size_for_family (family)); + +done: + *interface_count = if_count; + g_free (ifc.ifc_buf); + close (fd); + return result; +} + +#elif defined(HAVE_GETIFADDRS) + +void * +mono_get_local_interfaces (int family, int *interface_count) +{ + struct ifaddrs *ifap = NULL, *cur; + int if_count = 0; + gboolean ignore_loopback = FALSE; + void *result; + char *result_ptr; + + *interface_count = 0; + + if (!mono_address_size_for_family (family)) + return NULL; + + if (getifaddrs (&ifap)) + return NULL; + + for (cur = ifap; cur; cur = cur->ifa_next) { + //ignore interfaces with no address assigned + if (!cur->ifa_addr) + continue; + + //ignore interfaces that don't belong to @family + if (cur->ifa_addr->sa_family != family) + continue; + + //ignore interfaces that are down + if ((cur->ifa_flags & IFF_UP) == 0) + continue; + + //If we have a non-loopback iface, don't return any loopback + if ((cur->ifa_flags & IFF_LOOPBACK) == 0) + ignore_loopback = TRUE; + + if_count++; + } + + result_ptr = result = g_malloc (if_count * mono_address_size_for_family (family)); + for (cur = ifap; cur; cur = cur->ifa_next) { + if (!cur->ifa_addr) + continue; + if (cur->ifa_addr->sa_family != family) + continue; + if ((cur->ifa_flags & IFF_UP) == 0) + continue; + + //we decrement if_count because it did not on the previous loop. + if (ignore_loopback && (cur->ifa_flags & IFF_LOOPBACK)) { + --if_count; + continue; + } + + memcpy (result_ptr, get_address_from_sockaddr (cur->ifa_addr), mono_address_size_for_family (family)); + result_ptr += mono_address_size_for_family (family); + } + g_assert (result_ptr <= (char*)result + if_count * mono_address_size_for_family (family)); + + freeifaddrs (ifap); + *interface_count = if_count; + return result; +} + +#endif + +#ifdef HAVE_GETNAMEINFO + +gboolean +mono_networking_addr_to_str (MonoAddress *address, char *buffer, socklen_t buflen) +{ + MonoSocketAddress saddr; + socklen_t len; + mono_socket_address_init (&saddr, &len, address->family, &address->addr, 0); + + return getnameinfo (&saddr.addr, len, buffer, buflen, NULL, 0, NI_NUMERICHOST) == 0; +} + +#elif HAVE_INET_NTOP + +gboolean +mono_networking_addr_to_str (MonoAddress *address, char *buffer, socklen_t buflen) +{ + return inet_ntop (address->family, &address->addr, buffer, buflen) != NULL; +} + +#endif + +#ifndef _WIN32 +// These are already defined in networking-windows.c for Windows +void +mono_networking_init (void) +{ + //nothing really +} + +void +mono_networking_shutdown (void) +{ + //nothing really +} +#endif \ No newline at end of file diff --git a/mta-mono/vendor/mono/utils/networking-windows.c b/mta-mono/vendor/mono/utils/networking-windows.c new file mode 100644 index 0000000..ea9edff --- /dev/null +++ b/mta-mono/vendor/mono/utils/networking-windows.c @@ -0,0 +1,36 @@ +/* + * networking-windows.c: Windows-specific networking implementations + * + * Author: + * Alexander Köplinger (alex.koeplinger@outlook.com) + */ + +#include + +#if defined(HOST_WIN32) + +void * +mono_get_local_interfaces (int family, int *interface_count) +{ + *interface_count = 0; + return NULL; +} + +void +mono_networking_init (void) +{ + WSADATA wsadata; + int err; + + err = WSAStartup (MAKEWORD (2,0), &wsadata); + if(err) + g_error ("%s: Couldn't initialise networking", __func__); +} + +void +mono_networking_shutdown (void) +{ + WSACleanup (); +} + +#endif /* defined(HOST_WIN32) */ diff --git a/mta-mono/vendor/mono/utils/networking.c b/mta-mono/vendor/mono/utils/networking.c new file mode 100644 index 0000000..bd461b0 --- /dev/null +++ b/mta-mono/vendor/mono/utils/networking.c @@ -0,0 +1,75 @@ +/* + * networking.c: Portable networking functions + * + * Author: + * Rodrigo Kumpera (kumpera@gmail.com) + * + * (C) 2015 Xamarin + */ + +#include +#include + +int +mono_address_size_for_family (int family) +{ + switch (family) { + case AF_INET: + return sizeof (struct in_addr); + case AF_INET6: + return sizeof (struct in6_addr); + } + return 0; +} + + +void +mono_free_address_info (MonoAddressInfo *ai) +{ + MonoAddressEntry *cur = ai->entries, *next; + while (cur) { + next = cur->next; + g_free ((void*)cur->canonical_name); + g_free (cur); + cur = next; + } + g_strfreev (ai->aliases); + g_free (ai); +} + + +/* port in host order, address in network order */ +void +mono_socket_address_init (MonoSocketAddress *sa, socklen_t *len, int family, const void *address, int port) +{ + memset (sa, 0, sizeof (MonoSocketAddress)); + if (family == AF_INET) { + *len = sizeof (struct sockaddr_in); + + sa->v4.sin_family = family; + sa->v4.sin_addr = *(struct in_addr*)address; + sa->v4.sin_port = htons (port); +#if HAVE_SOCKADDR_IN_SIN_LEN + sa->v4.sin_len = sizeof (*len); +#endif + } else if (family == AF_INET6) { + *len = sizeof (struct sockaddr_in6); + + sa->v6.sin6_family = family; + sa->v6.sin6_addr = *(struct in6_addr*)address; + sa->v6.sin6_port = htons (port); +#if HAVE_SOCKADDR_IN6_SIN_LEN + sa->v6.sin6_len = sizeof (*len); +#endif + } else { + g_error ("Cannot handle address family %d", family); + } +} + +void +mono_address_init (MonoAddress *out_addr, int family, void *in_addr) +{ + memset (out_addr, 0, sizeof (MonoAddress)); + out_addr->family = family; + memcpy (&out_addr->addr, in_addr, mono_address_size_for_family (family)); +} diff --git a/mta-mono/vendor/mono/utils/networking.h b/mta-mono/vendor/mono/utils/networking.h new file mode 100644 index 0000000..55c8291 --- /dev/null +++ b/mta-mono/vendor/mono/utils/networking.h @@ -0,0 +1,106 @@ +/* + * networking.h: Portable networking functions + * + * Author: + * Rodrigo Kumpera (kumpera@gmail.com) + * + * (C) 2015 Xamarin + */ + + +#ifndef __MONO_NETWORKING_H__ +#define __MONO_NETWORKING_H__ + +#include +#include + +#ifdef HAVE_ARPA_INET_H +#include +#endif +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_SOCKIO_H +#include +#endif + +#ifdef HAVE_NETINET_IN_H +#include +#endif + +#ifdef HOST_WIN32 +#include +#include +#endif + +#include + +typedef enum { + MONO_HINT_UNSPECIFIED = 0, + MONO_HINT_IPV4 = 1, + MONO_HINT_IPV6 = 2, + MONO_HINT_CANONICAL_NAME = 4, + MONO_HINT_CONFIGURED_ONLY = 8, +} MonoGetAddressHints; + +typedef struct _MonoAddressEntry MonoAddressEntry; + +struct _MonoAddressEntry { + int family; + int socktype; + int protocol; + int address_len; + union { + struct in_addr v4; + struct in6_addr v6; + } address; + const char *canonical_name; + MonoAddressEntry *next; +}; + +typedef struct { + MonoAddressEntry *entries; + char **aliases; +} MonoAddressInfo; + +typedef union { + struct sockaddr_in v4; + struct sockaddr_in6 v6; + struct sockaddr addr; +} MonoSocketAddress; + +typedef struct { + int family; + union { + struct in_addr v4; + struct in6_addr v6; + } addr; +} MonoAddress; + +/* This only supports IPV4 / IPV6 and tcp */ +int mono_get_address_info (const char *hostname, int port, int flags, MonoAddressInfo **res) MONO_INTERNAL; + +void mono_free_address_info (MonoAddressInfo *ai) MONO_INTERNAL; + +void mono_socket_address_init (MonoSocketAddress *sa, socklen_t *len, int family, const void *address, int port) MONO_INTERNAL; + +void *mono_get_local_interfaces (int family, int *interface_count) MONO_INTERNAL; + +#ifndef HAVE_INET_PTON +int inet_pton (int family, const char *address, void *inaddrp) MONO_INTERNAL; +#endif + +void mono_address_init (MonoAddress *out_addr, int family, void *in_addr) MONO_INTERNAL; +int mono_address_size_for_family (int family) MONO_INTERNAL; +gboolean mono_networking_addr_to_str (MonoAddress *address, char *buffer, socklen_t buflen) MONO_INTERNAL; + +int mono_networking_get_tcp_protocol (void) MONO_INTERNAL; +int mono_networking_get_ip_protocol (void) MONO_INTERNAL; +int mono_networking_get_ipv6_protocol (void) MONO_INTERNAL; + +void mono_networking_init (void) MONO_INTERNAL; +void mono_networking_shutdown (void) MONO_INTERNAL; + + +#endif diff --git a/mta-mono/vendor/mono/utils/strtod.c b/mta-mono/vendor/mono/utils/strtod.c index f20acdc..1ba4b72 100644 --- a/mta-mono/vendor/mono/utils/strtod.c +++ b/mta-mono/vendor/mono/utils/strtod.c @@ -173,6 +173,12 @@ * #define NO_ERRNO if strtod should not assign errno = ERANGE when * the result overflows to +-Infinity or underflows to 0. */ +#if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN +# define IEEE_MC68k +#elif defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN +# define IEEE_8087 +#else + #if defined(TARGET_X86) || defined(mips) && defined(MIPSEL) || defined (__arm__) || defined(__aarch64__) # define IEEE_8087 @@ -194,9 +200,12 @@ # define IEEE_MC68k #else +#warning byte order unknown, assuming big endian #define IEEE_MC68k #endif +#endif + #define Long gint32 #define ULong guint32 diff --git a/mta-mono/vendor/mono/utils/valgrind.h b/mta-mono/vendor/mono/utils/valgrind.h index 315da5b..6954d75 100644 --- a/mta-mono/vendor/mono/utils/valgrind.h +++ b/mta-mono/vendor/mono/utils/valgrind.h @@ -12,7 +12,7 @@ This file is part of Valgrind, a dynamic binary instrumentation framework. - Copyright (C) 2000-2012 Julian Seward. All rights reserved. + Copyright (C) 2000-2013 Julian Seward. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -89,7 +89,7 @@ || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6)) */ #define __VALGRIND_MAJOR__ 3 -#define __VALGRIND_MINOR__ 8 +#define __VALGRIND_MINOR__ 10 #include @@ -111,35 +111,51 @@ #undef PLAT_x86_darwin #undef PLAT_amd64_darwin #undef PLAT_x86_win32 +#undef PLAT_amd64_win64 #undef PLAT_x86_linux #undef PLAT_amd64_linux #undef PLAT_ppc32_linux -#undef PLAT_ppc64_linux +#undef PLAT_ppc64be_linux +#undef PLAT_ppc64le_linux #undef PLAT_arm_linux +#undef PLAT_arm64_linux #undef PLAT_s390x_linux #undef PLAT_mips32_linux +#undef PLAT_mips64_linux #if defined(__APPLE__) && defined(__i386__) # define PLAT_x86_darwin 1 #elif defined(__APPLE__) && defined(__x86_64__) # define PLAT_amd64_darwin 1 -#elif defined(__MINGW32__) || defined(__CYGWIN32__) \ +#elif (defined(__MINGW32__) && !defined(__MINGW64__)) \ + || defined(__CYGWIN32__) \ || (defined(_WIN32) && defined(_M_IX86)) # define PLAT_x86_win32 1 +#elif defined(__MINGW64__) \ + || (defined(_WIN64) && defined(_M_X64)) +# define PLAT_amd64_win64 1 #elif defined(__linux__) && defined(__i386__) # define PLAT_x86_linux 1 #elif defined(__linux__) && defined(__x86_64__) # define PLAT_amd64_linux 1 #elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__) # define PLAT_ppc32_linux 1 -#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) -# define PLAT_ppc64_linux 1 -#elif defined(__linux__) && defined(__arm__) +#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF != 2 +/* Big Endian uses ELF version 1 */ +# define PLAT_ppc64be_linux 1 +#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF == 2 +/* Little Endian uses ELF version 2 */ +# define PLAT_ppc64le_linux 1 +#elif defined(__linux__) && defined(__arm__) && !defined(__aarch64__) # define PLAT_arm_linux 1 +#elif defined(__linux__) && defined(__aarch64__) && !defined(__arm__) +# define PLAT_arm64_linux 1 #elif defined(__linux__) && defined(__s390__) && defined(__s390x__) # define PLAT_s390x_linux 1 -#elif defined(__linux__) && defined(__mips__) +#elif defined(__linux__) && defined(__mips__) && (__mips==64) +# define PLAT_mips64_linux 1 +#elif defined(__linux__) && defined(__mips__) && (__mips!=64) # define PLAT_mips32_linux 1 #else /* If we're not compiling for our target platform, don't generate @@ -368,7 +384,8 @@ valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request, /* ------------------------ amd64-{linux,darwin} --------------- */ -#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) +#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) \ + || (defined(PLAT_amd64_win64) && defined(__GNUC__)) typedef struct { @@ -430,6 +447,14 @@ typedef #endif /* PLAT_amd64_linux || PLAT_amd64_darwin */ +/* ------------------------- amd64-Win64 ------------------------- */ + +#if defined(PLAT_amd64_win64) && !defined(__GNUC__) + +#error Unsupported compiler. + +#endif /* PLAT_amd64_win64 */ + /* ------------------------ ppc32-linux ------------------------ */ #if defined(PLAT_ppc32_linux) @@ -441,8 +466,8 @@ typedef OrigFn; #define __SPECIAL_INSTRUCTION_PREAMBLE \ - "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ - "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" + "rlwinm 0,0,3,0,31 ; rlwinm 0,0,13,0,31\n\t" \ + "rlwinm 0,0,29,0,31 ; rlwinm 0,0,19,0,31\n\t" #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ _zzq_default, _zzq_request, \ @@ -501,7 +526,7 @@ typedef /* ------------------------ ppc64-linux ------------------------ */ -#if defined(PLAT_ppc64_linux) +#if defined(PLAT_ppc64be_linux) typedef struct { @@ -576,7 +601,84 @@ typedef ); \ } while (0) -#endif /* PLAT_ppc64_linux */ +#endif /* PLAT_ppc64be_linux */ + +#if defined(PLAT_ppc64le_linux) + +typedef + struct { + unsigned long long int nraddr; /* where's the code? */ + unsigned long long int r2; /* what tocptr do we need? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ + "rotldi 0,0,61 ; rotldi 0,0,51\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + \ + __extension__ \ + ({ unsigned long long int _zzq_args[6]; \ + unsigned long long int _zzq_result; \ + unsigned long long int* _zzq_ptr; \ + _zzq_args[0] = (unsigned long long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ + _zzq_ptr = _zzq_args; \ + __asm__ volatile("mr 3,%1\n\t" /*default*/ \ + "mr 4,%2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = client_request ( %R4 ) */ \ + "or 1,1,1\n\t" \ + "mr %0,3" /*result*/ \ + : "=b" (_zzq_result) \ + : "b" (_zzq_default), "b" (_zzq_ptr) \ + : "cc", "memory", "r3", "r4"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + unsigned long long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = guest_NRADDR */ \ + "or 2,2,2\n\t" \ + "mr %0,3" \ + : "=b" (__addr) \ + : \ + : "cc", "memory", "r3" \ + ); \ + _zzq_orig->nraddr = __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = guest_NRADDR_GPR2 */ \ + "or 4,4,4\n\t" \ + "mr %0,3" \ + : "=b" (__addr) \ + : \ + : "cc", "memory", "r3" \ + ); \ + _zzq_orig->r2 = __addr; \ + } + +#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* branch-and-link-to-noredir *%R12 */ \ + "or 3,3,3\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "or 5,5,5\n\t" \ + ); \ + } while (0) + +#endif /* PLAT_ppc64le_linux */ /* ------------------------- arm-linux ------------------------- */ @@ -646,6 +748,74 @@ typedef #endif /* PLAT_arm_linux */ +/* ------------------------ arm64-linux ------------------------- */ + +#if defined(PLAT_arm64_linux) + +typedef + struct { + unsigned long long int nraddr; /* where's the code? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "ror x12, x12, #3 ; ror x12, x12, #13 \n\t" \ + "ror x12, x12, #51 ; ror x12, x12, #61 \n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + \ + __extension__ \ + ({volatile unsigned long long int _zzq_args[6]; \ + volatile unsigned long long int _zzq_result; \ + _zzq_args[0] = (unsigned long long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ + __asm__ volatile("mov x3, %1\n\t" /*default*/ \ + "mov x4, %2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* X3 = client_request ( X4 ) */ \ + "orr x10, x10, x10\n\t" \ + "mov %0, x3" /*result*/ \ + : "=r" (_zzq_result) \ + : "r" (_zzq_default), "r" (&_zzq_args[0]) \ + : "cc","memory", "x3", "x4"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + unsigned long long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* X3 = guest_NRADDR */ \ + "orr x11, x11, x11\n\t" \ + "mov %0, x3" \ + : "=r" (__addr) \ + : \ + : "cc", "memory", "x3" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* branch-and-link-to-noredir X8 */ \ + "orr x12, x12, x12\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "orr x9, x9, x9\n\t" \ + : : : "cc", "memory" \ + ); \ + } while (0) + +#endif /* PLAT_arm64_linux */ + /* ------------------------ s390x-linux ------------------------ */ #if defined(PLAT_s390x_linux) @@ -763,7 +933,7 @@ typedef "move %0, $11\n\t" /*result*/ \ : "=r" (_zzq_result) \ : "r" (_zzq_default), "r" (&_zzq_args[0]) \ - : "cc","memory", "t3", "t4"); \ + : "$11", "$12"); \ _zzq_result; \ }) @@ -776,7 +946,7 @@ typedef "move %0, $11" /*result*/ \ : "=r" (__addr) \ : \ - : "cc", "memory" , "t3" \ + : "$11" \ ); \ _zzq_orig->nraddr = __addr; \ } @@ -796,6 +966,75 @@ typedef #endif /* PLAT_mips32_linux */ +/* ------------------------- mips64-linux ---------------- */ + +#if defined(PLAT_mips64_linux) + +typedef + struct { + unsigned long long nraddr; /* where's the code? */ + } + OrigFn; + +/* dsll $0,$0, 3 + * dsll $0,$0, 13 + * dsll $0,$0, 29 + * dsll $0,$0, 19*/ +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "dsll $0,$0, 3 ; dsll $0,$0,13\n\t" \ + "dsll $0,$0,29 ; dsll $0,$0,19\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + __extension__ \ + ({ volatile unsigned long long int _zzq_args[6]; \ + volatile unsigned long long int _zzq_result; \ + _zzq_args[0] = (unsigned long long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ + __asm__ volatile("move $11, %1\n\t" /*default*/ \ + "move $12, %2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* $11 = client_request ( $12 ) */ \ + "or $13, $13, $13\n\t" \ + "move %0, $11\n\t" /*result*/ \ + : "=r" (_zzq_result) \ + : "r" (_zzq_default), "r" (&_zzq_args[0]) \ + : "$11", "$12"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned long long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* $11 = guest_NRADDR */ \ + "or $14, $14, $14\n\t" \ + "move %0, $11" /*result*/ \ + : "=r" (__addr) \ + : \ + : "$11"); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_T9 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* call-noredir $25 */ \ + "or $15, $15, $15\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "or $11, $11, $11\n\t" \ + ); \ + } while (0) + +#endif /* PLAT_mips64_linux */ + /* Insert assembly code for other platforms here... */ #endif /* NVALGRIND */ @@ -2379,7 +2618,7 @@ typedef /* ------------------------ ppc64-linux ------------------------ */ -#if defined(PLAT_ppc64_linux) +#if defined(PLAT_ppc64be_linux) /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ @@ -2932,7 +3171,563 @@ typedef lval = (__typeof__(lval)) _res; \ } while (0) -#endif /* PLAT_ppc64_linux */ +#endif /* PLAT_ppc64be_linux */ + +/* ------------------------- ppc64le-linux ----------------------- */ +#if defined(PLAT_ppc64le_linux) + +/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS \ + "lr", "ctr", "xer", \ + "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ + "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ + "r11", "r12", "r13" + +/* Macros to save and align the stack before making a function + call and restore it afterwards as gcc may not keep the stack + pointer aligned if it doesn't realise calls are being made + to other functions. */ + +#define VALGRIND_ALIGN_STACK \ + "mr 28,1\n\t" \ + "rldicr 1,1,0,59\n\t" +#define VALGRIND_RESTORE_STACK \ + "mr 1,28\n\t" + +/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned + long) == 8. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+0]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+1]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+2]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 4, 16(12)\n\t" /* arg2->r4 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+3]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 4, 16(12)\n\t" /* arg2->r4 */ \ + "ld 5, 24(12)\n\t" /* arg3->r5 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+4]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 4, 16(12)\n\t" /* arg2->r4 */ \ + "ld 5, 24(12)\n\t" /* arg3->r5 */ \ + "ld 6, 32(12)\n\t" /* arg4->r6 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+5]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 4, 16(12)\n\t" /* arg2->r4 */ \ + "ld 5, 24(12)\n\t" /* arg3->r5 */ \ + "ld 6, 32(12)\n\t" /* arg4->r6 */ \ + "ld 7, 40(12)\n\t" /* arg5->r7 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+6]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 4, 16(12)\n\t" /* arg2->r4 */ \ + "ld 5, 24(12)\n\t" /* arg3->r5 */ \ + "ld 6, 32(12)\n\t" /* arg4->r6 */ \ + "ld 7, 40(12)\n\t" /* arg5->r7 */ \ + "ld 8, 48(12)\n\t" /* arg6->r8 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+7]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 4, 16(12)\n\t" /* arg2->r4 */ \ + "ld 5, 24(12)\n\t" /* arg3->r5 */ \ + "ld 6, 32(12)\n\t" /* arg4->r6 */ \ + "ld 7, 40(12)\n\t" /* arg5->r7 */ \ + "ld 8, 48(12)\n\t" /* arg6->r8 */ \ + "ld 9, 56(12)\n\t" /* arg7->r9 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+8]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 4, 16(12)\n\t" /* arg2->r4 */ \ + "ld 5, 24(12)\n\t" /* arg3->r5 */ \ + "ld 6, 32(12)\n\t" /* arg4->r6 */ \ + "ld 7, 40(12)\n\t" /* arg5->r7 */ \ + "ld 8, 48(12)\n\t" /* arg6->r8 */ \ + "ld 9, 56(12)\n\t" /* arg7->r9 */ \ + "ld 10, 64(12)\n\t" /* arg8->r10 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+9]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-128\n\t" /* expand stack frame */ \ + /* arg9 */ \ + "ld 3,72(12)\n\t" \ + "std 3,96(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 4, 16(12)\n\t" /* arg2->r4 */ \ + "ld 5, 24(12)\n\t" /* arg3->r5 */ \ + "ld 6, 32(12)\n\t" /* arg4->r6 */ \ + "ld 7, 40(12)\n\t" /* arg5->r7 */ \ + "ld 8, 48(12)\n\t" /* arg6->r8 */ \ + "ld 9, 56(12)\n\t" /* arg7->r9 */ \ + "ld 10, 64(12)\n\t" /* arg8->r10 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+10]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + _argvec[2+10] = (unsigned long)arg10; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-128\n\t" /* expand stack frame */ \ + /* arg10 */ \ + "ld 3,80(12)\n\t" \ + "std 3,104(1)\n\t" \ + /* arg9 */ \ + "ld 3,72(12)\n\t" \ + "std 3,96(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 4, 16(12)\n\t" /* arg2->r4 */ \ + "ld 5, 24(12)\n\t" /* arg3->r5 */ \ + "ld 6, 32(12)\n\t" /* arg4->r6 */ \ + "ld 7, 40(12)\n\t" /* arg5->r7 */ \ + "ld 8, 48(12)\n\t" /* arg6->r8 */ \ + "ld 9, 56(12)\n\t" /* arg7->r9 */ \ + "ld 10, 64(12)\n\t" /* arg8->r10 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+11]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + _argvec[2+10] = (unsigned long)arg10; \ + _argvec[2+11] = (unsigned long)arg11; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-144\n\t" /* expand stack frame */ \ + /* arg11 */ \ + "ld 3,88(12)\n\t" \ + "std 3,112(1)\n\t" \ + /* arg10 */ \ + "ld 3,80(12)\n\t" \ + "std 3,104(1)\n\t" \ + /* arg9 */ \ + "ld 3,72(12)\n\t" \ + "std 3,96(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 4, 16(12)\n\t" /* arg2->r4 */ \ + "ld 5, 24(12)\n\t" /* arg3->r5 */ \ + "ld 6, 32(12)\n\t" /* arg4->r6 */ \ + "ld 7, 40(12)\n\t" /* arg5->r7 */ \ + "ld 8, 48(12)\n\t" /* arg6->r8 */ \ + "ld 9, 56(12)\n\t" /* arg7->r9 */ \ + "ld 10, 64(12)\n\t" /* arg8->r10 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+12]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + _argvec[2+10] = (unsigned long)arg10; \ + _argvec[2+11] = (unsigned long)arg11; \ + _argvec[2+12] = (unsigned long)arg12; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 12,%1\n\t" \ + "std 2,-16(12)\n\t" /* save tocptr */ \ + "ld 2,-8(12)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-144\n\t" /* expand stack frame */ \ + /* arg12 */ \ + "ld 3,96(12)\n\t" \ + "std 3,120(1)\n\t" \ + /* arg11 */ \ + "ld 3,88(12)\n\t" \ + "std 3,112(1)\n\t" \ + /* arg10 */ \ + "ld 3,80(12)\n\t" \ + "std 3,104(1)\n\t" \ + /* arg9 */ \ + "ld 3,72(12)\n\t" \ + "std 3,96(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(12)\n\t" /* arg1->r3 */ \ + "ld 4, 16(12)\n\t" /* arg2->r4 */ \ + "ld 5, 24(12)\n\t" /* arg3->r5 */ \ + "ld 6, 32(12)\n\t" /* arg4->r6 */ \ + "ld 7, 40(12)\n\t" /* arg5->r7 */ \ + "ld 8, 48(12)\n\t" /* arg6->r8 */ \ + "ld 9, 56(12)\n\t" /* arg7->r9 */ \ + "ld 10, 64(12)\n\t" /* arg8->r10 */ \ + "ld 12, 0(12)\n\t" /* target->r12 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \ + "mr 12,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(12)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_ppc64le_linux */ /* ------------------------- arm-linux ------------------------- */ @@ -3393,6 +4188,457 @@ typedef #endif /* PLAT_arm_linux */ +/* ------------------------ arm64-linux ------------------------ */ + +#if defined(PLAT_arm64_linux) + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS \ + "x0", "x1", "x2", "x3","x4", "x5", "x6", "x7", "x8", "x9", \ + "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", \ + "x18", "x19", "x20", "x30", \ + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", \ + "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", \ + "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", \ + "v26", "v27", "v28", "v29", "v30", "v31" + +/* x21 is callee-saved, so we can use it to save and restore SP around + the hidden call. */ +#define VALGRIND_ALIGN_STACK \ + "mov x21, sp\n\t" \ + "bic sp, x21, #15\n\t" +#define VALGRIND_RESTORE_STACK \ + "mov sp, x21\n\t" + +/* These CALL_FN_ macros assume that on arm64-linux, + sizeof(unsigned long) == 8. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x1, [%1, #16] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x1, [%1, #16] \n\t" \ + "ldr x2, [%1, #24] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x1, [%1, #16] \n\t" \ + "ldr x2, [%1, #24] \n\t" \ + "ldr x3, [%1, #32] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x1, [%1, #16] \n\t" \ + "ldr x2, [%1, #24] \n\t" \ + "ldr x3, [%1, #32] \n\t" \ + "ldr x4, [%1, #40] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x1, [%1, #16] \n\t" \ + "ldr x2, [%1, #24] \n\t" \ + "ldr x3, [%1, #32] \n\t" \ + "ldr x4, [%1, #40] \n\t" \ + "ldr x5, [%1, #48] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x1, [%1, #16] \n\t" \ + "ldr x2, [%1, #24] \n\t" \ + "ldr x3, [%1, #32] \n\t" \ + "ldr x4, [%1, #40] \n\t" \ + "ldr x5, [%1, #48] \n\t" \ + "ldr x6, [%1, #56] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x1, [%1, #16] \n\t" \ + "ldr x2, [%1, #24] \n\t" \ + "ldr x3, [%1, #32] \n\t" \ + "ldr x4, [%1, #40] \n\t" \ + "ldr x5, [%1, #48] \n\t" \ + "ldr x6, [%1, #56] \n\t" \ + "ldr x7, [%1, #64] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #0x20 \n\t" \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x1, [%1, #16] \n\t" \ + "ldr x2, [%1, #24] \n\t" \ + "ldr x3, [%1, #32] \n\t" \ + "ldr x4, [%1, #40] \n\t" \ + "ldr x5, [%1, #48] \n\t" \ + "ldr x6, [%1, #56] \n\t" \ + "ldr x7, [%1, #64] \n\t" \ + "ldr x8, [%1, #72] \n\t" \ + "str x8, [sp, #0] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #0x20 \n\t" \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x1, [%1, #16] \n\t" \ + "ldr x2, [%1, #24] \n\t" \ + "ldr x3, [%1, #32] \n\t" \ + "ldr x4, [%1, #40] \n\t" \ + "ldr x5, [%1, #48] \n\t" \ + "ldr x6, [%1, #56] \n\t" \ + "ldr x7, [%1, #64] \n\t" \ + "ldr x8, [%1, #72] \n\t" \ + "str x8, [sp, #0] \n\t" \ + "ldr x8, [%1, #80] \n\t" \ + "str x8, [sp, #8] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #0x30 \n\t" \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x1, [%1, #16] \n\t" \ + "ldr x2, [%1, #24] \n\t" \ + "ldr x3, [%1, #32] \n\t" \ + "ldr x4, [%1, #40] \n\t" \ + "ldr x5, [%1, #48] \n\t" \ + "ldr x6, [%1, #56] \n\t" \ + "ldr x7, [%1, #64] \n\t" \ + "ldr x8, [%1, #72] \n\t" \ + "str x8, [sp, #0] \n\t" \ + "ldr x8, [%1, #80] \n\t" \ + "str x8, [sp, #8] \n\t" \ + "ldr x8, [%1, #88] \n\t" \ + "str x8, [sp, #16] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11, \ + arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #0x30 \n\t" \ + "ldr x0, [%1, #8] \n\t" \ + "ldr x1, [%1, #16] \n\t" \ + "ldr x2, [%1, #24] \n\t" \ + "ldr x3, [%1, #32] \n\t" \ + "ldr x4, [%1, #40] \n\t" \ + "ldr x5, [%1, #48] \n\t" \ + "ldr x6, [%1, #56] \n\t" \ + "ldr x7, [%1, #64] \n\t" \ + "ldr x8, [%1, #72] \n\t" \ + "str x8, [sp, #0] \n\t" \ + "ldr x8, [%1, #80] \n\t" \ + "str x8, [sp, #8] \n\t" \ + "ldr x8, [%1, #88] \n\t" \ + "str x8, [sp, #16] \n\t" \ + "ldr x8, [%1, #96] \n\t" \ + "str x8, [sp, #24] \n\t" \ + "ldr x8, [%1] \n\t" /* target->x8 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \ + VALGRIND_RESTORE_STACK \ + "mov %0, x0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "x21" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_arm64_linux */ + /* ------------------------- s390x-linux ------------------------- */ #if defined(PLAT_s390x_linux) @@ -3881,7 +5127,7 @@ typedef #endif /* PLAT_s390x_linux */ -/* ------------------------- mips-linux ------------------------- */ +/* ------------------------- mips32-linux ----------------------- */ #if defined(PLAT_mips32_linux) @@ -3901,19 +5147,19 @@ typedef _argvec[0] = (unsigned long)_orig.nraddr; \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ - "subu $29, $29, 16 \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "subu $29, $29, 16 \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ "addu $29, $29, 16\n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ "addu $29, $29, 8 \n\t" \ - "move %0, $v0\n" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -3927,20 +5173,20 @@ typedef _argvec[1] = (unsigned long)(arg1); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ "subu $29, $29, 16 \n\t" \ - "lw $a0, 4(%1) \n\t" /* arg1*/ \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "lw $4, 4(%1) \n\t" /* arg1*/ \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ "addu $29, $29, 16 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ "addu $29, $29, 8 \n\t" \ - "move %0, $v0\n" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -3955,21 +5201,21 @@ typedef _argvec[2] = (unsigned long)(arg2); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ "subu $29, $29, 16 \n\t" \ - "lw $a0, 4(%1) \n\t" \ - "lw $a1, 8(%1) \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ "addu $29, $29, 16 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ "addu $29, $29, 8 \n\t" \ - "move %0, $v0\n" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -3985,22 +5231,22 @@ typedef _argvec[3] = (unsigned long)(arg3); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ "subu $29, $29, 16 \n\t" \ - "lw $a0, 4(%1) \n\t" \ - "lw $a1, 8(%1) \n\t" \ - "lw $a2, 12(%1) \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ "addu $29, $29, 16 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ "addu $29, $29, 8 \n\t" \ - "move %0, $v0\n" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -4017,23 +5263,23 @@ typedef _argvec[4] = (unsigned long)(arg4); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ "subu $29, $29, 16 \n\t" \ - "lw $a0, 4(%1) \n\t" \ - "lw $a1, 8(%1) \n\t" \ - "lw $a2, 12(%1) \n\t" \ - "lw $a3, 16(%1) \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ "addu $29, $29, 16 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ "addu $29, $29, 8 \n\t" \ - "move %0, $v0\n" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -4051,25 +5297,25 @@ typedef _argvec[5] = (unsigned long)(arg5); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ - "lw $a0, 20(%1) \n\t" \ - "subu $sp, $sp, 24\n\t" \ - "sw $a0, 16($sp) \n\t" \ - "lw $a0, 4(%1) \n\t" \ - "lw $a1, 8(%1) \n\t" \ - "lw $a2, 12(%1) \n\t" \ - "lw $a3, 16(%1) \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 24\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ "addu $29, $29, 24 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ - "addu $sp, $sp, 8 \n\t" \ - "move %0, $v0\n" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -4087,28 +5333,28 @@ typedef _argvec[6] = (unsigned long)(arg6); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ - "lw $a0, 20(%1) \n\t" \ - "subu $sp, $sp, 32\n\t" \ - "sw $a0, 16($sp) \n\t" \ - "lw $a0, 24(%1) \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 32\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ "nop\n\t" \ - "sw $a0, 20($sp) \n\t" \ - "lw $a0, 4(%1) \n\t" \ - "lw $a1, 8(%1) \n\t" \ - "lw $a2, 12(%1) \n\t" \ - "lw $a3, 16(%1) \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "sw $4, 20($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ - "addu $sp, $sp, 32 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ - "addu $sp, $sp, 8 \n\t" \ - "move %0, $v0\n" \ + "addu $29, $29, 32 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -4129,29 +5375,29 @@ typedef _argvec[7] = (unsigned long)(arg7); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ - "lw $a0, 20(%1) \n\t" \ - "subu $sp, $sp, 32\n\t" \ - "sw $a0, 16($sp) \n\t" \ - "lw $a0, 24(%1) \n\t" \ - "sw $a0, 20($sp) \n\t" \ - "lw $a0, 28(%1) \n\t" \ - "sw $a0, 24($sp) \n\t" \ - "lw $a0, 4(%1) \n\t" \ - "lw $a1, 8(%1) \n\t" \ - "lw $a2, 12(%1) \n\t" \ - "lw $a3, 16(%1) \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 32\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ - "addu $sp, $sp, 32 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ - "addu $sp, $sp, 8 \n\t" \ - "move %0, $v0\n" \ + "addu $29, $29, 32 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -4173,31 +5419,31 @@ typedef _argvec[8] = (unsigned long)(arg8); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ - "lw $a0, 20(%1) \n\t" \ - "subu $sp, $sp, 40\n\t" \ - "sw $a0, 16($sp) \n\t" \ - "lw $a0, 24(%1) \n\t" \ - "sw $a0, 20($sp) \n\t" \ - "lw $a0, 28(%1) \n\t" \ - "sw $a0, 24($sp) \n\t" \ - "lw $a0, 32(%1) \n\t" \ - "sw $a0, 28($sp) \n\t" \ - "lw $a0, 4(%1) \n\t" \ - "lw $a1, 8(%1) \n\t" \ - "lw $a2, 12(%1) \n\t" \ - "lw $a3, 16(%1) \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 40\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ - "addu $sp, $sp, 40 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ - "addu $sp, $sp, 8 \n\t" \ - "move %0, $v0\n" \ + "addu $29, $29, 40 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -4220,33 +5466,33 @@ typedef _argvec[9] = (unsigned long)(arg9); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ - "lw $a0, 20(%1) \n\t" \ - "subu $sp, $sp, 40\n\t" \ - "sw $a0, 16($sp) \n\t" \ - "lw $a0, 24(%1) \n\t" \ - "sw $a0, 20($sp) \n\t" \ - "lw $a0, 28(%1) \n\t" \ - "sw $a0, 24($sp) \n\t" \ - "lw $a0, 32(%1) \n\t" \ - "sw $a0, 28($sp) \n\t" \ - "lw $a0, 36(%1) \n\t" \ - "sw $a0, 32($sp) \n\t" \ - "lw $a0, 4(%1) \n\t" \ - "lw $a1, 8(%1) \n\t" \ - "lw $a2, 12(%1) \n\t" \ - "lw $a3, 16(%1) \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 40\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ - "addu $sp, $sp, 40 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ - "addu $sp, $sp, 8 \n\t" \ - "move %0, $v0\n" \ + "addu $29, $29, 40 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -4270,35 +5516,35 @@ typedef _argvec[10] = (unsigned long)(arg10); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ - "lw $a0, 20(%1) \n\t" \ - "subu $sp, $sp, 48\n\t" \ - "sw $a0, 16($sp) \n\t" \ - "lw $a0, 24(%1) \n\t" \ - "sw $a0, 20($sp) \n\t" \ - "lw $a0, 28(%1) \n\t" \ - "sw $a0, 24($sp) \n\t" \ - "lw $a0, 32(%1) \n\t" \ - "sw $a0, 28($sp) \n\t" \ - "lw $a0, 36(%1) \n\t" \ - "sw $a0, 32($sp) \n\t" \ - "lw $a0, 40(%1) \n\t" \ - "sw $a0, 36($sp) \n\t" \ - "lw $a0, 4(%1) \n\t" \ - "lw $a1, 8(%1) \n\t" \ - "lw $a2, 12(%1) \n\t" \ - "lw $a3, 16(%1) \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 48\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 40(%1) \n\t" \ + "sw $4, 36($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ - "addu $sp, $sp, 48 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ - "addu $sp, $sp, 8 \n\t" \ - "move %0, $v0\n" \ + "addu $29, $29, 48 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -4324,37 +5570,37 @@ typedef _argvec[11] = (unsigned long)(arg11); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ - "lw $a0, 20(%1) \n\t" \ - "subu $sp, $sp, 48\n\t" \ - "sw $a0, 16($sp) \n\t" \ - "lw $a0, 24(%1) \n\t" \ - "sw $a0, 20($sp) \n\t" \ - "lw $a0, 28(%1) \n\t" \ - "sw $a0, 24($sp) \n\t" \ - "lw $a0, 32(%1) \n\t" \ - "sw $a0, 28($sp) \n\t" \ - "lw $a0, 36(%1) \n\t" \ - "sw $a0, 32($sp) \n\t" \ - "lw $a0, 40(%1) \n\t" \ - "sw $a0, 36($sp) \n\t" \ - "lw $a0, 44(%1) \n\t" \ - "sw $a0, 40($sp) \n\t" \ - "lw $a0, 4(%1) \n\t" \ - "lw $a1, 8(%1) \n\t" \ - "lw $a2, 12(%1) \n\t" \ - "lw $a3, 16(%1) \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 48\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 40(%1) \n\t" \ + "sw $4, 36($29) \n\t" \ + "lw $4, 44(%1) \n\t" \ + "sw $4, 40($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ - "addu $sp, $sp, 48 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ - "addu $sp, $sp, 8 \n\t" \ - "move %0, $v0\n" \ + "addu $29, $29, 48 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) @@ -4381,45 +5627,462 @@ typedef _argvec[12] = (unsigned long)(arg12); \ __asm__ volatile( \ "subu $29, $29, 8 \n\t" \ - "sw $gp, 0($sp) \n\t" \ - "sw $ra, 4($sp) \n\t" \ - "lw $a0, 20(%1) \n\t" \ - "subu $sp, $sp, 56\n\t" \ - "sw $a0, 16($sp) \n\t" \ - "lw $a0, 24(%1) \n\t" \ - "sw $a0, 20($sp) \n\t" \ - "lw $a0, 28(%1) \n\t" \ - "sw $a0, 24($sp) \n\t" \ - "lw $a0, 32(%1) \n\t" \ - "sw $a0, 28($sp) \n\t" \ - "lw $a0, 36(%1) \n\t" \ - "sw $a0, 32($sp) \n\t" \ - "lw $a0, 40(%1) \n\t" \ - "sw $a0, 36($sp) \n\t" \ - "lw $a0, 44(%1) \n\t" \ - "sw $a0, 40($sp) \n\t" \ - "lw $a0, 48(%1) \n\t" \ - "sw $a0, 44($sp) \n\t" \ - "lw $a0, 4(%1) \n\t" \ - "lw $a1, 8(%1) \n\t" \ - "lw $a2, 12(%1) \n\t" \ - "lw $a3, 16(%1) \n\t" \ - "lw $t9, 0(%1) \n\t" /* target->t9 */ \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 56\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 40(%1) \n\t" \ + "sw $4, 36($29) \n\t" \ + "lw $4, 44(%1) \n\t" \ + "sw $4, 40($29) \n\t" \ + "lw $4, 48(%1) \n\t" \ + "sw $4, 44($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ - "addu $sp, $sp, 56 \n\t" \ - "lw $gp, 0($sp) \n\t" \ - "lw $ra, 4($sp) \n\t" \ - "addu $sp, $sp, 8 \n\t" \ - "move %0, $v0\n" \ + "addu $29, $29, 56 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ lval = (__typeof__(lval)) _res; \ } while (0) #endif /* PLAT_mips32_linux */ +/* ------------------------- mips64-linux ------------------------- */ + +#if defined(PLAT_mips64_linux) + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \ +"$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \ +"$25", "$31" + +/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned + long) == 4. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" /* arg1*/ \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + "dsubu $29, $29, 8\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 8\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + "dsubu $29, $29, 16\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 80(%1)\n\t" \ + "sd $4, 8($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 16\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + "dsubu $29, $29, 24\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 80(%1)\n\t" \ + "sd $4, 8($29)\n\t" \ + "ld $4, 88(%1)\n\t" \ + "sd $4, 16($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 24\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + "dsubu $29, $29, 32\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 80(%1)\n\t" \ + "sd $4, 8($29)\n\t" \ + "ld $4, 88(%1)\n\t" \ + "sd $4, 16($29)\n\t" \ + "ld $4, 96(%1)\n\t" \ + "sd $4, 24($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 32\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_mips64_linux */ + /* ------------------------------------------------------------------ */ /* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ @@ -4464,8 +6127,8 @@ typedef errors. */ VG_USERREQ__COUNT_ERRORS = 0x1201, - /* Allows a string (gdb monitor command) to be passed to the tool - Used for interaction with vgdb/gdb */ + /* Allows the client program and/or gdbserver to execute a monitor + command. */ VG_USERREQ__GDB_MONITOR_COMMAND = 0x1202, /* These are useful and can be interpreted by any tool that @@ -4562,14 +6225,14 @@ VALGRIND_PRINTF(const char *format, ...) #if defined(NVALGRIND) return 0; #else /* NVALGRIND */ -#if defined(_MSC_VER) +#if defined(_MSC_VER) || defined(__MINGW64__) uintptr_t _qzz_res; #else unsigned long _qzz_res; #endif va_list vargs; va_start(vargs, format); -#if defined(_MSC_VER) +#if defined(_MSC_VER) || defined(__MINGW64__) _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__PRINTF_VALIST_BY_REF, (uintptr_t)format, @@ -4600,14 +6263,14 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) #if defined(NVALGRIND) return 0; #else /* NVALGRIND */ -#if defined(_MSC_VER) +#if defined(_MSC_VER) || defined(__MINGW64__) uintptr_t _qzz_res; #else unsigned long _qzz_res; #endif va_list vargs; va_start(vargs, format); -#if defined(_MSC_VER) +#if defined(_MSC_VER) || defined(__MINGW64__) _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, (uintptr_t)format, @@ -4844,7 +6507,9 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) VG_USERREQ__MEMPOOL_EXISTS, \ pool, 0, 0, 0, 0) -/* Mark a piece of memory as being a stack. Returns a stack id. */ +/* Mark a piece of memory as being a stack. Returns a stack id. + start is the lowest addressable stack byte, end is the highest + addressable stack byte. */ #define VALGRIND_STACK_REGISTER(start, end) \ (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ VG_USERREQ__STACK_REGISTER, \ @@ -4856,7 +6521,9 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \ id, 0, 0, 0, 0) -/* Change the start and end address of the stack id. */ +/* Change the start and end address of the stack id. + start is the new lowest addressable stack byte, end is the new highest + addressable stack byte. */ #define VALGRIND_STACK_CHANGE(id, start, end) \ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE, \ id, start, end, 0, 0) @@ -4893,15 +6560,28 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \ -1, 0, 0, 0, 0) +/* Execute a monitor command from the client program. + If a connection is opened with GDB, the output will be sent + according to the output mode set for vgdb. + If no connection is opened, output will go to the log output. + Returns 1 if command not recognised, 0 otherwise. */ +#define VALGRIND_MONITOR_COMMAND(command) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__GDB_MONITOR_COMMAND, \ + command, 0, 0, 0, 0) + + #undef PLAT_x86_darwin #undef PLAT_amd64_darwin #undef PLAT_x86_win32 +#undef PLAT_amd64_win64 #undef PLAT_x86_linux #undef PLAT_amd64_linux #undef PLAT_ppc32_linux -#undef PLAT_ppc64_linux +#undef PLAT_ppc64be_linux +#undef PLAT_ppc64le_linux #undef PLAT_arm_linux #undef PLAT_s390x_linux #undef PLAT_mips32_linux +#undef PLAT_mips64_linux #endif /* __VALGRIND_H */